標(biāo)題: 51單片機(jī)紅外解碼程序+仿真文件(支持長/短按,自適應(yīng)主頻6MHz ~ 40MHz) [打印本頁]

作者: liuxu8888    時間: 2013-6-21 00:08
標(biāo)題: 51單片機(jī)紅外解碼程序+仿真文件(支持長/短按,自適應(yīng)主頻6MHz ~ 40MHz)
//*********************【 NEC解碼頭文件 】*******************
//
//     簡介:本程序適用于NCE解碼:(9ms+4.5ms)引導(dǎo)碼+32位編碼。
//           兼容STC所有型號(包括 1T 和 12T 系列),可以定義任意I/O作紅外接收腳,
//                         自適應(yīng)解碼主頻:6MHz ~ 40MHz。
//
// 使用條件:占用系統(tǒng)定時器0,開啟定時器0中斷(如使用其它定時器請自改IR_Init();初始化函數(shù))
//
// 使用說明:填相關(guān)宏定義:USER_H、USER_L、Check_EN、CPU_Fosc、IR,
//           上電初始化函數(shù)IR_Init(),
//           在定時器0中斷中調(diào)用IR_NEC()解碼函數(shù),
//           解碼有效時,IR_BT=2即短按,IR_BT=3即長按,由用戶清0,
//           解碼存放:用戶碼高8位NEC[0],用戶碼低8位NEC[1],操作碼NEC[2],操作碼反碼NEC[3]。
//
//【供用戶調(diào)用的函數(shù)】
//    IR_Init();                         //接收初始化,開啟定時器0中斷400us
//    IR_NEC();                             //紅外線解碼(解NEC編碼)
//          
//***************************************************************/
#ifndef __IR_NEC_H__
#define __IR_NEC_H__


//【用戶必填項:USER_H、USER_L、Check_EN、CPU_Fosc、IR】
#define  USER_H     0x80         //用戶碼高8位
#define  USER_L     0x7F         //用戶碼低8位
#define  Check_EN   0                    //是否要校驗16位用戶碼:不校驗填0,校驗則填1       
#define  CPU_Fosc   12000000L    //輸入主頻,自適應(yīng)解碼(單位:Hz,范圍:6MHz ~ 40MHz)
#define  CA_S       8                    //長按時間設(shè)置,單位:108mS(即 108mS整數(shù)倍,10倍以上為宜)

sbit IR = P3^6;                  //紅外線接口(任意引腳)

#define  Step       400          //紅外采樣步長:400us
#define  TH_H      ((65536-Step*(CPU_Fosc/300)/40000)/256)  //定時器高8位基準(zhǔn)賦值
#define  TH_L      ((65536-Step*(CPU_Fosc/300)/40000)%256)  //定時器低8位基準(zhǔn)賦值

uint8   IR_BT;     //解碼效果返回:0無效,1有效,2短按,3長按
uint8   NEC[4];    //解碼存放:16位用戶碼、操作碼正反碼
uint8   cntCA;     //長按計數(shù)
uint16  cntStep;   //步數(shù)計
bit     IRa,IRb;   //接收腳電位狀態(tài)保存
bit     IRsync;    //同步標(biāo)志
uint8   BitN;      //位碼裝載數(shù)


/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數(shù):紅外線解碼初始化
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void IR_Init()
{
   TMOD &= 0xF0;           //清定時器0
   TMOD |= 0x01;           //定時器0:16位定時器
   TL0 = TH_L;           //每步時間
   TH0 = TH_H;
   ET0 = 1;
   EA  = 1;
   TR0 = 1;
}

