下面我們來說說本問利用51單片機軟件解密的方法 首先大家看了我剛才貼出來的連接 應該知道了 編碼無非就是低電平高電平。
具體我們怎么記錄這種規律 很簡單 我們用定時器把每個高低電平的時間記下來 然后顯示在數碼管上 設置2秒顯示一個數據 然后用EXCLE記錄下來
再用鉛筆 或者 隨便什么畫圖軟件 把它的波形畫出來 標上 低電平 高電平 再對比下不同的鍵的區別 一切就豁然開朗了
現在舉 實際的例子
萬能遙控板大家應該都知道吧
此主題相關圖片如下:圖片 04.jpg
?
隨便去那都能買到 幾塊錢 左右 安上電池 設置好型號(這里例子設置的是長虹 如果用家里的遙控板 那么不用設置了 )
單片機上電 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
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
01。JPG 是脈沖開始時所有鍵前8個完全一樣的高低脈沖
此主題相關圖片如下:02.jpg
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 貼出來 大家看下規律
此主題相關圖片如下:03.jpg
然后我們 來分析應該怎么解碼 我相信到了這一步應該很簡單了吧 比如在這個例子中 我們發現 后面的鍵碼改變的部分完全是重復 那么為什么完全可以不去讀后面的碼 只讀前面的16位的脈沖 放在寄存器中 再用比較指令 跳轉 下面是針對這個波形圖的解碼程序 相信大家已經能用自己手中的利器 把它搞定了
寫到這里 我覺得很疑惑 感覺自己沒能把具體問題簡單化 很多東西還是要*大家自己去消化理解了
程序看不懂。?那么OK 去翻指令 查書 一條一條看吧 程序我敢保證都是 編譯通過的
下面是解碼程序的關鍵代碼 :
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中便為所按鍵之鍵值碼。
文章寫完了。希望能對大家有少許的幫助 覺得有用就拿去研究。
評論
查看更多