最近参考了网上的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
设计资源 培训 开发板 精华推荐
- ADP7142UJ-EVALZ、LFCSP 评估板,用于评估 ADP7142 40V、200mA 低噪声、CMOS LDO
- AL6562 过渡模式 PFC LED 控制器的典型应用
- 使用 ColdFire MCF5208 拆分总线架构的系统设计,适用于 2.5V、16 位 DDR SDRAM 系统
- 烧录夹子-pcb
- 具有热降额功能的 LT3756EMSE 30W 白光 LED 前照灯驱动器的典型应用电路
- 基于双路比较器的 4.5ns 晶体振荡器具有 50% 的占空比和互补输出
- L7809A 开关稳压器的典型应用
- 【毕设】基于阿里云IOT平台的智慧工厂设计
- 用于 12V 应用的 LTC4367CDD-1 过压电源控制器的典型应用
- TAR5S25点稳压器(低压差稳压器)的典型应用