/*┈┈┈┈┈┈┈┈┈┈ 基準(zhǔn) ┈┈┈┈┈┈┈┈┈┈┈*/
#define    Boot_Limit    ((9000+4500 +1000)/Step)   //引導(dǎo)碼周期上限   
#define    Boot_Lower    ((9000+4500 -1000)/Step)   //引導(dǎo)碼周期下限   
#define    Bit1_Limit    ((2250 +800)/Step)         //“1”周期上限
#define    Bit0_Limit    ((1125 +400)/Step)         //“0”周期上限
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數(shù):紅外線NEC周期采樣解碼法(定時中斷,下降沿查詢周期時間)
全局變量:IR_BT = 0無效
                  1有效,待繼續(xù)判斷長、短按(如不需要判斷長、短按,則直接使用)
                  2短按
                  3長按
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void IR_NEC()
{          
   TL0 = TH_L;   //重賦值
   TH0 = TH_H;       

   cntStep++;    //步數(shù)累加
   if(IR_BT==1)if(cntStep>300)IR_BT=2; //解碼有效后,如果無長按,120ms(400us×300)后默認(rèn)短按

   IRb = IRa;    //保存上次電位狀態(tài)
   IRa = IR;     //保存當(dāng)前電位狀態(tài)
       
   if(IRb && !IRa)    //是否下降沿(上次高,當(dāng)前低)
   {
      if(cntStep > Boot_Limit)   //超過同步時間?
      {       
          if(IR_BT==1)if(++cntCA>CA_S)IR_BT=3; //解碼有效后,繼續(xù)按住遙控>CA_S即長按
          IRsync=0;                            //同步位清0
      }
      else if(cntStep > Boot_Lower){ IRsync=1; BitN=32; }   //同步位置1,裝載位碼數(shù)32                          
      else if(IRsync)            //如果已同步
      {
         if(cntStep > Bit1_Limit)IRsync=0;                   
         else
         {       
            NEC[3] >>= 1;                               
            if(cntStep > Bit0_Limit)NEC[3] |= 0x80;    //“0”與“1”
            if(--BitN == 0)                               
            {
               IRsync = 0;    //同步位清0

               #if (Check_EN == 1)                                       
               if((NEC[0]==USER_H)&&(NEC[1]==USER_L)&&(NEC[2]==~NEC[3]))    //校驗16位用戶碼、操作碼正反碼
               {  IR_BT=1; cntCA=0;  }     //解碼有效,接下來判斷:短按?長按?
               #else
               if(NEC[2]==~NEC[3]){ IR_BT=1; cntCA=0; }  //只校驗操作碼正反碼
               #endif                                       
            }
            else if((BitN & 0x07)== 0)    //NEC[3]每裝滿8位,移動保存一次(即 BitN%8 == 0)
            {   NEC[0]=NEC[1]; NEC[1]=NEC[2]; NEC[2]=NEC[3];   }
         }
      }
      cntStep = 0;   //步數(shù)計清0
   }
}

//取消相關(guān)宏定義
#undef CPU_Fosc

#endif





主程序
#include "INC\STC89C52RC.H"
#include "INC\MY_SET.H"
#include "INC\IR_NEC.H"        //調(diào)用NEC解碼頭文件

sfr   SE   = 0x80;             //數(shù)碼管段選 P0:0x80   P1:0x90
sbit  WX1  = P2^0;                 //數(shù)碼管位顯
sbit  WX2  = P2^1;
sbit  WX3  = P2^2;
sbit  WX4  = P2^3;
sbit  WX5  = P2^4;
sbit  WX6  = P2^5;
sbit  WX7  = P2^6;
sbit  WX8  = P2^7;

uint8c tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X88,0X83,0XC6,0XA1,0X86,0X8E,0xFF};
uint8  Xn,X1,X2,X3,X4,X5,X6;

void KZ0();      //短按處理
void KZ1();      //長按處理


