0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳細(xì)解讀紅外遙控解碼

工程師鄧生 ? 來源:云創(chuàng)硬見 ? 作者:云創(chuàng)硬見 ? 2020-01-16 17:00 ? 次閱讀

紅外遙控是我們現(xiàn)實生活中必不可少的一員。遙控,顧名思義即在遙遠(yuǎn)的地方進行控制,其實也就是說遠(yuǎn)程通信。紅外遙控就是以紅外線為傳輸介質(zhì)的遙控。

紅外遙控器是怎么工作的?其實它內(nèi)部就是有一個單片機,單片機的I/O口控制一個紅外LED燈(當(dāng)然一般會加外部放大電路以增大傳輸距離),在內(nèi)部編碼后發(fā)送出去,然后電視或者空調(diào)之類的可以用紅外遙控控制的電器在接收到紅外信號后就會進行解碼,并根據(jù)制定好的協(xié)議執(zhí)行特定動作,比如電視可能換臺、調(diào)節(jié)音量等?,F(xiàn)在有的手機就帶有紅外遙控功能,其實也是用單片機的功能實現(xiàn)的。

紅外遙控解碼

有的時候,我們希望模擬一些遙控器的功能,這時候就要對這些遙控器的數(shù)據(jù)進行解碼。

在進行解碼前,我們先來了解一下紅外編碼。紅外編碼有很多種,最常用的編碼是NEC編碼。NEC格式的編碼如下:

詳細(xì)解讀紅外遙控解碼

NEC格式的紅外編碼是連續(xù)的32位二進制碼組。32位二進制碼組之前的引導(dǎo)碼,用于區(qū)分每次的傳輸;在起始碼之后的才是32位二進制碼組,其中8位用戶識別碼和8位反碼(反碼主要用于)校驗,用戶識別碼的作用主要是區(qū)分不同品牌的遙控器;接著就是8位操作碼和反碼,用于表示哪個按鍵被按下。

NEC格式的編碼除引導(dǎo)碼和起始碼外,用于交互數(shù)據(jù)的信息采用脈寬調(diào)制的串行碼,在38kHz的載波下,以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進制的“0”;以脈寬為0.565ms、間隔1.685ms、周期為2.25ms的組合表示二進制的“1”,其波形如下所示:

了解了紅外編碼,就可以進行紅外解碼了。

實現(xiàn)方法

一般,進行紅外解碼我們需要先將接受到的有效信號與外界環(huán)境的干擾信號分離開,這就是載波的作用。現(xiàn)在市面上有很多一體化紅外接收頭,內(nèi)部是紅外接收二極管 +放大電路 +解調(diào)器。當(dāng)接收到紅外信號后,先將其放大,然后把38kHz的信號保留下來。需要注意的是一般一體化紅外接收頭接收到信號時輸出是低電平,沒有接收信號時是高電平。

上面是常用紅外接收頭的引腳,“OUT”腳接單片機的I/O口,“-”腳接電源負(fù)極,“+”腳接電源正極。

接好電路,就要進行解碼工作了.其實解碼工作主要是識別引導(dǎo)碼,還有數(shù)據(jù)“0”“1”。我們看波形圖,只要識別紅外接收頭“OUT”引腳高低電平持續(xù)的時間就可以了。這個可以用定時器中斷完成,也可以用延時來判斷。由于只完成解碼工作,我們就用延時的方法更方便。

首先,紅外接收頭沒有接到信號時是高電平,等待其變低。之后,每隔900us測量一次,若在10次內(nèi)電平變高,說明這不是引導(dǎo)碼,退出重新開始;若10次內(nèi)并沒有變高,說明這就是引導(dǎo)碼,繼續(xù)下一步。接著可以不判斷起始碼,就是直接等待引腳電平變高再變低,就可以接收數(shù)據(jù)了。

接收數(shù)據(jù),就是進行判斷“0”和“1”。從位的定義我們可以發(fā)現(xiàn)“0”、“1”均以0.56ms的低電平開始,不同的是高電平的寬度不同,“0”為0.56ms,“1”為1.68ms,所以必須根據(jù)高電平的寬度區(qū)別“0”和“1”。

每一位“0”或者“1”在接收頭接收信號即低電平的時間都是一樣的,直接等待低電平過去,在高電平時延時600us,如果600us時還是高電平,說明是“1”;如果是低電平即高電平過去了,說明是“0”。將這些數(shù)據(jù)結(jié)合到一起,就是接收到的編碼了。

將單片機的串口與電腦接好,就可以在串口顯示我們讀到的紅外遙控數(shù)據(jù)了。

實現(xiàn)代碼:

#include <reg52.h>

// --- 紅外接收一體化輸出口 ----------------------------------

sbit IR_Out = P3^2;

bit START_Flag = 0;

bit BOOT_REPEATING_CODE_Flag = 0;

unsigned char DATA[4] = {0};

bdata unsigned char TEMP_BIT;

sbit B0 = TEMP_BIT^0;

sbit B1 = TEMP_BIT^1;

sbit B2 = TEMP_BIT^2;

sbit B3 = TEMP_BIT^3;

sbit B4 = TEMP_BIT^4;

sbit B5 = TEMP_BIT^5;

sbit B6 = TEMP_BIT^6;

sbit B7 = TEMP_BIT^7;

// --- 有無遙控信號判斷函數(shù) ----------------------------------

bit START_Judge();

// --- 連發(fā)碼判斷函數(shù) ----------------------------------------

bit BOOT_REPEATING_CODE_Judge();

// --- "0"和"1"識別 ------------------------------------------

bit H_L_LEVEL_Judge();

bit START_Judge()

bit TEMP_Flag = 1;

unsigned char i = 0;

//在正常無遙控信號時,一體化紅外接收頭輸出是高電平,程序一直在循環(huán)。

while ( IR_Out == 1);

//重復(fù)10次,目的是檢測在6876~8352微秒內(nèi)如果出現(xiàn)高電平就退出解碼程序

for(i =0;i <9; i++)

DELAY_Us(800); // 測試實際延時約為764~928us

if ( IR_Out == 1 )

TEMP_Flag = 0;

break;

return TEMP_Flag;

bit BOOT_REPEATING_CODE_Judge()

bit TEMP_Flag = 1;

while( IR_Out == 0 ) ; // 等待高電平避開9毫秒低電平引導(dǎo)脈沖

DELAY_Ms(1); // 測試實際延時約為1.007ms

DELAY_Ms(1); // 測試實際延時約為1.007ms

DELAY_Us(200); // 0.086ms

DELAY_Us(200); // 0.086ms

DELAY_Us(200); // 0.086ms

// 共計2.272ms

if( IR_Out == 0 )

TEMP_Flag = 1; // 是連發(fā)碼

else

TEMP_Flag = 0; // 不是連發(fā)碼,而是引導(dǎo)碼

return TEMP_Flag;

bit H_L_LEVEL_Judge()

while( IR_Out == 0 ); // 等待地址碼第一位的高電平信號

DELAY_Us(800); // 測試實際延時約為764~928us

if ( IR_Out == 1)

DELAY_Ms(1); // 測試實際延時約為1.007ms

return 1;

else

return 0;

// --- 串口初始化 --------------------------------------------

void UART_Initial();

void DELAY_Us(unsigned int Us)

unsigned int x;

for(x = 0; x <= (Us/200-1); x++);

void DELAY_Ms(unsigned int Ms)

unsigned int x,y;

for(x = 0; x <= (Ms-1); x++)

for(y = 0; y <= 120; y++);

void main()

unsigned char i;

UART_Initial();

IR_Out = 1;

while(1)

START_Flag = START_Judge();

BOOT_REPEATING_CODE_Flag = BOOT_REPEATING_CODE_Judge();

if ( START_Flag && !BOOT_REPEATING_CODE_Flag )

for(i =0;i <4; i++)

B0 = H_L_LEVEL_Judge();

B1 = H_L_LEVEL_Judge();

B2 = H_L_LEVEL_Judge();

B3 = H_L_LEVEL_Judge();

B4 = H_L_LEVEL_Judge();

B5 = H_L_LEVEL_Judge();

B6 = H_L_LEVEL_Judge();

B7 = H_L_LEVEL_Judge();

DATA[i] = TEMP_BIT;

for(i =0;i <4; i++)

SBUF = DATA[i];

while( TI == 0 );

TI = 0;

void UART_Initial()

SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收

TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit reload

TH1 = 0xFD; // TH1: reload value for 9600 baud @

// 11.0592MHz

TR1 = 1; // TR1: timer 1 run

EA = 0; // 關(guān)閉總中斷

ES = 0; // 關(guān)閉串口中斷

1、紅外遙控的編碼不只NEC,還有很多也有廣泛應(yīng)用如RC-5,RC-6等。

2、上面的代碼所用指令是STC 89C52單片機,如需用其它芯片請另行更改。
責(zé)任編輯:wv

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 紅外遙控解碼
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    951
收藏 人收藏

    評論

    相關(guān)推薦

    紅外遙控燈開關(guān)電路圖

    紅外遙控燈開關(guān),簡而言之,是一種利用紅外線技術(shù)遠(yuǎn)程控制燈具開啟與關(guān)閉的裝置。它主要由紅外發(fā)射器(遙控器或墻壁開關(guān)上的發(fā)射模塊)、
    的頭像 發(fā)表于 06-24 16:05 ?923次閱讀
    <b class='flag-5'>紅外</b><b class='flag-5'>遙控</b>燈開關(guān)電路圖

    源碼系列:基于FPGA的紅外遙控系統(tǒng)設(shè)計(附源工程)

    的發(fā)送裝置和接收裝置組成,發(fā)送裝置可由按鍵,編碼模塊,發(fā)射電路等組成,接收裝置由紅外接收電路,遙控,解碼模塊等組成,此次設(shè)計我們用到的硬件平臺式是Altera的DE1_SOC,晶振為50MHZ。 在
    發(fā)表于 05-01 19:59

    紅外遙控開關(guān)電路圖分享

    紅外遙控開關(guān)是一種通過感應(yīng)紅外線信號來控制電器設(shè)備開關(guān)的裝置。其基本原理是,紅外遙控的發(fā)射電路采用紅外
    的頭像 發(fā)表于 02-21 17:08 ?2229次閱讀
    <b class='flag-5'>紅外</b><b class='flag-5'>遙控</b>開關(guān)電路圖分享

    紅外遙控測試儀電路圖分享

    紅外遙控測試儀是一種用于測試紅外遙控設(shè)備的電子儀器。紅外遙控是一種廣泛應(yīng)用的無線通信技術(shù),用于控
    的頭像 發(fā)表于 02-12 14:49 ?1558次閱讀
    <b class='flag-5'>紅外</b><b class='flag-5'>遙控</b>測試儀電路圖分享

    如何提高紅外線發(fā)射管在遙控器上的發(fā)射距離

    的指令轉(zhuǎn)化為紅外線信號發(fā)送給待控設(shè)備。但是,在實際使用中,我們常常遇到遙控器發(fā)射距離較短的情況。本文將詳細(xì)介紹如何提高紅外線發(fā)射管在遙控器上
    的頭像 發(fā)表于 01-31 14:47 ?2364次閱讀

    紅外遙控與藍(lán)牙遙控的區(qū)別

    ,我們將詳細(xì)介紹紅外遙控和藍(lán)牙遙控的特點和區(qū)別。 首先,紅外遙控是一種基于
    的頭像 發(fā)表于 01-25 16:23 ?4626次閱讀

    紅外遙控器使用方法

    紅外遙控器是一種常見的電子設(shè)備,廣泛應(yīng)用于家庭、商業(yè)和工業(yè)領(lǐng)域。它可以通過紅外線信號與相應(yīng)的設(shè)備進行通信,實現(xiàn)控制和操作。本文將詳細(xì)介紹紅外
    的頭像 發(fā)表于 12-20 11:31 ?4062次閱讀

    紅外遙控原理及應(yīng)用

    電子發(fā)燒友網(wǎng)站提供《紅外遙控原理及應(yīng)用.ppt》資料免費下載
    發(fā)表于 11-16 09:20 ?5次下載
    <b class='flag-5'>紅外</b><b class='flag-5'>遙控</b>原理及應(yīng)用

    Arduino紅外遙控解碼率很低是為什么?

    Arduino利用官方的紅外解碼庫,但是成功率很低,按8到9次才會識別一次
    發(fā)表于 11-08 06:52

    家用吊扇紅外遙控電路設(shè)計

    電子發(fā)燒友網(wǎng)站提供《家用吊扇紅外遙控電路設(shè)計.doc》資料免費下載
    發(fā)表于 10-23 09:56 ?0次下載
    家用吊扇<b class='flag-5'>紅外</b><b class='flag-5'>遙控</b>電路設(shè)計

    智能紅外遙控電風(fēng)扇的設(shè)計

    電子發(fā)燒友網(wǎng)站提供《智能紅外遙控電風(fēng)扇的設(shè)計.doc》資料免費下載
    發(fā)表于 10-23 09:12 ?1次下載
    智能<b class='flag-5'>紅外</b><b class='flag-5'>遙控</b>電風(fēng)扇的設(shè)計

    基于單片機的紅外風(fēng)扇遙控

    電子發(fā)燒友網(wǎng)站提供《基于單片機的紅外風(fēng)扇遙控.rar》資料免費下載
    發(fā)表于 10-20 09:11 ?8次下載
    基于單片機的<b class='flag-5'>紅外</b>風(fēng)扇<b class='flag-5'>遙控</b>

    紅外遙控解碼,在主循環(huán)中檢測接受完成標(biāo)志位然后串口打印不行是怎么回事?

    紅外遙控解碼碰到一個問題,使用外部中斷方法,現(xiàn)在出現(xiàn)的問題是在主循環(huán)中檢測接受完成標(biāo)志位然后串口打印不行
    發(fā)表于 10-17 06:35

    基于單片機的紅外解碼及其應(yīng)用

    電子發(fā)燒友網(wǎng)站提供《基于單片機的紅外解碼及其應(yīng)用.pdf》資料免費下載
    發(fā)表于 10-10 09:18 ?5次下載
    基于單片機的<b class='flag-5'>紅外</b><b class='flag-5'>解碼</b>及其應(yīng)用

    基于51單片機的紅外遙控發(fā)射接收proteus仿真設(shè)計

    設(shè)計一個51單片機紅外遙控發(fā)射接收proteus仿真設(shè)計
    的頭像 發(fā)表于 09-24 14:04 ?2869次閱讀
    基于51單片機的<b class='flag-5'>紅外</b><b class='flag-5'>遙控</b>發(fā)射接收proteus仿真設(shè)計