打印

一个代码求解释啊,不明白啊!多谢啦啊!

[复制链接]
2278|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhanghaiw|  楼主 | 2013-3-31 17:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*
* 红外接收数据,查询方式,并通过串口发送
*
* 晶振:11.0592M
*/

#include <reg52.h>

typedef unsigned char uint8;

sbit Ir_Pin = P3^3;

uint8 Ir_Buf[4]; //用于保存解码结果


/*
* UART初始化
* 波特率:9600
*/
void uart_init(void)
{
    TMOD = 0x21;         //此处使用两个定时器发生中断
    SCON = 0x50;

    TH1 = 0xFD;
    TL1 = 0xFD;

    TR1 = 1;
}

/*
* UART发送一字节
*/
void UART_Send_Byte(uint8 dat)
{
        SBUF = dat;
        while (TI == 0);
        TI = 0;
}


/*
* 获取低电平时间
*/
unsigned int Ir_Get_Low()
{
        TL0 = 0;
        TH0 = 0;
        TR0 = 1;
        while (!Ir_Pin && (TH0&0x80)==0);           /*此处不明白为什么TH0要与上0x80*/
                                                                       //此处过了30000多us就停止了!
        TR0 = 0;           
        return (TH0 * 256 + TL0);         //把十进制数转换一把
}

/*
* 获取高电平时间
*/
unsigned int Ir_Get_High()
{
        TL0 = 0;
        TH0 = 0;
        TR0 = 1;
        while (Ir_Pin && (TH0&0x80)==0);

        TR0 = 0;
        return (TH0 * 256 + TL0);
}


main()
{
        unsigned int temp;
        char i,j;

        uart_init();
       
        while (1)
        {
start:         //此数为goto语句的用法
                while (Ir_Pin);

                temp = Ir_Get_Low(); // 获取低电平的时间

                if ((temp < 7833) || (temp > 8755))  //引导脉冲低电平8500~9500us
                        goto start;

                temp = Ir_Get_High(); //获取高电平的时间

                if ((temp < 3686) || (temp > 4608))  //引导脉冲高电平4000~5000us
                        goto start;

                for (i=0; i<4; i++) //4个字节
                {
                        for (j=0; j<8; j++) //每个字节8位
                        {
                                temp = Ir_Get_Low();
                                if ((temp < 184) || (temp > 737)) //200~800us
                                        goto start;

                                temp = Ir_Get_High();
                                if ((temp < 184) || (temp > 1843)) //200~2000us
                                        goto start;

                                Ir_Buf[i] >>= 1;
                                if (temp > 1032) //1120us
                                        Ir_Buf[i] |= 0x80;
                        }
                }

                UART_Send_Byte(Ir_Buf[0]);
                UART_Send_Byte(Ir_Buf[1]);
                UART_Send_Byte(Ir_Buf[2]);
                UART_Send_Byte(Ir_Buf[3]);
        }
}


就是TH为什么非得与上0x80呢,求大家帮助一下啊,赶集了啊!

相关帖子

沙发
zhanghaiw|  楼主 | 2013-3-31 17:37 | 只看该作者
自己先顶一个啊,呵呵!

使用特权

评论回复
板凳
gaoyang9992006| | 2013-3-31 18:00 | 只看该作者
那个0x80是提取最高位的。就是1000,000位与,获取TH0的最高位,貌似那个位有嘛东西

使用特权

评论回复
地板
gaoyang9992006| | 2013-3-31 18:10 | 只看该作者
等待低电平,并且TH的最高位要小于某个数

使用特权

评论回复
5
gmgmgm| | 2013-4-1 00:22 | 只看该作者
while (!Ir_Pin && (TH0&0x80)==0);
等待计数器TH0最高位为1时退出;也就是当计数器TH0计数到0x80值时TH0&0x80 此值为1条件成立,限制等待Ir_Pin 脚处于低电平的时间不长于计数器TH0时间为0x80;如果TH0还没计数到0x80值时Ir_Pin已由低电平变为高电平,则所得的值小于0x80;要注意前面的&&和后面&运算符的意义和差别,前面的&&运算是先判断Ir_Pin是否已变为高电平,再次判断TH0是否已到达限定的计时时间值0x80。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
zhanghaiw + 1 赞一个!
6
清清泉水| | 2013-4-25 15:16 | 只看该作者
学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

68

帖子

0

粉丝