|
/*************************************************************** *文件名: 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 ;-------------------------------- |