<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 一個(gè)紅外線發(fā)射+解碼程序+仿真文件

          一個(gè)紅外線發(fā)射+解碼程序+仿真文件

          作者: 時(shí)間:2016-11-29 來(lái)源:網(wǎng)絡(luò) 收藏
          可定義任意I/O作接收腳,支持長(zhǎng)/短按,自適應(yīng)主頻6MHz~40


          本文引用地址:http://www.ex-cimer.com/article/201611/323430.htm
          //*********************【 NEC解碼頭文件 】*******************////     簡(jiǎn)介:本程序適用于NCE解碼:(9ms+4.5ms)引導(dǎo)碼+32位編碼。//           兼容STC所有型號(hào)(包括 1T 和 12T 系列),可以定義任意I/O作紅外接收腳,//                         自適應(yīng)解碼主頻:6MHz ~ 40MHz。// // 使用條件:占用系統(tǒng)定時(shí)器0,開(kāi)啟定時(shí)器0中斷(如使用其它定時(shí)器請(qǐng)自改IR_Init();初始化函數(shù))// // 使用說(shuō)明:填相關(guān)宏定義:USER_H、USER_L、Check_EN、CPU_Fosc、IR,//           上電初始化函數(shù)IR_Init(),//           在定時(shí)器0中斷中調(diào)用IR_NEC()解碼函數(shù),//           解碼有效時(shí),IR_BT=2即短按,IR_BT=3即長(zhǎng)按,由用戶清0,//           解碼存放:用戶碼高8位NEC[0],用戶碼低8位NEC[1],操作碼NEC[2],操作碼反碼NEC[3]。////【供用戶調(diào)用的函數(shù)】//    IR_Init();                         //接收初始化,開(kāi)啟定時(shí)器0中斷400us//    IR_NEC();                             //紅外線解碼(解NEC編碼)//          //***************************************************************/ #ifndef __IR_NEC_H__#define __IR_NEC_H__//【用戶必填項(xiàng):USER_H、USER_L、Check_EN、CPU_Fosc、IR】#define  USER_H     0x80         //用戶碼高8位#define  USER_L     0x7F         //用戶碼低8位#define  Check_EN   0                    //是否要校驗(yàn)16位用戶碼:不校驗(yàn)填0,校驗(yàn)則填1        #define  CPU_Fosc   12000000L    //輸入主頻,自適應(yīng)解碼(單位:Hz,范圍:6MHz ~ 40MHz)#define  CA_S       8                    //長(zhǎng)按時(shí)間設(shè)置,單位:108mS(即 108mS整數(shù)倍,10倍以上為宜)sbit IR = P3^6;                  //紅外線接口(任意引腳) #define  Step       400          //紅外采樣步長(zhǎng):400us#define  TH_H      ((65536-Step*(CPU_Fosc/300)/40000)/256)  //定時(shí)器高8位基準(zhǔn)賦值#define  TH_L      ((65536-Step*(CPU_Fosc/300)/40000)%256)  //定時(shí)器低8位基準(zhǔn)賦值uint8   IR_BT;     //解碼效果返回:0無(wú)效,1有效,2短按,3長(zhǎng)按uint8   NEC[4];    //解碼存放:16位用戶碼、操作碼正反碼uint8   cntCA;     //長(zhǎng)按計(jì)數(shù)uint16  cntStep;   //步數(shù)計(jì)bit     IRa,IRb;   //接收腳電位狀態(tài)保存bit     IRsync;    //同步標(biāo)志uint8   BitN;      //位碼裝載數(shù)/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函數(shù):紅外線解碼初始化┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/void IR_Init(){TMOD &= 0xF0;           //清定時(shí)器0TMOD |= 0x01;           //定時(shí)器0:16位定時(shí)器TL0 = TH_L;           //每步時(shí)間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周期采樣解碼法(定時(shí)中斷,下降沿查詢(xún)周期時(shí)間)全局變量:IR_BT = 0無(wú)效1有效,待繼續(xù)判斷長(zhǎng)、短按(如不需要判斷長(zhǎng)、短按,則直接使用)2短按3長(zhǎng)按┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/void IR_NEC(){          TL0 = TH_L;   //重賦值TH0 = TH_H;        cntStep++;    //步數(shù)累加if(IR_BT==1)if(cntStep>300)IR_BT=2; //解碼有效后,如果無(wú)長(zhǎng)按,120ms(400us×300)后默認(rèn)短按IRb = IRa;    //保存上次電位狀態(tài)IRa = IR;     //保存當(dāng)前電位狀態(tài)if(IRb && !IRa)    //是否下降沿(上次高,當(dāng)前低){if(cntStep > Boot_Limit)   //超過(guò)同步時(shí)間?{        if(IR_BT==1)if(++cntCA>CA_S)IR_BT=3; //解碼有效后,繼續(xù)按住遙控>CA_S即長(zhǎng)按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]))    //校驗(yàn)16位用戶碼、操作碼正反碼{  IR_BT=1; cntCA=0;  }     //解碼有效,接下來(lái)判斷:短按?長(zhǎng)按?#elseif(NEC[2]==~NEC[3]){ IR_BT=1; cntCA=0; }  //只校驗(yàn)操作碼正反碼#endif                                        }else if((BitN & 0x07)== 0)    //NEC[3]每裝滿8位,移動(dòng)保存一次(即 BitN%8 == 0){   NEC[0]=NEC[1]; NEC[1]=NEC[2]; NEC[2]=NEC[3];   }}}cntStep = 0;   //步數(shù)計(jì)清0}} //取消相關(guān)宏定義#undef CPU_Fosc #endif主程序#include "INCSTC89C52RC.H"#include "INCMY_SET.H"#include "INCIR_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();      //長(zhǎng)按處理/***************** 主函數(shù) ********************/void main(void){IR_Init();                           //紅外線解碼初始化while(1){ //遙控檢測(cè)if((IR_BT==2)||(IR_BT==3))                          {if(IR_BT==2)KZ0();      //短按處理                  else        KZ1();      //長(zhǎng)按處理        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; }}}				   
          				
                      
                          
          			
          							
          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


          推薦視頻

          更多>>

          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();