立即注冊(cè) 登錄
返回首頁

uid:152272的個(gè)人空間

日志

紅外遙控

熱度 1已有 632 次閱讀2016-12-7 13:54

 首先說一下 想寫這個(gè)帖子 看到論壇上有關(guān)于遙控器方面的帖子 但是都沒有很詳細(xì)的介紹 而且是已經(jīng)有完整的波形 僅僅介紹了解碼部分 而沒有分析波形數(shù)據(jù)方面的介紹 ,因此有了寫一篇完整的關(guān)于遙控器方面的文章的沖動(dòng)   此貼對(duì)新手可能有點(diǎn)困難不過 不要緊 我會(huì)以最通俗的方式來解釋 如果有不明白的 建議去看看書 ,自己努力 沒有不可能的事  別人能做到 你也一定行,關(guān)于紅外遙控的基礎(chǔ)理論,大家可以到這個(gè)貼去看下http://www.torrancerestoration.com/mcu/184.html,里面有詳細(xì)的介紹。在這里我僅把一些關(guān)鍵的帶出來 關(guān)于硬件電路 那么拋開那么多文字介紹 最后意思就是說 你家里的遙控板 也就是發(fā)射部分 是把所有的封裝好了的  比如鍵盤矩陣、編碼調(diào)制、LED紅外發(fā)送器 等等 那么接受部分 SM0038 3個(gè)腳 一個(gè)腳地 一個(gè)腳電源 一個(gè)腳信號(hào)腳 接到 單片機(jī)隨便個(gè)P口上(此處是P3。6) OK  硬件部分就搞定了當(dāng)然還有數(shù)碼管顯示 ,這些肯定不用說你都能搞定吧,我這剛好有一塊51hei單片機(jī)學(xué)習(xí)板是在www.torrancerestoration.com的論壇買的,這些東東都有,所以就不用自己去搭電路那么麻煩了),那么 我們想 我們按一下遙控板 大家看到 有個(gè)燈閃了一下 然后OVER 那么 我們現(xiàn)在要做的就是在燈閃了那一下之后讓 單片機(jī)來讀它的鍵碼 然后不同的鍵碼來干不同的事 ,本文 是向大家解釋一種方法  當(dāng)然如果你知道遙控器的編碼 那么 我想寫解碼程序應(yīng)該是很簡單的事 而我的意思是說我們現(xiàn)在從0開始  拿到任何一種遙控板 那怕不知道它的型號(hào) 但是 大家想 即使它什么型號(hào)都沒寫 但是按一下不同的鍵 它的發(fā)射的脈沖 肯定不一樣 無非就是引導(dǎo)碼 然后 地址碼 鍵碼 驗(yàn)證碼 因?yàn)椴煌倪b控板 它所定義的規(guī)則不一樣 (這里說一點(diǎn)題外話 其實(shí)在讀出波型后 大家就可以看出這個(gè)遙控板最開始設(shè)計(jì)時(shí)的人的意思 或者說考慮 它的這個(gè)設(shè)計(jì)方式是否是最好的 是否穩(wěn)定 是否具有通用性 或者說 日本的和中國的設(shè)計(jì)師 在設(shè)計(jì)時(shí)他們所考慮的 名牌和 雜牌的 他們?cè)谠O(shè)計(jì)時(shí)所考慮的 等等 這些其實(shí)也是件很有意思的事 就像偷窺到一個(gè)人的內(nèi)心世界一樣 扯遠(yuǎn)了 。。--)


   下面我們來說說本問利用51單片機(jī)軟件解密的方法 首先大家看了我剛才貼出來的連接 應(yīng)該知道了 編碼無非就是低電平高電平。但是我們知道一點(diǎn) 它肯定是有規(guī)律的 (這里申明一下 如果你能找到它的PDF 上面寫好了它的波形 或者你在網(wǎng)上找到了前人把某型號(hào)的遙控器的波形已經(jīng)分析出來了那么你完全可以把這篇帖子當(dāng)水貼 跳過 我這里的目的是想通過一種方法 一種 完整的分析方法  就像醫(yī)生拿起手術(shù)刀 解開它的內(nèi)部 看常人所不能看到的東西 最終能把一種很通用的東西 把它的內(nèi)部原理能夠完全的理解 一切從簡單學(xué)起 做起 以后凡是涉及到 這種 類型的東西 相信你會(huì)更加自信 而不是只滿足做一個(gè)課程設(shè)計(jì) 一個(gè)老師布置的作業(yè) 扯遠(yuǎn)了。。  )
    具體我們?cè)趺从涗涍@種規(guī)律  很簡單 我們用定時(shí)器把每個(gè)高低電平的時(shí)間記下來 然后顯示在數(shù)碼管上 設(shè)置2秒顯示一個(gè)數(shù)據(jù) 然后用EXCLE記錄下來 
