?? receive.asm
字號:
/***************************************************************+
*文件名: Receive.asm
*版權(quán): www.zlgmcu.com
*日期: 16:27 04-3-16
*功能: 多機紅外通信接收端程序代碼
****************************************************************/
$NOMOD51
$INCLUDE (REG932.INC)
INFR EQU P0.4 ;定義紅外接收端口
MOTOR_CONTROL EQU P0.5 ;定義外部設(shè)備控制端口
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 ;調(diào)用按鍵中斷初始化程序
ACALL DELAY100US
LOOP:
ACALL POWER_DOWN ;調(diào)用完全掉電程序
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 ;進入完全掉電狀態(tài)
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
;-------------------------------------
;功能:從紅外線傳送的數(shù)據(jù)上讀取1字節(jié)
;出口參數(shù):A
;-------------------------------------
READBYTE:
CLR A ;將A清0
MOV R7,#8 ;定義循環(huán)次數(shù)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
;-------------------------------------
;功能:讀取接收到的紅外數(shù)據(jù)
;出口參數(shù):DATA1,DATA2
;-------------------------------------
READDATA:
ACALL READBYTE ;讀取一字節(jié)
MOV DATA1,A ;存入DATA1
ACALL READBYTE ;讀取一字節(jié)
MOV DATA2,A ;存如DATA2
RET
;-------------------------------------
;功能:延時100US
;注:在7.373Mhz情況下
;-------------------------------------
DELAY100US:
MOV R7,#182
LOOP1:
DJNZ R7,LOOP1
RET
;-------------------------------------
;功能:延時N x 100us,
;入口參數(shù):A
;-------------------------------------
DELAY_N00US:
MOV R5,A
LOOP_N00US:
ACALL DELAY100US
DJNZ R5,LOOP_N00US
RET
;-------------------------------------
;功能:MS級延時
;入口參數(shù):A
;-------------------------------------
DELAYMS:
MOV R3,A
LOOPMS1:
MOV R4,#10
LOOPMS2:
ACALL DELAY100US
DJNZ R4,LOOPMS2
DJNZ R3,LOOPMS1
RET
;-------------------------------------
;功能:鍵盤中斷服務(wù)程序
;-------------------------------------
KEY_ISR:
CLR EA ;關(guān)中斷
MOV PCONA,#0x00 ;外部功能模塊上電
JNB INFR,$ ;讀取INFR,等待其為1,
MOV A,#5
ACALL DELAYMS ;延時5ms
JB INFR,$ ;等待INFr為0
ACALL READHEAD ;幀頭校驗
ACALL READDATA ;讀數(shù)據(jù)
MOV A,DATA1
CJNE A,#0x01,NONE_CONTROL ;判斷數(shù)據(jù),
SETB MOTOR_CONTROL ;為1,則開外部設(shè)備(燈)
/*
MOV A,DATA2
CJNE A,#0x02,NONE_CONTROL ;判斷數(shù)據(jù),
SETB MOTOR_CONTROL ;為2,則開外部設(shè)備(燈)
*/
NONE_CONTROL:
MOV KBCON,#0x00 ;清鍵盤中斷標志
SETB EA ;開中斷
RETI
;-------------------------------------
END
;-------------------------------------
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -