1. gzyueqian
      13352868059
      首頁 > 新聞中心 > > 正文

      keil c51紅外遙控解碼程序

      更新時間: 2008-01-22 08:34:21來源: 粵嵌教育瀏覽量:1061

      點 本keil c51程序適用uPC1621/uPC1622及兼容的紅外遙控器芯片,占用外部中斷0和定時器1,以中斷方式解碼,節(jié)省系統(tǒng)資源,以查詢方式檢測遙控信號是否有效.

      解碼思路:
        紅外線經(jīng)一體化接受頭解碼放到后送到單片機的外部中斷0,單片機設置外部中斷下降沿觸發(fā),T0和T1為16位定時器,T0在系統(tǒng)啟動后定時5ms.T1在外部中斷0啟動后開始定時,初值為0,每次在INT0中斷后先讀T1計數(shù)值,并重設初值為0,而且判斷T1的計數(shù)值,


      代碼
      //Fosc=11.0592MHz
      // states for and variables IR data processing ;
      typedef enum{
      IR_idle,
      IR_waitstart,
      IR_getaddr,
      IR_getaddrinv,
      IR_getdata,
      IR_getdatainv
      }_IRstate;

      _IRstate IRstate = IR_idle;

      unsigned char IRaddr=0xff;
      unsigned char _IRaddr=0xff;
      unsigned char IRdata=0xff;
      unsigned char _IRdata=0xff;
      unsigned char IR_repeat=0;
      unsigned char IR_ready=0;
      unsigned char IR_poweron=0;
      //bit ir_done=0;
      // time constants
      unsigned int IRtimer=0; // IR timeout

      //cpu初始化
      void cpu_init(void)
      {
      TMOD=0X11; // T0 and T1 十六位定時
      TH0=0xee; //fosc=11.0592M,timer=5ms
      TL0=0x00;
      TR0=1; // run timer 0;
      TF0=0;

      ET0=1; // enable tmr 0 overflow interrupt
      IT0=1; // int0 edge sensitive
      EX0=1; // enable "int0"
      EA=1; // global interupt enable
      }

      //T0中斷
      void tmrint() interrupt 1
      {
      TH0=0xee;
      TL0=0x00;
      if (IRtimer) //IR接收超時
      --IRtimer; //
      else
      {
      IRstate=IR_idle;
      // IR_poweron=0;
      }
      }

      //Fosc=11.0592MHz
      #define msec_12p5 0x2d00
      #define msec_15 0x3600
      #define msec_9 0x2066
      //#define msec_9 0x1066
      #define msec_2p5 0x900
      #define msec_0p9 0x33d
      #define msec_1p68 0x610


      //void IRint() interrupt 0(void)

      //When the IR receive pin goes low and interrupt is generated
      // IR is collected by starting timer 2 in the first falling edge of the pin
      // then on every other falling edge, the timer value is saved and the timer restarted .
      // the captured time is then used to get the IR data
      // a "start of data" is 13.5Msec,a "1" is 2.25Msec,a "0" is 1.12 msec and a "repeat" is 11.25msec.
      // the counter increments at 1.085 Usec
      // I allow a fairly large tolerance to time jitter but there are no false triggers seen.

      void IRint() interrupt 0
      {
      static unsigned char bits;
      unsigned short time;
      switch(IRstate)
      {
      case IR_idle:
      TL1=0;
      TH1=0;
      TR1=1;
      IRstate=IR_waitstart;
      IRtimer=26;
      break;
      case IR_waitstart: //P2_4=!P2_4;
      TR1=0;
      time=TH1;
      time =(time <<8)+TL1;;
      TL1=0;
      TH1=0;
      TR1=1;
      if ((time > msec_12p5)&&(time < msec_15)) // greater than 12.5Msec & less than 15 msec = start code
      {
      IRaddr=0;
      _IRaddr=0;
      IRdata=0;
      _IRdata=0;
      bits=1;
      IRstate=IR_getaddr;
      }
      else if ((time > msec_9)&&(time < msec_12p5))// less than 12.5Msec and greater than 9 msec =Repeat code
      {
      IR_repeat=2;
      IRstate=IR_idle;
      }
      else
      { // to short, bad data just go to idle
      IRstate=IR_idle;
      }
      break;
      case IR_getaddr: // P2_4=!P2_4;
      TR1=0;
      time=TH1;
      time =(time <<8)+TL1;;
      TL1=0;
      TH1=0;
      TR1=1;
      if ((time>msec_2p5)||(time<msec_0p9))// if > 2.5msec or shorter than .9Msec bad data , go to idle
      {
      IRstate=IR_idle;
      break;
      }
      if (time>msec_1p68)// greater than 1.68Msec is a 1
      {
      IRaddr|= bits;
      }
      bits=bits<<1;
      if (!bits)
      {
      IRstate=IR_getaddrinv;
      bits=1;
      }
      break;
      case IR_getaddrinv: //P2_4=!P2_4;
      TR1=0;
      time=TH1;
      time =(time <<8)+TL1;;
      TL1=0;
      TH1=0;
      TR1=1;
      if ((time>msec_2p5)||(time<msec_0p9))// if > 2.5msec or shorter than .9Msec bad data , go to idle
      {
      IRstate=IR_idle;
      break;
      }
      if (time>msec_1p68)// greater than 1.68Msec is a 1
      {
      _IRaddr|= bits;
      }
      bits=bits<<1;
      if (!bits)
      {
      IRstate=IR_getdata;;
      bits=1;
      }
      break;
      case IR_getdata:
      TR1=0;
      time=TH1;
      time =(time <<8)+TL1;;
      TL1=0;
      TH1=0;
      TR1=1;
      if ((time>msec_2p5)||(time<msec_0p9))// if > 2.5msec or shorter than .9Msec bad data , go to idle
      {
      IRstate=IR_idle;
      break;
      }
      if (time>msec_1p68)// greater than 1.68Msec is a 1
      {
      IRdata|= bits;
      }
      bits=bits<<1;
      if (!bits)
      {
      IRstate=IR_getdatainv;
      bits=1;
      }
      break;
      case IR_getdatainv:
      TR1=0;
      time=TH1;
      time =(time <<8)+TL1;;
      TL1=0;
      TH1=0;
      TR1=1;
      if ((time>msec_2p5)||(time<msec_0p9)) // if > 2.5msec or shorter than .9Msec bad data , go to idle
      {
      IRstate=IR_idle;
      break;
      }
      if (time>msec_1p68)// greater than 1.68Msec is a 1
      {
      _IRdata|= bits;
      }
      bits=bits<<1;
      if (!bits) // we have it all , now we make sure it is a NEC code from the CHS IR transmitter
      { // make sure address,~address are correct , data ,~data are correct and address is 0.
      IR_ready=((IRaddr^_IRaddr)==0xff)&&((IRdata^_IRdata)==0xff)&&(IRaddr==0);
      if(IR_ready)
      {
      IRstate=IR_idle;
      }
      }
      break;
      default:
      IRstate=IR_idle;
      break;
      }
      }

      void main(void)
      {
      cpu_init();
      while(1)
      {
      if(IR_ready)
      {
      IR_ready=0;
      switch(IRdata)
      {
      case 0x45: //1
      //your code
      break;
      case 0x44: //3
      //your code
      break;
      case 0x43: //4
      //your code
      break;
      case 0x08: //prev
      //your code
      break;
      case 0x5a: //next
      //your code
      break;
      default:
      break;
      &n bsp; }
      }
      }
      }

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 亚洲国产欧美在线观看片不卡 | 中文字幕第一页在线资源 | 色综合久久综合网观看 | 香蕉久久精品国产 | 性欧美老妇乱码一区二区 | 在线观看午夜福利院视频 |