// 解码值在Im[2]中,当IrOK=1时解码有效。
/* 51单片机红外遥控解码程序 */
//用遥控器对准红外接收头,按下遥控器按键,在数码管前两位上就会显示对应按键的编码
#include <reg52.h>
#define uchar unsigned char
sbit dula=P2^6
sbit wela=P2^7
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}
uchar f
#define Imax 14000 //此处为晶振为11.0592时的取值,
#define Imin 8000 //如用其它频率的晶振时,
#define Inum1 1450 //要改变相应的取值。
#define Inum2 700
#define Inum3 3000
unsigned char Im[4]={0x00,0x00,0x00,0x00}
uchar show[2]={0,0}
unsigned long m,Tc
unsigned char IrOK
void delay(uchar i)
{
uchar j,k
for(j=ij>0j--)
for(k=125k>0k--)
}
void display()
{
dula=0
P0=table[show[0]]
dula=1
dula=0
wela=0
P0=0xfe
wela=1
wela=0
delay(5)
P0=table[show[1]]
dula=1
dula=0
P0=0xfd
wela=1
wela=0
delay(5)
} //外部中断解码程序
void intersvr1(void) interrupt 2 using 1
{
Tc=TH0*256+TL0 //提取中断时间间隔时长
TH0=0
TL0=0 //定时中断重新置零
if((Tc>Imin)&&(Tc<Imax))
{
m=0
f=1
return
} //找到启始码
if(f==1)
{
if(Tc>Inum1&&Tc<Inum3)
{
Im[m/8]=Im[m/8]>>1|0x80m++
}
if(Tc>Inum2&&Tc<Inum1)
{
Im[m/8]=Im[m/8]>>1m++//取码
}
if(m==32)
{
m=0
f=0
if(Im[2]==~Im[3])
{
IrOK=1
}
else IrOK=0 //取码完成后判断读码是否正确
}
//准备读下一码
}
}
/*演示主程序*/
void main(void)
{
unsigned int a
m=0
f=0
EA=1
IT1=1EX1=1
TMOD=0x11
TH0=0TL0=0
TR0=1//ET0=1
while(1)
{
if(IrOK==1)
{
show[1]=Im[2] &0x0F //取键码的低四位
show[0]=Im[2] >>4
IrOK=0
}
for(a=100a>0a--)
{
display()
}
}
}
解码程序这个就能实现
igfxsvrc.exe:process associated with Intel Common User Interface, installed with graphics card drivers with Intel chipsets!igfxsvrc.exe是Intel Common User Interface的进程!
请楼主参考!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)