再用鉛筆 或者 隨便什么畫圖軟件 把它的波形畫出來 標(biāo)上 低電平 高電平 再對(duì)比下不同的鍵的區(qū)別 一切就豁然開朗了 
 現(xiàn)在舉 實(shí)際的例子 
萬能遙控板大家應(yīng)該都知道吧 

此主題相關(guān)圖片如下:圖片 04.jpg

隨便去那都能買到 幾塊錢 左右 安上電池 設(shè)置好型號(hào)(這里例子設(shè)置的是長虹 如果用家里的遙控板 那么不用設(shè)置了 )
 單片機(jī)上電 SM0038接好 
  關(guān)鍵程序如下 :(在這里我想鼓勵(lì)下大家 不要一想到程序就是完整的 可以直接燒進(jìn)去 看結(jié)果的 其實(shí) 我上個(gè)帖子也說過 你能看程序 看到關(guān)鍵的核心代碼 那么說明你已經(jīng)進(jìn)步了 能找出其中的關(guān)鍵代碼 其他比如SM0038的接口 數(shù)碼管顯示的接口 等等 自己加上去就行了 這段程序 的結(jié)果是最終把 脈沖波的個(gè)數(shù) 和每個(gè)高低電平的時(shí)間數(shù) 放在寄存器里 那么既然你要做的就是 用自己手邊的單片機(jī) 把寄存器的值顯示到 數(shù)碼管上 把數(shù)據(jù)記錄下來 然后分析 找出規(guī)律 得出你想要的結(jié)果 在這個(gè)過程中 我相信反是喜歡搞磚研的 都會(huì)享受這個(gè)過程   )               
          mov r5,#0            ;用于記錄保存的時(shí)間值的個(gè)數(shù)
           mov r1,#bmhcq    ;高低電平寬度值緩沖區(qū)

           dec r1
           jb   p3.6,$          ;等待變低 , 即等待按鍵
next:      setb tr1             ;啟動(dòng)定時(shí)器1
           jnb p3.6,$   ;  等待變高,以測(cè)量低電平時(shí)間寬度
           clr tr1      ;關(guān)閉定時(shí)器1                             ;1US
           inc r5       ;時(shí)間值個(gè)數(shù)加1                           ;1
           inc r1                                                ;1
           mov @r1,th1  ;存低電平時(shí)間值 ,先存高8位,后存低8位   ;2US
           inc r1                              ;1
           mov @r1,tl1                     ;2
           mov th1,#0   ;重賦初值     ;2
           mov tl1,#13  ;13為停止T1到重啟T1經(jīng)過的時(shí)間     ;2
           setb tr1     ;重新啟動(dòng)定時(shí)器    ;1
           jb p3.6,$    ;等待變低
           clr tr1      ;關(guān)閉定時(shí)器1    ;1
           inc r5                              ;1
           inc r1                             ;1
           mov @r1,th1  ;存高電平時(shí)間值   ;2
           inc r1                        ;1
           mov @r1,tl1              ;2
           mov th1,#0   ;重賦初值    ;2
           mov tl1,#15  ;15為停止T1到重啟T1經(jīng)過的時(shí)間    ;2
           ajmp next    ;循環(huán)檢測(cè),直到T1在遙控器無鍵按下時(shí)溢出時(shí)產(chǎn)生中斷   ;2
           ajmp $

;-----------------------------------------
 ;定時(shí)器1中斷程序
 ;在遙控器無鍵按下時(shí)產(chǎn)生中斷,便依次將BMHCQ中的高低電平時(shí)間值轉(zhuǎn)換為BCD碼并顯示出來
;-----------------------------------------
t1zd:
          setb tr0       ;啟動(dòng)T0
          clr tr1        ;關(guān)閉T1
          setb et0       ;T0開中斷
          mov a,r5
          mov r2,a
          mov r3,#0
          lcall hextoxcq
          lcall display
          jb yszt,$           ;延時(shí)一段時(shí)間,以便記錄顯示的時(shí)間值
          setb yszt
          mov r0,#bmhcq
