📄 code1.txt
字号:
;主机程序
ORG 0000H
LJMP START
DELAY: MOV R7,#0
DELAYLOOP: DJNZ R7,DELAYLOOP
DJNZ R6,DELAYLOOP
RET
RECEIVE: ;接收数据块的长度
CLR RI
JNB RI,$
MOV A,SBUF
MOV R2,A ;将数据块长度存到R2
MOV R0,#30H ;设置数据块存放始地址
MOV 70H,#0 ;校验和初始化为零
CLR RI ;清接收中断标志
RECER: JNB RI,$ ;等待接收一个字节数据
MOV A,SBUF ;将已接收到的一个字节数据送A
CLR RI
MOV @R0,A ;存放数据块
INC R0 ;准备下个要接收数据的存放地址
ADD A,70H ;计算接收数据的校验和
MOV 70H,A ;暂存校验和
DJNZ R2,RECER ;所有数据接收完?否,跳到RECER
JNB RI,$ ;等待接收从机的校验和
MOV A,SBUF ;从机校验和送A
CJNE A,70H,RECEIVEX ;接收到的校验和等于从机发送的校验和?否,跳到RECEIVEX
MOV SBUF,#00H ;是,向从机发回接收正确的标志00H
CLR REN ;不允许再接收
RET
RECEIVEX: MOV SBUF,#0FFH ;向从机发回接收出错标志0FFH
SJMP RECEIVE ;再次接收数据块
DISPLAYLED: MOV R0,#30H
DISPLAY: MOV R1,#4 ;共四个八段管
MOV R3,#11111110B ;从左边开始显示
LOOP: MOV P2,#0FH ;关所有八段管
MOV P1,R0 ;显示一位八段管
MOV P2,R3
MOV R6,#1
LCALL DELAY ;调用延迟子程序
MOV A,R3 ;显示下一位
RL A
MOV R3,A
INC R0
DEC R2 ;数据块长度减1
DJNZ R1,LOOP ;四位显示完?否,跳到LOOP
MOV A,R2 ;将R2中的值给A
JNZ DISPLAY ;数据块都显示完?否,跳到DISPLAY
RET ;是,返回
START: MOV SP,#70H ;设置堆栈指针
MOV PCON,#00H ;设置SMOD=0
MOV TMOD,#20H ;定时器T1设置为方式2
MOV TH1,#0FDH ;设置波特率为9600bps
MOV TL1,#0FDH
SETB TR1 ;启动T1
MOV SCON,#0F8H ;串口工作于方式3,允许接收,TB8=1
MOV R7,#1 ;设置通信的次数
MOV 10H,#01H ;被寻址的从机地址暂存到10H
AA: MOV SBUF,10H ;发送从机地址
CLR TI ;清发送中断标志位
JNB TI,$ ;等待发送完
CLR RI ;清接收中断标志位
JNB RI,$ ;等待从机应答
MOV A,SBUF ;从机应答地址送A
CJNE A,10H,AAX ;从机应答地址相符?否,跳至AAX
LCALL RECEIVE ;是,接收从机发过来的数据块
MOV R4,#30 ;设置刷新次数
DISAGAIN: LCALL DISPLAYLED ;调用显示子程序
DJNZ R4,DISAGAIN
INC 10H ;准备下个被寻址从机地址
DJNZ R7,AA ;所有从机都完成通信?否,跳到AA
AAX: MOV SBUF,#0FFH ;送从机拒绝接收命令
CLR TI
JNB TI,$ ;等待命令发送完成
SETB TB8 ;重设地址帧标志
SJMP AA ;跳到AA,重新发送该从机地址
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -