標(biāo)題:
單片機(jī)紅外遙控解碼ASM匯編程序
[打印本頁(yè)]
作者:
liugengzhuang
時(shí)間:
2017-7-2 14:07
標(biāo)題:
單片機(jī)紅外遙控解碼ASM匯編程序
51系列單片機(jī)做的紅外遙控解碼
0.png
(44.4 KB, 下載次數(shù): 46)
下載附件
2017-7-3 03:24 上傳
單片機(jī)匯編語(yǔ)言源程序如下:
/**紅外遙控解碼范例**/
/**作者:田開坤**/
/**較網(wǎng)上可以下載到的程序相比,本代碼考慮了解碼過(guò)程容易死機(jī)的問(wèn)題,采取辦法解決了,可以解碼失敗,但決不死機(jī)**/
DQ equ 0ebh ;P4.3定義接口,參考STC89C51數(shù)據(jù)手冊(cè)
EX2 equ 0c2h ;外部中斷2,參考STC89C51數(shù)據(jù)手冊(cè)
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ù)參數(shù)變量
DA_BUF equ 40H ;解碼出的數(shù)據(jù)緩沖區(qū),包括41H
ORG 0000h
LJMP main
ORG 003bh ;外部中斷2入口地址,參考STC89C51數(shù)據(jù)手冊(cè)
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微秒延時(shí)子程序
JB DQ,EXIT ;延時(shí)834微秒后判斷DQ腳是否出現(xiàn)高電平如果有就退出解碼程序
DJNZ R6, SB ;重復(fù) 10 次,目的是檢測(cè)在 9000 微秒內(nèi)如果出現(xiàn)高電平就退出解碼程序
;-------------------------------;以上完成對(duì)遙控信號(hào) 起始碼 的 9000 微秒的初始低電平信號(hào)的識(shí)別!!!!!
JNB DQ, [ DISCUZ_CODE_1 ]nbsp; ;等待,避開 起始碼 低電平
JB DQ,[ DISCUZ_CODE_1 ]nbsp; ;避開結(jié)果碼
/*;測(cè)試按鍵一次有多少位低電平,不同遙控器不一樣*/
/*;電工電子中心投影遙控器只有32位,這對(duì)后邊程序參數(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)識(shí)別碼 (即地址碼)
AAQQ: JNB DQ,[ DISCUZ_CODE_1 ]nbsp; ;通過(guò)低電平段
;JB DQ,[ DISCUZ_CODE_1 ]nbsp; ;以下6行代碼可以用本行替換,但這樣容易出現(xiàn)死機(jī)。
MOV R6,#255
CTN2: JNB DQ,DER7 ;等待有效低電平到來(lái),避開 結(jié)果碼 高電平
MOV BYT_DLY,#3 ;42uS
ACALL DELAY ;調(diào)用42微秒延時(shí)子程序,延時(shí)太短,計(jì)數(shù)器R6不夠大,延時(shí)太長(zhǎng),會(huì)錯(cuò)過(guò)最佳檢測(cè)點(diǎn)
DJNZ R6,CTN2
LJMP EXIT ;防止死機(jī)
DER7: DJNZ R7,AAQQ
MOV R1,#DA_BUF ;設(shè)定1AH為起始RAM區(qū)
MOV R2,#2 ;接收從DA_BUF到DA_BUF+1的2個(gè)內(nèi)存,用于存放操作碼 (即數(shù)據(jù)碼) 和操作反碼
PP: MOV R3,#8 ;每組數(shù)據(jù)為8位
JJJJ: JNB DQ,[ DISCUZ_CODE_1 ]nbsp; ;等待通過(guò)數(shù)據(jù)碼的低電平信號(hào),等高電平到來(lái)后出去;
MOV BYT_DLY,#13 ;834uS
ACALL DELAY ;高電平開始后用840(560<t<1125,)微秒的時(shí)間尺去判斷信號(hào)此時(shí)的高低電平狀態(tài)
MOV C,DQ ;將DQ引腳此時(shí)的電平狀態(tài)0或1存入C中
JNC UUU ;如果為0就跳轉(zhuǎn)到UUU
;JB DQ,[ DISCUZ_CODE_1 ]nbsp; ;以下6行代碼可以用本行替換,但這樣容易出現(xiàn)死機(jī)。
MOV R6,#255
CTN3: JNB DQ,UUU ;等待有效低電平到來(lái),避開 結(jié)果碼 高電平
MOV BYT_DLY,#3 ;42uS
ACALL DELAY ;調(diào)用840微秒延時(shí)子程序
DJNZ R6,CTN3
LJMP EXIT ;防止死機(jī)
UUU: MOV A,@R1 ;將R1中地址的給A
RRC A ;將C中的值0或1移入A中的最低位
MOV @R1,A ;將A中的數(shù)暫時(shí)存放在R1數(shù)值的內(nèi)存中
DJNZ R3,JJJJ ;接收滿8位換一個(gè)內(nèi)存
INC R1 ;對(duì)R1中的值加1,換下一個(gè)RAM
DJNZ R2,PP ;接收完8位數(shù)據(jù)碼和8位數(shù)據(jù)反碼,存放在1AH/1BH中
MOV A,DA_BUF
CPL A ;對(duì)1AH取反后和1BH比較
CJNE A,DA_BUF+1,EXIT ;如果不等表示接收數(shù)據(jù)發(fā)生錯(cuò)誤,放棄
MOV R7,DA_BUF ;將按鍵的鍵值通過(guò)數(shù)碼管顯示出來(lái)!
ACALL DISP
CLR P1.0 ;蜂鳴器鳴響-嘀嘀嘀-的聲音,表示解碼成功
MOV BYT_DLY,#50
ACALL DELAY
SETB P1.0 ;蜂鳴器停止
EXIT: SETB EA
reti
;-------------------------延時(shí)子程序---------------------------------
;晶振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 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1