📄 host.asm
字号:
/***************************************************************
*文件名: host.asm
*版权: www.zlgmcu.com
*日期: 16:27 04-3-16
*功能: 多机红外通信发送端程序代码
***************************************************************/
$NOMOD51
$INCLUDE(REG932.INC)
KEY1 EQU P0.0 ;定义KEY1键
KEY2 EQU P0.1 ;定义KEY2键
INFR EQU P0.3 ;定义红外发送引脚
PLLEN BIT TCR20.7
;------------------------------
ORG 0000H
AJMP MAIN
ORG 003BH
AJMP KEY_ISR
;------------------------------
ORG 0080H
MAIN:
MOV P0M1,#0x00 ;定义P0口属性
MOV P0M2,#0x00
MOV P2M1,#0x40 ;定义P2.6(OCA)口属性
MOV P2M2,#0x40
ACALL CCU_INIT ;CCU初始化
ACALL KEYISR_INIT ;键盘中断初始化
LOOP:
ACALL POWER_DOWN ;完全掉电
AJMP LOOP
RET
;-------------------------------
;功能:CCU初始化
;-------------------------------
CCU_INIT:
MOV TOR2H,#0x02 ;CCU定时器重装值
MOV TOR2L,#0x05
MOV OCRAH,#0x01 ;(OCRAH:OCRAL)=(TOR2H:TOR2L)/2,PWM的占空比为50%
MOV OCRAL,#0x02
MOV TCR21,#0x85 ;PLL预分频为5+1
MOV CCCRA,#0x01 ;非反相的PWM在比较匹配时置位,在CCU定时器向下溢出时清0
SETB PLLEN ;启动PLL
SETB OCA
JNB PLLEN,$
MOV TCR20,#0x82 ;设置输出模式,非反相PWM
RET
;--------------------------------
;功能:键盘中断初始化
;--------------------------------
KEYISR_INIT:
MOV KBMASK,#0x03 ;设置P01->P00为中断源
MOV KBCON,#0x00 ;清除键盘中断标志
SETB EKBI ;键盘中断允许
SETB EA ;开中断
RET
;--------------------------------
;功能:完全掉电
;--------------------------------
POWER_DOWN:
MOV PCONA,#0xFF ;外部模块掉电
MOV PCON,#0x03 ;进入完全掉电模式
RET
;--------------------------------
;功能:按键判断程序
;--------------------------------
READ_KEY:
MOV A,#12
ACALL DELAYMS ;延时12MS
JNB KEY1,KEY1_DOWN ;判断KEY1是否按下
JNB KEY2,KEY2_DOWN ;判断KEY2是否按下
JMP NOKEY_DOWN
KEY1_DOWN: ;KEY1按下
JNB KEY1,$ ;等待KEY1为1
ACALL START_DEVICE01 ;发送启动设备1(灯)的指令
JMP NOKEY_DOWN
KEY2_DOWN: ;KEY2按下
JNB KEY2,$ ;等待KEY2为1
ACALL START_DEVICE02 ;发送启动设备2(门/窗)的指令
JMP NOKEY_DOWN
NOKEY_DOWN:
RET
;--------------------------------
;功能:启动外部设备1
;--------------------------------
START_DEVICE01:
ACALL SEND_HEAD ;发送帧头
MOV A,#0x01
ACALL SEND_DATA ;发送数据
RET
;--------------------------------
START_DEVICE02:
ACALL SEND_HEAD ;发送帧头
MOV A,#0x02
ACALL SEND_DATA ;发送数据
RET
;--------------------------------
;功能:发送帧头
;--------------------------------
SEND_HEAD:
CLR INFR ;拉低INFR
MOV A,#50
ACALL DELAYMS ;延时50ms
SETB INFR ;拉高INFR
MOV A,#10
ACALL DELAYMS ;延时10ms
CLR INFR ;拉低INFR
MOV A,#1
ACALL DELAYMS ;延时1ms
SETB INFR ;拉高INFR
MOV A,#1
ACALL DELAYMS ;延时1ms
CLR INFR ;拉低INFR
MOV A,#1
ACALL DELAYMS ;延时1ms
RET
;--------------------------------
;功能:通过红外载波发送数据
;入口参数:R6
;--------------------------------
SEND_DATA:
MOV R7,#8 ;循环次数
START_SEND:
MOV A,R6
RLC A ;将最高位移入A
JC BIT1 ;当C为1时,跳至BIT1
JMP BIT0 ;跳至BIT0
BIT1:
SETB INFR ;INFR置高
AJMP SENDBIT
BIT0:
CLR INFR ;INFR置0
MOV R6,A ;将A保存进R6
SENDBIT:
ACALL DELAY400US ;延时400us
DJNZ R7,START_SEND
RET
;---------------------------------
;功能:延时100us(7.373MHz时)
;---------------------------------
DELAY100US:
MOV R5,#182
LOOP1:
DJNZ R5,LOOP1
RET
;---------------------------------
;功能:延时400us
;---------------------------------
DELAY400US:
MOV R3,#4
LOOP4:
ACALL DELAY100US
DJNZ R3,LOOP4
RET
;---------------------------------
;功能:ms级延时
;入口参数:A
;---------------------------------
DELAYMS:
MOV R3,A
LOOP_N:
MOV R2,#10
LOOP10:
ACALL DELAY100US
DJNZ R2,LOOP10
DJNZ R3,LOOP_N
RET
;---------------------------------
;功能:键盘中断服务程序
;---------------------------------
KEY_ISR:
CLR EA ;关中断
MOV PCONA,#0x00 ;外部功能模块上电
ACALL CCU_INIT ;CCU初始化
MOV A,#10
ACALL DELAYMS ;延时10ms
ACALL READ_KEY ;调用判断按键子程序
MOV KBCON,#0x00 ;清中断标志位
MOV A,#50
ACALL DELAYMS ;延时50ms
SETB EA ;开中断
RETI
;--------------------------------
END
;--------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -