學習紅外解碼的步驟:
1,搜索相關(guān)資料。我已經(jīng)幫你們搜索好了。
2,理解紅外解碼的原理。
弄清怎么發(fā)射的和怎么接收的,主要是怎么接收的。
3,編寫程序,調(diào)試,應(yīng)用。
第一部分
原理:
我們先要弄清它是怎么發(fā)射的,和怎么接收的。
一、編碼
遙控發(fā)射器專用芯片很多,根據(jù)編碼格式可以分成兩大類,這里我們以運用比較廣泛,解碼比較容易的一類來加以說明,現(xiàn)以日本NEC的uPD6121G組成發(fā)射電路為例說明編碼原理。當發(fā)射器按鍵按下后,即有遙控碼發(fā)出,所按的鍵不同遙控編碼也不同。這種遙控碼具有以下特征:
采用脈寬調(diào)制的串行碼,以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進制的“0”;以脈寬為0.565ms、間隔1.685ms、周期為2.25ms的組合表示二進制的“1”,其波形如下圖所示。
上述“0”和“1”組成的32位二進制碼經(jīng)38kHz的載頻進行二次調(diào)制以提高發(fā)射效率,達到降低電源功耗的目的。然后再通過紅外發(fā)射二極管產(chǎn)生紅外線向空間發(fā)射。編碼數(shù)據(jù),載波,發(fā)射,接收解碼如下圖所示:
UPD6121G產(chǎn)生的遙控編碼是連續(xù)的32位二進制碼組,其中前16位為用戶識別碼,能區(qū)別不同的電器設(shè)備,防止不同機種遙控碼互相干擾。該芯片的用戶識別碼固定為十六進制01H;后16位為8位操作碼(功能碼)及其反碼。UPD6121G最多額128種不同組合的編碼。
遙控器在按鍵按下后,周期性地發(fā)出同一種32位二進制碼,周期約為108ms。一組碼本身的持續(xù)時間隨它包含的二進制“0”和“1”的個數(shù)不同而不同,大約在45~63ms之間,發(fā)射波形圖如下圖所示。
當一個鍵按下超過36ms,振蕩器使芯片激活,將發(fā)射一組108ms的編碼脈沖,這108ms發(fā)射代碼由一個起始碼(9ms),一個結(jié)果碼(4.5ms),低8位地址碼(9ms ~ 18ms),高8位地址碼(9ms ~ 18ms),8位數(shù)據(jù)碼(9ms ~ 18ms)和這8位數(shù)據(jù)的反碼(9ms~18ms)組成。如果鍵按下超過108ms仍未松開,接下來發(fā)射的代碼(連發(fā)代碼)將僅由起始碼(9ms)和結(jié)束碼(2.5ms)組成。
這是最重要的:引導碼+用戶識別碼+用戶識別碼(反碼)+操作碼+操作碼(反碼)
二、接收部分
P32 連著外部中斷0
單片機上的外部中斷 0
來一個下降沿就進入中斷。
#include
#define uchar unsigned char
#define uint unsigned int
int irtime;
uchar disp[8];
uchar startflag;//開始標志
uchar irdata[33];//數(shù)據(jù)一共33位加上引導碼
uchar bitnum;
uchar irreceok;//接收一幀數(shù)據(jù)完成
uchar ircode[4];//4個字節(jié)的數(shù)據(jù)
uchar irprosok;//處理完成
sbit SH_CP=P2^4;
sbit DS=P2^5;
sbit ST_CP=P1^5;
uchar code wei[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
uchar code duan[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //0123456789abcdef
void send_dat(unsigned dat)
{
unsigned char i;
for(i=0;i< 8;i++)
{
DS=dat&0x80;
SH_CP=1;
SH_CP=0;
dat< <=1;
}
}
void timer0init(void)
{
TMOD=0X02;
TH0=0;
TL0=0;
ET0=1;
EA=1;
TR0=1;
}
void int0init(void)
{
IT0=1;
EX0=1;
EA=1;
}
void irwork()
{
//disp[0]=ircode[0]/16;
//disp[1]=ircode[0];
//disp[2]=ircode[1]/16;
//disp[3]=ircode[1];
// disp[4]=ircode[2]/16;
// disp[5]=ircode[2]/100;
// disp[6]=ircode[2]0/10;
// disp[7]=ircode[2];
switch (ircode[2])
{
case 6 : disp[6]=0;disp[7]=1;break;
case 12 :disp[6]=0;disp[7]=2 ;break;
case 47 :disp[6]=0;disp[7]=3;break;
case 4 : disp[6]=0;disp[7]=4;break;
case 14 :disp[6]=0;disp[7]=5 ;break;
case 45 :disp[6]=0;disp[7]=6;break;
case 33: disp[6]=0;disp[7]=7;break;
case 41 :disp[6]=0;disp[7]=8 ;break;
case 37 :disp[6]=0;disp[7]=9;break;
default : disp[5]=0;
disp[6]=15;
disp[7]=15 ;
}
}
void irpros(void) //處理函數(shù)
{
uchar k,i,j;
uchar value;
k=1;
for(j=0;j< 4;j++)
{
for(i=0;i< 8;i++)
{
if(irdata[k] >10)//時間長度等于1.125ms就是0 等于2.25ms就是1;
{
value=value|0x80;
}
else
{
value=value;
}
if(i< 8)
{
value=value >>1;
}
k++;
}
ircode[j]=value;//ircode[j]返回的是十六進制數(shù)。
value=0;
}
irprosok=1;
}
void display(void)
{
uchar i;
for(i=5;i< 8;i++)
{
send_dat(duan[disp*]); //定義段 0亮
send_dat(wei*); //定義位 1亮
ST_CP=1;
ST_CP=0;
//delay(2);
}
}
void main()
{
timer0init();
int0init();
while(1)
{
if(irreceok)
{
irpros();
irreceok=0;
}
if(irprosok)
{
irwork();
irprosok=0;
}
display();
}
}
void timer0 () interrupt 1
{
irtime++;
}
void int0 () interrupt 0
{
if(startflag)
{
if(irtime< 126&&irtime >=66)//檢測引導碼9ms
{
bitnum=0;
}
irdata[bitnum]=irtime;
irtime=0;
bitnum++;
if(bitnum==33)
{
bitnum=0;
irreceok=1;
}
}
else
{
startflag=1;
irtime=0;
}
}
-
芯片
+關(guān)注
關(guān)注
455文章
50714瀏覽量
423155 -
振蕩器
+關(guān)注
關(guān)注
28文章
3832瀏覽量
139038 -
遙控發(fā)射器
+關(guān)注
關(guān)注
1文章
11瀏覽量
7829 -
遙控解碼
+關(guān)注
關(guān)注
0文章
9瀏覽量
1720
發(fā)布評論請先 登錄
相關(guān)推薦
評論