- 59
- 0
- 约4.96千字
- 约 3页
- 2017-06-03 发布于河南
- 举报
单片机89C51全双工串行通信汇编
单片机89C51 全双工串行通信汇编
有甲、乙两台单片机,以工作方式2 全双工串行通信,第9 位作为奇偶校验位。编出实现以
下功能的程序:
甲机:将0 到F 的十六进制数,总共16 个数存放到片内RAM 中的30H~3FH,然后再将30H~3FH
中的数据发送到乙机,乙机对接收的数据进行奇偶校验,若校验正确则乙机向甲机发出“数据发送正
确”的信息(现取00H 作为回答信号),甲机接收到乙机的此信息再发送下一个字节。若奇偶校验错,
则乙机发出“数据发送不正确”的信息(现取FFH 作为回答信号)给甲机要求甲机再次发送原数据,
直到数据发送正确。
乙机:将甲机发送的数据存入乙机片内RAM 的50H~5FH 单元中,进行奇偶校验,并发出相
应的回答信息(即00H 或FFH)给甲机。接收完了16 个数据后,通过P0 依次从0 到F 开始显示,看
看是否接收到的数据是否正确。
甲机程序:
ORG 0000H
LJMP MAIN
ORG 0023H ; 中断入口地址
LJMP SEC
ORG 0100H ;程序开始地址
MAIN: MOV SCON,#80H ; 串行口工作方式2,PCON 未设置,波特率不加倍
MOV IE,#90H ;打开总中断和串口中断
;下面绿色字体程序是将数据写入RAM 中的30H~3FH 单元中,如果地
址单元中已经有数据,可以将这段绿色程序删掉
MOV R0,#00H ;给R0 赋初值(0~F )
MOV R1,#30H ;给地址指针R1 赋数据存放的初始地址
MOV R2,#10H ;存放16 个数据
LOOP: MOV A,R0 ;将R0 中的值赋给A
ACALL TAB ; 调用子程序TAB
MOV @R1,A ;将A 中的值送R1 中地址
INC R0 ;R0 加1 取下一个数
INC R1 ;R1 加1 取下一个数据存放地址
DJNZ R2,LOOP ;是否将16 个数据存放完毕,否继续跳转到LOOP 存放
MOV R1,#30H ;给地址指针R1 赋提取数据的初始地址
MOV R2,#00H ;要提取数据个数的初值
MOV A,@R1 ;将R1 中的内容作为地址,把该地址的内容送A
MOV C,P ;取奇偶位送C
MOV TB8,C ;将C 送TB8
MOV SBUF,A ;发送数据
LJMP $ ;等待中断
SEC: JBC TI,D1 ; 中断响应 如果是TI =1,引起的清TI 跳转到D1,否则向下执行
CLR RI ; 中断是由RI 引起的,清RI
MOV A,SBUF ;将接到的数据送A
CJNE A,#00H,ERR ;将A 中的数据与00H 比较,不相等跳转到ERR,否则向下执行
D1: INC R1 ;表示接收正确,程序继续发送数据。R1 加1 取下一个发送的数
INC R2 ;R2 加1,计算发送数据的个数
MOV A,@R1 ;将R1 中的内容作为地址,把该地址的内容送A
MOV C,P ;取奇偶位送C
MOV TB8,C ;将C 的内容送TB8
MOV SBUF,A ;发送数据
CJNE R2,#10H,BACK ; 比较是否发完16 个数据,R2 不等于16 继续跳转到BACK 发送
CLR ES ;发送完毕关闭中断
LJMP BACK ; 中断返回
E
原创力文档

文档评论(0)