高分请教高人,红外遥控解码程序C语言,要求每一行都解释为什么什么作用。非常感谢!!先给100分,好再加

2024-11-01 15:57:58
推荐回答(3个)
回答1:

#include //特殊寄存器头文件

#define c(x) (x*110592/120000) //是晶振值,为计数器计一下所需要的微秒数,120000为12M,110592为11.0592M

sbit Ir_Pin=P3^3; //位声明,把P3.3/外部中断1的状态读到Ir_Pin中

unsigned char code Led_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共阳极数码显示码0-F.
unsigned char code Led_Sel[]={0xe,0xd,0xb,0x7}; //位选编码

unsigned char Led_Buf[4]; //显示缓冲区
char Led_Index; //位选信号定义

unsigned char Ir_Buf[4]; //用于保存解码结果

//==============================================================
//数码管扫描
timer0() interrupt 1 using 1 //定时器中断零程序
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256; //定时器0设定约1000us中断一次,用于数码管扫描
P0=0xff; //数码管初始显示零
P2=Led_Sel[Led_Index]; //位选
P0=Led_Tab[Led_Buf[Led_Index]]; //段选

if(++Led_Index>3) Led_Index=0; //四个扫描完了,到第一个数码管
}
//==============================================================
unsigned int Ir_Get_Low() //脉冲为低电平的时间
{
TL1=0;
TH1=0; //为定时器1赋初值
TR1=1; //开启定时器1
while(!Ir_Pin && (TH1&0x80)==0); //判断,如果P3.3口为低电平则执行TR1=0
TR1=0; //关闭定时器1
return TH1*256+TL1; //返回TH1*256+TL1的值
}
//=============================================================
unsigned int Ir_Get_High() //脉冲高电平时间
{
TL1=0;
TH1=0; //为定时器1赋初值
TR1=1; //开启定时器1
while(Ir_Pin && (TH1&0x80)==0); //判断,如果P3.3口为低电平则执行TR1=0
TR1=0; //关闭定时器1
return TH1*256+TL1; //返回TH1*256+TL1的值
}
//==============================================================
main()
{
unsigned int temp;
char i,j;
Led_Index=1;

TMOD=0x11;
TL0=(65536-1000)%256;
TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描
EA=1; //开总中断
ET0=1; //定时计数器0的开放控制位
TR0=1; //定时器0的运行控制位

Led_Buf[0]=0;
Led_Buf[1]=0;
Led_Buf[2]=0;
Led_Buf[3]=0; //显示区设成0

do{
restart:
while(Ir_Pin); //判断P3.3口
temp=Ir_Get_Low(); //取脉冲为低电平的时间
if(tempc(9500)) continue; //引导脉冲低电平9000
temp=Ir_Get_High(); //取脉冲高电平时间
if(tempc(5000)) continue; //引导脉冲高电平4500
for(i=0;i<4;i++) //4个字节
for(j=0;j<8;j++) //每个字节8位
{
temp=Ir_Get_Low();
if(tempc(800)) goto restart; //根据编码格式,低电平小于0.2ms大于0.8ms视为无效电平,重新检测
temp=Ir_Get_High();
if(tempc(2000)) goto restart; //根据编码格式,低电平小于0.2ms大于2ms视为无效电平,重新检测
Ir_Buf[i]>>=1; //把Ir_Buf[i]右移一位,然后赋值给Ir_Buf[i]
if(temp>c(1120)) Ir_Buf[i]|=0x80; //根据编码格式,如果电平大于1.12ms,则把0x80赋值给Ir_Buf[i]
}
Led_Buf[0]=Ir_Buf[2]&0xf;
Led_Buf[1]=(Ir_Buf[2]/16)&0xf;
Led_Buf[2]=Ir_Buf[3]&0xf;
Led_Buf[3]=(Ir_Buf[3]/16)&0xf; //显示结果
}while(1);
}

回答2:

#define c(x) (x*110592/120000) //是晶震值,为计数器计一下所需要的微秒数,120000为12M,110592为11.0592M
temp=Ir_Get_Low(); //取脉冲为低电平的时间
if(tempc(9500)) continue;//引导脉冲低电平9000 //根据红外编码有起始9ms的低电平时间,大于8.5小于9.5为防止计数器有误差
temp=Ir_Get_High(); //取脉冲高电平时间
if(tempc(5000)) continue;//引导脉冲高电平4500 //根据红外编码有起始4.5ms的高电平时间
for(i=0;i<4;i++) //4个字节
for(j=0;j<8;j++) //每个字节8位
{
temp=Ir_Get_Low();
if(tempc(800)) goto restart;
//根据编码格式,低电平小于0.2ms大于0.8ms视为无效电平,重新检测
temp=Ir_Get_High();
if(tempc(2000)) goto restart;//意思同上
以上是解码过程,由于时间关系其它我就不解释,你自己理解一下,有什么问题可以Hi我.

回答3:

太少了