<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> STM32 >> 瀏覽文章

        STM32單片機解碼NEC紅外控制器C語言程序

        作者:佚名   來源:本站原創   點擊數:  更新時間:2014年04月26日   【字體:

        本文轉自: http://blog.sina.com.cn/s/blog_dc9571b90101ivox.html
         
        紅外遙控器發射碼值的協議有很多種,在百度文庫里搜“史​上​最​全​的​紅​外​遙​控​器​編​碼​協​議”,可以看到是有43種,但是我們今天是解碼NEC紅外協議的,幾乎所有的開發板帶的小遙控器都是這個協議的,我是用的定時器配合外部中斷寫的解碼程序。

         
        #include "ir_exti.h"
        //利用外部中斷和定時器進行紅外解碼
        //在51上學習的
         
         
        u8 irtime;//定時器時間累加
        u8 irflag;//接收到第一個下降沿的標志
        u8 irdate;//接收下降沿次數的累加
        u8 irtable[33];//裝每一次下降沿的時間
        //u8 irdateok;
        u8 irtable2[4];//解碼出地址和數據 地址 地址反碼 數據 數據反碼
        u8 irdatewokeok;//解出正確的數據就把此標志位置1
        u8 repeat=0;//按住不放標志位
         
        void TIMER2_INIT(u16 psc,u16 arr);
        //戰艦板子上面的紅外信號端鏈接在PB9上面,我們把外部中斷映射到PB9上即可
        void IR_EXTI_INIT()
        {
         RCC->APB2ENR|=1<<3;//打開PB口時鐘
         GPIOB->CRH&=0XFFFFFF0F;//清除PB9的原有狀態
         GPIOB->CRH|=0X00000080;//設置PB9為輸入
         GPIOB->ODR|=1<<9;      //設置PB9輸出高電平,上拉
         
         Ex_NVIC_Config(GPIO_B,9,1);//TRIM:觸發模式,1,下降沿;2,上升沿;3,任意電平觸發
         MY_NVIC_Init(1,0,EXTI9_5_IRQChannel,2);
         TIMER2_INIT(71,99);//產生0.1ms的中斷
        }
        //定時器2初始化函數
        //psc預分頻系數,arr自動重裝載寄存器
        //APB1=36M 則TIM3=72M
        //Tout= ((arr+1)*(psc+1))/Tclk
        void TIMER2_INIT(u16 psc,u16 arr)
        {
         RCC->APB1ENR|=1<<0;//開啟定時器2的時鐘
         TIM2->ARR=arr;
         TIM2->PSC=psc;
         TIM2->DIER|=1<<0;//允許更新中斷
         //默認是向上計數
         TIM2->CR1|=1<<0;//使能計數器
         MY_NVIC_Init(1,0,TIM2_IRQChannel,2);
        }
         
        void TIM2_IRQHandler(void)
        {
         static u16 i=0;
         if(TIM2->SR&0X0001)
         {
          irtime++;
          //i*10=1(ms) 110ms:i=1100
          if(repeat&&(i>1500))//當時間超時了,就把按住不放次數清零
          {
           i++;
           if(i>1500)
           {
            i=0;
            repeat=0;    
           }      
          }  
         }
         TIM2->SR&=~(1<<0);
        }
         
        //IR解碼
        void irdatewoke(void)
        {
         u8 k,value,i,j;
         k=1;
         for(j=0;j<4;j++)
         {
          for(i=0;i<8;i++)
          {
           value=value>>1;
           if(irtable[k]>=17)//這個17隨著定時器中斷時間而改變
           {
            value=value|0x80;
           }
           k++;
          }
          irtable2[j]=value;
         }
         if(irtable2[0]==(u8)(~irtable2[1]))
         {
          if(irtable2[2]==(u8)(~irtable2[3]))
           irdatewokeok=1;
         }
         //irdatewokeok=1;
        }
         
        //顯示測試函數
        void diswoke(void)
        {
         printf("%d %d %d %d\r\n",irtable2[0],irtable2[1],irtable2[2],irtable2[3]);
        }
         
        void EXTI9_5_IRQHandler(void)
        {
         if(irflag)
         {
          if(irtime>90)//這個90隨著中斷時間而改變
          {
           if(irdate==1)
           {
            repeat++;
            irflag=0;
            printf("%d\r\n",repeat);  
           }
           else
           {
            repeat=0; 
           }
           irdate=0;
          }
          irtable[irdate]=irtime;
          irtime=0;
          irdate++;
          if(irdate==33)
          {
           irdate=0;
           irflag=0;
           irdatewoke();
           if(irdatewokeok==1)
            diswoke();//發送到串口小助手上
           irdatewokeok=0;
          }
         }
         else
         {
          irflag=1;
          irtime=0;
         }
         
         EXTI->PR=1<<9;   //清除 LINE0 上的中斷標志位
        }
        //我得到的鍵值,左到右、上到下
        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