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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STC12C5410AD學習板---紅外解碼

          STC12C5410AD學習板---紅外解碼

          作者: 時間:2016-11-18 來源:網(wǎng)絡 收藏
          這個是我自制STC12C5410AD學習板的紅外解碼程序,此程序是針對SAA3010紅外編碼芯片來做解碼的。如果換了其他芯片,只要修改紅外芯片的頭文件就可以了。

          本文引用地址:http://www.ex-cimer.com/article/201611/316026.htm

          視頻演示地址:

          http://v.youku.com/v_show/id_XMTUyMzQwMjg4.html

          以下是詳細程序:

          /*****Program Author : ZhengWen(ClimberWin) *****/
          /*****E_mail :cooldianzi@163.com *****/
          /*************************************************************/
          /*****File Function : IR Soft Recode(SAA3010) *****/
          /*****Compile Date : 2009/2/4 *****/
          /*****Edition Info : V1.0 *****/
          /*****Amend Date : *****/
          /*************************************************************/
          /************紅外軟件解碼,遙控器型號,SAA3310芯片************/
          /***********************2009.2.4******************************/
          /***********可以紅外解碼LCD顯示*************/
          #include
          #include "intrins.h "
          #include "SAA3010_Recode.h"
          #include "LCD12864.H"
          #include
          #include
          #include
          #include

          #define uchar unsigned char
          #define uint unsigned int
          #define ulong unsigned long

          sbit speaker=P2^1;
          uchar LCD_IR_data[16]={0xbc,0xfc,0xd6,0xb5,0xce,0xaa,0x3a,0x30,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00};//鍵值為:0x00
          void Delay1ms(unsigned int count);
          void Key_Beep(void);
          void Delay_Beep(unsigned int count1);
          void init_rs232(void);

          /***************************1秒延時子程序start***************************/
          void Delay1ms(unsigned int count)
          {
          unsigned int i,j;
          for(i=0;ifor(j=0;j<120;j++);
          }

          /***************************1秒延時子程序end***************************/

          /*****************按鍵聲音********************/
          void Key_Beep(void)
          { uchar i;
          for (i=0;i<250;i++)
          { speaker=1;
          Delay_Beep(30);

          speaker=0;

          Delay_Beep(30);
          }
          speaker=1;
          }

          /**************************************************/

          /***************************蜂鳴器延時子程序start**********************/
          void Delay_Beep(unsigned int count)
          {
          unsigned int i,j;
          for(i=0;ifor(j=0;j<10;j++);
          }
          /***************************蜂鳴器延時子程序end************************/
          /* 串口通信初始化設置 */
          void init_rs232(void)
          {
          AUXR=74; //設置波特率是普通51的12倍 ,允許AD中斷
          SCON=0x50;
          PCON=0x00;
          TH1=0xFA; //波特率 115200 22.1184MHZ 時候(F4 4800 FA 9600 FDH 9600)*12
          TL1=0XFA;
          TMOD=0X20;
          TR1=1;
          }


          void main(void)
          {
          uchar key_code_b; //紅外遙控鍵值百位
          uchar key_code_s; //紅外遙控鍵值十位
          uchar key_code_g; //紅外遙控鍵值個位
          Delay1ms(1000);
          init_rs232();
          TI=1;
          printf("STC12C5410AD學習板 紅外遙控解碼n");
          printf("ClimberWin 2009.2.4nn");
          Delay1ms(5000);

          LCD_INIT();
          Delay1ms(1000);
          LCD_LOCAL(1,1,"STC 單片機學習板");
          LCD_LOCAL(2,1,"MCU:STC12C5410AD");
          LCD_LOCAL(4,1,"Date:2009.2.4 ");
          LCD_LOCAL(3,1,"By ClimberWin ");
          /****************************************/
          Delay1ms(50000);
          LCD_LOCAL(1,1,"紅外遙控測試界面");
          LCD_LOCAL(2,1,"遙控芯片:SAA3010");
          LCD_LOCAL(3,1,"測試結(jié)果: ");
          LCD_LOCAL(4,1," ");
          printf("紅外遙控測試界面n");
          //Delay100us(8); // 實為760uS
          Key_Beep();
          IR_Input = 1;//先把信號線拉高,等待接收紅外信號
          while(1)
          {
          LCD_IR_data[7]=0x30;//初值設置顯示000
          LCD_IR_data[8]=0x30;
          LCD_IR_data[9]=0x30;
          if(!IR_Input) SAA3010_Recode();
          if(SAA3010_CODE[0]==0x03)
          {Key_Beep();
          SBUF=SAA3010_CODE[3];//發(fā)送解碼值到串口
          key_code_b=SAA3010_CODE[3]/100; //把鍵值用十進制表示
          key_code_s=(SAA3010_CODE[3]%100)/10;
          key_code_g=(SAA3010_CODE[3]%100)%10;
          LCD_IR_data[7]=LCD_IR_data[7]+key_code_b;
          LCD_IR_data[8]=LCD_IR_data[8]+key_code_s;
          LCD_IR_data[9]=LCD_IR_data[9]+key_code_g;
          LCD_LOCAL(4,1,LCD_IR_data);//把解碼數(shù)據(jù)顯示到液晶上
          SAA3010_CODE[0]=0x00;
          SAA3010_CODE[1]=0x00;
          SAA3010_CODE[2]=0x00;
          SAA3010_CODE[3]=0x00;
          }
          else
          {SAA3010_CODE[0]=0x00;}
          }
          }

          LCD12864.H 如下:

          /*****Program Author : ZhengWen(ClimberWin) *****/
          /*****E_mail :cooldianzi@163.com *****/
          /*************************************************************/
          /*****File Function : LCD12864 Display Module *****/
          /*****Compile Date : 2009/1/28 *****/
          /*****Edition Info : V1.0 *****/
          /*****Amend Date : *****/
          /*************************************************************/
          #ifndef __LCD12864__
          #define __LCD12864__
          #include
          #define uchar unsigned char
          #define uint unsigned int
          #define ulong unsigned long
          sbit LCD_CS = P1^7;//片選 高電平有效 單片LCD使用時可固定高電平rs
          sbit LCD_SID = P1^6;//數(shù)據(jù) r/w
          sbit LCD_SCLK = P1^5;//時鐘 e

          /********************LCD12864**************************/
          void LCD_SEND(uchar date);
          void LCD_SCOM(bit st,uchar date);
          void LCD_DELAY(void);
          void LCD_INIT(void);
          void LCD_write(uchar *p);
          void LCD_LOCAL(uchar x,uchar y,uchar *p);
          void LCD_cblank(uchar x,uchar y);
          void LCD_count(long s,uchar x1,uchar y1,uchar x,uchar y,uchar *p);
          void DELAYLCD(uchar t);
          /*****************************************************/
          /****************************lcd12864************************************/
          void DELAYLCD(uchar t)
          {
          while(--t);
          }

          void LCD_SEND(uchar date)
          {
          uchar i;
          LCD_SCLK=0;
          for(i=0;i<8;i++)
          {
          LCD_SID=date&0x80;
          LCD_SCLK=1;
          LCD_SCLK=0;
          date<<=1;
          }
          }
          void LCD_SCOM(bit st,uchar date)
          {
          uchar st_temp,hdate,ldate;
          if(st)
          st_temp=0xfa;
          else st_temp=0xf8;
          hdate=date&0xf0;
          ldate=date&0x0f;
          ldate <<= 4;
          LCD_CS = 1;
          LCD_SEND(st_temp);
          LCD_SEND(hdate);
          LCD_SEND(ldate);
          LCD_CS = 0;
          DELAYLCD(38);
          }
          void LCD_DELAY(void)
          { uchar s;
          s=10;
          while(--s)
          DELAYLCD(250);
          }
          void LCD_INIT(void)
          {
          LCD_SCOM(0,0x30);
          LCD_DELAY();
          LCD_SCOM(0,0x0c);
          LCD_DELAY();
          LCD_SCOM(0,0x01); //清屏,將DDRAM的地址計數(shù)器歸零
          LCD_DELAY();
          }
          void LCD_write(uchar *p)
          {
          while(*p)
          {
          LCD_SCOM(1,*p);
          p++;
          }
          }
          void LCD_LOCAL(uchar x,uchar y,uchar *p) //lcd string (x,y) write!
          {
          switch (x)
          {
          case 1:LCD_SCOM(0,0x7f+y); LCD_write(p);break;
          case 2:LCD_SCOM(0,0x8f+y); LCD_write(p);break;
          case 3:LCD_SCOM(0,0x87+y); LCD_write(p);break;
          case 4:LCD_SCOM(0,0x97+y); LCD_write(p);break;
          default :LCD_SCOM(0,0x7f+y); LCD_write(p);
          }
          }
          void LCD_cblank(uchar x,uchar y)
          {
          switch (x)
          {
          case 1:LCD_SCOM(0,0x7f+y); LCD_SCOM(0,0x0d);break;
          case 2:LCD_SCOM(0,0x8f+y); LCD_SCOM(0,0x0d);break;
          case 3:LCD_SCOM(0,0x87+y); LCD_SCOM(0,0x0d);break;
          case 4:LCD_SCOM(0,0x97+y); LCD_SCOM(0,0x0d);break;
          default :LCD_SCOM(0,0x7f+y); LCD_SCOM(0,0x0d);
          }
          }

          /************************************************************************/

          /*******************************************************************************/
          #endif

          SAA3010_Rncode.H 如下:

          /*****Program Author : ZhengWen(ClimberWin) *****/
          /*****E_mail :cooldianzi@163.com *****/
          /*************************************************************/
          /*****File Function : SAA3010 IR_Input soft recode *****/
          /*****Compile Date : 2009/2/4 *****/
          /*****Edition Info : V1.0 *****/
          /*****Amend Date : *****/
          /*************************************************************/
          /***************對紅外遙控器SAA3010軟件解碼*******************/
          #ifndef __SAA3010_Rncode__
          #define __SAA3010_Rncode__
          #define uchar unsigned char
          #include
          sbit IR_Input=P3^4;
          uchar SAA3010_CODE[4];

          void SAA3010_Recode(void);
          void Delay100us(uchar i);

          /*************SAA3010解碼程序**************/
          void SAA3010_Recode(void)
          {
          unsigned char i, j;
          bit FBIT;
          // IR_Input 由高變低,跳過第一次采樣
          for (i=0; i<4; i++)
          {
          SAA3010_CODE[i] =0x00;
          }
          /*--------------------------------------
          曼徹斯特碼:
          輸入二元碼 Manchester碼
          0 01
          1 10
          ****************************************/
          // 設為第二次采樣,采樣時間間隔800uS
          Delay100us(8);

          if (!IR_Input)
          {
          // 因為SAA3010的起始位為1
          SAA3010_CODE[0] |=0x01;
          SAA3010_CODE[0] <<= 1;
          // 起始第二位一次采樣
          Delay100us(8);
          if (IR_Input)
          { // 采樣是1
          SAA3010_CODE[0] |=0x01;
          FBIT = 1;
          }
          else
          { // 采樣是0
          FBIT = 0;
          }
          if (FBIT)
          { // 若第一次采樣是1
          while (IR_Input);
          }
          else
          {
          while (!IR_Input);
          }
          // 二次采樣
          Delay100us(8);
          //----------------------------------------------------------------------------
          // 采樣控制位
          // 一次采樣
          Delay100us(8);
          if (IR_Input)
          {
          SAA3010_CODE[1] |=0x01;
          FBIT = 1;
          }
          else
          {
          FBIT = 0;
          }

          if (FBIT)
          {
          while (IR_Input);
          }
          else
          {
          while (!IR_Input); // 等待IR_Input上升
          }
          // 二次采樣
          Delay100us(8);
          //----------------------------------------------------------------------------------
          // 收集系統(tǒng)碼(5位)
          for (j=0; j<5; j++)
          {
          // 一次采樣
          Delay100us(8);
          if (IR_Input)
          {
          SAA3010_CODE[2] |=0x01;
          FBIT = 1;
          }
          else
          {
          FBIT = 0;
          }

          if (FBIT)
          {
          while (IR_Input);
          }
          else
          {
          while (!IR_Input);
          }
          // 二次采樣
          Delay100us(8);
          SAA3010_CODE[2] <<= 1;
          }

          //-----------------------------------------------------------------------------

          // 收集數(shù)據(jù)碼(6位)
          for (j=0; j<6; j++)
          {
          // 一次采樣
          Delay100us(8);
          if (IR_Input)
          {
          SAA3010_CODE[3] |=0x01;
          FBIT = 1;
          }
          else
          {
          FBIT = 0;
          }

          if (FBIT)
          {
          while (IR_Input);
          }
          else
          {
          while (!IR_Input);
          }
          // 二次采樣
          Delay100us(8);
          SAA3010_CODE[3] <<= 1;
          }
          //-----------------------------------------------------------------------------
          }
          else
          { // 是抖動
          for (i=0; i<4; i++)
          {
          SAA3010_CODE[i] =0x00;
          }

          return;
          }

          SAA3010_CODE[3]>>= 1;//09.2.4
          }

          /************760us延時程序********************/
          void Delay100us(uchar i)
          {
          uchar j;
          while(i<50)//50
          {
          for(j=0;j<50;j++)
          { _nop_();}
          i++;
          }
          }

          /******************************************************/
          #endif



          關鍵詞: STC12C5410AD紅外解

          評論


          技術專區(qū)

          關閉
          看屁屁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); })();