【實用】動手用單片機做紅外遙控解碼器

2021-02-14 暢學電子

    你家裡是否有一個電視機遙控器或者空調機遙控器呢?你是否也想讓它遙控其他的電器甚至讓它遙控您的電腦呢?那好,跟我一起做這個「紅外遙控解碼器」。

該小製作所需要的元件很少:單片機TA89C2051一隻,RS232接口電平與TTL電平轉換心片MAX232CPE一隻,紅外接收管一隻,晶振11.0592MHz,電解電容10uF4隻,10uF一隻,電阻1K1個,300歐姆左右1個,瓷片電容30P2個。發光二極體8個。價錢不足20元。

電路原理介紹:

主控制單元是單片機AT89C2051,中斷口INT0跟紅外接受管U1相連,接收紅外信號的脈衝,8個發光二極體作為顯示解碼輸出(也可以用來擴展接其他控制電路),U3是跟電腦串行口RS232相連時的電平轉換心片,9、10腳分別與單片機的1、2腳相連,(1腳為串行接收,2腳為串行發送),MAX232CPE的7、8腳分別接電腦串行口的2(接收)腳、3(發送腳)。晶振採用11.0592MHz,這樣才能使得通訊的波特率達到9600b/s,電腦一般默認值是9600b/s、8位數據位、1位停止位、無校驗位。電路就這麼簡單了,現在分析具體的編程過程吧。

開始位是以3.6ms低電平然後是3.6ms高電平,然後數據表示形式是0.9ms低電平0.9ms高電平周期為1.8ms表示「0」,0.9ms低電平2.4ms高電平周期為3.3ms表示「1」,編寫程序時,以大於3.4ms小於3.8ms高電平為起始位,以大於2.2ms小於2.7ms高電平表示「1」,大於0.84ms小於1.11ms高電平表示「0」。因此,我們主要用單片機測量高電平的長短來確定是「1」還是「0」即可。定時器0的工作方式設置為方式1:movtmod,#09h,這樣設置定時器0即是把GATE置1,16位計數器,最大計數值為2的16次方個機器周期,此方式由外中斷INT0控制,即INT0為高時才允許計數器計數。比如:

jnbp3.2,$

jbp3.2,$

clrtr0

這3條指令就可以測量一個高電平,接下來讀取計數值TH0,TL0就可以分辨是起始位還是「1」或「0」。在確定碼錶之前,您可以使用P0口的8個發光二極體來顯示編碼,16位編碼分兩次顯示:

movp0,keydata

acalldelay_1s;//1ms延時子程序

movp0,keydata+1

ljmpmain

根據P0相繼的兩次顯示的編碼,記錄每個按鍵的編碼,形成編碼表,即遙控器編碼的解碼完畢。碼錶確定之後,以後接收到遙控器的編碼之後,就與碼錶比較,找到匹配的碼項,並把該碼項對應的順序號輸出到P0口,同時也把順序號向串行口輸出到電腦,電腦接收該數據後由串口軟體決定如何處理。

程序不長,下面是完整的程序和注釋:(先看流程圖)

keydataequ30h;//該地址和31H地址用來存放遙控器按鍵編碼。

org00h

main:

movkeydata,#0;//清零

movtmod,#09h;//設置定時0方式1,GATE=1

movr7,#0;//計數器,用來計數是否滿8位

movr6,#0;//計數器,用來計數是否滿2位元組(解16位編碼)

jbp3.2,$;//是否為低電平

again:;//如果為低,繼續往下面執行

movtl0,#0;//清零TL0

movth0,#0;//清零TH0

setbtr0;//開啟定時器0

jnbp3.2,$;//等待高電平到來

jbp3.2,$;//高電平到來,此時開始計數

clrtr0;//高電平結束,停止計數

mova,th0;//讀取th0值,TL0忽略不計clrc;//

subba,#12;//

jcagain;//th0《12則轉,即小於3.4ms,你可以算一下這個時間

mova,#14;//

clrc;//

subba,th0;//和14比較,如果TH0》14則大於3.8ms

jcagain;//大於3.8ms,從新再檢測

nextbit:;//起始位找到了,然後下一位

movtl0,#0;//

movth0,#0;//

setbtr0;//啟動定時器

jnbp3.2,$;//等待高電平

jbp3.2,$;//高電平到來,此時開始計數

clrtr0;//高電平結束,停止計數

mova,th0;//讀取計數值,TL0忽略不計

clrc;//

subba,#8;//th0和8比較

jcnext;;;;//若《2.2ms則轉,再判斷是否大於0.84ms

mova,#10;//再跟10比較

clrc;//

subba,th0;//

jcagain;;;;;;;//若》2.7ms,則放棄,從新檢測

mova,keydata;//符合大於2.2ms小於2.7ms,即為「1」

setbc;//C=1

rrca;//把1移位進A

movkeydata,a;//保存

incr7;//計數器加1

cjner7,#8,nextbit;//是否滿8位

incr6;//計數加1

cjner6,#2,last8;//是否滿兩字節

sjmpseach;//不滿兩字節,再新採集

last8:;//滿1位元組,再接下來第二字節

movkeydata+1,a;//把第一字節編碼數據保存到31h裡

movr7,#0;//計數器R7清零

sjmpnextbit;//繼續採集數據

next:;//小於2.2ms時轉到這裡

mova,th0;//讀取計數值TH0

swapa;//高4位與低4位對換

movr1,a;//保存到R1

anltl0,#0f0h;//取TL0高4位,低4位忽略不計

mova,tl0;//

clrc;//

rrca;//

rrca;//

rrca;//

rrca;//

adda,r1;//

movr1,a;//

subba,#30;//以上幾行是把TH0的低4位和TL0的高4位合併為1位元組作為計數值

jcnextbit;//判斷是否《0.84ms,是則放棄,繼續採集

mova,r1;//否

clrc;//

cjnea,#64,continue;//跟64比較

continue:;//

jncnextbit;//a》64表示採樣值》1.11ms放棄

mova,keydata;//否則,符合位「0」

clrc;//C=0

rrca;//把零右移進A

movkeydata,a;//保存

incr7;//計數器加1

cjner7,#8,nextbit;//是否滿8位

incr6;//計數器加1

cjner6,#2,last_8;//是第一字節已經滿

sjmpseach;//

last_8:;//如果為第二字節

movkeydata+1,a;//則保存第一字節到31h

movr7,#0;//清零R7

sjmpnextbit;//

seach:;//匹配按鍵編碼

movr0,#-2;//按鍵編碼字節個數計數器

movr1,#-1;//按鍵順序計數器

seach1:;//

incr0;//

seach2:;//

incr0;//

incr1;//

cjner1,#29,compare;//是否R1=29

sjmpexit0;//

compare:;//開始匹配

mova,r0;//

movdptr,#keycode;//地址指針指向碼錶首址

movca,@a+dptr;//取碼

cjnea,keydata,seach1;//比較

incr0;//R0+1,再比較下一字節(每個按鍵編碼為2位元組)

mova,r0;//

;movdptr,#keycode;//

movca,@a+dptr;//比較

cjnea,keydata+1,seach2;//是否匹配,不匹配則繼續跟下一字節比較

movp1,r1;//如果匹配,把按鍵順序號輸出到p1

send:;//

movtmod,#20h;//設置timer1,mode2

movtl1,#0fdh;//設置定時器初值

movth1,#0fdh;//

movscon,#01010000b;//以上設置,即設置串口波特率係數為:9600,8,1,0

setbtr1;//啟動定時器1

loop_s:;//

movsbuf,r1;//把R1(按鍵順序號)輸出到串口

jnbti,$;//等待是否發送完畢

clrti;//發送完畢,清零TI

exit0:;//

ljmpmain;//循環

keycode:;//每兩字節代表一個按鍵的編碼

db11111000b,00000000b,11111100b,00000000b,11111001b,11000000b

db11111100b,11000000b,11111010b,00000000b,11111010b,00100000b

db11111010b,01000000b,11111010b,01100000b,11111010b,10000000b

db11111010b,10100000b,11111010b,11000000b,11111010b,11100000b

db11111011b,00000000b,11111011b,00100000b,11111011b,01000000b

db11111011b,01100000b,11111111b,01100000b,11111111b,10100000b

db10001100b,10001110b,10001101b,11101110b,10001100b,10101110b

db10001101b,11001110b,11111000b,11100000b,11111100b,10000000b

