找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 13998|回復(fù): 55
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)學(xué)習(xí)手記——紅外遙控解碼<一>【原創(chuàng)】

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:53134 發(fā)表于 2013-8-17 00:26 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
-------------------------------------寫在前面的廢話-----------------------------------------------

    2013年暑假在學(xué)校沒回家,參加了2013TI杯湖北省電子設(shè)計(jì)大賽。比賽的時(shí)候,看到大家在比賽之前都準(zhǔn)備了各種模塊(顯示模塊,電源模塊,矩陣鍵盤...)顯然他們比賽的時(shí)候就輕松多了,而我就是一個(gè)菜鳥,沒什么經(jīng)驗(yàn),第一次參加比賽。也沒準(zhǔn)備什么模塊。導(dǎo)致后來三天兩夜的比賽中吃了大虧。所以平時(shí)要準(zhǔn)備各種模塊,和寫好的程序。


--------------------------------------------------------------------------------------------------
學(xué)習(xí)紅外解碼的步驟:
1,搜索相關(guān)資料。我已經(jīng)幫你們搜索好了。
2,理解紅外解碼的原理。
弄清怎么發(fā)射的和怎么接收的,主要是怎么接收的。
3,編寫程序,調(diào)試,應(yīng)用。

第一部分
原理:
我們先要弄清它是怎么發(fā)射的,和怎么接收的。



一、編碼
遙控發(fā)射器專用芯片很多,根據(jù)編碼格式可以分成兩大類,這里我們以運(yùn)用比較廣泛,解碼比較容易的一類來加以說明,現(xiàn)以日本NEC的uPD6121G組成發(fā)射電路為例說明編碼原理。當(dāng)發(fā)射器按鍵按下后,即有遙控碼發(fā)出,所按的鍵不同遙控編碼也不同。這種遙控碼具有以下特征:
采用脈寬調(diào)制的串行碼,以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進(jìn)制的“0”;以脈寬為0.565ms、間隔1.685ms、周期為2.25ms的組合表示二進(jìn)制的“1”,其波形如下圖所示。






上述“0”和“1”組成的32位二進(jìn)制碼經(jīng)38kHz的載頻進(jìn)行二次調(diào)制以提高發(fā)射效率,達(dá)到降低電源功耗的目的。然后再通過紅外發(fā)射二極管產(chǎn)生紅外線向空間發(fā)射。編碼數(shù)據(jù),載波,發(fā)射,接收解碼如下圖所示:









UPD6121G產(chǎn)生的遙控編碼是連續(xù)的32位二進(jìn)制碼組,其中前16位為用戶識(shí)別碼,能區(qū)別不同的電器設(shè)備,防止不同機(jī)種遙控碼互相干擾。該芯片的用戶識(shí)別碼固定為十六進(jìn)制01H;后16位為8位操作碼(功能碼)及其反碼。UPD6121G最多額128種不同組合的編碼。

遙控器在按鍵按下后,周期性地發(fā)出同一種32位二進(jìn)制碼,周期約為108ms。一組碼本身的持續(xù)時(shí)間隨它包含的二進(jìn)制“0”和“1”的個(gè)數(shù)不同而不同,大約在45~63ms之間,發(fā)射波形圖如下圖所示。






當(dāng)一個(gè)鍵按下超過36ms,振蕩器使芯片激活,將發(fā)射一組108ms的編碼脈沖,這108ms發(fā)射代碼由一個(gè)起始碼(9ms),一個(gè)結(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)組成。








這是最重要的:引導(dǎo)碼+用戶識(shí)別碼+用戶識(shí)別碼(反碼)+操作碼+操作碼(反碼)








二、接收部分






P32 連著外部中斷0
單片機(jī)上的外部中斷 0
    來一個(gè)下降沿就進(jìn)入中斷。

