色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 單片機紅外遙控程序beta

          單片機紅外遙控程序beta

          作者: 時間:2016-11-24 來源:網絡 收藏
          千辛萬苦,終于把這個完成了。不錯不錯?,F在的問題就在上板子上測試了。剛才發(fā)了,發(fā)現"/""*""*""/"居然被屏蔽了。標注只能用兩個杠杠表示。為了以后更好的發(fā)布,我寫程序注釋的時候盡量用雙斜杠。

          #include
          #define uchar unsigned char
          #define uint unsigned int

          本文引用地址:http://cafeforensic.com/article/201611/320670.htm

          uchar code table[]={
          0x06,0x5b,0x4f,
          0x66,0x6d,0x7d,0x07,
          0x7f,0x6f,0x77,0x7c,
          0x39,0x5e,0x79,0x71}; //定義數字顯示

          sbit remote=P3^3;//定義中斷源外中斷3.3

          int count=0;//定義全局變量計數計時器
          bit get_over;//定義讀取數據結束
          int dat[33],ircode[4]; //第一個是直接讀取數據,第二個是解碼之后的數據

          void ini_rem(void); //遙控器的初始化
          void ini_other(void); //其他設定初始化
          void exchange(void); //編碼轉換
          //void timer0(void) interrupt 0 //計時器0中斷,計時計算上升沿個數來測定1,0,和開始結束碼
          //void ex_rem(void) interrupt 4 //外中斷1,通過上升沿來讓定時器計時
          void dis(void);//顯示函數
          void delay(uint z); //顯示延時函數
          main()
          {
          ini_other();
          ini_rem();
          while(1)
          {
          if(get_over==1)
          {
          exchange();
          dis();
          get_over=0;
          }
          }
          }

          void ini_other()
          {
          EA=1; //總中斷



          ET0=1; //定時器0中斷
          TR0=1; //定時器0中斷
          TMOD=0X01; //定時器狀態(tài) 定時器0方式1,16位計數器
          TH0=(65535-300)/256; //初值設定為300us=0.30ms
          TL0=(65535-300)%6;



          EX1=1; //開啟外部中斷 1
          IT1=1; // 設置成 下降沿觸發(fā)方式 (為0時為低電平觸發(fā))
          PX1=1;//將外中斷設置為高優(yōu)先級
          }

          ex_rem(void) interrupt 2
          {
          bit flag;
          int i=0;
          EX1=0;


          if(flag)
          {

          if(count>=27&&count<=33)// 引導碼接受成功
          {
          i=0;//給計數標志位
          }

          dat[i]=count;//將計時數存入,備用處理
          count=0;//計數清零
          i++;//下一次的計時數

          if(i==33)//如果一次信號32位全部OK
          {
          i=0;//給計數標志位
          get_over=1;//置計數標志
          }
          else
          {
          count=0;//否則計數清零,置標志位,繼續(xù)
          flag=1;
          }
          }
          EX1=1;
          }

          void timer0(void) interrupt 1
          {
          TH0=(65535-500)/256;
          TL0=(65535-500)%6;
          //TMOD=0X01;
          count++;

          }

          void exchange(void) //編碼子程序從第三個數據開始
          {
          unsigned char i,j,k,val,tmp1;

          k=1;


          for(i=0;i<4;i++)
          {
          for(j=0;j<8;j++)

          {
          tmp1=dat[k];

          if(tmp1>4)
          val=val|0x80;
          else val=val;

          if(j<8)
          val=val>>1;

          k++;
          }

          ircode[i]=val;
          val=0;
          }
          }

          void dis() //顯示子程序 OK
          {
          P1=0XF0;
          P2=table[ircode[2]/10];
          delay(1);
          P1=0xF1;
          P2=table[ircode[2]];
          delay(1);

          }

          void delay(uint z) //延時子函數
          {
          uint x,y;
          for(x=z;x>0;x--)
          for(y=110;y>0;y--);
          }




          評論


          技術專區(qū)

          關閉