紅外遙控系統原理附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微控制器散件的焊接方法和注意事