单片机红外码值处理
* 红外码值处理
* ------------------------------------------------*/
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也就到了最低位,其他位也是这个道理,我相信你明白了
谢谢大神指导
明白了!谢谢!
单步执行一下不就出结果了吗?