?? irrece1.asm
字號:
/***********************************************************
紅外線解碼程序
引導碼: 9ms 4.5ms
函數調用
unsinged char IRRead();
***********************************************************/
?PRIRRead SEGMENT CODE
PUBLIC IRREAD
RSEG ?PRIRRead
IRREAD:
CLR EA
SETB P3.2
CLR P3.5
// JB P3.2, $ ;等待紅外線脈沖
MOV R6,#3
SB: LCALL YS3 ;調用900微秒延時子程序
JB P3.2,EXIT ;延時882微秒后判斷P3.2腳是否出現高電平如果有就退出解碼程序
DJNZ R6, SB ;重復3次,目的是檢測在3000微秒內如果出現高電平就退出解碼程序
;以上完成對遙控信號的9000微秒的初始低電平信號的識別。
; JNB P3.2, $ ;等待高電平避開9毫秒低電平引導脈沖
LCALL IOLOW_ERR ;低電平超時判斷
CJNE R4,#160,DD0
LJMP EXITERR
DD0: MOV R6,#3
SB1: LCALL YS3 ;調用延時1600us
JNB P3.2,EXIT ;延時900微秒后判斷P3.2腳是否出現低電平如果有就退出解碼程序
DJNZ R6, SB1 ;重復3次,目的是檢測在3000微秒內如果出現高電平就退出解碼程序
; JB P3.2, $ ;等待高電平避開3毫秒低電平引導脈沖
LCALL IOHEI_ERR ;高電平超時判斷
CJNE R4,#160,DD1
LJMP EXITERR
DD1: SETB P3.5
MOV R1,#1AH ;設定1AH為起始RAM區
MOV R2,#2
PP: MOV R3,#8
JJJJ:
; JNB P3.2,$ ;等待地址碼第一位的高電平信號
LCALL IOLOW_ERR ;低電平超時判斷
CJNE R4,#160,DD2
LJMP EXITERR
DD2: LCALL YS1 ;高電平開始后用882微秒的時間尺去判斷信號此時的高低電平狀態
MOV C,P3.2 ;將P3.2引腳此時的電平狀態0或1存入C中
JNC UUU ;如果為0就跳轉到UUU
; SETB P3.5
; JB P3.2,$ ;如果為1就等待高電平信號結束
; CLR P3.5
LCALL IOHEI_ERR ;高電平超時判斷
CJNE R4,#160,UUU
LJMP EXITERR
UUU: MOV A,@R1 ;將R1中地址的給A
RLC A ;將C中的值0或1移入A中的最低位
MOV @R1,A ;將A中的數暫時存放在R1中
DJNZ R3,JJJJ ;接收地址碼的高8位
INC R1 ;對R1中的值加1,換成下一個RAM
DJNZ R2,PP ;接收完16位地址碼和8位數據碼和8位數據反碼,存放在1AH/1BH/1CH/1DH的RAM中
;以下對代碼是否正確和定義進行識別
;判斷結束碼
; SETB P3.5
LCALL YS2 ;延時6ms
LCALL YS2
LCALL YS2 ;延時6ms
LCALL YS2
CLR P3.5
; JNB P3.2, EXIT ;判斷P3.2是低電平 ,說明是錯誤碼,退出,是高電平,正確
; LCALL IOLOW_ERR ;低電平超時判斷
; CJNE R4,#160,DD4
; LJMP EXITERR
EXIT:
SETB EA ;允許中斷
MOV R7,#1
RET
EXITERR:
LCALL YS2 ;延時6ms
LCALL YS2
SETB EA ;允許中斷
MOV R7,#0
RET
YS1: MOV R4,#20 ;延時子程序1,精確延時1600微秒20Mhz 413 * 20 * (指令周期0.1808) = 1493
D1: MOV R5,#205 ;延時413 = (2*205+2+1)
DJNZ R5,$
DJNZ R4,D1
RET
YS2: MOV R4,#30 ;延時子程序2,精確延時3018微秒 503 * 30 * 0.1808 = 2728.272
D2: MOV R5,#250 ;延時 503 = (2*250+2+1)
DJNZ R5,$
DJNZ R4,D2
RET
YS3: MOV R4,#10;延時程序3,精確延時900微秒 403 * 10 * 0.1808 = 728.624
D3:MOV R5,#200 ;延時403 //1 c 403 = (2*200+2+1)
DJNZ R5,$ //2 c
DJNZ R4,D3 //2 c
RET
//低電平超時判斷
IOLOW_ERR:
MOV R4,#30 ;延時子程序2,精確延時3018微秒
LD1: MOV R5,#250
LD2: DEC R5
CJNE R5,#0,LD21
LJMP LD3
LD21:JNB P3.2,LD2
LJMP LD4 ;高電平,退出
LD3: DEC R4
CJNE R4,#0,LD1 ;說明超時了,直接退出
LJMP LD5
LD4:
MOV R4,#0AH
RET
LD5: MOV R4,#160
RET
//高電平超時判斷
IOHEI_ERR:
MOV R4,#30 ;延時子程序2,精確延時3018微秒
HD1: MOV R5,#250
HD2: DEC R5
CJNE R5,#0,HD21
LJMP HD3
HD21:JB P3.2,HD2
LJMP HD4 ;高電平,退出
HD3: DEC R4
CJNE R4,#0,HD1 ;說明超時了,直接退出
LJMP HD5
HD4:
MOV R4,#0AH
RET
HD5: MOV R4,#160
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -