本帖最后由 贺信 于 2009-10-14 13:45 编辑
void uDelay(uchar n) //延时子程序,入口参数每加1约加10us
{
for(;n>0;n--)
{uchar m=20;while(--m);}
}
***/
//**********************红外解码******************************//
uchar IR_Decode()
{
unsigned char uData = 0; //处理数据后返回值
unsigned char uTemp = 0; //数据为1或0暂存值
ET1 = 0; //关定时器1
T0Count = 0; //定时器计数值清零
while(IR_RE == 1); //初始状态下,红外输出脚一直是高电平,等待
ET1 = 1; //当有低电平到来打开定时器
while(IR_RE == 0); //低电平等待,T0计数
// if( T0Count > 30) //电平为高,判断计数时间0.1* 60 = 6ms
// {
//led=0;
ET1 = 0;
T0Count = 0;
ET1 = 1;
while(IR_RE == 1); //等待4.5ms的头高电平过去
// if(T0Count > 5) //超过0.1*30 = 3ms,即视为数据头判断完
// {
//led=0;
ET1 = 0;
T0Count = 0;
uData = 0;
for(k=0;k<4;k++)
{
while(IR_RE == 0); //等待560ms低电平过去,因为只判断数据高电平
//led=0;
ET1 = 0;
T0Count = 0; //高电平时清计数值开定时器
ET1 = 1;
while(IR_RE == 1); //高电平等待计时
if(T0Count > 2) //根据波形长度判定码值为0或1
uTemp = 1;
else
uTemp = 0;
uData |= (uTemp<<k); //保存键值
}
SendFlag = 1; //置位发送标志
led=0;
return uData; //判断四位后返回得到的值
// }
/**
}
else
{
T0Count = 0;
return uData = 0;
}
**/
}
这样的话,灯到节点11都亮!!难到这种判断行不通!!! |