下面是个用中断加定时器的红外解码程序,但是精度不高,我试了一下,只有75%。我想把它的精度提供一下,可是调了好久都没有调出来,所以就先把程序贴出来,请高手帮忙解答解答了,,
// P3^2接红外接收头,p2^1接蜂鸣器,用于解码正确时叫一下,竞争为12MHz的,
//定时器用的是T1,先谢谢了!!!
//Crystal Frequency=12.000000M
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar wb=0,irr_b=0,p=0;
uint ds=0,a=0;
long da=0,da1=0;
sbit beep=P2^1;
void delay_ms(uchar k)
{
uchar i,j;
for (i=k;i>0;i--)
for (j=121;j>0;j--);
}
void beep_di()
{
beep=0;
delay_ms(100);
beep=1;
}
void ext_int0_isr(void) interrupt 0
{
a=TH1*256+TL1; //读取定时器的值
if(irr_b==0) //第一个中断
{
irr_b=1; //状态为:开始接收
TH1=0x00; //定时器清零
TL1=0x00;
}
else if(irr_b==1) //第二个以后的中断
{
//a=TCNT1L;
//判断是引导,还是数据
if((12000<a)&&(a<14500)) //引导
{
wb=0; //数据计数清零
da=0; //数据清零
TH1=0x00; //定时器清零
TL1=0x00;
}
else if((900<a)&&(a<1800)) //数据0
{
wb++;
da=(da<<1);
TH1=0x00;
TL1=0x00;
}
else if((1850<a)&&(a<3000)) //数据1
{
wb++;
da=(da<<1)+1;
TH1=0x00;
TL1=0x00;
}
}
if(wb==32) //数据长度够32位
{
irr_b=0; //状态为停止接收
wb=0; //数据计数清零
p=da;
P0=da;
beep_di();
}
}
//*****************************************************************************
void init()
{
TMOD=0x10;
ET1=1;
TR1=1;
TH1=0; //9ms
TL1=0;
TF1=0;
EX0=1;
IT0=1;
EA=1;
}
//*****************************************************************************
void timeout()
{
ds=TH1*256+TL1;;
if(ds>32000) //定时器超时,接收复位
{
TH1=0;
TL1=0;
irr_b=0;
da=0;
wb=0;
p=0;
}
}
void main()
{
init();
while(1)timeout();
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
-----------------------------------------------------------------------
#include "W78E516.h" 换成 #include "reg52.h" 就OK
一周热门 更多>