微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机红外码值处理

单片机红外码值处理

时间:10-02 整理:3721RD 点击:
/*------------------------------------------------
*               红外码值处理
*  ------------------------------------------------*/
void Ircordpro( void )
{
        unsigned char        i, j, k;
        unsigned char        cord, value;
        k = 1;
        for ( i = 0; i < 4; i++ )               /*开始接收用户码 处理4个字节 */
        {
                for ( j = 1; j <= 8; j++ )      /*处理1个字节8位 */
                {
                        cord = irdata[k];
                        if ( cord > 7 )         /*判断是1还是0 大于某值为 1 ,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差 */
                                value |= 0x80;     // 所有数据1放最高位
                        if ( j < 8 )
                        {
                                value >>= 1;                                // 把上次的数据位右移一位  
                        }
                        k++;
                }
                IRcord        = value;
                value                = 0;
        }
        irpro_ok = 1;/*处理完毕标志位置1 */
}
irdata是存电平脉宽的
以下是中断程序
void EX0_ISR( void ) interrupt 0
{
        static unsigned char        i;                     
        static bit                startflag;              /*过滤引导码,是否开始处理标志位 */
        if ( startflag )
        {
                if ( irtime < 63 && irtime >= 33 )      /*引导码 TC9012的头码,9ms+4.5ms 引导码 8-16ms间 */
                        i = 0;
                irdata        = irtime;               /*一次存储32位电平宽度,存储每个电平的持续时间,用于以后判断是0还是1 */
                irtime                = 0;
                i++;
                if ( i == 33 )
                {
                        irok        = 1;
                        i        = 0;
                }
        }else {
                irtime                = 0;//这是因为程序在执行,定时器也开始计时了,这样的话,定时器的数字就不为0
                startflag        = 1;
        }
}
小白看了别人的程序后,红色部分不明白。问题一:为什么要位或0x80;问题二:为什么要右移1位?忘大神解惑,不胜感激!

大神大神看过来

大神大神看过来

有偿解答 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈   1 0 0 2 9 2 5 0 9 4   

这是串行数据接收处理问题,串行数据一次接收只有一位,所以一般放在接收字节的高位或低位,放在高位就是|0x80,放在低位就是|0x01,移位方向跟所接收的数据发送方向有关,如先发送bit0,接收时将接收到的数据放在高位,之后右移位,当8位数据接收完后,最先接收到的也就移位到接收字节的bit0了。

宝宝有小情绪了

多谢大神相救!在求助一下,程序中的value不是一个局部变量吗,没有初始化值不是随机的吗?我没有理解value是干嘛用的

value是局部变量,也是临时变量,因为接收的数据是8位,所以无论初始值是多少,接收完8位数据后就是接收到的数据了,如果接收到的数据少于8位,就应该赋一个初始值。接收完数据后,有一个 IRcord        = value;,这里 IRcord应该是一个外部的变量,这样接收的数据就传出去了。接收一般用临时变量处理,避免影响到其他的外部或全局变量。

假如说你需要传 一个字节的数据 假设这个数据是 0X55 ,它的 二进制为 0101 0101 B ,红外传输的 时候,从低位位开始传输,就是说,先传过来的是 1 ,现在你开始接受,假设你的接受变量为 value=0, value |=0x80 ,单个的 | 是按位进行或运算,|| 是整体进行或运算 ,那么就是,value = 0000 0000 B    与 0x1000 0000 B 的每一位进行或运算,结果 为0x1000 000 然后赋值给value  ,当移位7次以后,这个1也就到了最低位,其他位也是这个道理,我相信你明白了

谢谢大神指导

明白了!谢谢!

单步执行一下不就出结果了吗?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top