单片机
返回首页

基于attiny13的NEC红外线遥控信号解码程序

2019-10-30 来源:51hei

最近参考了网上的51红外线遥控遥控信号解码程序,编写了基于attiny13的NEC红外线遥控信号解码程序,拿出来给大家共勉,欢迎大家批评指正。程序如下:


#include

#include


#define uchar unsigned char

#define star()  TCCR0B=(1<#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<  {

   if (TCNT0>250) break;         //高电平时间太长不合法,退出等待

  }

   stop(); //停止计时     

  

  return TCNT0;

}

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

uchar getLtime(void)           

{

  TCNT0=0; 

  star();                        //开始计时

  while ((PINB&(1<  {

   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<    return; //结束外部中断程序 

}

  time=getHtime();   //接收并判定引导码的 4.5ms 高电平

   if ((time<71)||(time>89))       //时间判定范围为 4.0~5.0ms,超过此范围则说明为误码,直接退出

   {

  GIFR=(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<    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<                return; //结束外部中断程序 

    }  

}

ir_da[i]=byt;

  }

  ir_flag=1; 

   step=0;    //如果按键未松开,下次中断执行连发码处理程序

  GIFR=(1<}


else   //如果是连发码执行下面的程序段

  {

  time=getLtime(); //接收并判定连发码引导码的 9ms 低电平

  if((time<152)||(time>171)) //时间判定范围为 8.5~9.5ms,超过此范围则说明为误码,直接退出

    {

step=1;     //下次中断执行按键处理程序

GIFR=(1<    return; //结束外部中断程序 

}

  time=getHtime();   //接收并判定连发引导码的 2.25ms 高电平

   if ((time<36)||(time>44))       //时间判定范围为 2.0~2.5ms,超过此范围则说明为误码,直接退出

   {

    step=1;     //下次中断执行按键处理程序

  GIFR=(1<    return; //结束外部中断程序   

   }else     //确定为连发码

    {

ir_flag=1; 

    step=0;    //如果按键仍未松开,下次中断继续执行连发码处理程序

    GIFR=(1<}

  }

}

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

int main(void)

{

  PORTB=0xff;  

   MCUCR=(1<  GIMSK=(1<  sei();                 //开全局中断

  while (1)

  {;}

}

attiny13使用内部时钟,电源电压5V时实测1.15MHz左右。编译器为GCC


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 开关电源的基本组成及工作原理

  • 带有短路保护系统的5V直流稳压电源电路图

    相关电子头条文章