小弟头次写程序,实在是困惑,我的问题是:程序下降沿中断,以判断两次下降时间差来解码,因为没能解码,我就写了下面那个判断两次下降沿的时间差来确定,我用示波器确认了红外发出的波形是正确的,1838一体红外头输出给单片机解码的波形脉宽也是正确的,但我用下面那程序把时间差 timeH timeL发到串口上显示就比我实际编码的值大量9倍左右,比如我编码0的脉宽是1.12ms但发到串口上的数据有9ms左右!!
我真不知道为什么,而且以这大9倍多的时间为依据去解码也能正确!!!
有做过红外的前辈帮小弟看看呀!!实在很困惑,程序那里错了呀!!!
#include <reg51.h>
#include"uart.h"
unsigned char IRcode; //红外解码值
unsigned char timeL,timeH; //保存时间
unsigned int time_us; //保存下降沿差时间
unsigned char uSendData;
bit NewIRcode=0; //指示当处理完了4位码后,就有了新的遥控码
/*******************初始化************************/
void initial()
{
EA = 0;
TMOD=0x01; //定时器0,工作方式1 ;
TCON=0x01; //外中断0下降沿触发(IT0=1)(其中包括TR1=0,TR0=0)
TH0=0x00; //初始化定时器0
TL0=0x00;
EA=1; //开全中断
ET0=1; //开放T0中断
EX0=1; //开放INT0
}
/**********************interrupt0******************************
中断0(P3^2脚)下降沿中断,以判断两次下降时间差来解码,
12M
***********************************************************/
unsigned char TempTH[32];
unsigned char uInterruptNum = 0; //中断的次数
void IR_ISR() interrupt 0 using 1 //红外数据中断处理函数
{
// static unsigned char cn=0; //处理数据计数
EX0 = 0; // 关INT 0
TR0 = 0; // 关 Timer 0
TR0=0; //关定时器0
timeH=TH0; //保存时间
timeL=TL0;
TH0=0X00; //时间重新置0
TL0=0X00;
TR0=1; //开定时器0
EX0 = 1; // 开INT 0
TempTH[uInterruptNum] = timeH;
uInterruptNum++;
TempTH[uInterruptNum] = timeL;
uInterruptNum++;
}
/***************************中断入***************************/
void Timer0_ISR() interrupt 1 using 2 {} //定时器0中断函数
/****************************主函数******************************/
void main()
{
unsigned char i;
initial();
Uart_initial(); //串口初始化
while(1)
{
if(uInterruptNum >= 16)
{
for(i = 0; i < uInterruptNum; i++)
{
Uart_send(TempTH[i]);
}
uInterruptNum = 0;
}
}
} |