📄 receive.asm
字号:
/***************************************************************+
*文件名: Receive.asm
*版权: www.zlgmcu.com
*日期: 16:27 04-3-16
*功能: 多机红外通信接收端程序代码
****************************************************************/
$NOMOD51
$INCLUDE (REG932.INC)
INFR EQU P0.4 ;定义红外接收端口
MOTOR_CONTROL EQU P0.5 ;定义外部设备控制端口
HEADFLAG BIT 0x10 ;定义帧头出错标志
BITFLAG BIT 0x11 ;定义位出错标志
DATA1 DATA 0x30 ;定义DATA1全局变量
DATA2 DATA 0x31 ;定义DATA2全局变量
;-------------------------------------
ORG 0000H
AJMP MAIN
ORG 003BH
AJMP KEY_ISR
;-------------------------------------
ORG 0080H
MAIN:
MOV P0M1,#0x00 ;定义P0口模式
MOV P0M2,#0x00
ACALL KEYISR_INIT ;调用按键中断初始化程序
ACALL DELAY100US
LOOP:
ACALL POWER_DOWN ;调用完全掉电程序
AJMP LOOP
RET
;-------------------------------------
;功能:键盘中断初始化
;-------------------------------------
KEYISR_INIT:
MOV KBMASK,#0x10 ;P04键盘中断
MOV KBCON,#0x00 ;清键盘中断标志位
SETB EKBI ;键盘中断使能
SETB EA ;开中断
RET
;-------------------------------------
;功能:完全掉电
;-------------------------------------
POWER_DOWN:
MOV PCONA,#0xFF ;功能模块掉电
MOV PCON,#0x03 ;进入完全掉电状态
RET
;-------------------------------------
;功能:帧校验
;-------------------------------------
READHEAD:
MOV A,#4
ACALL DELAY_N00US ;延时400us
JNB INFR,SKIP1 ;INFR为0,跳至SKIP1
SETB HEADFLAG ;INFR为1,置帧错误标志
SKIP1:
ACALL DELAY100US ;延时100us
JNB INFR,SKIP2 ;再次读INFR,并对其进行判断,其为0,跳
SETB HEADFLAG ;为1,置帧错误标志
SKIP2:
MOV A,#5
ACALL DELAY_N00US ;延时500us
MOV A,#4
ACALL DELAY_N00US ;延时400us
JB INFR,SKIP3 ;INFR为1,跳至SKIP3
SETB HEADFLAG ;INFR为0,置帧错误标志
SKIP3:
ACALL DELAY100US ;延时100us
JB INFR,SKIP4 ;再次读INFR,并对其进行判断,其为1,跳
SETB HEADFLAG ;为0,置帧错误标志
SKIP4:
MOV A,#5
ACALL DELAY_N00US
MOV A,#4
ACALL DELAY_N00US ;延时400us
JNB INFR,SKIP5 ;INFR为0,跳至SKIP5
SETB HEADFLAG ;INFR为1,置帧错误标志
SKIP5:
ACALL DELAY100US ;延时100us
JNB INFR,SKIP6 ;再次读INFR,并对其进行判断,其为0,跳
SETB HEADFLAG ;为1,置帧错误标志
SKIP6:
MOV A,#5
ACALL DELAY_N00US ;延时500us
RET
;-------------------------------------
;功能:从红外线传送的数据上读取1字节
;出口参数:A
;-------------------------------------
READBYTE:
CLR A ;将A清0
MOV R7,#8 ;定义循环次数8
READBYTE_START:
ACALL DELAY100US ;延时100US
JB INFR,BIT1 ;读INFR,为1,则跳至BIT1
BIT0: ANL A,#0xEF ;为0,清最高位为0
JMP READBIT_OVER
BIT1: ORL A,#0x80 ;为1,置最高位为1
READBIT_OVER:
RL A ;左移1位
MOV R4,A ;保存A
MOV A,#4
ACALL DELAY_N00US ;延时400us
MOV A,R4 ;还原A
DJNZ R7,READBYTE_START
RET
;-------------------------------------
;功能:读取接收到的红外数据
;出口参数:DATA1,DATA2
;-------------------------------------
READDATA:
ACALL READBYTE ;读取一字节
MOV DATA1,A ;存入DATA1
ACALL READBYTE ;读取一字节
MOV DATA2,A ;存如DATA2
RET
;-------------------------------------
;功能:延时100US
;注:在7.373Mhz情况下
;-------------------------------------
DELAY100US:
MOV R7,#182
LOOP1:
DJNZ R7,LOOP1
RET
;-------------------------------------
;功能:延时N x 100us,
;入口参数:A
;-------------------------------------
DELAY_N00US:
MOV R5,A
LOOP_N00US:
ACALL DELAY100US
DJNZ R5,LOOP_N00US
RET
;-------------------------------------
;功能:MS级延时
;入口参数:A
;-------------------------------------
DELAYMS:
MOV R3,A
LOOPMS1:
MOV R4,#10
LOOPMS2:
ACALL DELAY100US
DJNZ R4,LOOPMS2
DJNZ R3,LOOPMS1
RET
;-------------------------------------
;功能:键盘中断服务程序
;-------------------------------------
KEY_ISR:
CLR EA ;关中断
MOV PCONA,#0x00 ;外部功能模块上电
JNB INFR,$ ;读取INFR,等待其为1,
MOV A,#5
ACALL DELAYMS ;延时5ms
JB INFR,$ ;等待INFr为0
ACALL READHEAD ;帧头校验
ACALL READDATA ;读数据
MOV A,DATA1
CJNE A,#0x01,NONE_CONTROL ;判断数据,
SETB MOTOR_CONTROL ;为1,则开外部设备(灯)
/*
MOV A,DATA2
CJNE A,#0x02,NONE_CONTROL ;判断数据,
SETB MOTOR_CONTROL ;为2,则开外部设备(灯)
*/
NONE_CONTROL:
MOV KBCON,#0x00 ;清键盘中断标志
SETB EA ;开中断
RETI
;-------------------------------------
END
;-------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -