单片机89C51全双工串行通信汇编.pdfVIP

  • 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)

1亿VIP精品文档

相关文档