📄 wireless.asm
字号:
ORG 0000H ;主程序入口
AJMP START
ORG 0023H ;中断服务子程序入口
AJMP RECEIVE
ORG 0030H
START: MOV P2,#7FH ;LED灯全灭,P2.7=0使TXEN=0,模块处于接收状态
LCALL DELAY_10ms ;时间延迟
MOV R0,#50H ;R0(50H)中存放接收数据地址
;MOV R5,#00H ;R5(校验和寄存器)清零
MOV SCON,#50H ;串行口方式1,允许接收
MOV TMOD,#20H ;初始化T1为定时器方式,模式2
MOV TH1,#0FDH ;设置计数常数,波特率为9600b/s
MOV TL1,#0FDH
MOV 87H,#00H ;SMOD=0
SETB TR1 ;启动定时器T1
SETB EA ;开全局中断
SETB ES ;开串行口中断
; MOV R0,#50H ;R0为接收数据存放地址(50H)
;MOV R2,#01H ;R1存放命令
;MOV R3,#03H ;R2存放地址及命令发送次数(3次)
;CLR P2.7 ;设置TXEN=0,使模块处于接收状态
; LCALL DELAY_10ms ;时间延迟
; SJMP $
; LJMP MAIN ;等待串口中断
;***********************************************************************
;串口中断接收数据中断子程序
RECEIVE: MOV R4,#00H ;R4为校验和寄存器
CLR RI
MOV A,SBUF ;接收字符
CJNE A,#0FFH,RXD_ERR ;接收是否FFH?不是则跳转
ADD A,R4 ;形成累加校验和
MOV R4,A
JNB RI,$ ;接收字符
CLR RI
MOV A,SBUF
CJNE A,#00H,RXD_ERR ;接收是否00H,不是则跳转
ADD A,R4
MOV R4,A
MOV R6,#00H ;R6存放接收次数(6次)
RXSIX: JNB RI,$ ;接收数据
CLR RI
MOV A,SBUF
ADD A,R4 ;形成校验和
MOV R4,A
MOV R0,A ;把数据命令放入50H开始的数据寄存器
INC R0
DJNZ R2,RXSIX ;接收6次数据
JNB RI,$
CLR RI
MOV A,SBUF ;接收校验和
SUBB A,R4 ;比较校验和是不是正确
JNZ RXD_ERR ;校验和不正确则跳转
LCALL COMPARE ;调用比较子程序比较三对地址和命令数据
MOV A,P2 ;判断三对数据是否至少有两对相同
CJNE A,#00H,RXD_END ;不相等(P2=00H)则跳转
MOV R2,50H ;R2存放地址
MOV R3,51H ;R3存放命令标志
SJMP RXD_END
RXD_ERR: MOV P2,#00H ;数据错,灯全亮
RXD_END: RETI
;***********************************************************************
MAIN: CLR EA ;关闭中断
LCALL PROCESSOR ;调数据处理子程序
SETB EA
;**********************************************************************
;延时子程序
DELAY_10ms: MOV R7,#32
DEL1: MOV R6,#142 ;因为晶振为11.0592MHZ,所以t=12/(11.0592×1000000)
NOP
DEL2: DJNZ R6,DEL2 ;142×2t+2t=286t
DJNZ R7,DEL1 ;(286t+2t)×32+t=10.001ms
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -