1. 程式人生 > >紅外遙控系統原理附51微控制器軟體解碼程式

紅外遙控系統原理附51微控制器軟體解碼程式

紅外接收頭的型號有很多HS0038 VS838等 功能大致相同,只是引腳封裝不同。

紅外接收有幾種統一的編碼方式,取樣哪種編碼方式取決於遙控器使用的晶片,接收頭收到的都是一樣的。

電視遙控器使用的是專用整合發射晶片來實現遙控碼的發射,如東芝TC9012,飛利浦AA3010T等,通常彩電遙控訊號的發射,就是將某個按鍵所對應的控制指令和系統碼(由0和1組成的序列),調製在38KHz的載波上,然後經放大、驅動紅外發射管將訊號發射出去。不同公司的遙控晶片,取樣的遙控碼格式也不一樣,較普遍的有兩種,一種NEC標準,一種是PHILIPS標準。

NEC標準:遙控載波的頻率為38KHz(佔空比1:3)當某個鍵按下時,系統首先發射一個完整的全碼,如果按鍵超過108ms仍未鬆開,接下來發射的程式碼(連發程式碼)將由起始碼(9ms)和結束碼(2.5ms)組成。
一個完整的全碼 = 引導碼 +使用者碼 +使用者碼 + 資料碼 + 資料碼 + 資料反碼。
紅外接收編碼

其中,引導碼高電平9ms,低電平4.5ms;系統碼8位,資料碼8位,共32位;其中前16位為使用者識別碼,能區別不同的紅外遙控裝置,以防止不同的機種遙控碼互相干擾。後16位為8位的操作碼和8位的操作反碼,用於核對資料是否接收準確。收端根據資料碼做出應該執行上面動作的判斷。

連發程式碼是在持續按鍵時傳送的碼。它告知接收端。某鍵是在被連續的按著。

NEC標準下的發射碼錶示
發射資料0時用”0.56ms高電平 + 0.565ms低電平 = 1.125ms”表示;
資料1用”高電平0.56ms + 1.69ms = 2.25ms”表示。
遙控器發射訊號:
遙控器發射訊號

一體化接收頭接收到訊號

需要注意的是:當一體化接收頭收到38kHz紅外訊號時,輸出端輸出低電平,否則為高電平。所以一體化接收頭輸出的波形和發射波形是反向的

PHILIPS標準:
載波頻率38KHz:沒有筒,點按鍵時,控制碼1和0之間切換,若持續按鍵,則控制碼不變。
一個全碼 = 起始碼’11’ +控制碼 + 使用者碼 + 使用者碼
資料0用“低電平1.778ms + 高電平1.778ms”表示;
資料1用“高電平1.778ms + 低電平1.778ms”表示。
連續碼重複延時114ms。

所謂的解碼就是一個區分脈衝寬度的過程。紅矮訊號的0和1是通過脈衝持續時間的長短來區分的,

我的遙控器使用的是NEC標準的WD6122晶片,遙控器編碼如下:
遙控器鍵位編碼

以下是我用1602顯示紅外接收頭接收到編碼的程式:
①這個是對1602操作的函式

------------------------------------------------*/
#include "1602.h"
#include "delay.h" #define CHECK_BUSY sbit RS = P2^4; //定義埠 sbit RW = P2^5; sbit EN = P2^6; #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0 #define EN_SET EN=1 #define DataPort P0 /*------------------------------------------------ 判忙函式 ------------------------------------------------*/ bit LCD_Check_Busy(void) { #ifdef CHECK_BUSY DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80); #else return 0; #endif } /*------------------------------------------------ 寫入命令函式 ------------------------------------------------*/ void LCD_Write_Com(unsigned char com) { // while(LCD_Check_Busy()); //忙則等待 DelayMs(5); RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; } /*------------------------------------------------ 寫入資料函式 ------------------------------------------------*/ void LCD_Write_Data(unsigned char Data) { //while(LCD_Check_Busy()); //忙則等待 DelayMs(5); RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; } /*------------------------------------------------ 清屏函式 ------------------------------------------------*/ void LCD_Clear(void) { LCD_Write_Com(0x01); DelayMs(5); } /*------------------------------------------------ 寫入字串函式 ------------------------------------------------*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) { if (y == 0) { LCD_Write_Com(0x80 + x); //表示第一行 } else { LCD_Write_Com(0xC0 + x); //表示第二行 } while (*s) { LCD_Write_Data( *s); s ++; } } /*------------------------------------------------ 寫入字元函式 ------------------------------------------------*/ /* void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) { if (y == 0) { LCD_Write_Com(0x80 + x); } else { LCD_Write_Com(0xC0 + x); } LCD_Write_Data( Data); }*/ /*------------------------------------------------ 初始化函式 ------------------------------------------------*/ void LCD_Init(void) { LCD_Write_Com(0x38); /*顯示模式設定*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); LCD_Write_Com(0x08); /*顯示關閉*/ LCD_Write_Com(0x01); /*顯示清屏*/ LCD_Write_Com(0x06); /*顯示游標移動設定*/ DelayMs(5); LCD_Write_Com(0x0C); /*顯示開及游標設定*/ }

②延時函式

#include "delay.h"
/*------------------------------------------------
 uS延時函式,含有輸入引數 unsigned char t,無返回值
 unsigned char 是定義無符號字元變數,其值的範圍是
 0~255 這裡使用晶振12M,精確延時請使用匯編,大致延時
 長度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
 while(--t);
}
/*------------------------------------------------
 mS延時函式,含有輸入引數 unsigned char t,無返回值
 unsigned char 是定義無符號字元變數,其值的範圍是
 0~255 這裡使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{

 while(t--)
 {
     //大致延時1mS
     DelayUs2x(245);
     DelayUs2x(245);
 }
}

③以下是主函式

#include<reg52.h>    //包含標頭檔案,一般情況不需要改動,標頭檔案包含特殊功能暫存器的定義
#include"1602.h"
#include"delay.h"

sbit IR=P3^2;  //紅外介面標誌

char code Tab[16]="0123456789ABCDEF";
/*------------------------------------------------
                全域性變數宣告
------------------------------------------------*/

unsigned char  irtime;//紅外用全域性變數

bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char irdata[33];

unsigned char TempData[16];
/*------------------------------------------------
                  函式宣告
------------------------------------------------*/
void Ir_work(void);
void Ircordpro(void);

/*------------------------------------------------
                  定時器0中斷處理
------------------------------------------------*/

void tim0_isr (void) interrupt 1 using 1
{
  irtime++;  //用於計數2個下降沿之間的時間
}

/*------------------------------------------------
                  外部中斷0中斷處理
------------------------------------------------*/
void EX0_ISR (void) interrupt 0 //外部中斷0服務函式
{
  static unsigned char  i;             //接收紅外訊號處理
  static bit startflag;                //是否開始處理標誌位

if(startflag)                         
   {
    if(irtime<63&&irtime>=33)//引導碼 TC9012的頭碼,9ms+4.5ms
                        i=0;
            irdata[i]=irtime;//儲存每個電平的持續時間,用於以後判斷是0還是1
            irtime=0;
            i++;
             if(i==33)
                {
                 irok=1;
                 i=0;
                }
          }
     else
        {
        irtime=0;
        startflag=1;
        }

}

/*------------------------------------------------
                定時器0初始化
------------------------------------------------*/
void TIM0init(void)//定時器0初始化
{

  TMOD=0x02;//定時器0工作方式2,TH0是重灌值,TL0是初值
  TH0=0x00; //過載值
  TL0=0x00; //初始化值
  ET0=1;    //開中斷
  TR0=1;    
}
/*------------------------------------------------
                  外部中斷0初始化
------------------------------------------------*/
void EX0init(void)
{
 IT0 = 1;   //指定外部中斷0下降沿觸發,INT0 (P3.2)
 EX0 = 1;   //使能外部中斷
 EA = 1;    //開總中斷
}
/*------------------------------------------------
                  鍵值處理
------------------------------------------------*/

void Ir_work(void)
{
       TempData[0] = Tab[IRcord[0]/16];   //處理客戶碼
       TempData[1] = Tab[IRcord[0]%16];
       TempData[2] = '-';
       TempData[3] = Tab[IRcord[1]/16];   //處理客戶碼
       TempData[4] = Tab[IRcord[1]%16];
       TempData[5] = '-';
       TempData[6] = Tab[IRcord[2]/16];   //處理資料碼
       TempData[7] = Tab[IRcord[2]%16];
       TempData[8] = '-';
       TempData[9] = Tab[IRcord[3]/16];   //處理資料反碼
       TempData[10] = Tab[IRcord[3]%16];

       LCD_Write_String(5,1,TempData);

       irpro_ok=0;//處理完成標誌

  }
/*------------------------------------------------
                紅外碼值處理
------------------------------------------------*/
void Ircordpro(void)//紅外碼值處理函式
{ 
  unsigned char i, j, k;
  unsigned char cord,value;

  k=1;
  for(i=0;i<4;i++)      //處理4個位元組
     {
      for(j=1;j<=8;j++) //處理1個位元組8位
         {
          cord=irdata[k];
          if(cord>7)//大於某值為1,這個和晶振有絕對關係,這裡使用12M計算,此值可以有一定誤差
             value|=0x80;
          if(j<8)
            {
             value>>=1;
            }
           k++;
         }
     IRcord[i]=value;
     value=0;     
     } 
     irpro_ok=1;//處理完畢標誌位置1
}

/*------------------------------------------------
                    主函式
------------------------------------------------*/
void main(void)
{
 EX0init();            //初始化外部中斷
 TIM0init();           //初始化定時器

 LCD_Init();           //初始化液晶
 DelayMs(20);          //延時有助於穩定
 LCD_Clear();          //清屏

 LCD_Write_String(0,0,"www.doflye.net");
 LCD_Write_String(0,1,"Code:");

 while(1)//主迴圈
   {
    if(irok)                        //如果接收好了進行紅外處理
      {   
       Ircordpro();
       irok=0;
      }

    if(irpro_ok)                   //如果處理好後進行工作處理,如按對應的按鍵後顯示對應的數字等
      {
       Ir_work();
      }
   }
}

相關推薦

紅外遙控系統原理51微控制器軟體解碼程式

紅外接收頭的型號有很多HS0038 VS838等 功能大致相同,只是引腳封裝不同。 紅外接收有幾種統一的編碼方式,取樣哪種編碼方式取決於遙控器使用的晶片,接收頭收到的都是一樣的。 電視遙控器使用的是專用整合發射晶片來實現遙控碼的發射,如東芝TC9012,飛利

【轉】51微控制器精確延遲程式

51微控制器精確延時程式(晶振12MHz,一個機器週期1us.) 幾個精確延時程式:在精確延時的計算當中,最容易讓人忽略的是計算迴圈外的那部分延時,在對時間要求不高的場合,這部分對程式不會造成影響. 一. 500ms延時子程式:(晶振12MHz,一個機器週期1us.)   

寫了一個 51微控制器外部中斷程式

/*******************************************************************/ /*                                                                 */ /* 微控制器開發系統演示程式

51微控制器C語言程式100例

目錄目錄................................................................................................................................1函式的使用和熟悉**************

51微控制器簡潔按鍵程式

最為精闢和實用的按鍵處理程式;1.新型的按鍵掃描程式;不過我在網上游逛了很久,也看過不少源程式了,沒有;同時,這裡面用到了一些分層的思想,在微控制器當中也;以下假設你懂C語言,因為純粹的C語言描述,所以和;核心演算法:;unsignedcharTrg;;unsignedcha

51微控制器萬能紅外遙控學習(通過波形學習)

最近公司需要開發一款紅外萬能學習模組,利用手機app控制,紅外模組需要帶有紅外接收模組,和發射模組。剛開始我用普遍的紅外四位元組時序成功的學習到資料和發射,但後來發現空調的編碼位元組數是不一樣的,公司要求只需要學習到空調的碼就可以,不需要像空調一樣,一個按鍵多次按發射不同的

51微控制器紅外遙控繼電器電路部分設計

1.電路設計      電源電路設計原理圖為:在電源插孔處,其內部邊緣實際是2號腳,為接地腳;1腳實際是內部的一根鐵芯,為電源接頭,在此設計的電路中需要接藍色的自鎖開關3號電源輸入,並由開關的5腳為整個紅外接收模組提供電能,本電源部分是小電壓電路經常採用的供電結構。在供電

淺析操作系統函數調用原理-實例

做的 調用 ble pri 用戶 過多 tdi 獨立 簡單的 最近在研究二進制,研究到函數調用部分,將自己理解的原理做個記錄。 首先需要了解系統棧的工作原理,棧可以理解成一種先進後出的數據結構,這就不用多說了。 在操作系統中,系統棧也起到用來維護函數調用、參數傳遞等關系的一

MCS-51微控制器 原理 整理

1 書籍 《MCS-51微控制器原理、系統設計與應用_12015401.pdf》 MCS-51 Intel 公司 的 8051 核心技術 MSC-51微控制器(有史以來,最簡單易懂教程).pdf 《新編MCS-51微控制器應用設計.pdf》 ---- good 2 MCS-51

基於51微控制器的交通燈控制系統設計

第一章 硬體設計與原理 以AT89C51微控制器為核心,起著控制作用。系統包括數碼管顯示電路、復位電路、時鐘電路、發光二級管電路和按鍵電路。設計思路分為六個模組:復位電路、晶振電路模組、AT89C51、數碼管顯示電路、發光二級管電路和按鍵電路這六個模組。 1.2 硬體設計分析 1.

51微控制器最小系統板製作過程

本文將介紹如何自制一個51微控制器最小系統及一些附加模組。最終制成的系統將具有燒錄程式,執行程式等功能。   先放兩張張最終成品如下  ​ (正面) (反面--錫接走線法)   提醒讀者,下載口的佈局有點不合理,請調至第五部的測試下載模

51微控制器的工作流程及原理解析、stm32的bootload解析

(1)51執行原理:                       http://www.elecfans.com/emb/danpianji/20181030805716.ht

基於51微控制器的溫度控制系統畢設

基於51微控制器的溫度控制系統畢設 分享一下微控制器畢設課程計參考資料33個,獻給大四的朋友,畢業設計就不用愁了,如果有什麼不懂的地方可以加群大家一起交流:813238832資料下載的地址:https://bbs.usoftchina.com/thread-208012-1-1.html 1、CDMA通訊

51微控制器獨立鍵盤原理

我這按鍵是機械彈性按鍵,所以具有彈性,按鍵在按下和鬆開的瞬間均伴隨有一連串的抖動,鍵抖動會引起一次按鍵被誤讀多次,然後為了保證cpu對鍵的一次閉合僅作一次處理,所以我們必須去除抖動。去除抖動有2種,硬體消抖和軟體消抖。其中一軟體消抖最方便。所以我就以軟體消抖為例。     獨

51微控制器之獨立按鍵和矩陣鍵盤(概念及原理

一、基本知識         1.按鍵分類與輸入原理         按鍵按照結構原理科分為兩類,一類是觸點式開關按鍵,如機械式開關、導電橡膠式開關燈;另一類是無觸點式開關按鍵,如電氣式按鍵,磁感應按鍵等。前者造價低,後者壽命長。目前,微機系統中最常見的是觸點式開關按鍵。

51微控制器中斷系統(定時器、計數器)

*部分內容來源於網路 一、中斷 中斷是指計算機執行過程中,出現某些意外情況需主機干預時,機器能自動停止正在執行的程式並轉入處理新情況的程式,處理完畢後又返回原被暫停的程式繼續執行。 (*以上解釋來自於百度百科-中斷) 二、51微控制器中斷級別 中斷號 優先順

微控制器開發-紅外遙控漸變的晶片方案分享

外遙控是一種無線、非接觸控制技術,具有抗干擾能力強,資訊傳輸可靠,功耗低,成本低,易實現等顯著優點,被諸多電子裝置特別是家用電器廣泛採用,並越來越多的應用到計算機和手機系統中。 隨著LED陸續匯入室內、室外照明市場,LED照明價格也大幅下降,但品質參差不齊也導致問題叢生,據指出,各地陸續訂定LE

51微控制器最小系統的製作

#include <REGX52.H>      //預處理命令 void main(void)      {     unsigned int a;          while(1)    {                P2_0 = 0;      //設P2.0口為低電平,點亮LED

51微控制器定時器的原理與使用

定時器是微控制器的重要功能模組之一,在檢測、控制領域有廣泛應用。定時器常用作定時時鐘,以實現定時檢測,定時響應、定時控制,並且可以產生ms寬的脈衝訊號,驅動步進電機。定時和計數的最終功能都是通過計數實現,若計數的事件源是週期固定的脈衝則可實現定時功能,否則只能實現計數功能。

手把手講解51微控制器最小系統焊接、流水燈(跑馬燈)編寫以及燒錄

(1)首先當然是要購買“51微控制器最小系統的散件”,淘寶上面賣的比較多,散件的話一般二、三十元左右,其次還需要購買一個電烙鐵,一般30瓦的就足夠了,這裡我就講一講51微控制器散件的焊接方法和注意事