久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> 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深爱久久99精品 | 天堂综合 | 久久精品视频在线播放 | 又爽又黄axxx片免费观看 | 欧美在线观看一区 | 亚洲欧美一区二区三区视频 | 在线视频 中文字幕 | 涩涩导航 | 久久乐国产精品 | 久热久草 | 自拍偷拍一区二区三区 | 观看av| 久久久久香蕉视频 | 精品国产一区二区三区在线观看 | 精品欧美色视频网站在线观看 | www.v888av.com| 欧美一级黄色免费 | 五月激情婷婷在线 | 成人av一区二区三区 | 色综合久 | 日韩精品久久久久 | 午夜影院| 99国产精品久久久 | 青青久久av北条麻妃海外网 | 国产操操操 | 日韩一区二区在线视频 | 新超碰97 | 欧美无乱码久久久免费午夜一区 | 成av在线| 国产午夜影院 | 精品国产精品 | 日韩一区二区在线观看视频 | 国产免费视频 | 国产午夜高清 |