久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13762|回復: 17
打印 上一主題 下一主題
收起左側

[原創]詳細介紹用51單片機解密任何遙控器

  [復制鏈接]
跳轉到指定樓層
樓主
ID:6481 發表于 2009-5-7 17:56 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

  首先說一下 想寫這個帖子 看到論壇上有關于遙控器方面的帖子 但是都沒有很詳細的介紹 而且是已經有完整的波形 僅僅介紹了解碼部分 而沒有分析波形數據方面的介紹 ,因此有了寫一篇完整的關于遙控器方面的文章的沖動 此貼對新手可能有點困難不過 不要緊 我會以最通俗的方式來解釋 如果有不明白的 建議去看看書 自己努力 沒有不可能的事 別人能做到 你也一定行,關于紅外遙控的基礎理論,大家可以到這個貼去看下http://www.zg4o1577.cn/mcu/184.html,里面有詳細的介紹。在這里我僅把一些關鍵的帶出來 關于硬件電路 那么拋開那么多文字介紹 最后意思就是說 你家里的遙控板 也就是發射部分 是把所有的封裝好了的 比如鍵盤矩陣、編碼調制、LED紅外發送器 等等 那么接受部分 SM0038 3個腳 一個腳地 一個腳電源 一個腳信號腳 接到 單片機隨便個P口上(此處是P3。6) OK 硬件部分就搞定了當然還有數碼管顯示 ,這些肯定不用說你都能搞定吧,我這剛好有一塊51hei單片機學習板是在www.zg4o1577.cn的論壇買的,這些東東都有,所以就不用自己去搭電路那么麻煩了),那么 我們想 我們按一下遙控板 大家看到 有個燈閃了一下 然后OVER 那么 我們現在要做的就是在燈閃了那一下之后讓 單片機來讀它的鍵碼 然后不同的鍵碼來干不同的事 ,本文 是向大家解釋一種方法 當然如果你知道遙控器的編碼 那么 我想寫解碼程序應該是很簡單的事 而我的意思是說我們現在從0開始 拿到任何一種遙控板 那怕不知道它的型號 但是 大家想 即使它什么型號都沒寫 但是按一下不同的鍵 它的發射的脈沖 肯定不一樣 無非就是引導碼 然后 地址碼 鍵碼 驗證碼 因為不同的遙控板 它所定義的規則不一樣 (這里說一點題外話 其實在讀出波型后 大家就可以看出這個遙控板最開始設計時的人的意思 或者說考慮 它的這個設計方式是否是最好的 是否穩定 是否具有通用性 或者說 日本的和中國的設計師 在設計時他們所考慮的 名牌和 雜牌的 他們在設計時所考慮的 等等 這些其實也是件很有意思的事 就像偷窺到一個人的內心世界一樣 扯遠了 。。--)
  下面我們來說說本問利用51單片機軟件解密的方法 首先大家看了我剛才貼出來的連接 應該知道了 編碼無非就是低電平高電平。但是我們知道一點 它肯定是有規律的 (這里申明一下 如果你能找到它的PDF 上面寫好了它的波形 或者你在網上找到了前人把某型號的遙控器的波形已經分析出來了那么你完全可以把這篇帖子當水貼 跳過 我這里的目的是想通過一種方法 一種 完整的分析方法  就像醫生拿起手術刀 解開它的內部 看常人所不能看到的東西 最終能把一種很通用的東西 把它的內部原理能夠完全的理解 一切從簡單學起 做起 以后凡是涉及到 這種 類型的東西 相信你會更加自信 而不是只滿足做一個課程設計 一個老師布置的作業 扯遠了。。  )
  具體我們怎么記錄這種規律  很簡單 我們用定時器把每個高低電平的時間記下來 然后顯示在數碼管上 設置2秒顯示一個數據 然后用EXCLE記錄下來
再用鉛筆 或者 隨便什么畫圖軟件 把它的波形畫出來 標上 低電平 高電平 再對比下不同的鍵的區別 一切就豁然開朗了
 現在舉 實際的例子
萬能遙控板大家應該都知道吧


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

           dec r1
           jb   p3.6,$          ;等待變低 , 即等待按鍵
