- 什么是紅外遙控
紅外遙控系統主要由紅外發射裝置和紅外接收裝置構成。
紅外發射裝置主要由鍵盤電路、紅外編碼芯片、電源和紅外發射電路組成(比如遙控器),如圖:
紅外接收裝置主要由紅外接收電路、紅外解碼芯片、電源和應用電路組成,在單片機開發板上有紅外接收電路,而且單片機充當解碼芯片。
- 紅外信號是怎么傳輸的
人的眼睛能看到的可見光按波長從長到短排列依次為:紅、橙、黃、綠、青、藍、紫。其中紅光的波長范圍為0.62~0.72微米,紅外遙控就是利用波長為0.76至1.5微米之間的近紅外線來傳送控制信號的。
紅外信號的發射由紅外發射電路中的紅外發光二極管完成,通常情況下為了提高抗干擾能力與降低電源消耗,遙控器將遙控信號(二進制脈沖碼)調制在載波(載波是傳送信息的物理基礎和承載工具)上經放大后發送至紅外二極管,再由二極管轉換為紅外信號發送出去。
遙控器上不同的按鍵有著不一樣的鍵值,按下相對應的鍵,紅外二極管就會發送對應的信號,接收裝置接收到信號后會對信號進行信號解調后會得到相應按鍵的鍵值,再根據不同的鍵值執行相應的操作。
- NEC協議
就像串口通信一樣,紅外通信也有其自己的通信協議,我們一般遵循NEC協議。
NEC規定紅外二極管每次發送的信號的數據格式如下:
發送的數據主要由引導碼、用戶碼1、用戶碼2、數據碼、數據反碼組成。引導碼相當于暗號,當接收裝置接收到正確的引導碼后就開始讀取數據,倆組用戶碼是為了區別其他的紅外發射器發射的信號,數據碼中的內容就對應著相應的鍵值,數據反碼是為了在接收信號后檢驗信號的正確性。(引導碼是“9ms高電平+4.5ms低電平”)
這樣我們雖然清楚了信號的發送形式,但是怎么表達數據發送中的高低位(“0"和"1”)呢?這又涉及到NEC的位定義了,規定:“0.56ms高電平+0.565ms低電平”代表“1”;“0.56ms高電平+1.69ms低電平”代表“0”,就是說“0”與“1”的不同就是他們低電平所持續的時間不同。(PS:發送數據時從最低位開始發送)
不知道讀者注意到黑體字標出的發送沒,為什么要刻意強調是發送時的呢?因為單片機接收到的數據格式與發送時的恰恰相反,就是說接收時的引導碼是“9ms低電平+4.5ms高電平”;“0”是“0.56ms低電平+0.565ms高電平”;“1”是“0.56ms低電平+1.69ms高電平”。這一點我們要格外注意,因為后續我們在解碼程序中是以接收到的數據為準的!!!
- 程序分析
敲代碼之前首先要對程序有一個清楚的認識,即明白要做哪幾個模塊?這些模塊之間要怎么聯系起來?在下做的一個程序是把從紅外發射器中接收到數據經過處理后顯示在數碼管上,這樣看來我的程序就需要如下幾個模塊:
1.初始化模塊:包括初始化紅外接收引腳(把P3.2外部中斷引腳作為紅外接收引腳)、打開外部中斷允許位;
2.延時模塊:延時模塊主要用來分析高低電平持續的時間,從而判斷對應的位是“0”還是“1”;
3.解碼模塊:利用外部中斷函數interrupt 0進行數據解碼,其任務是檢驗并接收正確的數據信號,對用戶碼和數據碼進行分析,即通過檢測高低電平持續的時間來判斷相應的位是“0”還是“1”。然后得出相對應的鍵值,把鍵值對應的數反饋到程序中;
4.顯示模塊:其主要任務是接收解碼模塊反饋的數值,并將數值顯示在數碼管上;
5.主函數模塊:整合前幾個模塊。
程序如下:
#include"reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit a=P2^2;//a、b、c是控制位選的三個引腳
sbit b=P2^3;
sbit c=P2^4;
sbit IR=P3^2;//將紅外接收引腳和外部中斷0引腳定義在一起,
這樣一旦接收到信號就進入中斷函數進行解碼
uint jz=0,time;//jz存的是鍵值相對應的數值
uchar irdata[4],duan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};
//duan[17]存的是數碼管段選顯示0~F的數據;irdata[4]存的是一組用戶碼和數據碼、數據反碼
void dy(uint n) //延時一次約為0.01ms 用來判斷脈沖時間
{while(n--);}
void xs(uint x) //數碼管顯示
{
a=0;b=0;c=0;//因為我遙控器上的數只有0~9,所以就位選時控制一個數碼管就行
P0=duan[x];//顯示數字
}
void init() //初始化
{
IT0=1;//確定中斷0(紅外接收)的觸發方式為下降沿觸發
EX0=1;//打開外部中斷0和總中斷的允許位
EA=1;
IR=1; //相當于打開外部中斷0 此處意義為紅外接收器打開
}
void hhh() interrupt 0 //執行中斷:進行讀取信號 最后產生鍵值
{
uint i,j,k;
dy(700);//能進入中斷函數就代表IR已經為0,此處的延時是為了判斷延時的大體時間
if(IR==0)
{
k=1000;
while(IR==0&&(k>0))//檢測引導碼中9ms低電平
{
dy(1);
k--;
}
if(IR==1)//判斷高電平
{
k=500;
while(IR==1&&(k>0))//檢測引導碼中4.5ms高電平
{
dy(1);
k--;
}
for(i=0;i<4;i++) //開始讀取用戶碼和數據和數據反碼,
因為用戶碼和數據碼、數據反碼共有4組,所以外層有四組循環
{
for(j=0;j<8;j++)//每組數據有八位,故內層循環有八組,每次循環讀一位
{
if(IR==0)
{
k=70;
while(IR==0&&(k>0))//檢測0.56ms的低電平
{
k--;
dy(1);
}
}
if(IR==1)//進入高電平時間,這一塊比較核心,它判斷了高電平持續時間的長短
{
time=0;
k=500;
while(IR==1&&k>0)//開始檢測高電平
{
dy(10);
time++;//time是以0.1ms為單位,因為dy(10);
k--;
}
if(time>30) return ;
irdata[i]>>=1; //移位運算,空出最高為為下一次采集做準備
if(time>=8)//如果高電平持續時間超過0.85ms代表位是“1”
irdata[i]|=0x80;//或運算,給最高為置1
time=0;//重置
}
}
}
}
if(irdata[2]!=~irdata[3])//irdata[2]與irdata[3]分別是數據碼和數據反碼 ,此操作是檢驗數據準確性
return;
}
switch(irdata[2])//反饋鍵值所對應的數值
{
case 0x16:jz=0;break;
case 0x0c:jz=1;break;
case 0x18:jz=2;break;
case 0x5e:jz=3;break;
case 0x08:jz=4;break;
case 0x1c:jz=5;break;
case 0x5a:jz=6;break;
case 0x42:jz=7;break;
case 0x52:jz=8;break;
case 0x4a:jz=9;break;
case 0x45:jz=10;break;
default:break;
}
}
void main()
{
init();//初始化
while(1)
xs(jz);//顯示數值
}
上一篇:51單片機-實踐操作
下一篇:51單片機—串口通信
推薦閱讀
史海拾趣
隨著產品質量的提升和市場口碑的積累,Ametherm公司開始積極拓展國內外市場。他們與多家知名企業建立了合作關系,將產品應用于各種電子設備中。同時,公司還積極參加國際電子展會,與全球客戶進行交流與合作。這些舉措使得Ametherm的品牌影響力逐漸擴大,市場份額也穩步提升。
在Littelfuse的支持下,C&K Switches公司繼續保持著穩健的發展態勢。它不斷推出新產品和技術,拓展新的應用領域和市場。同時,C&K還加強了與全球客戶和合作伙伴的合作關系,共同推動電子行業的發展。展望未來,C&K將繼續致力于技術創新和產品研發,不斷提升產品質量和服務水平,為客戶提供更優質、更可靠的產品和解決方案。
這些故事展示了C&K Switches公司在電子行業中的發展歷程和成就。從創立之初的精湛技藝和創新理念,到全球布局和業務拓展,再到技術突破和創新以及與Littelfuse的收購與合作,C&K始終保持著對技術的追求和對市場的敏銳洞察。未來,C&K將繼續在電子行業中發揮重要作用,推動行業的發展和進步。
3L Electronic Corporation深知人才是企業發展的根本。因此,公司注重人才培養和團隊建設,為員工提供豐富的培訓和發展機會。通過引進優秀人才和建立激勵機制,公司形成了一支高效、專業的團隊,為公司的持續創新和發展提供了有力保障。
Excelta公司創立于20世紀90年代初,當時電子元器件市場正處于快速發展階段。創始人李明看到連接器市場的巨大潛力,決定投身其中。然而,初創時期資金緊張,技術儲備薄弱,公司面臨巨大挑戰。李明帶領團隊日夜兼程,通過技術創新和成本控制,成功開發出第一款具有競爭力的連接器產品,并迅速獲得了市場的認可。此后,Excelta逐漸在連接器領域嶄露頭角。
面對日益嚴峻的環境問題,CTC Coils Ltd公司積極響應國家綠色發展的號召,開始實施綠色環保戰略。公司引進先進的生產設備和工藝,優化生產流程,減少能源消耗和廢物排放。同時,公司還研發出了一系列環保型電感線圈產品,滿足了市場對綠色電子產品的需求。
本制作使用2X16的液晶(國內型號叫1602B)。可以將234個來電存在EEPROM中,并可以通過電腦串行口在超級終端中讀取數據。MT8870 是電信信號 DTMF 解碼器,在本電路中有兩個輸入:一個是電話線輸入,另一個是耳機輸入,可以接掃描儀、錄音機等設備。兩 ...… 查看全部問答∨ |
前言: 在 SMPS(Switching Mode Power Supply) 以及 DC-DC 轉換器設計中 , 使用場效應晶體管當作切換開關已經越來越普遍。在設計中為了減少尺寸大小和提升電源密度 , 其電源管理中操作工作頻率也要求越來越高。如此會造成較高的 di/dt 產生使得 ...… 查看全部問答∨ |
請教將12.xMHz方波二倍頻到24.xMHz,有什么方法? 1,用fpga的pll或pll的IC來做。(現不考慮) 2,用RC和門電路搭一個,怎么做呢?占空比50%,可以嗎? 3,聽說可以RC結合FPGA/CPLD,這個和2的方法應該是一致的吧? 4,還有其他方法嗎?… 查看全部問答∨ |
|
采用低功耗的單片機和藍牙模塊研制出一種便攜式的住院病人生理參數采集系統,實現了醫院內普通病房的無線生理數據采集功能。本文從硬件和軟件兩方面討論了系統的設計和實現過程 ,并選擇了體溫測量模塊的實現方法做重點介紹 ,闡明了藍牙技術在醫療 ...… 查看全部問答∨ |
|
我想確定一個問題,就是:是不是我把卡A放到GSM模塊中··然后程序里定義的手機號碼B··然后卡A發短信噶B呢? 一下是我幾個AT指令: unsigned char code mode[]= "AT+CMGF=1\\r "; //&nb ...… 查看全部問答∨ |