单片机红外解码程序问题,完全不能理解
我并非一点基础也没有,也了解NEC的红外编码可是就是不能完全理解下面那个程序,这个程序很普遍,但是问了几个人都只是知道功能而不知道为什么,我具体的问题如下:(1)首先Tc...
我并非一点基础也没有,也了解NEC的红外编码可是就是不能完全理解下面那个程序,这个程序很普遍,但是问了几个人都只是知道功能而不知道为什么,我具体的问题如下:
(1)首先 Tc=TH0*256+TL0是什么意思,这是定时器高位上移两位然后再加上低位,应该是定时器的所经过的时间(初始值是都为0)这个我知道,我问的是这两个代表什么实际意义,也就是和红外接收有什么关系
(2)接收红外信后后进入单片机中断是一个怎么样的过程,能不能从引导码到用户码在到数据码那样完整叙述一下整个过程?我用的NEC编码的芯片,接收是1838接收头,接收时有没有反相哦不知道,,我看其他书籍是反相的
(3)Im[m/8]=Im[m/8]>>1|0x80; m++; 再就是这个语句,我知道是为“1”的波形对应的为值1,但是后面m++不理解,m是数组元素的标号,前面一个元素只是接收了某位,没有接收完全部位就转入下一个元素?盼高手解答!
程序如下:
#define Imax 14000 //此处为晶振为11.0592时的取值,
#define Imin 8000 //如用其它频率的晶振时,
#define Inum1 1450 //要改变相应的取值。
#define Inum2 700
#define Inum3 3000
void intersvr1(void) interrupt 2 using 1
{
TR0=1;
Tc=TH0*256+TL0;//提取中断时间间隔时长
TH0=0;
TL0=0; //定时中断重新置零
if((Tc>Imin)&&(Tc<Imax))
{
m=0;
f=1;
return;
} //找到启始码
if(f==1)
{
if(Tc>Inum1&&Tc<Inum3)
{
Im[m/8]=Im[m/8]>>1|0x80; m++;
}
if(Tc>Inum2&&Tc<Inum1)
{
Im[m/8]=Im[m/8]>>1; m++; //取码
}
if(m==32)
{
m=0;
f=0;
if(Im[2]==~Im[3])
{
IrOK=1;
TR0=0;
}
else IrOK=0; //取码完成后判断读码是否正确
}
//准备读下一码
}
}
最好能有程序流程图,一目了然!! 展开
(1)首先 Tc=TH0*256+TL0是什么意思,这是定时器高位上移两位然后再加上低位,应该是定时器的所经过的时间(初始值是都为0)这个我知道,我问的是这两个代表什么实际意义,也就是和红外接收有什么关系
(2)接收红外信后后进入单片机中断是一个怎么样的过程,能不能从引导码到用户码在到数据码那样完整叙述一下整个过程?我用的NEC编码的芯片,接收是1838接收头,接收时有没有反相哦不知道,,我看其他书籍是反相的
(3)Im[m/8]=Im[m/8]>>1|0x80; m++; 再就是这个语句,我知道是为“1”的波形对应的为值1,但是后面m++不理解,m是数组元素的标号,前面一个元素只是接收了某位,没有接收完全部位就转入下一个元素?盼高手解答!
程序如下:
#define Imax 14000 //此处为晶振为11.0592时的取值,
#define Imin 8000 //如用其它频率的晶振时,
#define Inum1 1450 //要改变相应的取值。
#define Inum2 700
#define Inum3 3000
void intersvr1(void) interrupt 2 using 1
{
TR0=1;
Tc=TH0*256+TL0;//提取中断时间间隔时长
TH0=0;
TL0=0; //定时中断重新置零
if((Tc>Imin)&&(Tc<Imax))
{
m=0;
f=1;
return;
} //找到启始码
if(f==1)
{
if(Tc>Inum1&&Tc<Inum3)
{
Im[m/8]=Im[m/8]>>1|0x80; m++;
}
if(Tc>Inum2&&Tc<Inum1)
{
Im[m/8]=Im[m/8]>>1; m++; //取码
}
if(m==32)
{
m=0;
f=0;
if(Im[2]==~Im[3])
{
IrOK=1;
TR0=0;
}
else IrOK=0; //取码完成后判断读码是否正确
}
//准备读下一码
}
}
最好能有程序流程图,一目了然!! 展开
展开全部
“我并非一点基础也没有”
很遗憾,从你提的这三个问题来看,你的基础比0只多出一点点。
(1)Tc是个16位整型。这是16位整型的基本算法。Tc保存的是抓出的脉宽。
(2)引导码就是指定宽度的脉冲,数据码是短一些的脉冲——所以才会那么大费周章地抓脉宽判断是引导码还是用户码。接收是否反相要查你所用接收头的手册,有可能跟你的程序是相反的。
(3)m不是字节序号而是位序号。注意前面的/8。
加油啊
很遗憾,从你提的这三个问题来看,你的基础比0只多出一点点。
(1)Tc是个16位整型。这是16位整型的基本算法。Tc保存的是抓出的脉宽。
(2)引导码就是指定宽度的脉冲,数据码是短一些的脉冲——所以才会那么大费周章地抓脉宽判断是引导码还是用户码。接收是否反相要查你所用接收头的手册,有可能跟你的程序是相反的。
(3)m不是字节序号而是位序号。注意前面的/8。
加油啊
追问
你回答的什么?!!你说的我早知道 废话!!
中断怎么抓住脉宽你没有说
过程怎么样你没说
m我当然知道擦 ,就是不知道在这个程序里面怎么字节变成位了?
有本事继续回答!!
追答
“中断怎么抓住脉宽”
定时器后台运行,每次进外部中断时读数即可获得上次脉宽,并清零准备抓取下次脉宽。(形象来说,就是后台掐个秒表,每次进外部中断就摁停,记下脉宽时间,然后摁reset重新开始计时)
“m我当然知道擦 ,就是不知道在这个程序里面怎么字节变成位了?”
红外编码是通过串行接收的,LSB在前。所以要用最基本的移位操作逐位逐位地记录并写入缓冲区中。其中数据码的“1”和“0”是根据脉宽不同来区分的,“0”的脉宽比“1”的脉宽短。
收完32位(4字节)后,认为数据码接收完成。
题外话:你的这个接收程序只能算是个简单示例,一点儿错误处理都没有,环境恶劣一点儿就基本上没法正常工作……
不必不服气,加油啊
展开全部
红外信号一般采用脉宽调制的串行码
以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的"0";
以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的"1
当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。
解码的关键是如何识别"0"和"1",接收端而言,"0"是0.56ms的高+0.56ms的低。"1"是1.68ms的高+0.56ms的低。
所以可以根据高电平的宽度区别"0"和"1"。当高电平出现时开始延时,0.56ms以后,若读到的电平为低,说明该位为"0",反之则为"1",为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为"0",读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。为了共用引导部分延时程序,一般用0.9ms延时。
现在回到你的问题,Tc=TH0*256+TL0 是计算你每个脉冲的周期,你应该用的下降沿触发方式来触发外部中断1,所以这个公式就是计算两个下降沿之间的时间,当大于8000也就是8.6毫秒小于14000也就是15.2毫秒时判断为起始码(实际是9+4.5=13.5)。
第二个问题前面已经说明了
第三,Im[m/8]=Im[m/8]>>1|0x80; m++;你注意没有,这里m的值应该是从0到31,所以m/8的值就变为了0~3,数组标号的变化只有到m增加8时才会发生,所以处理数据时是移位8次也就是处理完一个字节,数组标号加1.
以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的"0";
以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的"1
当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。
解码的关键是如何识别"0"和"1",接收端而言,"0"是0.56ms的高+0.56ms的低。"1"是1.68ms的高+0.56ms的低。
所以可以根据高电平的宽度区别"0"和"1"。当高电平出现时开始延时,0.56ms以后,若读到的电平为低,说明该位为"0",反之则为"1",为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为"0",读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。为了共用引导部分延时程序,一般用0.9ms延时。
现在回到你的问题,Tc=TH0*256+TL0 是计算你每个脉冲的周期,你应该用的下降沿触发方式来触发外部中断1,所以这个公式就是计算两个下降沿之间的时间,当大于8000也就是8.6毫秒小于14000也就是15.2毫秒时判断为起始码(实际是9+4.5=13.5)。
第二个问题前面已经说明了
第三,Im[m/8]=Im[m/8]>>1|0x80; m++;你注意没有,这里m的值应该是从0到31,所以m/8的值就变为了0~3,数组标号的变化只有到m增加8时才会发生,所以处理数据时是移位8次也就是处理完一个字节,数组标号加1.
来自:求助得到的回答
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询