📄 rg2051.asm
字号:
;CPU用89C2051.
;2051接收PC机传来的每条记录的64个字节,再发送给8031.然后再接收,如此反复.
;P1口状态为条屏通讯地址选择,32H,33H,34H 40H--7FH有64个寄存器,接收数据
;2051通过P3.3与7858的P3.2相连.
;多机通讯协议.
;PC机命令集:'~''&''*''01'(地址)收到正确地址,返回地址,等待以下功能号
;#'DD...D','^''DD...D''@'条屏内容和方式
;!'DD...D','^''DD...D''@'校时,开关机时间
;PC机通讯信息0FFH起始,7FH结束
;汉字0A0H--0FEH ASCII字符一般20H--7EH
;没有0FFH起始则为摇控键值
;P1.7--OS1 P3.2--OS2 晶振选择
;00--11.0592MHZ 01--24MHZ 10--33.333MHZ 11--50MHZ
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP RESX
ORG 40H
LONG EQU 10 ;条屏长X字 (51最多40个字,52最多104个字)
MAIN:MOV SP,#08H
MOV P3,#0FFH
MOV P1,#0FFH
MOV R1,#10H
YAM1:MOV R2,#00H
YAM2:MOV R3,#00H
YAM3:CPL P3.4 ;看门狗信号输入
DJNZ R3,YAM3
DJNZ R2,YAM2
DJNZ R1,YAM1
MAIN2:MOV SP,#08H
MOV P3,#0FFH
MOV P1,#0FFH
SETB P3.3
MOV A,P1 ;根据P1口状态确定条屏通讯地址22H,23H,24H
ANL A,#7FH ;屏蔽P1.7最高位
MOV B,#100 ;地址:(30H,30H,30H)--(31H,32H,37H) 000--127
DIV AB
ADD A,#30H
MOV 22H,A
MOV A,B
MOV B,#10
DIV AB
ADD A,#30H
MOV 23H,A
MOV A,B
ADD A,#30H
MOV 24H,A
SETB P3.5 ;1487控制端--高电平收
MOV TMOD,#21H
JB P1.7,SEL3
JB P3.2,SEL2
MOV TH1,#0FDH
MOV TL1,#0FDH ;11.0592*1000000/32/12/(256-253)=9600bps FDH
MOV PCON,#00H ;80H波特率*2 11.0592MHZ,33.333MHZ==>00H 24MHZ,50MHZ==>80H
JMP SEL5
SEL2:MOV TH1,#0F3H
MOV TL1,#0F3H ;2*24*1000000/32/12/(256-243)=9600bps F3H
MOV PCON,#80H ;80H波特率*2 11.0592MHZ,33.333MHZ==>00H 24MHZ,50MHZ==>80H
JMP SEL5
SEL3:JB P3.2,SEL4
MOV TH1,#0F7H
MOV TL1,#0F7H ;33.333*1000000/32/12/(256-247)=9600bps F7H
MOV PCON,#00H ;80H波特率*2 11.0592MHZ,33.333MHZ==>00H 24MHZ,50MHZ==>80H
JMP SEL5
SEL4:MOV TH1,#0E5H
MOV TL1,#0E5H ;2*50*1000000/32/12/(256-253)=9600bps FDH
MOV PCON,#80H ;80H波特率*2 11.0592MHZ,33.333MHZ==>00H 24MHZ,50MHZ==>80H
SEL5:CLR ET1
CLR ET0
SETB TR1 ;开定时器1
MOV SCON,#0F0H ;接收数据第9位为1才接收
CLR RI
INX1:CPL P3.4 ;看门狗信号输入
JB P3.7,WAQS
JB P3.7,WAQS
JB P3.7,WAQS
LCALL DIR ;调红外接收子程序
MOV A,25H ;25H放已收到键值
LCALL SENC
WAQS:JNB RI,INX1 ;等待接收'~'
CLR RI
MOV A,SBUF
CJNE A,#7EH,WAQS ;判是否'~'
LCALL REC
MOV A,SBUF
CJNE A,#26H,WAQS ;判是否'&'
LCALL REC
MOV A,SBUF
CJNE A,#2AH,WAQS1 ;判是否'*' 通讯协议1
JMP WAQS2
WAQS1:CJNE A,#23H,WAQS ;判是否'#' 通讯协议2
JMP WAQS3
WAQS2:LCALL REC
MOV A,SBUF
CJNE A,#5AH,WAQS21 ;判是否'Z' 广播式通讯
JMP WAQS22
WAQS21:CJNE A,22H,ERRS ;通讯协议1 ;判是否与本机地址22H相同
LCALL REC
MOV A,SBUF
CJNE A,23H,ERRS ;判是否与本机地址23H相同
LCALL REC
MOV A,SBUF
CJNE A,24H,ERRS ;判是否与本机地址24H相同
WAQS22:CLR P3.5 ;1487控制端
SETB TB8
MOV A,#2AH
MOV SBUF,A ;回送'*'
JNB TI,$
CLR TI
MOV SCON,#0D0H ;清SM2位,接收任意数据
SETB P3.5 ;1487控制端
CLR 00H ;初始00H为0,表示第一幕
PRI: MOV R0,#44H ;接收数据的存放指针R0指向寄存器的40H单元.
PRI1:LCALL REC ;等待接收数据
MOV A,SBUF
MOV @R0,A ;收到数据放40H--7FH,共64单元
INC R0
CJNE R0,#80H,PRI1
LCALL REC ;等待接收'^''@'
MOV A,SBUF
CJNE A,#5EH,PRI2 ;'^'
LCALL SENCC
CLR P3.5 ;1487控制端
CLR TI
MOV SBUF,#5EH ;返回'^'
JNB TI,$
SETB P3.5 ;1487控制端
LJMP PRI
PRI2:CJNE A,#40H,ERRS ;看是否是'@'
LCALL SENCC
MOV A,#7FH ;结束向8031发#7FH
LCALL SENC
CLR P3.5 ;1487控制端
LCALL YAM ;延时相应7858处理数据时间
CLR TI
MOV SBUF,#40H ;返回'@'
JNB TI,$
ERRS:LJMP MAIN2
WAQS3:LCALL REC ;通讯协议2
MOV A,SBUF
CJNE A,#5AH,WAQS31 ;判是否'Z' 广播式通讯
JMP WAQS32
WAQS31:CJNE A,22H,ERRS ;判是否与本机地址22H相同
LCALL REC
MOV A,SBUF
CJNE A,23H,ERRS ;判是否与本机地址23H相同
LCALL REC
MOV A,SBUF
CJNE A,24H,ERRS ;判是否与本机地址24H相同
WAQS32:CLR P3.5 ;1487控制端
SETB TB8
MOV A,#23H
MOV SBUF,A ;回送'#'
JNB TI,$
CLR TI
MOV SCON,#0D0H ;清SM2位,接收任意数据
SETB P3.5 ;1487控制端
CLR 00H ;初始00H为0,表示第一幕
MOV A,#LONG
RL A
ADD A,#10 ;固定字型2个字节+方式8个字节
ADD A,#26H
MOV R7,A
MOV R0,#26H ;接收数据的存放指针R0指向寄存器的26H单元.
LCALL REC ;等待接收第1个数据
MOV A,SBUF
CJNE A,#21H,PRJ0 ;是否'!'
MOV R7,#31
PRQ1:LCALL REC ;等待接收数据
MOV A,SBUF
MOV @R0,A ;收到数据放26H--
INC R0
DJNZ R7,PRQ1
LCALL REC ;等待接收'^''@'
MOV A,SBUF
CJNE A,#40H,ERRS ;看是否是'@'
LCALL SENCD
JMP PRJ3
ERRS1:LJMP MAIN2
PRJ: MOV R0,#26H ;接收数据的存放指针R0指向寄存器的26H单元.
PRJ1:LCALL REC ;等待接收数据
MOV A,SBUF
PRJ0:MOV @R0,A ;收到数据放26H--7FH
INC R0
MOV A,R0
CJNE A,07H,PRJ1
LCALL REC ;等待接收'^''@'
MOV A,SBUF
CJNE A,#5EH,PRJ2 ;'^'
LCALL SENCB
CLR P3.5 ;1487控制端
CLR TI
MOV SBUF,#5EH ;返回'^'
JNB TI,$
SETB P3.5 ;1487控制端
LJMP PRJ
PRJ2:CJNE A,#40H,ERRS1 ;看是否是'@'
LCALL SENCB
MOV A,#7FH ;结束向8031发#7FH
LCALL SENC
PRJ3:CLR P3.5 ;1487控制端
LCALL YAM ;延时相应7858处理数据时间
CLR TI
MOV SBUF,#40H ;返回'@'
JNB TI,$
LJMP MAIN2
;---------------------------------
YAM: MOV R5,#01 ;延时相应7858处理数据时间
YAM11:MOV R4,#0FFH
YAM12:MOV R3,#0FFH
CPL P3.4 ;看门狗信号输入
DJNZ R3,$
DJNZ R4,YAM12
DJNZ R5,YAM11
RET
;---------------------------------
SENCB:JB 00H,SENCB0 ;发送该条记录的COU个字节到8031程序
SETB 00H ;超时计数器2EH置0,置00H标记
MOV A,#0FEH ;向8031发送一特征字节0FFH,表示后要跟数据
LCALL SENC
SENCB0:MOV R0,#26H ;传送一幕记录数据;R0为传送数据的起始指针
SECB1:MOV A,@R0
LCALL SENC
INC R0
MOV A,R0
CJNE A,07H,SECB1
RET
;---------------------------------
SENCC:JB 00H,SENQ ;发送该条记录的COU个字节到8031程序
SETB 00H ;超时计数器2EH置0,置00H标记
MOV A,#0FFH ;向8031发送一特征字节0FFH,表示后要跟数据
LCALL SENC
SENQ: MOV R0,#44H ;传送一幕记录数据;R0为传送数据的起始指针
SEC2: MOV A,@R0
LCALL SENC
INC R0
CJNE R0,#80H,SEC2
RET
;---------------------------------
SENCD:MOV A,#0FDH ;向8031发送一特征字节0FFH,表示后要跟数据
LCALL SENC
MOV R7,#31
MOV R0,#26H ;传送一幕记录数据;R0为传送数据的起始指针
SECD2:MOV A,@R0
LCALL SENC
INC R0
DJNZ R7,SECD2
RET
;---------------------------------
REC: MOV R3,#20H
CPL P3.4 ;看门狗信号输入
REC1: MOV R4,#0FFH
REC2: MOV R5,#0FFH
REC3: JBC RI,REC5
JBC RI,REC5
JBC RI,REC5
JBC RI,REC5
CPL P3.4 ;看门狗信号输入
DJNZ R5,REC3
DJNZ R4,REC2
DJNZ R3,REC1
; LJMP REC
POP DPH
POP DPL
MOV DPTR,#MAIN
PUSH DPL
PUSH DPH
REC5: RET
;-------------------------
RESX:INC 25H ;在发送数据到8031时,若超时,与8031联系不上,则退出
MOV A,25H
CJNE A,#03H,REX1
MOV 25H,#00H
CLR ET0
CLR EA
POP DPH
POP DPL
MOV DPTR,#MAIN
PUSH DPL
PUSH DPH
REX1:RETI
;---------------------------------------------
SENC:MOV TH0,#00H ;通过P3.3发送数据到点阵主板子程序
MOV TL0,#00H
MOV TMOD,#21H
SETB 2DH ;选择定时器0的工作.
MOV 25H,#00H
CLR TF0
SETB ET0 ;打开定时器1计时
SETB EA
MOV R1,#08H
CLR P3.3 ;先发一低电平
NOP
NOP
NOP
SETB P3.3 ;再高位守键
SETB TR0
SEQ1:JB P3.3,SEQ1 ;等待一低电平
CLR TR0 ;联络上,发送一字节数据
SEQ2:NOP ;联络不上,超时退出
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RRC A
MOV P3.3,C
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R1,SEQ2
CLR TR0
CLR ET0
CLR 2DH
SETB P3.3
CPL P3.4 ;看门狗信号输入
MOV R4,#50 ;延时一断时间
AF1:DJNZ R4,AF1
RET
;----------------------------------------------------
DIR: ;红外接收子程序
AJMP L00
L0: POP ACC
POP ACC
MOV DPTR,#INX1
PUSH DPL
PUSH DPH
RET
L00:MOV TMOD,#21H
MOV TH0,#00H
MOV TL0,#00H
MOV A,#00H
MOV R0,#00H
CPL P3.4 ;看门狗信号输入
AA: JB P3.7,$
JB P3.7,AA
JB P3.7,AA
SETB TR0
AA1:JNB P3.7,$
JNB P3.7,AA1
JNB P3.7,AA1
CLR TR0
MOV A,TH0 ;晶振频率11.0592MHZ=1DH 24MHZ=41H 33.333MHZ=59H 50HMZ=8AH
JB P1.7,DSL3
JB P3.2,DSL2
CJNE A,#1DH,L01 ;TH0=9MS/((12/11.0592/1000)*256)
LJMP L02 ;9MS>X>8MS
DSL2:CJNE A,#41H,L01 ;TH0=9MS/((12/11.0592/1000)*256)
LJMP L02 ;9MS>X>8MS
DSL3:JB P3.2,DSL4
CJNE A,#59H,L01 ;TH0=9MS/((12/11.0592/1000)*256)
LJMP L02 ;9MS>X>8MS
DSL4:CJNE A,#8AH,L01 ;TH0=9MS/((12/11.0592/1000)*256)
LJMP L02 ;9MS>X>8MS
L01:JC L0
L02:MOV TH0,#00H
MOV TL0,#00H
MOV A,#00H
MOV R0,#00H
SETB TR0
CPL P3.4 ;看门狗信号输入
BB1:JB P3.7,$
JB P3.7,BB1
JB P3.7,BB1
CLR TR0
MOV A,TH0
JB P1.7,ESL3
JB P3.2,ESL2
CJNE A,#0DH,L03 ;4.5MS>X>3.5MS 11MHZ=0DH
LJMP L0
ESL2:CJNE A,#1FH,L03 ;4.5MS>X>3.5MS 24MHZ=1FH
LJMP L0
ESL3:JB P3.2,ESL4
CJNE A,#2BH,L03 ;4.5MS>X>3.5MS 33.333MHZ=2BH
LJMP L0
ESL4:CJNE A,#41H,L03 ;4.5MS>X>3.5MS 50MHZ=41H
L07:LJMP L0
L03:JC L07
LCALL L04
MOV 25H,A
LCALL L04
XRL A,25H
CJNE A,#0FFH,L07
LCALL L04
MOV 25H,A
LCALL L04
XRL A,25H
CJNE A,#0FFH,L07
RET
L04:MOV R3,#08H
MOV A,#00H
MOV R0,#00H
MOV R5,#00H
L06:MOV TH0,#00H
MOV TL0,#00H
CPL P3.4 ;看门狗信号输入
CC: JNB P3.7,$
JNB P3.7,CC
JNB P3.7,CC
SETB TR0
CC1:JB P3.7,$
JB P3.7,CC1
JB P3.7,CC1
JB P3.7,CC1
CLR TR0
MOV R0,TH0 ;0.56MS==>BIT=0 1.125MS-->BIT=1
JB P1.7,FSL3
JB P3.2,FSL2
CJNE R0,#03H,L05 ;R0>#03H,CY<-0,R0<#03H,CY<-1
JMP L05
FSL2:CJNE R0,#06H,L05 ;R0>#03H,CY<-0,R0<#03H,CY<-1
JMP L05
FSL3:JB P3.2,FSL4
CJNE R0,#09H,L05 ;R0>#03H,CY<-0,R0<#03H,CY<-1
JMP L05
FSL4:CJNE R0,#0DH,L05 ;R0>#03H,CY<-0,R0<#03H,CY<-1
L05:CPL C ;11MHZ=03H 24MHZ=06H 33.333MHZ=09H 50MHZ=0DH
RLC A
DJNZ R3,L06
RET
;----------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -