<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 詳細(xì)介紹用51單片機解密任何紅外遙控器

          詳細(xì)介紹用51單片機解密任何紅外遙控器

          作者: 時間:2012-10-23 來源:網(wǎng)絡(luò) 收藏

          在這里我僅把一些關(guān)鍵的帶出來關(guān)于硬件電路 那么拋開那么多文字最后意思就是說 你家里的遙控板 也就是發(fā)射部分 是把所有的封裝好了的 比如鍵盤矩陣、編碼調(diào)制、LED發(fā)送器 等等那么接受部分 SM0038 3個腳 一個腳地 一個腳電源 一個腳信號腳 接到 隨便個P口上(此處是P3。6) OK 硬件部分就搞定了當(dāng)然還有數(shù)碼管顯示,這些肯定不用說你都能搞定吧,這些東東都有,所以就不用自己去搭電路那么麻煩了),那么 我們想 我們按一下遙控板 大家看到 有個燈閃了一下 然后OVER 那么 我們現(xiàn)在要做的就是在燈閃了那一下之后讓 來讀它的鍵碼 然后不同的鍵碼來干不同的事,本文 是向大家解釋一種方法 當(dāng)然如果你知道的編碼 那么 我想寫解碼程序應(yīng)該是很簡單的事 而我的意思是說我們現(xiàn)在從0開始 拿到一種遙控板 那怕不知道它的型號 但是 大家想 即使它什么型號都沒寫 但是按一下不同的鍵 它的發(fā)射的脈沖 肯定不一樣 無非就是引導(dǎo)碼 然后 地址碼 鍵碼驗證碼 因為不同的遙控板 它所定義的規(guī)則不一樣 (這里說一點題外話 其實在讀出波型后 大家就可以看出這個遙控板最開始設(shè)計時的人的意思 或者說考慮 它的這個設(shè)計方式是否是最好的 是否穩(wěn)定 是否具有通用性 或者說 日本的和中國的設(shè)計師 在設(shè)計時他們所考慮的 名牌和 雜牌的 他們在設(shè)計時所考慮的 等等 這些其實也是件很有意思的事 就像偷窺到一個人的內(nèi)心世界一樣 扯遠(yuǎn)了 。。--)

          本文引用地址:http://www.ex-cimer.com/article/170745.htm


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

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

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

          ;-----------------------------------------
          ;定時器1中斷程序
          ;在遙控器無鍵按下時產(chǎn)生中斷,便依次將BMHCQ中的高低電平時間值轉(zhuǎn)換為BCD碼并顯示出來
          ;-----------------------------------------
          t1zd:
          setb tr0 ;啟動T0
          clr tr1 ;關(guān)閉T1
          setb et0 ;T0開中斷
          mov a,r5
          mov r2,a
          mov r3,#0
          lcall hextoxcq
          lcall display
          jb yszt,$ ;延時一段時間,以便記錄顯示的時間值
          setb yszt
          mov r0,#bmhcq
          dispnext: mov a,@r0 ;從BMHCQ中依次取出時間值(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 ;將高電平或低電平時間值轉(zhuǎn)為BCD碼放于XCQ中
          lcall HEXtoXCQ ;將高電平或低電平時間值轉(zhuǎn)為十六進(jìn)制的LED碼放于XCQ中
          lcall display ;顯示
          cpl p2.5 ;改變批示燈的狀態(tài),以此說明顯示內(nèi)容的改變
          jb yszt,$ ;延時,以便抄錄時間值
          setb yszt
          djnz r5,dispnext ;獲取的時間值沒顯示完則繼續(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中高電平或低電平時間值轉(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

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

          此主題相關(guān)圖片如下:01.jpg 點擊圖片放大
          點擊瀏覽下一頁
          01。JPG 是脈沖開始時所有鍵前8個完全一樣的高低脈沖


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

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

          DYKJZ: JB P3.6,$

          LCALL YKJM ;核心解碼代碼子程序
          cpl a
          jz no ;判斷是否為錯誤代碼(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í)行的代碼
          ;比如 點亮一個燈給單片機接上串口 用單片機控制電腦的打開 放音樂。等等
          ;這些不屬于本問討論的范圍 有興趣的可以自己擴展
          RET
          ;-----------------------
          ;核心解碼代碼子程序
          ;------------------------
          YKJM:

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


          ;引導(dǎo)碼正確時執(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é)束,不管其寬度,因為是通過高電平的寬度來區(qū)分0(約為0.5ms)和1(約為1.6ms)
          MOV TH1,#0
          MOV TL1,#0
          SETB TR1;啟動T1,統(tǒng)計高電平的寬度
          JB P3.6,$
          CLR TR1
          MOV A,TH1
          CJNE A,#2,JM4;若高電平寬度值大于2,則說明此高電平為寬脈沖(1),否則為窄脈沖(0)
          JM4: CPL C ;當(dāng)TH1的值大于2時,C=0,小于2時,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)出錯返回
          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è)定初值并啟動它
          MOV TL1,#0 ;以此來避免對同一按鍵讀兩次(避開遙控器的重發(fā)代碼)
          SETB TR2
          POP B
          POP 07H
          POP 06H
          POP 02H
          POP PSW
          RET ;此時,若引導(dǎo)碼、地址碼、鍵值碼和鍵值反碼中有一個有問題,A中便為錯誤代碼,否則,A中便為所按鍵之鍵值碼

          文章寫完了。希望能對大家有少許的幫助。

          脈沖點火器相關(guān)文章:脈沖點火器原理


          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();