#include
#define uchar unsigned char
#define uint unsigned int
int irtime;
uchar disp[8];
uchar startflag;//開始標(biāo)志
uchar irdata[33];//數(shù)據(jù)一共33位加上引導(dǎo)碼
uchar bitnum;
uchar irreceok;//接收一幀數(shù)據(jù)完成
uchar ircode[4];//4個(gè)字節(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)//時(shí)間長(zhǎng)度等于1.125ms就是0 等于2.25ms就是1;
{
value=value|0x80;
}
else
{
value=value;
}
if(i<8)
{
value=value>>1;
}
k++;
}
ircode[j]=value;//ircode[j]返回的是十六進(jìn)制數(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)//檢測(cè)引導(dǎo)碼9ms
{
bitnum=0;
}
irdata[bitnum]=irtime;
irtime=0;
bitnum++;
if(bitnum==33)
{
bitnum=0;
irreceok=1;
}
}
else
{
startflag=1;
irtime=0;
}

}



大家有什么疑問可以提出來(QQ:1874934688)。










資料: 紅外學(xué)習(xí).zip (1.51 MB, 下載次數(shù): 551)

源碼:
紅外源碼.zip (26.66 KB, 下載次數(shù): 230)



希望發(fā)燒友的新手們?cè)琰c(diǎn)能學(xué)會(huì)紅外解碼,有什么不明白的可以問我。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:262 發(fā)表于 2013-9-6 14:37 | 只看該作者
好東東我頂,51hei(51黑)單片機(jī)論壇有你更精彩.
回復(fù)

使用道具 舉報(bào)

板凳
ID:54902 發(fā)表于 2013-9-10 10:44 | 只看該作者
對(duì)于解碼這些東西還是不懂,樓主是不是使用任何一個(gè)紅外發(fā)射接收的管,都要解碼的?假如我使用PH303、PH302和單片機(jī)直接使用按鍵來 使一個(gè)led燈的亮滅應(yīng)該怎樣弄編程?
回復(fù)

使用道具 舉報(bào)

地板
ID:52286 發(fā)表于 2013-10-14 00:24 | 只看該作者
#在這里快速回復(fù)#支持支持、、
回復(fù)

使用道具 舉報(bào)

5#
ID:52964 發(fā)表于 2013-10-17 22:13 | 只看該作者
剛學(xué)單片機(jī),對(duì)遙控與AD方面不是很明,請(qǐng)樓群主教下NTC測(cè)溫方面的知識(shí).謝謝.QQ12812454
回復(fù)

使用道具 舉報(bào)

6#
ID:56497 發(fā)表于 2013-10-31 18:14 | 只看該作者
蠻有用的,不錯(cuò)~
回復(fù)

使用道具 舉報(bào)

7#
ID:56598 發(fā)表于 2013-11-3 22:56 | 只看該作者
不錯(cuò)~蠻有用的,不錯(cuò)~
回復(fù)

使用道具 舉報(bào)

8#
ID:56381 發(fā)表于 2013-11-3 23:14 | 只看該作者
很不錯(cuò),我要學(xué)學(xué)啊
回復(fù)

使用道具 舉報(bào)

9#
ID:56735 發(fā)表于 2013-11-8 19:03 | 只看該作者
很有用謝謝學(xué)習(xí)了。。
回復(fù)

使用道具 舉報(bào)

10#
ID:56685 發(fā)表于 2014-3-19 18:21 | 只看該作者
好評(píng)                              
回復(fù)

使用道具 舉報(bào)

11#
ID:60656 發(fā)表于 2014-4-13 22:32 | 只看該作者
收藏學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

12#
ID:60656 發(fā)表于 2014-4-13 22:33 | 只看該作者
diy個(gè)試試看效果
回復(fù)

使用道具 舉報(bào)

13#
ID:60246 發(fā)表于 2014-4-13 22:51 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

14#
ID:61227 發(fā)表于 2014-4-28 22:07 | 只看該作者
謝謝樓主慷慨,謝謝了
回復(fù)

使用道具 舉報(bào)

15#
ID:61227 發(fā)表于 2014-4-28 22:10 | 只看該作者
謝謝樓主慷慨,謝謝了
回復(fù)

使用道具 舉報(bào)

16#
ID:62517 發(fā)表于 2014-6-2 15:51 | 只看該作者
學(xué)習(xí)下
回復(fù)

使用道具 舉報(bào)

17#
ID:62533 發(fā)表于 2014-6-2 20:53 | 只看該作者
謝謝樓主慷慨,謝謝了
回復(fù)

使用道具 舉報(bào)

18#
ID:62553 發(fā)表于 2014-6-3 13:11 | 只看該作者
比較不錯(cuò)哦   樓主  謝謝
回復(fù)

使用道具 舉報(bào)

19#
ID:46838 發(fā)表于 2014-6-28 18:47 | 只看該作者
支持,謝謝分享,一定能學(xué)會(huì)的
回復(fù)

使用道具 舉報(bào)

20#
ID:63641 發(fā)表于 2014-7-5 19:34 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

21#
ID:63696 發(fā)表于 2014-7-7 11:28 來自手機(jī) | 只看該作者
樓主好人一生平安!學(xué)習(xí)進(jìn)步!感謝分享!
回復(fù)

使用道具 舉報(bào)

22#
ID:64732 發(fā)表于 2014-8-11 16:42 | 只看該作者
謝謝樓主啊
回復(fù)

使用道具 舉報(bào)

23#
ID:65361 發(fā)表于 2014-8-22 21:09 | 只看該作者
好東西,收藏。。。。
回復(fù)

使用道具 舉報(bào)

24#
ID:47760 發(fā)表于 2014-9-13 06:49 | 只看該作者
謝謝你的分享!
回復(fù)

使用道具 舉報(bào)

25#
ID:66338 發(fā)表于 2014-9-18 23:54 | 只看該作者
收藏學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

26#
ID:66338 發(fā)表于 2014-9-18 23:55 | 只看該作者
很實(shí)用!謝謝分享!
回復(fù)

使用道具 舉報(bào)

27#
ID:66338 發(fā)表于 2014-9-18 23:57 | 只看該作者
很不錯(cuò),謝謝樓主分享!!
回復(fù)

使用道具 舉報(bào)

28#
ID:61875 發(fā)表于 2014-9-19 10:26 | 只看該作者
謝謝樓主的奉獻(xiàn)。
回復(fù)

使用道具 舉報(bào)

29#
ID:68085 發(fā)表于 2014-10-29 21:04 | 只看該作者
學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

30#
ID:68146 發(fā)表于 2014-10-30 22:36 | 只看該作者
好東西
回復(fù)

使用道具 舉報(bào)

31#
ID:68146 發(fā)表于 2014-10-30 22:46 | 只看該作者
非常好
回復(fù)

使用道具 舉報(bào)

32#
ID:69215 發(fā)表于 2014-11-25 02:49 | 只看該作者
真是不錯(cuò)的資料
回復(fù)

使用道具 舉報(bào)

33#
ID:34185 發(fā)表于 2014-11-30 07:05 | 只看該作者
蠻有用的,不錯(cuò)~
回復(fù)

使用道具 舉報(bào)

34#
ID:34185 發(fā)表于 2014-11-30 07:06 | 只看該作者
真是不錯(cuò)的資料
回復(fù)

使用道具 舉報(bào)

35#
ID:34185 發(fā)表于 2014-11-30 07:10 | 只看該作者
真是不錯(cuò)的資料
回復(fù)

使用道具 舉報(bào)

36#
ID:34185 發(fā)表于 2014-12-3 18:06 | 只看該作者
很有用謝謝學(xué)習(xí)了!!
回復(fù)

使用道具 舉報(bào)

37#
ID:70104 發(fā)表于 2014-12-19 22:28 | 只看該作者
看看~~~~~
回復(fù)

使用道具 舉報(bào)

38#
ID:70104 發(fā)表于 2014-12-19 22:28 | 只看該作者
收下了,,不客氣
回復(fù)

使用道具 舉報(bào)

39#
ID:70104 發(fā)表于 2014-12-19 22:29 | 只看該作者
收下了,,不客氣
回復(fù)

使用道具 舉報(bào)

40#
ID:70104 發(fā)表于 2014-12-19 22:29 | 只看該作者
還差2個(gè)幣
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表