next:      setb tr1             ;啟動定時器1
           jnb p3.6,$   ;  等待變高,以測量低電平時間寬度
           clr tr1      ;關閉定時器1                             ;1US
           inc r5       ;時間值個數加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經過的時間            ;2
           setb tr1     ;重新啟動定時器                          ;1
           jb p3.6,$    ;等待變低
           clr tr1      ;關閉定時器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經過的時間            ;2
           ajmp next    ;循環檢測,直到T1在遙控器無鍵按下時溢出時產生中斷   ;2
           ajmp $

;-----------------------------------------
 ;定時器1中斷程序
 ;在遙控器無鍵按下時產生中斷,便依次將BMHCQ中的高低電平時間值轉換為BCD碼并顯示出來
;-----------------------------------------
t1zd:
          setb tr0       ;啟動T0
          clr tr1        ;關閉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位)調BTOD子程序將其轉換為5位BCD碼并放入XCQ中再調顯示子程序顯示
          mov r3,a  ;取高8位
          inc r0
          mov a,@r0
          mov r2,a   ;取低8位
          inc r0
          ;lcall BtoD      ;將高電平或低電平時間值轉為BCD碼放于XCQ中
          lcall HEXtoXCQ   ;將高電平或低電平時間值轉為十六進制的LED碼放于XCQ中
          lcall display   ;顯示
          cpl p2.5        ;改變批示燈的狀態,以此說明顯示內容的改變
          jb    yszt,$    ;延時,以便抄錄時間值
          setb  yszt
          djnz r5,dispnext ;獲取的時間值沒顯示完則繼續
          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中高電平或低電平時間值轉為BCD碼放于XCQ中
;---------------------------------------------
BtoD:
         push 00h
         mov r0,#BCD
         mov r4,#3
bd0:     mov @r0,#0       ;BCD緩沖區清0
         inc r0
         djnz r4,bd0
         mov r6,#16
bd1:     clr c            ;將R3R2中的16位二進制值轉換為三字節BCD碼存入BCD緩沖區中
         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      ;將轉換結果從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

 

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


 01。JPG 是脈沖開始時所有鍵前8個完全一樣的高低脈沖


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

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


[此貼子已經被admin于2009-7-30 2:03:19編輯過]
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:6481 發表于 2009-5-7 17:56 | 只看該作者

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 轉開始程序()

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

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


;引導碼正確時執行以下代碼
        ;   CLR          YKBZ                    ;遙控標志清0
JM21:
           MOV          R2,#16                  ;每次循環讀8位碼
           MOV          R6,#0                   ;存放16位碼中的低8位
           MOV          R7,#0                   ;存放16位碼中的高8位
JM3:
           JNB          P3.6,$                  ;等待低電平結束,不管其寬度,因為是通過高電平的寬度來區分0(約為0.5ms)和1(約為1.6ms)
           MOV          TH1,#0
           MOV          TL1,#0
           SETB         TR1                     ;啟動T1,統計高電平的寬度
           JB           P3.6,$
           CLR          TR1
    MOV   A,TH1
           CJNE         A,#2,JM4                ;若高電平寬度值大于2,則說明此高電平為寬脈沖(1),否則為窄脈沖(0)
JM4:       CPL          C                       ;當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位(數據碼)存于R7中,低8位(地址碼)存于R6中
           MOV          A,R6
           CJNE         A,#47H,JMCW     ;判斷地址碼是否為47H,不是轉出錯返回
           MOV          A,R7            ;若地址碼正確,則R7中便為數據碼
           mov          r1,#jzh
           mov          @r1,A
           LJMP         JMFH
JMCW:      MOV          A,B
JMFH:      CLR          TF1            ;T1的溢出標志清0
           MOV          TH1,#0          ;為T1設定初值并啟動它
           MOV          TL1,#0          ;以此來避免對同一按鍵讀兩次(避開遙控器的重發代碼)
           SETB         TR2
           POP          B
           POP          07H
           POP          06H
           POP          02H
           POP          PSW
           RET                          ;此時,若引導碼、地址碼、鍵值碼和鍵值反碼中有一個有問題,A中便為錯誤代碼,否則,A中便為所按鍵之鍵值碼

 文章寫完了。希望能對大家有少許的幫助 覺得有用就拿去研究下吧。最后放上完整的EXCLE 數據分析表 和 整理出的波形圖 大家看不清楚的下載后看完整的圖
 “要發只發精品   把最好的給大家”

