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

2020-01-30 14:03发布

/*本程序是自己写的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();
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
ronic
1楼-- · 2020-01-30 14:57
查查中断处理程序里面有没有清状态位,恢复中断功能
灰灰不会飞
2楼-- · 2020-01-30 18:00
ronic 发表于 2013-3-16 17:28
查查中断处理程序里面有没有清状态位,恢复中断功能

清状态位是什么意思?是汇编中的psw吗?我用的c语言编写的啊。我在原程序中断程序末尾也就是为ir[5]赋值后加了EX0=1之后还是不行,无论按下哪个键,都有且仅有一个数码管显示一个0,之后再按任何键都没有反应。自学51单片机不久,还请前辈指导!
shizhibing
3楼-- · 2020-01-30 22:34
 精彩回答 2  元偷偷看……
灰灰不会飞
4楼-- · 2020-01-30 23:23
shizhibing 发表于 2013-3-17 07:53
部分程序位置不对!检查一下!完善程序

能具体一些吗 检查许多遍了

一周热门 更多>