51系列單片機做的紅外遙控解碼
0.png (44.4 KB, 下載次數(shù): 46)
下載附件
2017-7-3 03:24 上傳
單片機匯編語言源程序如下:
- /**紅外遙控解碼范例**/
- /**作者:田開坤**/
- /**較網(wǎng)上可以下載到的程序相比,本代碼考慮了解碼過程容易死機的問題,采取辦法解決了,可以解碼失敗,但決不死機**/
- DQ equ 0ebh ;P4.3定義接口,參考STC89C51數(shù)據(jù)手冊
- EX2 equ 0c2h ;外部中斷2,參考STC89C51數(shù)據(jù)手冊
- SEG1 equ 0ffech ;數(shù)碼管1(最右)
- SEG2 equ 0ffedh ;數(shù)碼管2
- SEG3 equ 0ffeeh ;數(shù)碼管3
- SEG4 equ 0ffefh ;數(shù)碼管4(最左)
- BYT_DLY equ 5FH ;延時函數(shù)參數(shù)變量
- DA_BUF equ 40H ;解碼出的數(shù)據(jù)緩沖區(qū),包括41H
- ORG 0000h
- LJMP main
- ORG 003bh ;外部中斷2入口地址,參考STC89C51數(shù)據(jù)手冊
- LJMP EINT3
- ORG 40h
- main: MOV SP,#60h
- SETB EA
- SETB EX2
- SJMP [ DISCUZ_CODE_1 ]nbsp; ;原地踏步,等中斷解碼
- //中斷接收解碼模塊
- EINT3: CLR EA//關(guān)閉
- MOV R6,#10
- SB: MOV BYT_DLY,#13 ;834uS
- ACALL DELAY ;調(diào)用834微秒延時子程序
- JB DQ,EXIT ;延時834微秒后判斷DQ腳是否出現(xiàn)高電平如果有就退出解碼程序
- DJNZ R6, SB ;重復(fù) 10 次,目的是檢測在 9000 微秒內(nèi)如果出現(xiàn)高電平就退出解碼程序
- ;-------------------------------;以上完成對遙控信號 起始碼 的 9000 微秒的初始低電平信號的識別!!!!!
- JNB DQ, [ DISCUZ_CODE_1 ]nbsp; ;等待,避開 起始碼 低電平
- JB DQ,[ DISCUZ_CODE_1 ]nbsp; ;避開結(jié)果碼
- /*;測試按鍵一次有多少位低電平,不同遙控器不一樣*/
- /*;電工電子中心投影遙控器只有32位,這對后邊程序參數(shù)設(shè)置關(guān)系重大
- CLR A
- ADDLOOP: JNB DQ,$
- ADD A,#1
- MOV P1,A
- JB DQ,cADD
- sjmp $
- */
- MOV R7,#16 ;忽略前16位系統(tǒng)識別碼 (即地址碼)
- AAQQ: JNB DQ,[ DISCUZ_CODE_1 ]nbsp; ;通過低電平段
- ;JB DQ,[ DISCUZ_CODE_1 ]nbsp; ;以下6行代碼可以用本行替換,但這樣容易出現(xiàn)死機。
- MOV R6,#255
- CTN2: JNB DQ,DER7 ;等待有效低電平到來,避開 結(jié)果碼 高電平
- MOV BYT_DLY,#3 ;42uS
- ACALL DELAY ;調(diào)用42微秒延時子程序,延時太短,計數(shù)器R6不夠大,延時太長,會錯過最佳檢測點
- DJNZ R6,CTN2
- LJMP EXIT ;防止死機
- DER7: DJNZ R7,AAQQ
- MOV R1,#DA_BUF ;設(shè)定1AH為起始RAM區(qū)
- MOV R2,#2 ;接收從DA_BUF到DA_BUF+1的2個內(nèi)存,用于存放操作碼 (即數(shù)據(jù)碼) 和操作反碼
- PP: MOV R3,#8 ;每組數(shù)據(jù)為8位
- JJJJ: JNB DQ,[ DISCUZ_CODE_1 ]nbsp; ;等待通過數(shù)據(jù)碼的低電平信號,等高電平到來后出去;
- MOV BYT_DLY,#13 ;834uS
- ACALL DELAY ;高電平開始后用840(560<t<1125,)微秒的時間尺去判斷信號此時的高低電平狀態(tài)
- MOV C,DQ ;將DQ引腳此時的電平狀態(tài)0或1存入C中
- JNC UUU ;如果為0就跳轉(zhuǎn)到UUU
- ;JB DQ,[ DISCUZ_CODE_1 ]nbsp; ;以下6行代碼可以用本行替換,但這樣容易出現(xiàn)死機。
- MOV R6,#255
- CTN3: JNB DQ,UUU ;等待有效低電平到來,避開 結(jié)果碼 高電平
- MOV BYT_DLY,#3 ;42uS
- ACALL DELAY ;調(diào)用840微秒延時子程序
- DJNZ R6,CTN3
- LJMP EXIT ;防止死機
- UUU: MOV A,@R1 ;將R1中地址的給A
- RRC A ;將C中的值0或1移入A中的最低位
- MOV @R1,A ;將A中的數(shù)暫時存放在R1數(shù)值的內(nèi)存中
- DJNZ R3,JJJJ ;接收滿8位換一個內(nèi)存
- INC R1 ;對R1中的值加1,換下一個RAM
- DJNZ R2,PP ;接收完8位數(shù)據(jù)碼和8位數(shù)據(jù)反碼,存放在1AH/1BH中
- MOV A,DA_BUF
- CPL A ;對1AH取反后和1BH比較
- CJNE A,DA_BUF+1,EXIT ;如果不等表示接收數(shù)據(jù)發(fā)生錯誤,放棄
-
- MOV R7,DA_BUF ;將按鍵的鍵值通過數(shù)碼管顯示出來!
- ACALL DISP
- CLR P1.0 ;蜂鳴器鳴響-嘀嘀嘀-的聲音,表示解碼成功
- MOV BYT_DLY,#50
- ACALL DELAY
- SETB P1.0 ;蜂鳴器停止
- EXIT: SETB EA
- reti
- ;-------------------------延時子程序---------------------------------
- ;晶振22.1184M
- DELAY: PUSH BYT_DLY
- DEL31: PUSH BYT_DLY
- DEL32: DJNZ BYT_DLY,DEL32
- POP BYT_DLY
- DJNZ BYT_DLY,DEL31
- POP BYT_DLY
- DJNZ BYT_DLY,DELAY
- RET
- //數(shù)碼管顯示,數(shù)據(jù)由R7傳入
- DISP: mov dptr,#ledmap
- mov a,r7
- anl a,#0fh
- movc a,@a+dptr
- mov dptr,#SEG1
- cpl a
- movx @dptr,a
- mov dptr,#ledmap
- mov a,r7
- swap a
- anl a,#0fh
- movc a,@a+dptr
- mov dptr,#SEG2
- cpl a
- movx @dptr,a
- mov dptr,#SEG3
- mov a,#0ffh
- movx @dptr,a
- mov dptr,#SEG4
- movx @dptr,a
- ret
- ledmap: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h,00
- END
復(fù)制代碼
所有資料51hei提供下載:
紅外遙控解碼ASM.7z
(12.52 KB, 下載次數(shù): 32)
2017-7-2 14:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|