最近参考了网上的51红外线遥控遥控信号解码程序,编写了基于attiny13的NEC红外线遥控信号解码程序,拿出来给大家共勉,欢迎大家批评指正。程序如下:
#include #include #define uchar unsigned char #define star() TCCR0B=(1< #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< } time=getHtime(); //接收并判定引导码的 4.5ms 高电平 if ((time<71)||(time>89)) //时间判定范围为 4.0~5.0ms,超过此范围则说明为误码,直接退出 { GIFR=(1< } for (i=0; i<4; i++) //循环接收 4 个字节 { for (j=0; j<8; j++) { time=getLtime(); if ((time<6)||(time>14)) //时间判定范围为 340~780us,超过此范围则说明为误码,直接退出 { GIFR=(1< } 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< } } 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< } time=getHtime(); //接收并判定连发引导码的 2.25ms 高电平 if ((time<36)||(time>44)) //时间判定范围为 2.0~2.5ms,超过此范围则说明为误码,直接退出 { step=1; //下次中断执行按键处理程序 GIFR=(1< }else //确定为连发码 { ir_flag=1; step=0; //如果按键仍未松开,下次中断继续执行连发码处理程序 GIFR=(1< } } /****************************************************/ int main(void) { PORTB=0xff; MCUCR=(1< while (1) {;} } attiny13使用内部时钟,电源电压5V时实测1.15MHz左右。编译器为GCC
上一篇:avr单片机 Mega16定时器实验报告
下一篇:AVR单片机通过74HC595驱动数码管显示
推荐阅读最新更新时间:2024-11-06 21:07
设计资源 培训 开发板 精华推荐
- LTC1403A-1 演示板,14 位 1 通道 2.8Msps SAR ADC
- LT6656ACDC-2.048、2.048V 电压基准作为微功率稳压器的典型应用
- 使用 Analog Devices 的 ADR380ARTZ 的参考设计
- 555闪烁
- 80W、400V 交流转直流单输出台式电脑电源
- TCA62723FMG CMOS集成电路的典型应用Silicon Monolithic
- #第五届立创电子设计大赛#基于ESP8266OLED开发板WIFIkeil
- 使用 ON Semiconductor 的 CS8120YTHA5 的参考设计
- Luat_HMI-7I0-800480-A_V1.3
- PRT-15353,基于 TPL5110 的 SparkFun Nano Power Timer 开发套件