51红外解码 反数据码是怎么等到的?
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define DATA_OUT P0
sbit HX1838_Out=P3^2; //声明红外接收头的OUT引脚
uchar i,ch; //ch用来保存红外的数据反码
uint t;
void main(void)
{
TMOD=0x01;
TR0=1; //开启计数器,开始计时
HX1838_Out=1;
while(1)
{
while(HX1838_Out); //等待接收信号,一有按键按下,
//HX1838_Out为0,跳出while()循环
t=(TH0<<8)+TL0; //取得脉冲宽度,
if(t>200&&t<800); //是'0'码
else if(t>1100&&t<1800) //'1'码
{
if(i>24) //取出最后一字节
ch|=1<<(i-25);
}
else //非0、1码,重新解码
{
ch=0;
i=0;
}
if(i++==32)
{
DATA_OUT=~ch; //将数据反码取反得到数据码,再送到P0的LED显示
}
while(!HX1838_Out); //等待HX1838_Out引脚电平由低变高
TL0=0; //清计数器,重新计时
TH0=0;
}
}
if(i>24) //取出最后一字节
ch|=1<<(i-25);
为什么通过这两句可以得到反数据码? 因为红外编码共32位,最后的8位就是数据反码,大于24时当然就是数据反码了 zyyn123 发表于 2014-2-19 22:31
因为红外编码共32位,最后的8位就是数据反码,大于24时当然就是数据反码了 ...
能说一下是怎么把数据反码取出来的吗,谢谢 很显然,楼主没有看红外的编码帧格式。 应该是地址+地址反码+数据+数据反码 本帖最后由 zyyn123 于 2014-2-20 21:10 编辑
小德GD 发表于 2014-2-20 00:32
能说一下是怎么把数据反码取出来的吗,谢谢
红外编码一共由32位组成,前16位是用户码,17-24位为数据码,25-32位为数据码的反码。程序中的 i >24时,ch|=1<<(i-25),当然就是求数据反码了。把ch|=1<<(i-25)改成:ch=(ch|(1<<(i-25)))
先算红括号里的,再算绿括号里的,最后算括号外面的 dz20062008 发表于 2014-2-20 19:46
很显然,楼主没有看红外的编码帧格式。
我知道红外编码后8位是反码,只是不知到怎么得到 zyyn123 发表于 2014-2-20 21:08
红外编码一共由32位组成,前16位是用户码,17-24位为数据码,25-32位为数据码的反码。程序中的 i >24时, ...
明白了,谢谢
页:
[1]