灰灰不会飞 发表于 2013-3-16 16:10:57

[求助] 1838红外解码简化程序,失败,找不着原因。

/*本程序是自己写的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为数据码的高四位,
      ir为数据码的低四位*/
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];
dula=0;

wela=1;
P0=0xfd;
wela=0;
delay();

dula=1;
P0=led_du_table];
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=ir>>1;
   if(count>8)    //若超过1.12ms,赋1
   {
      ir=ir|0x80;
   }
    count=0;
}
}
ir=ir&0x0f;    //为ir和ir赋值
ir=ir>>4;
}
void init()
{
P0=0xff;
dula=0;
wela=0;
EA=1;
EX0=1;
IT0=1;
}

void main()
{
init();
while(1)
{
display();
}
}

ronic 发表于 2013-3-16 17:28:58

查查中断处理程序里面有没有清状态位,恢复中断功能

灰灰不会飞 发表于 2013-3-16 21:25:34

ronic 发表于 2013-3-16 17:28 static/image/common/back.gif
查查中断处理程序里面有没有清状态位,恢复中断功能

清状态位是什么意思?是汇编中的psw吗?我用的c语言编写的啊。我在原程序中断程序末尾也就是为ir赋值后加了EX0=1之后还是不行,无论按下哪个键,都有且仅有一个数码管显示一个0,之后再按任何键都没有反应。自学51单片机不久,还请前辈指导!

shizhibing 发表于 2013-3-17 07:53:13

部分程序位置不对!检查一下!完善程序

灰灰不会飞 发表于 2013-3-17 11:07:51

shizhibing 发表于 2013-3-17 07:53 static/image/common/back.gif
部分程序位置不对!检查一下!完善程序

能具体一些吗 检查许多遍了
页: [1]
查看完整版本: [求助] 1838红外解码简化程序,失败,找不着原因。