|
/*************************************************************** *文件名: host.asm *版權(quán): www.zlgmcu.com *日期: 16:27 04-3-16 *功能: 多機(jī)紅外通信發(fā)送端程序代碼 ***************************************************************/ $NOMOD51 $INCLUDE(REG932.INC) KEY1 EQU P0.0 ;定義KEY1鍵 KEY2 EQU P0.1 ;定義KEY2鍵 INFR EQU P0.3 ;定義紅外發(fā)送引腳 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預(yù)分頻為5+1 MOV CCCRA,#0x01 ;非反相的PWM在比較匹配時置位,在CCU定時器向下溢出時清0 SETB PLLEN ;啟動PLL SETB OCA JNB PLLEN,$ MOV TCR20,#0x82 ;設(shè)置輸出模式,非反相PWM RET ;-------------------------------- ;功能:鍵盤中斷初始化 ;-------------------------------- KEYISR_INIT: MOV KBMASK,#0x03 ;設(shè)置P01->P00為中斷源 MOV KBCON,#0x00 ;清除鍵盤中斷標(biāo)志 SETB EKBI ;鍵盤中斷允許 SETB EA ;開中斷 RET ;-------------------------------- ;功能:完全掉電 ;-------------------------------- POWER_DOWN: MOV PCONA,#0xFF ;外部模塊掉電 MOV PCON,#0x03 ;進(jìn)入完全掉電模式 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 ;發(fā)送啟動設(shè)備1(燈)的指令 JMP NOKEY_DOWN KEY2_DOWN: ;KEY2按下 JNB KEY2,$ ;等待KEY2為1 ACALL START_DEVICE02 ;發(fā)送啟動設(shè)備2(門/窗)的指令 JMP NOKEY_DOWN NOKEY_DOWN: RET ;-------------------------------- ;功能:啟動外部設(shè)備1 ;-------------------------------- START_DEVICE01: ACALL SEND_HEAD ;發(fā)送幀頭 MOV A,#0x01 ACALL SEND_DATA ;發(fā)送數(shù)據(jù) RET ;-------------------------------- START_DEVICE02: ACALL SEND_HEAD ;發(fā)送幀頭 MOV A,#0x02 ACALL SEND_DATA ;發(fā)送數(shù)據(jù) RET ;-------------------------------- ;功能:發(fā)送幀頭 ;-------------------------------- 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 ;-------------------------------- ;功能:通過紅外載波發(fā)送數(shù)據(jù) ;入口參數(shù):R6 ;-------------------------------- SEND_DATA: MOV R7,#8 ;循環(huán)次數(shù) START_SEND: MOV A,R6 RLC A ;將最高位移入A JC BIT1 ;當(dāng)C為1時,跳至BIT1 JMP BIT0 ;跳至BIT0 BIT1: SETB INFR ;INFR置高 AJMP SENDBIT BIT0: CLR INFR ;INFR置0 MOV R6,A ;將A保存進(jìn)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級延時 ;入口參數(shù):A ;--------------------------------- DELAYMS: MOV R3,A LOOP_N: MOV R2,#10 LOOP10: ACALL DELAY100US DJNZ R2,LOOP10 DJNZ R3,LOOP_N RET ;--------------------------------- ;功能:鍵盤中斷服務(wù)程序 ;--------------------------------- KEY_ISR: CLR EA ;關(guān)中斷 MOV PCONA,#0x00 ;外部功能模塊上電 ACALL CCU_INIT ;CCU初始化 MOV A,#10 ACALL DELAYMS ;延時10ms ACALL READ_KEY ;調(diào)用判斷按鍵子程序 MOV KBCON,#0x00 ;清中斷標(biāo)志位 MOV A,#50 ACALL DELAYMS ;延時50ms SETB EA ;開中斷 RETI ;-------------------------------- END ;-------------------------------- |