db11111100b,01000000b,11111001b,10100000b,11111100b,10100000b

db11111100b,01100000b

end

各種遙控器編碼不同,如果你採用的是其他遙控器,修改幾個參數即可(當然按鍵的編碼表肯定不同了),即計數器的值不同,不過有的遙控器有機器碼(機器碼每個按鍵都是一樣的),此時可以跳過機器碼的採集。



相關焦點

  • 紅外線 紅外遙控解碼器
    你是否也想讓它遙控其他的電器甚至讓它遙控您的電腦呢?那好,跟我一起做這個「紅外遙控解碼器」。     該小製作所需要的元件很少:單片機TA89C2051一隻,RS232接口電平與TTL電平轉換心片MAX232CPE 一隻,紅外接收管一隻,晶振11.0592MHz,電解電容10uF4隻,10uF一隻,電阻1K1個,300歐姆左右1個,瓷片電容30P2個。發光二極體8個。價錢不足20元。
  • 一種多路紅外遙控系統的電路設計和實現
    本課題要設計的紅外多路遙控系統,主要紅外發射和紅外接收這兩部分,本設計依託市面上常見的紅外發射和紅外接收元器件,使設計具有傳輸距離一般、硬體簡單、安裝方便、價格便宜的優點。本文所介紹的紅外多路遙控系統,是採用碼分制多通道紅外遙控系統裝置。早期的碼分制的脈衝指令編碼多採用分離元器件及小規模數字集成電路,編碼、解碼電路弄得很複雜,可靠性也差。
  • 單片機數碼管時鐘紅外線模式
    來源:網絡初學單片機的菜鳥們,都很想自己製作一款單片機電子鐘,放在自己的電腦桌上,展現一下學習單片機的成果,現在就來講一講製作這款遙控單片機數碼管時鐘的過程
  • Arduino-使用IR遙控器控制LED - 【單片機教程-Arduino】
    1x Arduino1x麵包板1x遙控器1x紅外接收器(我將使用TSOP4838)4x LED的4x 220ohm電阻跳線紅外接收器具有3個引腳:熱門文章推薦:直接點擊進入001:《單片機初學者必看》002:《周立功寫給學單片機的年輕人的話》003:《牛人談:軟體與硬體的入門難度與精通時間跨度》004:《學習51單片機有感;學習用書推薦;必寫的幾個程序》005:《幾種使用過的單片機比較
  • 這10款國產手機有紅外功能,可以遙控電視空調
    表面上看,手機帶紅外功能似乎沒啥用,除了小米、華為之外,基本上沒有其它手機廠商,推出帶有紅外功能的手機,其實,它用處還是很大的,比如電器的遙控器突然沒電了,或者放在哪個角落裡找不到了,這種情況下就可以拿出手機開電視或者空調了。甚至,你如果覺得用手機的紅外遙控更方便,還可以把家中所有電器都用手機控制,這樣就不需要再到處找遙控器了。
  • 機頂盒通用可學習型紅外遙控器的電路剖析
    家中電信寬帶的機頂盒配套遙控器基本上都有遙控學習功能。經常使用一段時間後發現,遙控器會經常出現時靈時不靈的現象。現對該遙控器進行一番拆解和電路剖析,藉此機會也順便對該遙控器的電視遙控學習功能探一究竟。
  • 基於單片機的直流電機閉環調速控制系統(附源程序)
    實用乾貨下載:關注我們「單片機系列」,回復「資料」獲取單片機相關資料。
  • 單片機、EDA實訓裝置功能及配置
    3、壓力測量實驗4、傳感器應用實驗:含光敏、熱敏、氣敏、溫溼度、壓力傳感器、霍爾傳感器和人體紅外傳感器等。6)具備單片機在線下載、獨立運行功能,每套實驗箱配備一片STC89C52(兼容89S52,性能高於89S52)單片機晶片。7)程式語言:彙編語言和C語言2、微機系統1)核心CPU8088。2)用CPLD器件組成整個系統控制邏輯和解碼電路。3)64K程序存儲器存放系統監控程序。
  • 單片機實用工具大全,超級贊,工程師必備!
    今天,電子發燒友小編要給各位大佬介紹幾款非常實用的單片機小工具,涉及調試、計算、設計、自動代碼生成等。第1款:555定時器自動計算工具,想要什麼頻率,想要什麼佔空比,輸入要求,點一下開始計算,然後結果就出來了!!!
  • 基於單片機的MP3播放器設計
    實用乾貨下載:關注我們「單片機系列」,回復「資料
  • 單片機紅外線報警器電路圖
    2 、 單片機系統.U1為AT89C2051單片機.C1.R0,R1和復位按鈕RESET組成手動電平復位和上電自動復位電路; C2.C3以及晶振T1組成時鐘電路iC4.C5為+5V電源濾波電容 .U2為CM0S6反相器CC4069 , 起驅動作用 .VD1 ~ VD6為紅外發射管, 其負極端接與P1口.P1口設置為輸出狀態 ,當P1口為 .0時 ,VD1~VD6發紅外光.VD7~VD12為紅外接收管.當接收到紅外光時導通
  • ARM7單片機輕鬆入門與實踐 — 暢學單片機
    本課程是ARM7單片機學習者從入門到深入的一套經典視頻教程,以初學者為對象,從零開始手把手教你學習單片機,循序漸進地基於理論講解並結合實驗項目實戰開發,講解當前最熱門的ARM7單片機的C程序設計!
  • 單片機C語言模塊化編程方法
    紅外鍵盤:程序通過紅外鍵盤進行操作。紅外鍵盤獨佔定時器0和外部中斷0,以實現紅外解碼和鍵盤鍵值的識別。紅外鍵盤定義了五個按鍵,分別為上翻、下翻、左翻、右翻和確認鍵。2. LCD液晶顯示:程序主要通過LCD顯示信息,LCD液晶顯示驅動提供顯示漢字、圖形和ASCII碼的函數接口。可以全屏、單行顯示漢字,任意位置顯示ASCII碼,還可以全屏、半屏顯示圖形。二. 功能模塊1.
  • 單片機初學者必看
    畢竟以後要自己設計電路,這些知識是很有用的。2、C語言基礎:我個人比較喜歡C語言開發,相比彙編最大的優點就是移植性要好。學習51單片機,C語言編程當然需要有些基礎。3、一些單片機的基礎知識:雖然是初學者,但是一些基礎理論知識還是應該知道的。4、一些焊接等動手能力,這個要求就不是那麼嚴格了。
  • 遙控精靈超強獨特功能有網沒網都能遙控!
  • 你家裡的遙控器是咋遙控的?
    ,指令信號發生電路便發生所需求的控制信號,控制指令信號經調製電路調製後,終究由驅動電路驅動紅外線發射器,宣布紅外線遙控指令信號。,遙控器可以當一個整機來獨立使用,對外引出線有接線樁頭,而遙控模塊在電路中當一個元件來使用
  • 單片機入門製作
    同時晶振部分電路也是必不可少的,這相當於給單片機帶了一塊手錶,讓它有時間觀念,知道自己什麼時候該幹什麼事情。總之最小系統就是保證單片機正常工作的最基本電路部分。OK,再說回到單片機實驗板。我是買元器件自己製作實驗板的,我感覺沒有必要多花錢去買一個成品,雖然這樣說賣實驗板的人可能會扁我。自己動手可以學到單片機硬體電路的知識和掌握製作的細節,這是不可多得的實踐機會。
  • Redmi K30 Pro重磅爆料:真機;超級藍牙,400米可接;紅外遙控
    另今日Redmi K30 Pro真機圖,可以看出耳機孔、紅外孔、彈出相機孔。彌補了上一代K20 Pro不支持紅外遙控的遺憾。
  • 手機真的能拍紅外透視照嗎?
    畢竟在這個手機攝像能力競爭日趨白熱化的年代,為了小眾的紅外攝像模式這粒芝麻,丟掉成像質量這個大西瓜,實在得不償失。如果你的動手能力足夠強(也有足夠多的鏡頭),理論上是可以自己動手,從硬體去掉攝像頭的紅外截止濾波片,來體驗一把紅外攝影的。而有人臉識別功能的手機,甚至不需要這種物理變動,只要有合適的軟體,就可以開啟自己的「秋意」模式。
  • 如何解決PIC單片機硬體死鎖的問題
    1、頻繁插拔電時,PIC單片機容易死機。用一個10K電阻並在LM7805的5V輸出端到地。