《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 通信与网络 > 设计应用 > 51单片机红外遥控解码
51单片机红外遥控解码
EEworld
EEworld
摘要: 红外遥控发射芯片采用PPM编码方式,当发射器按键按下后,将发射一组108ms的编码脉冲。遥控编码脉冲由前导码、...
Abstract:
Key words :

關(guān)鍵字:51單片機(jī) 紅外遙控解碼

紅外遙控發(fā)射芯片采用PPM編碼方式,當(dāng)發(fā)射器按鍵按下后,將發(fā)射一組108ms的編碼脈沖。遙控編碼脈沖由前導(dǎo)碼、8位用戶碼、8位用戶碼的反碼、8位操作碼以及8位操作碼的反碼組成。通過(guò)對(duì)用戶碼的檢驗(yàn),每個(gè)遙控器只能控制一個(gè)設(shè)備動(dòng)作,這樣可以有效地防止多個(gè)設(shè)備之間的干擾。編碼后面還要有編碼的反碼,用來(lái)檢驗(yàn)編碼接收的正確性,防止誤操作,增強(qiáng)系統(tǒng)的可靠性。前導(dǎo)碼是一個(gè)遙控碼的起始部分,由一個(gè)9ms的低電平(起始碼)和一個(gè)4. 5ms的高電平(結(jié)果碼)組成,作為接受數(shù)據(jù)的準(zhǔn)備脈沖。以脈寬為0. 56ms、周期為1. 12ms的組合表示二進(jìn)制的“0”;以脈寬為1. 68ms、周期為2. 24ms的組合表示二進(jìn)制的“1”。如果按鍵按下超過(guò)108ms仍未松開(kāi),接下來(lái)發(fā)射的代碼(連發(fā)代碼)將僅由起始碼(9ms)和結(jié)束碼(2. 5ms)組成。

單片機(jī)采用外部中斷INTI管腳和紅外接收頭的信號(hào)線相連,中斷方式為邊沿觸發(fā)方式。并用定時(shí)器0計(jì)算中斷的間隔時(shí)間,來(lái)區(qū)分前導(dǎo)碼、二進(jìn)制的“1”、“0”碼。并將8位操作碼提取出來(lái)在數(shù)碼管上顯示。

// 解碼值在Im[2]中,當(dāng)IrOK=1時(shí)解碼有效。 
/* 51單片機(jī)紅外遙控解碼程序 */
//用遙控器對(duì)準(zhǔn)紅外接收頭,按下遙控器按鍵,在數(shù)碼管前兩位上就會(huì)顯示對(duì)應(yīng)按鍵的編碼

#include
#define uchar unsigned char 
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar f;

#define Imax 14000    //此處為晶振為11.0592時(shí)的取值, 
#define Imin 8000    //如用其它頻率的晶振時(shí),
#define Inum1 1450    //要改變相應(yīng)的取值。
#define Inum2 700 
#define Inum3 3000

unsigned char Im[4]={0x00,0x00,0x00,0x00};
uchar show[2]={0,0};
unsigned long m,Tc;
unsigned char IrOK;


void delay(uchar i)
{
  uchar j,k; 
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}

void display()
{
   dula=0;
   P0=table[show[0]];
   dula=1;
   dula=0;
   
   wela=0;
   P0=0xfe;
   wela=1;
   wela=0;
   delay(5);
   
   P0=table[show[1]];
   dula=1;
   dula=0;
   
   P0=0xfd;
   wela=1;
   wela=0;
   delay(5);
}

 

關(guān)鍵字:51單片機(jī)紅外遙控解碼

 

//外部中斷解碼程序
void intersvr1(void) interrupt 2 using 1
{
 Tc=TH0*256+TL0;                                               //提取中斷時(shí)間間隔時(shí)長(zhǎng)
 TH0=0; 
    TL0=0;              //定時(shí)中斷重新置零
 if((Tc>Imin)&&(Tc      { 
  m=0;
        f=1;
  return;
      }       //找到啟始碼
   if(f==1)
      {
        if(Tc>Inum1&&Tc    {
   Im[m/8]=Im[m/8]>>1|0x80; m++; 
       }
      if(Tc>Inum2&&Tc        {
         Im[m/8]=Im[m/8]>>1; m++; //取碼
  }
  if(m==32) 
   {
         m=0;  
         f=0;
         if(Im[2]==~Im[3]) 
      {
           IrOK=1; 
   }
        else IrOK=0;   //取碼完成后判斷讀碼是否正確
     }
               //準(zhǔn)備讀下一碼
   }
 
}

 


/*演示主程序*/
void main(void)
{
    unsigned int  a;
   
 m=0;
    f=0;
 EA=1;
 
 IT1=1;EX1=1;
 
 TMOD=0x11;  
 TH0=0;TL0=0;
 TR0=1;//ET0=1;

 while(1)
 {
 
       if(IrOK==1) 
  {
      show[1]=Im[2] & 0x0F;     //取鍵碼的低四位
           show[0]=Im[2] >> 4;  
           IrOK=0;
     
  }
           for(a=100;a>0;a--)
          {
    display();
   }
 
 }
}

 

 

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。

相關(guān)內(nèi)容