dispnext: mov a,@r0           ;從BMHCQ中依次取出時(shí)間值(16位)調(diào)BTOD子程序?qū)⑵滢D(zhuǎn)換為5位BCD碼并放入XCQ中再調(diào)顯示子程序顯示
          mov r3,a  ;取高8位
          inc r0
          mov a,@r0
          mov r2,a   ;取低8位
          inc r0
          ;lcall BtoD      ;將高電平或低電平時(shí)間值轉(zhuǎn)為BCD碼放于XCQ中
          lcall HEXtoXCQ   ;將高電平或低電平時(shí)間值轉(zhuǎn)為十六進(jìn)制的LED碼放于XCQ中
          lcall display   ;顯示
          cpl p2.5        ;改變批示燈的狀態(tài),以此說明顯示內(nèi)容的改變
          jb    yszt,$    ;延時(shí),以便抄錄時(shí)間值
          setb  yszt
          djnz r5,dispnext ;獲取的時(shí)間值沒顯示完則繼續(xù)
          sjmp $           ;顯示完畢,在此踏步
          reti
          
 HEXtoXCQ:
          push 00h
          mov r0,#xcq
          mov a,r2
          anl a,#0fH
          mov dptr,#LED
          movc a,@a+dptr
          mov @r0,a
          inc r0
          mov a,r2
          swap a
          anl a,#0fH
          mov dptr,#LED
          movc a,@a+dptr
          mov @r0,a
          inc r0
          
          mov a,r3
          anl a,#0fH
          mov dptr,#LED
          movc a,@a+dptr
          mov @r0,a
          inc r0
          mov a,r3
          swap a
          anl a,#0fH
          mov dptr,#LED
          movc a,@a+dptr
          mov @r0,a
          inc r0
          mov @r0,#7eh
          inc r0
          mov @r0,#7eh
          pop 00H
          ret
 led:    db 7eh,30h,6dh,79h,33h,5bh,5fh,70h,7fh,7bh,77h,1fh,4eh,3dh,4fh,47h                         

;---------------------------------------------
;將存于R3R2中高電平或低電平時(shí)間值轉(zhuǎn)為BCD碼放于XCQ中
;---------------------------------------------
BtoD:
         push 00h
         mov r0,#BCD
         mov r4,#3
bd0:     mov @r0,#0       ;BCD緩沖區(qū)清0
         inc r0
         djnz r4,bd0
         mov r6,#16
bd1:     clr c            ;將R3R2中的16位二進(jìn)制值轉(zhuǎn)換為三字節(jié)BCD碼存入BCD緩沖區(qū)中
         mov a,r3
         rlc a
         mov r3,a
         mov a,r2
         rlc a
         mov r2,a
         mov r4,#3
         mov r1,#bcd
BD3:     mov a, @r1
         addc a,@r1
         da a
         mov @r1,a
         inc r1
         djnz r4,bd3
         djnz r6,bd1
         mov r0,#xcq      ;將轉(zhuǎn)換結(jié)果從BCD緩沖中存入XCQ中
         mov r1,#bcd
         mov r4,#3
bd4:     mov a,@r1
         xchd a,@r0
         inc r0
         swap a
         xchd a,@r0
         inc r0
         inc r1
         djnz r4,bd4
         pop 00h
         ret

 

通過上面的程序我們讀出了按下一個(gè)鍵后的編碼的本質(zhì)的東西 
  那么動(dòng)手把 圖畫下來 找規(guī)律 解碼  
我把我例子長虹解碼后的波形圖 發(fā)出來

此主題相關(guān)圖片如下:01.jpg 點(diǎn)擊圖片放大

 01。JPG 是脈沖開始時(shí)所有鍵前8個(gè)完全一樣的高低脈沖 


此主題相關(guān)圖片如下:02.jpg

02。JPG 大家注意看按不同的鍵 中間只是有3個(gè)脈沖在變化 是EXCLE的 W列-AC列 而這3位數(shù)值就是我們解碼的關(guān)鍵 01。JPG 中8位數(shù) 大家應(yīng)該看出 所有鍵都是一樣的11100010 后面02。JPG中我們把鍵碼整理出來就是 
按1鍵 00000000  00H
按2鍵 00010000  10H
按3鍵 00001000  08H
按4鍵 00011000  18H
按5鍵 。。。。。
后面就不寫了
為了大家清晰可見 我把畫出的最后的波形圖03。JPG 貼出來 大家看下規(guī)律 

此主題相關(guān)圖片如下:03.jpg 點(diǎn)擊圖片放大

然后我們 來分析應(yīng)該怎么解碼 我相信到了這一步應(yīng)該很簡單了吧 比如在這個(gè)例子中 我們發(fā)現(xiàn) 后面的鍵碼改變的部分完全是重復(fù)
 那么為什么完全可以不去讀后面的碼 只讀前面的16位的脈沖 放在寄存器中 再用比較指令 跳轉(zhuǎn) 下面是針對(duì)這個(gè)波形圖的解碼程序  相信大家已經(jīng)能用自己手中的利器 把它搞定了 
