編者按:以下是網(wǎng)友編寫的遙控解碼程序!一種用延時等待的解碼方法,比較容易理解,但缺點是占用CPU運行時間,第二種方法用定時器和外中斷的解碼方法,初學不易理解,但優(yōu)點也很明顯,第二種方法如果能解決連發(fā)解碼就比較完美,更完善的紅外遙控解碼程序,請參考本站TOPAV-2008,TOP51-2005所配程序。
解碼方法一
;//單片機接收紅外解讀程序\\
;硬件結(jié)構(gòu):8951,P0口數(shù)碼管段碼,P2.0-P2.3為位,P1為8個LED
;P3.2為紅外接收頭,P2.7蜂鳴器,晶振12M
;適用UPD6121 6122芯片接收
;---------------------------------------------------------
ORG 0000H
AJMP MAIN ;轉(zhuǎn)入主程序
ORG 0003H ;外部中斷P3.2腳INT0入口地址
AJMP INT ;轉(zhuǎn)入外部中斷服務(wù)子程序(解碼程序)
;以下為主程序進行CPU中斷方式設(shè)置
MAIN: SETB EA ;打開CPU總中斷請求
SETB IT0 ;設(shè)定INT0的觸發(fā)方式為脈沖下降沿觸發(fā)
SETB EX0 ;打開INT0中斷請求
AJMP $
;以下為進入P3.2腳外部中斷子程序,也就是解碼程序
INT: CLR EA ;暫時關(guān)閉CPU的所有中斷請求
MOV R6,#10
SB: ACALL YS1 ;調(diào)用882微秒延時子程序
JB P3.2,EXIT ;延時882微秒后判斷P3.2腳是否出現(xiàn)高
; 電平如果有就退出解碼程序
DJNZ R6, SB ;重復(fù)10次,目的是檢測在8820微秒內(nèi)
;如果出現(xiàn)高電平就退出解碼程序
;以上完成對遙控信號的9000微秒的初始低電平信號的識別。
JNB P3.2, $ ;等待高電平避開9毫秒低電平引導(dǎo)脈沖
ACALL YS2 ;延時4.74毫秒避開4.5毫秒的結(jié)果碼
MOV R1,#1AH ;設(shè)定1AH為起始RAM區(qū)
MOV R2,#4
;
PP: MOV R3,#8
JJJJ: JNB P3.2,$ ;等待地址碼第一位的高電平信號
LCALL YS1 ;高電平開始后用882微秒的時間尺去判斷信
;號此時的高低電平狀態(tài)
MOV C,P3.2 ;將P3.2引腳此時的電平狀態(tài)0或1存入C中
JNC UUU ;如果為0就跳轉(zhuǎn)到UUU
LCALL YS3
;
UUU: MOV A,@R1 ;將R1中地址的給A
RRC A ;將C中的值0或1移入A中的最低位
MOV @R1,A ;將A中的數(shù)暫時存放在R1中
DJNZ R3,JJJJ ;接收地址碼的高8位
INC R1 ;對R1中的值加1,換下一個RAM
DJNZ R2,PP ;接收完16位地址碼和8位數(shù)據(jù)碼和8位數(shù)據(jù)反
; 碼,存放在1AH/1BH/1CH/1DH的RAM中
MOV A,1CH ;比較數(shù)據(jù)碼和數(shù)據(jù)反碼是否正確?
CPL A
XRL A,1DH ;將1CH的值取反后和1DH比較 不同則無效丟棄,核對數(shù)據(jù)是否準確
JNZ EXIT
MOV DPTR,#TAB ;表頭地址送指針
MOV A,1DH
ANL A,#0FH ;相與,得到低四位碼
MOVC A,@A+DPTR
MOV 1EH,A ;查表得表碼存入1EH
MOV A,1DH
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV 1FH,A ;查表得高四位碼存入1F
MOV R7,#20H
DISP:
MOV P0,1FH ;送數(shù)碼管顯示
CLR P2.1
ACALL YS2
SETB P2.1
MOV P0,1EH
CLR P2.2
ACALL YS2
SETB P2.2
MOV P1,1DH ;將按鍵的鍵值通過P1口的8個LED顯示出來!
CLR P2.7 ;蜂鳴器鳴響-嘀嘀嘀-的聲音,表示解碼成功
LCALL YS2
SETB P2.7 ;蜂鳴器停止
DJNZ R7,DISP
EXIT: SETB EA ;允許中斷
RETI ;退出解碼子程序
YS1: MOV R4,#20 ;延時子程序1,精確延時882微秒
D1: MOV R5,#20
DJNZ R5,$
DJNZ R4,D1
RET
YS2: MOV R4,#10 ;延時子程序2,精確延時4740微秒
D2: MOV R5,#235
DJNZ R5,$
DJNZ R4,D2
RET
YS3: MOV R4,#2 ;延時程序3,精確延時1000微秒
D3:MOV R5,#248
DJNZ R5,$
DJNZ R4,D3
RET
TAB: DB 0C0H,0DEH,0A2H,8AH,9CH,89H,81H,0DAH,80H,88H,90H,85H,0E1H,86H,0A1H,0B1H;數(shù)據(jù)表,0-9-A-F
END
解碼方法二
你的解碼程序和我現(xiàn)在用的解碼程序大體是一樣的,我自己實際做了一下,發(fā)現(xiàn)按下遙控器,接收到紅外信號后,數(shù)碼管閃的厲害。我用的是6位動態(tài)數(shù)碼管。不知道你有沒有遇到這樣的情況?
分析解碼程序,感覺是中斷的時間太長了,數(shù)碼管當然會閃了。如果把數(shù)碼管用定時器刷新的話,又存在定時中斷和外中斷的優(yōu)先級問題,好難解決啊。
我初步有個想法。就是用定時器計算兩次外中斷間隔的時間。以此來確定是連發(fā)碼,數(shù)據(jù)“0”,數(shù)據(jù)“1”。不知道這個想法可否行的通。這幾天沒有時間試,因為廣州有個電子產(chǎn)品交易會,我要趕著做樣機。過了幾天我有空了在仔細的做一遍。把結(jié)果告訴大家。
不用連續(xù)解碼,只需在中斷時讀取定時器的時間,然后判斷是0或者1就可以了,實際測試已經(jīng)OK了,謝謝兩位的熱心幫助。
為了這個程序,弄了兩天的時間,飯都吃不好,現(xiàn)在弄通了,感覺真的很好。
我現(xiàn)在用6個數(shù)碼管顯示遙控器的用戶碼,用戶反碼,按鍵碼,無論怎么按遙控器,數(shù)碼管都不會閃的。
樓上的,我是這樣解決閃爍問題的,用顯示子程序計算出適當次數(shù)代替延時YS1 YS2 YS3子程序
;======================================================================================