[ 原 創 ] Suse| haozi
2009.5.7 15:55
www.zg4o1577.cn 轉載請注明出處

 

回復

使用道具 舉報

板凳
ID:13700 發表于 2009-6-1 15:08 | 只看該作者

呀這個好玩

回復

使用道具 舉報

地板
ID:33120 發表于 2011-11-8 21:04 | 只看該作者
牛人真多
回復

使用道具 舉報

5#
ID:33706 發表于 2012-1-10 10:01 | 只看該作者
這個好東西啊。。
回復

使用道具 舉報

6#
ID:44558 發表于 2012-9-10 13:54 | 只看該作者

謝謝版主,看到你這個帖子我非常感謝,我最近在做一個學習萬能型遙控器,我覺得我研究了版主這個主題后,我就能做出來 ,

我想問下版主,請問這里介紹的方法可以解碼任何制式的,是么?

回復

使用道具 舉報

7#
ID:1 發表于 2012-9-19 04:38 | 只看該作者

這個是nec的吧

回復

使用道具 舉報

8#
ID:44824 發表于 2012-9-19 16:36 | 只看該作者

我做了一個解碼器,但不是任何遙控器都能解的,只能自動識別并解出23種編碼

http://bbs.lcdhome.net/read.php?tid=222321&page=1&toread=1

回復

使用道具 舉報

9#
ID:21296 發表于 2013-1-28 17:03 | 只看該作者

認真學習

1
!!!!!

回復

使用道具 舉報

10#
ID:55734 發表于 2013-10-9 03:47 | 只看該作者
看看學習學習
回復

使用道具 舉報

11#
ID:55611 發表于 2013-10-12 09:47 | 只看該作者
好好學習,天天向上
回復

使用道具 舉報

12#
ID:52286 發表于 2013-10-13 22:20 | 只看該作者
#在這里快速回復#真是不錯的資料
回復

使用道具 舉報

13#
ID:34185 發表于 2014-11-30 07:19 | 只看該作者
好東西,學習學習
回復

使用道具 舉報

14#
ID:69860 發表于 2014-12-6 11:05 | 只看該作者
匯編的大神,膜拜啊
回復

使用道具 舉報

15#
ID:72947 發表于 2015-1-31 21:53 來自手機 | 只看該作者
收藏了
回復

使用道具 舉報

16#
ID:72047 發表于 2015-3-1 17:35 | 只看該作者
太厲害 ...
回復

使用道具 舉報

17#
ID:77205 發表于 2015-4-16 23:50 | 只看該作者
好樣的@@@@@@@@@@@@@@@@@@
回復

使用道具 舉報

18#
ID:28571 發表于 2015-4-17 21:59 | 只看該作者
好東西,學習一下,謝謝!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日日艹夜夜艹 | 国产在线一区二区三区 | 久久国产综合 | 国产精品国产成人国产三级 | 久久久av| 午夜视频一区二区 | 91一区二区| 欧美日韩不卡在线 | 亚洲欧美一区二区三区视频 | 欧美日韩亚 | 国产精品一区二区不卡 | 欧美视频三区 | 精品一区欧美 | 青娱乐av| 91国自产 | www.久久久久久久久久久 | 日韩二三区 | 国产精品久久久久久久久久久久久久 | 亚洲三区视频 | 九九热免费观看 | 日韩91在线 | 欧美久久一区 | 91av视频| 六月婷婷久久 | 成人性生交大免费 | 成人免费视频 | 精国产品一区二区三区四季综 | 四虎永久在线精品免费一区二 | 久久久www成人免费无遮挡大片 | 99久久精品免费看国产免费软件 | 搞av.com| 久久精品中文字幕 | 婷婷丁香综合网 | 国产欧美精品一区 | www.亚洲精品 | 国产精品视频999 | 日日干日日 | 韩日一区二区三区 | 久久精品国产免费 | xx视频在线观看 | 日韩电影免费观看中文字幕 |