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