求助,关于红外解码
程序如下
#include <reg52.h>
#include <intrins.h>
sbit GEWEI= P2^7;//
数码管7
sbit SHIWEI= P2^6; //数码管6
unsigned char IRCOM[8];
unsigned char code table[16] =
{0x28,0x7e,0xa2,0x62,
0x74,0x61,0x21,0x7a,
0x20,0x60,0x30,0x25,
0xa9,0x26,0xa1,0xb1}; //数码管段码
sbit ir=P3^2; //红外接收口
int n=0; //定时
中断次数
void init() //初始化
{
EA=1;
IT0=1;//
外部中断0的触发为下降沿
EX0=1;// 允许外部中断0
ET0=1;//允许
定时器0中断
PT0=1;//定时器中断优先级别高
PX0=0;
TMOD=0x02;//定时器0模式2
TH0=0x9c;//定时100μs
TL0=0x9c;
P1=0xff;//关8路led灯
ir=1;//P3^2口置1
}
void delay()//
{
int i ;
for(i=0;i<11;i++);
}
void timer0() interrupt 1 //定时100μs
{
n++;// 定时中断次数
}
void int0() interrupt 0 //外部中断函数
{
int j,k;
EX0=0;
delay();
while(!ir);//等待ir变为高电平即跳过9ms起始码
TR0=1;
while(ir);//定时器计时
TR0=0;
TH0=0x9c;
TL0=0x9c;
if(n<26) {EX0=1;n=0;return;}//若2.5ms内出现低电平为连发码返回
n=0;
for(j=0;j<4;j++) //解32位红外码
for(k=0;k<8;k++)
{
while(!ir); //等待ir为高电平
TR0=1; //开定时器,计算高电平的时间
while(ir);//等待定时器中断,并记录高电平时间
TR0=0; //高电平计时完成,关定时器
TH0=0x9c;
TL0=0x9c;
if(n<9)//小于0.9ms为0码
{
IRCOM[j]=IRCOM[j] >> 1;
IRCOM[j]=IRCOM[j]&0x7f;//a[j]右移一位最高位为0
n=0;//n清零
}
else if(n>=9) //大于0.9ms为1
{
IRCOM[j]=IRCOM[j] >> 1;
IRCOM[j]=IRCOM[j] | 0x80;//最高位送1
n=0;
}
else if(n>23) {EX0=1;n=0;return;}//如果大于2.3ms,出错,返回重新解码
}
if (IRCOM[2]!=~IRCOM[3]) {EX0=1;n=0;return;}//如果a[2]与a[3]不是互为补码,出错,返回重新解码
IRCOM[5]=IRCOM[2] & 0x0F; //存低四位
IRCOM[6]=IRCOM[2] & 0xF0;
IRCOM[6]=IRCOM[6] >> 4; //存高四位
EX0=1;
}
void IR_SHOW()
{
P0 = table[IRCOM[5]]; //送个位
GEWEI = 0;
SHIWEI = 1;
delay();
P0 = table[IRCOM[6]]; //送十位
SHIWEI = 0;
GEWEI = 1;
delay();
}
void main()
{
init();//初始化
while(1)
{
IR_SHOW();
P1=IRCOM[2];
}
}
我想把解出来的码送给led和数码管显示,结果按下遥控后led全亮,数码管只有一个亮且显示0,请各位大神
帮忙看看哪里错了
此帖出自
小平头技术问答
一周热门 更多>