制作出来的实物图如下:
电路原理图如下:
单片机源程序如下:
uchar IRcode[6]; //48位的键代码
uchar Total; //接收到的计数
#define IRMAX 108
uint xdata IRcodeTime[IRMAX];
uchar xdata IRgraph[16];
uchar xdata IRgrapl[16];
uint xdata DispTime[2];
uchar ST;
sbit IRsignal=P3^2;
//采用定时中断计时。当外部中断电平由高变低时中断响应,读取定时器的时间值并保存,//然后等待外部中断电平变高,再读取定时器的值并保存。如此循环。直到定时器溢出3次
//后(>180ms)则本次接收结束。通过设定的参数,对本次接收到的时间进行分析解码。
void IR_ISR(void) interrupt 0 using 1
{
TR0=0;
if(Total<IRMAX) //取低电平时间
IRcodeTime[Total++]= TH0*256+TL0;
TH0 = 0;
TL0 = 0;
TR0=1;
while(!IRsignal); //等待电平变高
TR0=0;
if(Total<IRMAX) //取高电平时间
IRcodeTime[Total++]= TH0*256+TL0;
TH0 = 0;
TL0 = 0;
TR0=1;
TR2=0;
}
void Timer0_ISR() interrupt 1 using 3
{
if(++ST>3) //延时大于180ms接收停止结束
{
TR0=0;
TH0=0x00;
TL0=0x00;
TR2=1;
}
}
//IRgraph IRgraplg两数组的一位对应一个像素点,高电平为显示,低电平不显示
void Time_Graph(void) //时间换波图形
{
uchar i,j,or;
uint mult;
if(Grp.Mult) //Grp.Mult 为显示比例
mult=Grp.Mult * 50;
else
mult=10;
for(i=Grp.Max;i<IRMAX;i++)
{
IRcodeTime[ i]=0;
}
if(Grp.Wab>(Grp.Max>>1))
Grp.Wab=0;
or=Grp.Wab * 2 + 1;
for(i = 0; i < 16; i++)
{
IRgraph[ i]=0x00;
IRgrapl[ i]=0x00;
}
DispTime[0]=IRcodeTime[or]; //本次显示波形的起始时间
DispTime[1]=IRcodeTime[or+1];
for(i = 0;i < 128;)
{
if(Grp.Max > or)
j = IRcodeTime[or++] / mult;
else
break;
if(j<2)j = 2;
while(j-- && i<128)
{
IRgraph[i / 8] |= 0x80 >> (i % 8);
i++;
}
if(i < 128)
IRgraph[i / 8] |= 0x80 >> (i % 8);
if(Grp.Max>or)
j = IRcodeTime[or++] / mult;
else
break;
if(j<2)j = 2;
while(j-- && i<128)
{
IRgrapl[i / 8] |= 0x80 >> (i % 8);
i++;
}
if(i < 128)
IRgrapl[i / 8] |= 0x80 >> (i % 8);
}
IRgrapl[0] |= 0x80;
for(i=127;i>0;i--) //没显示的部分全显示低
{
if(!(IRgraph[i / 8] & (0x80 >> (i % 8))))
IRgrapl[i / 8] |= 0x80 >> (i % 8);
else
{
if(i!=127)IRgrapl[i / 8] |= 0x80 >> (i % 8);
break;
}
}
}
全部资料51hei下载地址:
源程序.rar
(98.76 KB, 下载次数: 87)
原理图.7z
(39.21 KB, 下载次数: 58)
|