历史上的今天
今天是:2024年10月29日(星期二)
2019年10月29日 | AVR红外遥控解码代码
2019-10-29 来源:51hei
/******************红外遥控器解码源代码****************
编译环境:ICCAVR
编译人员:RJW
编译时间:2013_01_10 06:36
代码功能:实现红外遥控器解码,数码管显示用户码和数据码
*******************************************************/
#include #include #define uchar unsigned char #define uint unsigned int //定义外部中断和定时器中断 #progma interrupt_handler timer1:9 #progma interrupt_handler int0:2 //573使能端宏定义 #define DUAN PA3 #define WEI PA4 #define DUAN_OUT DDRA |= BIT(DUAN) #define DUAN_SET PORTA |= BIT(DUAN) #define DUAN_CLR PORTA &= ~BIT(DUAN) #define WEI_OUT DDRA |= BIT(WEI) #define WEI_SET PORTA |= BIT(WEI) #define WEI_CLR PORTA &= ~BIT(WEI) #progma data:code const uchar duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76}; #progma data:code const uchar wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //定义全局变量 uchar t_num=0,i_num=0,guide_ok=0,receive_ok=0; //定义用来保存零时数据和编码的数组 uchar time[33]; uchar code[4]={0x40,0x40,0x040,0x40}; /***********1us延时子函数*********** 功能:用于延时1us 参数:无 返回值:无 ******************************************/ void delay_1us() { unsigned char a,b; for(b=1;b>0;b--) for(a=3;a>0;a--); } /***********nus延时子函数*********** 功能:用于延时nus 参数:z:代表延时时长,即本函数可延时范围为:(0~65535us) 返回值:无 ******************************************/ void delay_nus(int z) { int i; for(i=z;i>0;i--) delay_1us(); } /***********定时器中断初始化函数*********** 功能:设置定时器1中断方式以及分频情况 参数:无 返回值:无 ******************************************/ void timer1_init() { TCCR1B = 0x01;//设置外部中断1无预分频 TCNT1H = 0xfb; TCNT1L = 0x4f;//设置定时时长为100US SREG |= BIT(7);//开启总中断 } /***********外部中断初始化函数*********** 功能:设置外部中断中断方式以及开启外部中断 参数:无 返回值:无 ******************************************/ void int0_init() { MCUCR = 0x02;//设置外部中断0下降沿触发方式 GICR = 0x40;//开启外部中断0中断 SREG |= BIT(7);//开启总中断 } /***********定时器中断服务程序*********** 功能:用于定时器中断时,计时变量加1 参数:无 返回值:无 ******************************************/ void timer1() { t_num++; } /***********外部中断服务程序*********** 功能:用于在响应外部中断的情况下执行相应操作 参数:无 返回值:无 ******************************************/ void int0() { TIMSK |= BIT(2);//开启定时器1中断 if(i_num==1) //判断是否是第二次外部中断 { if(t_num>80)//是否是引导码 { guide_ok=1; //是引导码则标志1 } else { guide_ok=0;//不是引导码则标志0 } } if(guide_ok==1) //如果是引导码 { time[i_num]=t_num; //将接收的各位数据保存 t_num=0; i_num++; } if(i_num==33) { i_num=0; guide_ok==0; //清楚引导码标志 receive_ok=1; //接收完成标志 } } /***********红外解码函数*********** 功能:将接收到的计时码转换为16进制码 参数:无 返回值:无 ******************************************/ void decode() { uchar i,j,k=1,dat=0; for(i=0;i<4;i++)//循环4次取得用户码'用户码'数据码'数据反码 { for(j=0;j<8;j++) //循环8次整合8个bit构成一个字节 { dat>>=1; if(time[k]>17) //PPM方式判断该bit是0还是1 { dat|=0x80; } k++; } code[i]=dat; } k=0; receive_ok=0; } /***********数码管显示初始化函数*********** 功能:设置数码管段选位选为输出模式 参数:无 返回值:无 ******************************************/ void smg_init() { DUAN_OUT; //设置段选端为输出模式 WEI_OUT; //设置位选端为输出模式 DDRB = 0xff;//设置数据端为输出模式 } /***********数码管显示函数*********** 功能:用于显示用户码和数据码 参数:无 返回值:无 ******************************************/ void smg_display() { uchar i,k=0; for(i=1;i<4;i++) { DUAN_SET; PORTB = duan[code[i]/10]; //将每个码字节的数据高4位送入 DUAN_CLR; WEI_SET; PORTB = wei[k]; WEI_CLR; delay_nus(500); //显示驻留500us DUAN_SET; PORTB = duan[code[i]%10]; //将每个码字节的数据低4位送入 DUAN_CLR; WEI_SET; PORTB = wei[k+1]; WEI_CLR; k=k+2; delay_nus(500); //显示驻留500us } k=0; } void main() { smg_init(); //数码管初始化 timer1_init();//定时器1初始化 int0_init(); //外部中断0初始化 while(1) { if(receive_ok==1) //判断33位数据是否接收完成 { decode(); //完成接收开始解码 } smg_display(); //显示 } }
上一篇:AVR IO口设置方法详解
史海拾趣
|
PC式硬盘录像机死机全接触 在使用PC式的硬盘录像机的过程中,难免会遇到许多诸如死机等突发故障,对于平时工作正常的较新机子而言,其中大多数死机都是软件停止了响应造成的,只要强制关闭了这些停止响应的软件,电脑即可恢复正常工作,方法是先按 ...… 查看全部问答> |
|
求助,在5502中SDRAM的写入过程要用210ns,如何提升速度 在TMS320VC5502中,对SDRAM写操作,居然要210ns,简直无法干活,请教前辈,怎样解决这个问题?我对EMIF的相关寄存器进行设置,如WRITE SETUP 、WRITE STROBE 、WRITE HOLD ,对写操作消耗时间一点都没变化,很郁闷呀,在论坛上有说这是5502本身问题 ...… 查看全部问答> |
|
磁珠 磁珠专用于抑制信号线、电源线上的高频噪声和尖峰干扰,还具有吸收静电脉冲的能力。磁珠是用来吸 收超高频信号,像一些RF电路,PLL,振荡电路,含超高频存储器电路(DDR SDRAM,RAMBUS等)都需要在电源输入部分加磁珠,而电感是一种蓄能元 ...… 查看全部问答> |
|
几年前,智能化的生活在大多数人看来是一种遥不可及的梦幻,近年来随着相关产业和技术的成熟,经过大量厂家和房地产开发商的宣传推广,越来越多的住宅小区开始配套相对完善的智能家居系统,人们智能化生活的梦想慢慢变成了现实。在南京,已经有数十 ...… 查看全部问答> |
|
在定制WinCE操作系统的时候,我想添加对C#的支持。可是选项中有 .NET Compact Framework 2.0 跟 .NET Compact Framework 2.0-headless两个选择项目。 请问各位大侠,两个有什么不同呢? 还有就是我刚开始添加的是前者,编 ...… 查看全部问答> |
|
#include void main(void) { WDTCTL=WDT_ADLY_1000;//设置看门狗定时时间1000ms IE1|=WDTIE; //WDT使能 P5DIR|=0x02; //P5.1输出 P5OUT=0X02; _EINT();//中断 ...… 查看全部问答> |




