单片机
返回首页

两机串行通讯单片机汇编语言编程举例

2017-10-14 来源:eefocus

A、B两机之间串行通讯(方式1),用‘检验和’校验波特率为2400,发送缓冲区和接收缓冲区都为片内30H开始的16个字节单元。已知:fosc=11.0592MHz。 

设计A发送,B接收的双方协议如下: 

1、首先A发送‘AA’信号,B接收到后发送‘BB’应答; 

2、A方最多只发送20次‘AA’,若无应答,置错误标志,退出。 

3、A收到‘BB’后,开始发送缓冲区的数据,同时求检验和,共16个字节。 

4、B接收数据,存入缓冲区,并同时求检验和。 

5、当一个数据块发送完后,A再发送检验和(一个字节)。 

6、B接收到A的检验和后,再与本身的检验和比较。 

7、若接收正确,B方发送‘00’,否则发送‘EE‘,请求重发。 

8、若A方接收到‘00’,结束发送,接收到‘EE’则重发。 

A机的通讯程序: 

ASTA: MOV TMOD,#20H ;设T1方式2 

MOV TH1,#0F4H ;计数初值,波特率=2400 

MOV PCON,#0 ;SMOD=0 

SETB TR1 ;启动T1 

MOV SCON,#50H ;串口方式1,REN=1 

ATT0: MOV R6,#200 

MOV R7,#20 

CLR F0 ;线路故障标志=0 

ATT1:MOV SBUF,#0AAH ;发‘AA’联络 

AWA1:JBC TI,ARR1 ;查询发送中断标志位 

SJMP AWA1 

ARR1:JBC RI,ARR2 ;等待接收 

DJNZ R6,ARR1 

DJNZ R7,ATT1 ; 

SETB F0 ;线路故障 

QUIT: AJMP EXIT ;退出 

ARR2:MOV A,SBUF ;接收对方回应‘BB’ 

XRL A,#0BBH ;比较应答信号是否正确? 

JNZ QUIT ;不正确,退出 

ATT2:MOV R0,#30H ;准备发送数据 

MOV R7,#16 

MOV R6,#0 ;检验和单元 

ATT3:MOV SBUF,@R0 ;发送一个字节 

MOV A,R6 

ADD A,@R0 ;求检验和 

MOV R6,A 

INC R0 

AWA2:JBC TI,ATT4 

SJMP AWA2 ;查询发送中断标志 

ATT4:DJNZ R7,ATT3 ;计数循环 

MOV SBUF,R6 ;数据块发送完,发送检验和 

AWA3:JBC TI,ARR3 

SJMP AWA3 

ARR3:JBC RI,ARR4 ;等待接收对方回应 

SJMP ARR3 

ARR4:MOV A,SBUF ;接收到对方回应 

JNZ ATT2 ;若是‘00’则成功,否则重发。 

EXIT: RET 



B机通讯程序:(用中断方式开始) 

ORG 0000H 

LJMP MAIN 

ORG 0023H 

LJMP BRR1 ;串行中断入口 

ORG 0030H 

MAIN: 。。。。。 ;主程序 



BSTA: MOV TMOD,#20H ;设T2方式2 

MOV TH1,#0F4H ;计数初值,波特率=2400 

MOV PCON,#0 ;SMOD=0 

SETB TR1 ;启动T1 

MOV SCON,#50H ;串口方式1,REN=1 

SETB ES 

SETB EA ;允许中断 

。。。。。。。。 

BRR1: CLR ES ;串行口中断服务程序 

JBC RI,BRR2 ; 

SJMP BRR1 

BRR2: MOV A,SBUF ;接收A机联络信号 

XRL A,#0AAH 

JZ BTT1 ;正确 

AJMP EXIT ;错误,退出 

BTT1: MOV SBUF,#0BBH ;发送应答 

BWA1:JBC TI,BRR3 

SJMP BWA1 

BRR3: MOV R0,#30H ;准备接收数据 单片机 

MOV R7,#10H 

MOV R6,#0 

BRR4:JBC RI,BRR5 

SJMP BRR4 

BRR5:MOV A,SBUF ;接收一个字节 

MOV @R0,A ;存入缓冲区 

INC R0 

ADD A,R6 ; 

MOV R6,A ;求检验和 

DJNZ R7,BRR4 ;数据块计数 

BWA2:JBC RI,BRR6 

SJMP BWA2 

BRR6:MOV A,SBUF ;接收对方检验和 

XRL A,R6 ;与本机的比较 

JZ BTT2 

MOV SBUF,#0FFH ;不同,发送‘FF’ 

BWA3:JBC TI,BRR3 ;准备接收重发 

SJMP BWA3 

BTT2:MOV SBUF,#0 ;正确,发送‘00’ 

EXIT: SETB ES 

RETI 



例3、 两机通讯在方式2或3,用第9位作奇偶校验。 

发送方: 

,,,,,, 

TTT: MOV SCON,#80H ;方式2 

MOV A,#data ;data为一字节数据 

MOV C,PSW.0 ;取奇偶位 

MOV TB8,C ;奇偶位送到TB8位 

MOV SBUF,A ;发送一个字节 

LOOP:JBC TI,NEXT 内容来自单片机之家www.dpj100.com 

SJMP LOOP 

NEXT: ,,,, 



接收方: 

,,,,,, 

RRR: MOV SCON,#90H ;方式2,允许接收 

LOOP: JBC RI,RECE 

SJMP LOOP 

RECE: MOV A,SBUF ;取出接收到的字节 

JB PSW。0,ONE ;判断接收方的奇偶值 

JB RB8,ERR ;判断发送方的奇偶值 

SJMP RIGHT 

ONE : JNB RB8,ERR 

RIGHT: ,,,,,, ;接收正确 



ERR: ,,,,,,, ;接收有错 

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

最新器件
精选电路图
  • CCD图像传感器在微光电视系统中的应用

  • 如何利用ESP8266制作一个简单的四轴飞行器

  • 离子检测器电路分析

  • 一个简单的警笛电路图

  • 分享一个电网倾角计电路

  • 一种构建12V和230V双直流电源的简单方法

    相关电子头条文章