亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標題: 基于attiny13的NEC紅外線遙控信號解碼程序 [打印本頁]

作者: tongms    時間: 2018-6-21 23:15
標題: 基于attiny13的NEC紅外線遙控信號解碼程序
最近參考了網上的51紅外線遙控遙控信號解碼程序,編寫了基于attiny13的NEC紅外線遙控信號解碼程序,拿出來給大家共勉,歡迎大家批評指正。程序如下:
#include <avr/io.h>
#include <avr/interrupt.h>

#define uchar unsigned char
#define star()  TCCR0B=(1<<CS01)|(1<<CS00)    //啟動定時器,64分頻,定時器時鐘周期在53.3us~58.2us之間,中位數55.75us
#define stop()  TCCR0B=0                     //停止定時器  
#define ir_in PB1    //int0引腳定義

volatile uchar ir_flag=0;
volatile uchar ir_da[4];
/****************************************************/
uchar getHtime(void)           
{
  TCNT0=0;
  star();                        //開始計時
  while (PINB&(1<<ir_in))       //等待高電平結束
  {
   if (TCNT0>250) break;         //高電平時間太長不合法,退出等待
  }
   stop(); //停止計時     
  
  return TCNT0;
}
/****************************************************/
uchar getLtime(void)           
{
  TCNT0=0;
  star();                        //開始計時
  while ((PINB&(1<<ir_in))==0)       //等待低電平結束
  {
   if (TCNT0>250) break;         //高電平時間太長不合法,退出等待
  }
   stop(); //停止計時     
  
  return TCNT0;
}
/****************************************************/
ISR(INT0_vect)  //外部中斷
{
  static uchar step=1;   //用于區分按鍵碼和連續碼以執行不同的中斷程序
  uchar i,j;
  uchar byt=0;
  uchar time;
if (step)        //剛按下遙控器的按鍵,執行下面的程序段
{
  time=getLtime(); //接收并判定引導碼的 9ms 低電平,
  if((time<152)||(time>171)) //時間判定范圍為 8.5~9.5ms,超過此范圍則說明為誤碼,直接退出
    {
GIFR=(1<<INTF0);  //寫入 ”1” 來清零外部中斷標志
    return; //結束外部中斷程序
}
  time=getHtime();   //接收并判定引導碼的 4.5ms 高電平
   if ((time<71)||(time>89))       //時間判定范圍為 4.0~5.0ms,超過此范圍則說明為誤碼,直接退出
   {
  GIFR=(1<<INTF0);  //寫入 ”1” 來清零外部中斷標志
    return; //結束外部中斷程序   
   }
  for (i=0; i<4; i++)       //循環接收 4 個字節
   {   
    for (j=0; j<8; j++)
    {
    time=getLtime();
if ((time<6)||(time>14))    //時間判定范圍為 340~780us,超過此范圍則說明為誤碼,直接退出  
    {
  GIFR=(1<<INTF0);  //寫入 ”1” 來清零外部中斷標志
    return; //結束外部中斷程序   
    }
    time=getHtime();
    if ((time>5)&&(time<15))  byt>>=1;  //時間判定范圍為 340~780us,在此范圍內說明該 bit 值為 0
        else if ((time>25)&&(time<35))  //時間判定范圍為 1460~1900us,在此范圍內說明該 bit 值為 1
    {
    byt>>=1;
    byt|=0x80;
                }
              else
                {
    GIFR=(1<<INTF0);  //寫入 ”1” 來清零外部中斷標志
                return; //結束外部中斷程序
    }  
}
ir_da[i]=byt;
  }
  ir_flag=1;
   step=0;    //如果按鍵未松開,下次中斷執行連發碼處理程序
  GIFR=(1<<INTF0);  //寫入 ”1” 來清零外部中斷標志
}

else   //如果是連發碼執行下面的程序段
  {
  time=getLtime(); //接收并判定連發碼引導碼的 9ms 低電平
  if((time<152)||(time>171)) //時間判定范圍為 8.5~9.5ms,超過此范圍則說明為誤碼,直接退出
    {
step=1;     //下次中斷執行按鍵處理程序
GIFR=(1<<INTF0);  //寫入 ”1” 來清零外部中斷標志
    return; //結束外部中斷程序
}
  time=getHtime();   //接收并判定連發引導碼的 2.25ms 高電平
   if ((time<36)||(time>44))       //時間判定范圍為 2.0~2.5ms,超過此范圍則說明為誤碼,直接退出
   {
    step=1;     //下次中斷執行按鍵處理程序
  GIFR=(1<<INTF0);  //寫入 ”1” 來清零外部中斷標志
    return; //結束外部中斷程序   
   }else     //確定為連發碼
    {
ir_flag=1;
    step=0;    //如果按鍵仍未松開,下次中斷繼續執行連發碼處理程序
    GIFR=(1<<INTF0);  //寫入 ”1” 來清零外部中斷標志
}
  }
}
/****************************************************/
int main(void)
{
  PORTB=0xff;  
   MCUCR=(1<<ISC01);     //INT0 的下降沿產生異步中斷請求
  GIMSK=(1<<INT0);       //外部引腳中斷使能
  sei();                 //開全局中斷
  while (1)
  {;}
}
attiny13使用內部時鐘,電源電壓5V時實測1.15MHz左右。編譯器為GCC





歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1