找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

红外解码问题,请帮我看看

[复制链接]
admin 发表于 2012-9-2 09:04:38 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
弄红外解码好多天了,总是遇到问题,大家帮我看下我这样弄有什么问题?

//cpu3?ê??ˉ
void cpu_init(void)
{
TMOD = 0x11 ;
IP = 0x2;
IT0 = 1;
EX0 = 1;
EA = 1;
IRstate = IR_EVENT;
}

void IRint() interrupt 0
{?

switch(IRstate)
{
case IR_EVENT:

if(P3_2 == 0)
{
// TR0 = 0;
TL0 = 0;
TH0 = 0;
TF0 = 0;
ET0 = 1;
// TR0 = 1;
while(P3_2 == 0)
{
;
}
//TR0 = 0;
IR_Low = TH0 ;
IR_Low = (IR_Low << 8) + TL0;

if((IR_Low > 6451) && (IR_Low < 10137))
{
P1_0 = 1;
}
TL0 = 0;
TH0 = 0;
// TR0 = 1;
ET0 = 1;
IRstate = IR_START;
}

break;
case IR_START:
TR0 = 0;
IR_High = TH0;
IR_High = (IR_High << 8) + TL0;

if((IR_High > 3225) && (IR_High < 5068))
{
P1_0 = 1;
}
TH0 = 0;
TL0 = 0;
TR0 = 1;
while(P3_2 == 0)
{
;
}
TR0 = 0;
IR_Low = TH0 ;
IR_Low = (IR_Low << 8) + TL0;
if((IR_Low > 368) && (IR_Low < 645))
{
// P1_0 = 1;
}
TL0 = 0;
TH0 = 0;
TR0 = 1;
IRstate = IR_TEMP;
break;
case IR_TEMP:
TR0 = 0;
IR_High = TH0;
IR_High = (IR_High << 8) + TL0;

if((IR_High > 1382) && (IR_High < 1658))
{
P1_0 = 1;
}
else if((IR_High > 368) && (IR_High < 645))
{
P1_0 = 1;
}
break;
case IR_SYNC:

break;
default:
// IRstate = IR_EVENT;
break;
}


}?

我的想法是进入外部中断后使用2个变量记录在高低电平时间断的计数,使用T0计数,每次进入外部中断读取时间赋值为IR_High,这事电平为低电平,然后重新启动T0,等待电平变为高电平后有读取计数赋值为IR_Low,然后计算在协议的各个时间段内的脉冲数,例如引导码9ms我采用 (11.0592/12)*9*1000 = 8294,我用IR_Low去和这个数比较,弄个误差范围,在8ms-10ms范围内比较,请问这样有什么错误?我弄的总是不对。
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-24 12:27 , Processed in 0.053571 second(s), 12 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表