⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rg2051.asm

📁 用于接收红外摇控器和异步串行的8051单片机程序
💻 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 + -