1、硬件故障:传感器损坏或接线不良会导致解码错误。
2、编码方式不匹配:红外遥控器使用的编码方式与Arduino程序解码方式不匹配,导致解码错误。
3、环境干扰:红外信号易受环境干扰,例如强光、其它遥控器信号等。
4、解码程序错误:编写解码程序时,可能存在程序逻辑错误或者解码算法问题,导致解码出错。
5、 *** 作问题:可能是用户 *** 作问题,例如红外遥控器距离目标设备太远或者遮挡遥控器等。
那个N大于30是因为已经超出了0和1代表的时间长度。0和1所代表的高低电平时间不一样。当高电平时长超过n=8时,代表1否则代表0这个是和你红外设置的0,1代表时间长度有关系,请问你有时序图吗??那就一目了然了
上面的sbit dula=P2^6; sbit wela=P2^7;分别是什么意思??
--为引脚,定义一个变量名称。
这里的P2^6和P2^7和IO口的P2^6,P2^7有什么关系??
--它们就是它们。
dula和wela是用来显示键值所用的数码管的段和位吗?
--看程序,它们都干些什么,就知道了。
把他们定义成P2^6和P2^7和数码管段与位所连接的IO口有关系吗?
--有关、无关,去看电路图。
另外uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};是显示这些码代表的键?
--这些,是显示数字用的。
--是不是代表键,你执行程序,就看出来了。
还是用这些码所代表的数码管的段和位或者别的什么的来显示按键值?
--试试看。
--有些程序,都是瞎编,显示什么,作者自己,都不清楚。
//////////////////////////////////////
//晶振频率为6MHz 一个机器周期2us //
//实现按键地址码、指令码的数码管显示//
//2010-06-01 //
//////////////////////////////////////
#include<reg52h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
bit overflag,dataover;//开始接收数据,数据处理完毕
uchar timedata;//定时器0溢出次数
uchar chubus[33];//33Byte数据 timedata组成的数组
uchar jieguos[4];//地址码,地址反码,数据码,数据反码;
void initial()//初始化
{
IT0=1;EX0=1;//负边沿触发
TMOD=0x01;ET0=1;TR0=1;//模式1,十六位定时器
TH0=0xff;TL0=0x06;//05ms溢出
EA=1; //开总中断
}
void time0() interrupt 1//定时器0中断
{TH0=0xff;TL0=0x06;
timedata++;
}
void ex0() interrupt 0//外部中断0,接收数据
{
static bit startflag;//开始接收
static uchar i;
if(startflag)
{
if(timedata<32&&timedata>=16) i=0;
chubus[i]=timedata;
timedata=0;
i++;
if(i==33){overflag=1;i=0;}
}
else
{
startflag=1;
timedata=0;
}
}
void chulidata()
{
uchar chubu;//初步数据
uchar jieguo;//结果数据
uchar x,y,z=1;
for(x=0;x<4;x++)//处理四组数据
{
for(y=1;y<=8;y++)//处理一组数据8Byte
{
chubu=chubus[z];
jieguo=jieguo>>1;
if(chubu>3) jieguo=jieguo|0x80;//大于15mS为1
z++;
}
jieguos[x]=jieguo;
jieguo=0;
}
dataover=1;
}
void delay(uint z)
{
uint x ,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display()
{
uchar gao,gao1;
uchar di,di1;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
gao1=table[jieguos[0]/16];
di1=table[jieguos[0]%16];
gao=table[jieguos[2]/16];
di=table[jieguos[2]%16];
dula=1;
P0=gao1;
dula=0;
P0=0xff;
wela=1;
P0=0x7e;
wela=0;
delay(2);
dula=1;
P0=di1;
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(2);//地址码
dula=1;
P0=gao;
dula=0;
P0=0xff;
wela=1;
P0=0x77;
wela=0;
delay(2);
dula=1;
P0=di;
dula=0;
P0=0xff;
wela=1;
P0=0x6f;
wela=0;
delay(2);//指令码
}
void main()
{
initial();//初始化
while(1)
{
if(overflag)//数据接收完毕
{
chulidata();//处理数据,完成标志dataover
overflag=0;
}
if(dataover)
{
display();//数码管显示
}
}
}
以上就是关于arduino红外遥控器解码错误原因全部的内容,包括:arduino红外遥控器解码错误原因、谁能帮我解释一下这个有关51单片机的红外解码的部分程序、下面红外解码的数码管显示程序中 sbit dula=P2^6; sbit wela=P2^7;分别是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)