/*本程序是自己写的1838红外一体化收发装置的解码程序,已简化,即没有对具体的引导码时间做确认,也没有对反码和原码做确认。
烧写后,只有第一次按键时数码管有变化,之后无反应。调试不出错误,求高手指导!*/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code led_du_table[]= //led数字编码
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar ir[]={0,0,0,0,0,0}; /*前四个表示收到的用户编码、反码、数据码、数据反码,ir[5]为数据码的高四位,
ir[4]为数据码的低四位*/
sbit hwir=P3^2; //外部中断即数据传输口
sbit dula=P2^6; //数码管段选
sbit wela=P2^7; //数码管位选
void delay() //0.14ms延迟
{
uchar x;
for(x=140;x>0;x--);
}
void display()
{
dula=1;
P0=led_du_table[ir[4]];
dula=0;
wela=1;
P0=0xfd;
wela=0;
delay();
dula=1;
P0=led_du_table[ir[5]];
dula=0;
wela=1;
P0=0xfe;
wela=0;
delay();
}
void wbzdf() interrupt 0 //外部中断函数
{
uchar count,m,n;
EX0=0;
while(!hwir); //9秒的低位引导码
while(hwir); //4.5秒的高位引导码
for(m=0;m<4;m++)
{
for(n=0;n<8;n++)
{
while(!hwir); //等低电平结束
while(hwir) //计算高电平时间
{
delay();
count++;
}
ir[m]=ir[m]>>1;
if(count>8) //若超过1.12ms,赋1
{
ir[m]=ir[m]|0x80;
}
count=0;
}
}
ir[4]=ir[2]&0x0f; //为ir[4]和ir[5]赋值
ir[5]=ir[2]>>4;
}
void init()
{
P0=0xff;
dula=0;
wela=0;
EA=1;
EX0=1;
IT0=1;
}
void main()
{
init();
while(1)
{
display();
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>