国产亚洲精品AA片在线观看,丰满熟妇HD,亚洲成色www成人网站妖精,丁香五月天婷婷五月天男人天堂

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 紅外遙控解碼器設計

紅外遙控解碼器設計

作者: 時間:2012-11-06 來源:網絡 收藏

程序不長,下面是完整的程序和注釋:(先看流程圖)
keydata equ 30h ;//該地址和31H地址用來存放遙控器按鍵編碼。
org 00h
main:
mov keydata,#0;// 清零
mov tmod ,#09h ;//設置定時0方式1,GATE=1
mov r7,#0;//計數器,用來計數是否滿8位
mov r6,#0;//計數器,用來計數是否滿2字節(jié)(解16位編碼)
jb p3.2,$;//是否為低電平
again:;//如果為低,繼續(xù)往下面執(zhí)行
mov tl0,#0;//清零TL0
mov th0,#0;//清零TH0
setb tr0;//開啟定時器0
jnb p3.2,$;//等待高電平到來
jb p3.2,$;//高電平到來,此時開始計數
clr tr0;//高電平結束,停止計數
mov a,th0;//讀取th0 值,TL0忽略不計
clr c;//
subb a,#12;//
jc again;//th012則轉,即小于3.4ms,你可以算一下這個時間
mov a,#14;//
clr c;//
subb a,th0;//和14比較,如果TH0>14則大于3.8ms
jc again ;//大于3.8ms,從新再檢測
nextbit:;//起始位找到了,然后下一位
mov tl0,#0;//
mov th0,#0;//
setb tr0;//啟動定時器
jnb p3.2,$;//等待高電平
jb p3.2,$ ;//高電平到來,此時開始計數
clr tr0;//高電平結束,停止計數
mov a,th0;//讀取計數值,TL0忽略不計
clr c;//
subb a,#8;//th0和8比較
jc next ;;;;//若 2.2ms則轉,再判斷是否大于0.84ms
mov a,#10;//再跟10比較
clr c;//
subb a,th0;//
jc again ;;;;;;;//若 >2.7ms,則放棄,從新檢測
mov a,keydata;// 符合大于2.2ms 小于2.7ms,即為“1”
setb c ;//C = 1
rrc a;//把1移位進A
mov keydata,a;//保存
inc r7;//計數器加1
cjne r7,#8,nextbit;//是否滿8位
inc r6;//計數加1
cjne r6,#2,last8;//是否滿兩字節(jié)
sjmp seach;//不滿兩字節(jié),再新采集
last8:;//滿1字節(jié),再接下來第二字節(jié)
mov keydata+1,a;//把第一字節(jié)編碼數據保存到31h里
mov r7,#0;//計數器R7清零
sjmp nextbit;//繼續(xù)采集數據
next: ;//小于2.2ms時轉到這里
mov a,th0;//讀取計數值TH0
swap a;//高4位與低4位對換
mov r1,a;//保存到R1
anl tl0,#0f0h;//取TL0高4位,低4位忽略不計
mov a,tl0;//
clr c;//
rrc a;//
rrc a;//
rrc a;//
rrc a;//
add a,r1;//
mov r1,a;//
subb a,#30;//以上幾行是把TH0的低4位和TL0的高4位合并為1字節(jié)作為計數值
jc nextbit ; //判斷是否 0.84ms,是則放棄,繼續(xù)采集
mov a,r1;//否
clr c;//
cjne a,#64,continue ;//跟64比較
continue:;//
jnc nextbit ; //a>64表示采樣值 >1.11ms 放棄
mov a,keydata ;//否則 ,符合位“0”
clr c ;//C = 0
rrc a;//把零右移進A
mov keydata,a;//保存
inc r7;//計數器加1
cjne r7,#8,nextbit;//是否滿8位
inc r6;//計數器加1
cjne r6,#2,last_8;//是第一字節(jié)已經滿
sjmp seach;//
last_8: ;//如果為第二字節(jié)
mov keydata+1,a;//則保存第一字節(jié)到31h
mov r7,#0;//清零R7
sjmp nextbit;//
seach:;//匹配按鍵編碼
mov r0,#-2 ;//按鍵編碼字節(jié)個數計數器
mov r1,#-1 ;//按鍵順序計數器
seach1:;//
inc r0;//
seach2:;//
inc r0;//
inc r1;//
cjne r1,#29,compare;//是否R1=29
sjmp exit0;//
compare:;//開始匹配
mov a,r0;//
mov dptr,#keycode;//地址指針指向碼表首址
movc a,@a+dptr;//取碼
cjne a,keydata,seach1;//比較
inc r0;//R0+1,再比較下一字節(jié)(每個按鍵編碼為2字節(jié))
mov a,r0;//
;mov dptr,#keycode;//
movc a,@a+dptr;//比較
cjne a,keydata+1,seach2;//是否匹配,不匹配則繼續(xù)跟下一字節(jié)比較
mov p1,r1 ;//如果匹配,把按鍵順序號輸出到p1
send:;//
mov tmod,#20h ; //設置timer 1,mode 2
mov tl1,#0fdh;//設置定時器初值
mov th1,#0fdh;//
mov scon,#01010000b;//以上設置,即設置串口波特率系數為:9600,8,1,0
setb tr1;//啟動定時器1
loop_s:;//
mov sbuf,r1 ;//把R1(按鍵順序號)輸出到串口
jnb ti,$;//等待是否發(fā)送完畢
clr ti;//發(fā)送完畢,清零TI
exit0:;//
ljmp main;//循環(huán)

keycode:;//每兩字節(jié)代表一個按鍵的編碼
db 11111000b,00000000b, 11111100b,00000000b, 11111001b,11000000b
db 11111100b,11000000b, 11111010b,00000000b, 11111010b,00100000b
db 11111010b,01000000b, 11111010b,01100000b, 11111010b,10000000b
db 11111010b,10100000b, 11111010b,11000000b, 11111010b,11100000b
db 11111011b,00000000b, 11111011b,00100000b, 11111011b,01000000b
db 11111011b,01100000b, 11111111b,01100000b, 11111111b,10100000b
db 10001100b,10001110b, 10001101b,11101110b, 10001100b,10101110b
db 10001101b,11001110b, 11111000b,11100000b, 11111100b,10000000b
db 11111100b,01000000b, 11111001b,10100000b, 11111100b,10100000b
db 11111100b,01100000b
end
---------------------------------------------------------------------------------
各種遙控器編碼不同,如果你采用的是其他遙控器,修改幾個參數即可(當然按鍵的編碼表肯定不同了),即計數器的值不同,不過有的遙控器有機器碼(機器碼每個按鍵都是一樣的),此時可以跳過機器碼的采集。最后有一點想提一下的是,剛開始不知道遙控器的編碼是比較麻煩的,筆者在“雙龍電子“網站下載了個聲卡示波器,用他可以一目了然觀看遙控器的波形,測量其脈沖寬度,有了它確實方便很多,該軟件可以到雙龍公司網站http://www.sl.com.cn/免費下載使用。如果你想用遙控器遙控電腦,你可以自己編寫一個接受串行口應用軟件,或者你可以直接下載使用Girder這個軟件,該軟件是專門為串口遙控器做的,很好用,下載地址為:http://www.girder.nl/,你可以利用這個軟件定義遙控器來遙控你電腦移動鼠標、鍵盤操作、上網瀏覽、打開播放器、關機等。


上一頁 1 2 下一頁

評論


相關推薦

技術專區(qū)

關閉