/***************** 主函數(shù) ********************/
void main(void)
{
   IR_Init();                           //紅外線解碼初始化
                                                  
   while(1)
   {
      //遙控檢測
      if((IR_BT==2)||(IR_BT==3))                          
      {
         if(IR_BT==2)KZ0();      //短按處理                  
         else        KZ1();      //長按處理       
         IR_BT =0;               //清有效標(biāo)志

         X1 = NEC[0]/16;              //更新顯示
         X2 = NEC[0]%16;
         X3 = NEC[1]/16;
         X4 = NEC[1]%16;
         X5 = NEC[2]/16;
         X6 = NEC[2]%16;
      }
          
   }

}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數(shù):遙控短按處理
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void KZ0()
{
   switch(NEC[2])             
   {
          case 0x12: P10 = !P10; break;
          case 0x05: break;
          case 0x1E: break;
          case 0x55: break;

          case 0x01: break;
          case 0x1B: break;
          case 0x03: break;
          case 0x6B: break;

          case 0x07: break;
          case 0x08: break;
          case 0x09: break;
          case 0x68: break;

          case 0x22: break;
          case 0xE6: break;
          case 0x33: break;
          case 0xE2: break;
          default:break;
   }
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數(shù):遙控長按處理
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void KZ1()
{
   switch(NEC[2])             
   {
          case 0x12: P14 = !P14; break;
          case 0x05: break;
          case 0x1E: break;
          case 0x55: break;

          case 0x01: break;
          case 0x1B: break;
          case 0x03: break;
          case 0x6B: break;

          case 0x07: break;
          case 0x08: break;
          case 0x09: break;
          case 0x68: break;

          case 0x22: break;
          case 0xE6: break;
          case 0x33: break;
          case 0xE2: break;
          default:break;
   }
}
/*********************數(shù)碼管掃描*************************/
void XS(void)
{
  if(++Xn > 7)Xn=0;
  switch(Xn)             
  {
            case 0: WX8=1;  NOP;           //屏蔽上個位顯
                    SE=tab[X1];           //送段碼
                    WX1=0;           //開位顯
                    break;
            case 1: WX1=1; NOP; SE=tab[X2]; WX2=0; break;
            case 2: WX2=1; NOP; SE=tab[X3]; WX3=0; break;       
         case 3: WX3=1; NOP; SE=tab[X4]; WX4=0; break;
         case 4: WX4=1; NOP; SE=tab[16]; WX5=0; break;
         case 5: WX5=1; NOP; SE=tab[16]; WX6=0; break;
         case 6: WX6=1; NOP; SE=tab[X5]; WX7=0; break;
         case 7: WX7=1; NOP; SE=tab[X6]; WX8=0; break;                 
         default:break;                        
  }
}

/********************** 定時器0中斷函數(shù)************************/
void time0(void) interrupt 1
{
   IR_NEC();
   XS();        
} 
接收源程序+仿真: NEC(任意接收引腳,支持長短按).rar.rar (111.09 KB, 下載次數(shù): 267)
遙控器源程序: 遙控器源程序.rar (94.19 KB, 下載次數(shù): 210)

作者: 左左右右    時間: 2013-7-1 17:01
51Hei(51黑)論壇有你更精彩
作者: 左左右右    時間: 2013-7-1 17:03
現(xiàn)在就有一種想動手做一個的沖動
作者: lbsxdz    時間: 2013-7-9 10:25
謝謝樓主分享!
作者: lbsxdz    時間: 2013-7-9 10:26
謝謝樓主分享!
作者: peture    時間: 2013-7-9 23:07
謝謝樓主分享。

作者: peture    時間: 2013-7-9 23:08
怎么下載不了啊,是不是我的電腦網(wǎng)絡(luò)問題呢
作者: 1156615097    時間: 2013-7-23 23:17
不錯的,好假貨,大家一起學(xué)習(xí)下

作者: 單片機(jī)ahz    時間: 2013-7-29 15:48
樓上的你就會說:不錯的,好假貨,大家一起學(xué)習(xí)下   說點別的好不好
作者: zjh    時間: 2013-8-12 19:43
學(xué)無止境
作者: zying    時間: 2013-9-15 00:11
請問這個程序怎樣實現(xiàn)遙控按鍵不自鎖狀態(tài)。謝謝分享!
作者: zhangli2020    時間: 2013-9-23 23:56
謝謝樓主分享
作者: jinchouxing    時間: 2013-10-3 16:05
謝謝樓主分享
作者: renzhi6    時間: 2013-10-11 09:19
感謝樓主分享
作者: renzhi6    時間: 2013-10-11 09:20
東西不錯
作者: 13620819446    時間: 2013-10-13 23:03
不錯過來看看
作者: m182892    時間: 2013-12-2 09:48
謝謝樓主分享
作者: m182892    時間: 2013-12-2 09:53
下載了,謝謝。
作者: whiskycheung    時間: 2014-1-5 11:22
好東西,謝謝樓主,正做這個呢
作者: smwn    時間: 2014-1-9 07:28
這個一定要頂
作者: lijieping    時間: 2014-1-10 21:31
下載學(xué)習(xí)。。。。。!
作者: GZMNGZS    時間: 2014-1-17 13:08
下來看看
作者: 07700114    時間: 2014-5-26 12:30
好東東,謝謝分享。
作者: 周安松    時間: 2014-9-13 09:24
謝謝樓主分享
作者: 唯楚有才    時間: 2014-9-13 10:03
謝謝分享
作者: T29    時間: 2014-9-14 02:02
很好  學(xué)習(xí)  謝謝
作者: yzmmdy    時間: 2014-9-14 17:14
謝謝分享
作者: wwwmagic    時間: 2014-12-30 13:53
謝謝樓主
作者: xsynet11    時間: 2015-1-1 21:37
你好,圖看不清,能發(fā)個清晰的嗎?謝謝!
作者: xsynet    時間: 2015-1-4 15:36
謝謝分享,就是圖看不清
作者: qq704661078    時間: 2015-1-31 19:35
謝謝樓主分享!!
作者: fontex    時間: 2015-2-3 13:26
找了很久,謝謝!
作者: ydmxyz    時間: 2015-2-20 15:34
謝謝樓主分享。
作者: meilidianzhi    時間: 2015-2-23 22:34
謝謝你
作者: rich3524    時間: 2015-2-26 10:25
謝謝樓主分享!
作者: ydmxyz    時間: 2015-3-11 13:12
可以學(xué)習(xí)下。
作者: 周安松    時間: 2015-3-18 14:56
謝謝分享
作者: 85444    時間: 2015-12-20 01:53
hao終于能下了
作者: lhylfm12345    時間: 2016-4-14 21:43
多謝分享
作者: ylll75    時間: 2016-9-26 15:51
沒有黑幣,下不了
作者: 袁潔棟    時間: 2016-10-17 18:52
謝謝 LZ分享,下載了,正好要用
作者: andy12345    時間: 2016-10-24 09:01
謝謝樓主分享。
作者: zdenan    時間: 2016-10-30 21:32
謝謝樓主分享!
作者: robter    時間: 2017-2-5 22:14
很好很好,感謝感謝




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1