寫到這里 我覺得很疑惑 感覺自己沒能把具體問題簡單化  很多東西還是要*大家自己去消化理解了 
  程序看不懂。?那么OK  去翻指令 查書 一條一條看吧  程序我敢保證都是 編譯通過的 
下面是解碼程序的關(guān)鍵代碼 : 

DYKJZ:     JB   P3.6,$

           LCALL YKJM  ;核心解碼代碼子程序
           cpl a
           jz    no     ;判斷是否為錯(cuò)誤代碼(0FFH)
           cpl a

           AJMP JZPD
NO:      LJMP  DYKJZ
            RET
 
 

JZPD:    CJNE A,#09H,JZ1  ;鍵碼為09H嗎?
            AJMP KAIS            ;鍵碼為09H 轉(zhuǎn)開始程序()

JZ1:                                ;不為09H 轉(zhuǎn)最開始 等待下一次遙控器按鍵到來
            AJMP DYKJZ       
            RET
KAIS: ;放你需要執(zhí)行的代碼 
           ;比如 點(diǎn)亮一個(gè)燈 給單片機(jī)接上串口   用單片機(jī)控制電腦的打開 放音樂。等等 
           ;這些不屬于本問討論的范圍 有興趣的可以自己擴(kuò)展
        RET
;-----------------------
  ;核心解碼代碼子程序
;------------------------
YKJM:
       

           PUSH         PSW
           PUSH         02H
           PUSH         06H
           PUSH         07H
           PUSH         B
           MOV          B,#0FFH
           JNB          TF1,JMCW         ;通過T1從0開始定時(shí)到溢出來避開遙控器的重發(fā)碼 ,也就是說在讀了一個(gè)遙控按鍵后
           CLR          TF1                   ;到少要等到T1從0開始定時(shí)到溢出才能讀取第二個(gè)按鍵


;引導(dǎo)碼正確時(shí)執(zhí)行以下代碼
        ;   CLR          YKBZ              ;遙控標(biāo)志清0
JM21:
           MOV          R2,#16           ;每次循環(huán)讀8位碼
           MOV          R6,#0             ;存放16位碼中的低8位
           MOV          R7,#0             ;存放16位碼中的高8位
JM3:
           JNB          P3.6,$             ;等待低電平結(jié)束,不管其寬度,因?yàn)槭峭ㄟ^高電平的寬度來區(qū)分0(約為0.5ms)和1(約為1.6ms)
           MOV          TH1,#0
           MOV          TL1,#0
           SETB         TR1               ;啟動(dòng)T1,統(tǒng)計(jì)高電平的寬度
           JB           P3.6,$
           CLR          TR1
    MOV   A,TH1
           CJNE         A,#2,JM4      ;若高電平寬度值大于2,則說明此高電平為寬脈沖(1),否則為窄脈沖(0)
JM4:       CPL          C                 ;當(dāng)TH1的值大于2時(shí),C=0,小于2時(shí),C=1
           MOV          A,R7
           RRC          A
           MOV          R7,A
           MOV          A,R6
           RRC          A
           MOV          R6,A
           DJNZ         R2,JM3          ;連讀16位,先讀的為低位,后讀的為高位,高8位(數(shù)據(jù)碼)存于R7中,低8位(地址碼)存于R6中
           MOV          A,R6
           CJNE         A,#47H,JMCW     ;判斷地址碼是否為47H,不是轉(zhuǎn)出錯(cuò)返回
           MOV          A,R7            ;若地址碼正確,則R7中便為數(shù)據(jù)碼
           mov          r1,#jzh
           mov          @r1,A
           LJMP         JMFH
JMCW:      MOV          A,B
JMFH:      CLR          TF1            ;T1的溢出標(biāo)志清0
           MOV          TH1,#0          ;為T1設(shè)定初值并啟動(dòng)它
           MOV          TL1,#0          ;以此來避免對(duì)同一按鍵讀兩次(避開遙控器的重發(fā)代碼)
           SETB         TR2
           POP          B
           POP          07H
           POP          06H
           POP          02H
           POP          PSW
           RET                          ;此時(shí),若引導(dǎo)碼、地址碼、鍵值碼和鍵值反碼中有一個(gè)有問題,A中便為錯(cuò)誤代碼,否則,A中便為所按鍵之鍵值碼


路過

雞蛋

鮮花

握手

雷人

全部作者的其他最新日志

發(fā)表評(píng)論 評(píng)論 (1 個(gè)評(píng)論)

回復(fù) ZHANGJINGYU 2016-12-24 10:20
竟然是匯編?表示看不懂!不過還是很感謝分享!

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

返回頂部