|
本帖最后由 rjx 于 2016-11-3 17:09 编辑
红外遥控接受解码失败的原因很多,但其中最重要的原因当属延时函数或定时器的延时时间误差太大。
很多人的遥控接受解码的程序大多是在网上找的或书上抄的。
我们知道,红外解码的关键是根据接收到的脉冲的宽度来区别0或1,这个宽度的判断,就是靠延时函数或定时器来完成的。因此延时函数的时间是否准确,就成为解码能否成功的关键。
因此,我们在引用别人的代码时,首先要注意原来的单片机用的是多大的晶振,如果原来的晶振是8M,你用4M,那延时函数的延时时间肯定不对了。
即使你用和原来的晶振一样,也未必能行,因为如果是单片机的型号不一样,那时间也会相差很多,因为AVR,PIC,51系列的机器周期和代码执行周期都是不一样的。
所以,在移植红外解码的程序时,自己要先编写一个简单的程序,在AVR Studio下跑一下,测试一下你使用的延时函数或定时器的时间,如有误差,一定要调整延时函数或定时器的参数,使之符合要求。
下面是一段解码程序,是一本书上抄来的,使用时发现不能解码,后仔细调整延时函数的参数(原值是155,后改为212,时钟是8M),最终才顺利成功。
最好的办法是利用单片机自带的定时器来判断0和1,定时器采用比较输出中断(自装),这是很准确的。
/********us延时程序,延时时间0.14ms(140us*),红外解码专用*******/
void Delayus(uint x)
{
char i, j;
for(i=0;i<x;i++)
{for(j=0;j<210;j++);}
}
interrupt [EXT_INT0] void ext_int0_isr(void) //红外解码,用INT0.
{
uchar i,j,sum=0;
GICR |=(0<<INT0);
Delayus(20); //延时20*0.14MS ,2.8MS
for(i = 0;i < 14;i++)
{
Delayus(1);
if(IRIN) //9MS内有高电平,则判断为干扰,退出处理程序
{
GICR |=(1<<INT0);
return; //返回
}
}
while(!(IRIN)); //等待9ms低电平过去
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
while(IRIN); //等待4.5ms高电平过去
while(!(IRIN)); //等待变高电平
while(IRIN) //计算高电平时间
{
Delayus(1); //延时0.14ms
sum++; //对0.14ms延时时间进行计数
if(sum >= 30) //高电平时间过长,则退出处理程序
{
GICR |=(1<<INT0);
return;
}
}
IR_buf = IR_buf >> 1; //接受一位数据
if(sum >= 6)
{IR_buf = IR_buf | 0x80;} //若计数值大于6(高电平时间大于0.56),则为数据1
sum = 0; //若计数小于6,数据最高位补"0",说明收到的是"0",同时计时清零
}
}
if(IR_buf[2]!=~IR_buf[3]) //将键数据反码取反后与键数据码码比较,若不等,表示接收数据错误,放弃
{ GICR |=(1<<INT0); return;}
HW_Status=1;
}
用于测试延时函数时间的代码:在测试时,在相关位置设置几个断点,按F10执行,看时间是否正确。
hip type : ATmega8L
Program type : Application
AVR Core Clock frequency: 8.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega8.h>
typedef unsigned int uint;
typedef unsigned char uchar;
// Declare your global variables here
void Delayus_2(uint x)
{
char i,j;
for(i=0;i<x;i++)
{ for(j=0;j<212;j++); }
}
void main(void)
{
PORTD=0x00;
DDRD=0x01;
while (1)
{ PORTD=0x00;
Delayus_2(1);
PORTD=0x01;
Delayus_2(20);
PORTD=0x00;
}
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|