搜索
bottom↓
回复: 7

求助:51单片机红外延时解码程序???

[复制链接]

出0入0汤圆

发表于 2009-6-15 23:11:09 | 显示全部楼层 |阅读模式
调试了好几天了,都没有成功,还请高手帮忙看一下程序是否有问题.谢谢
一体红外接收头接到P3^2脚上,
#include <at89x52.h>
#include <1602LCD.h>
#define uchar   unsigned char
sbit IR=P3^2;  //接收头
sbit sp=P2^1;  //蜂鸣器
bit ok;  //解码成功标志
static unsigned int a,d;
extern  display_long_char(uchar x,uchar y,uchar *pa);
void display_char (uchar x,uchar y,uchar temp);
extern  void INIT_LCD (void);
unsigned char code tab1[16]={" LCD REMOTE TSET"};
void beep (void)  //蜂鸣器程序
{
  unsigned int t;
  t=50000;
  sp=0;
  while (t)
  {t--;}
  sp=1;
}
void delay840ns (void) //延时0.84ms
{
unsigned int t=860;
while (t--);
}
void delay9ms (void) //延时9ms
{
unsigned int t=50000;
unsigned int a;
while (t--)
{
  for (a=60;a<=0;a--);
  }
}
void starting (void) //初始化中断
{
IT0=1;
EX0=1;
EA=1;
}
void hex_bin (unsigned int r,unsigned int t)  //转换程序
{
unsigned char a1,a2,d1,d2;
a1=(char)r&0xff;
a2=(char)r>>8;
d1=(char)t&0xff;
d2=(char)t>>8;
display_char (2,2,a1+0x30);
display_char (2,3,'A');
}
main ()
{
  beep ();
  INIT_LCD ();
  display_long_char (1,1,tab1);
  starting ();        //初始化
  while (1)
   {
         display_long_char (1,1,tab1);
         if (ok)  hex_bin (a,d);
   }
}

void remote (void) interrupt 0
{
unsigned char i;
a=0;
d=0;
EA=1;
return;
delay9ms ();
if (IR) while (IR) if (!IR) {EA=1;ok=0;return;}         //等等4.5MS结果码
  else {EA=1;ok=0;return;}  //出错返回
while (IR==0);
for (i=0;i<16;i++)
  {
   delay840ns ();
   if (IR==1) {a=(a>>1)|0x80;while (IR==1);}  //取0
    else a=(a>>1);         //取1
        while (IR==0);
  }

  for (i=0;i<16;i++)
  {
   delay840ns ();
   if (IR==1) {d=(d<<1)|1;while (IR==1);}  //取0
    else d=(d<<1);         //取1
        while (IR==0);
  }
  beep ();
  ok=1;
  EA=1;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2009-6-18 22:30:44 | 显示全部楼层
近两天的调试,终于调试成功了!庆祝一下!

/*24M时的延时函数*
  完成时间:2009-06-17
  作者:周勇*/
#include <at89x52.h>
#include <intrins.h>
#define uchar  unsigned char
#define uint   unsigned int
sbit di1=P3^4;        //数码管控制位
sbit di2=P3^5;  //数码管控制位
sbit di3=P3^6;        //数码管控制位
sbit di4=P3^7;        //数码管控制位
sbit IR=P3^2;
sbit sp=P1^3;    //蜂鸣器
  bit ok;

uchar recode[4]={0,0,0,0};
void delay840us(void)  //delay 0.84ms
{
uint i;
  for(i=0;i<188;i++)
   {
    _nop_();
     }
}

void delay1ms (void)   //delay 1ms
{
uint i;
for (i=0;i<222;i++)
  {
     _nop_();
  }
}

void delay4700us (void)   //delay 接近5MS
{
uint i;
for (i=0;i<1600;i++)  
  {
     _nop_();
  }
}

void scan_delay (unsigned int i)        //扫描延时 5 MS
{
unsigned char b;
for (;i>0;i--)
  {
    for (b=200;b>0;b--)
         {}
  }
}

void beep (void)  //蜂鸣器程序
{
  unsigned int t;
   t=60000;
    sp=0;
  while (t--)
  {
    _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
          }
    sp=1;
}

IR_Remote (void) interrupt 0 using 1   //解码核心程序
{
uchar t,count;
EX0=0;
  for (t=0;t<8;t++)
   {
            delay1ms ();
         if (IR) {EX0=1;return;}
   }
if (!IR)
{
  delay4700us ();
  for (t=0;t<4;t++)
   {
            for (count=0;count<8;count++)
           {
                    while (!IR);
                  delay840us ();
                   if (IR)  {recode[t]=recode[t]>>1|0x80;while (IR);}
                          else recode[t]=recode[t]>>1;
                                   }
                     }
   
                      }
        if (recode[0]==~recode[1])  //校验解码
          {
                    
                        beep ();
             ok=1;
                            }
                else
                  {
                    ok=0;
                        }
               
                EX0=1;
         return;
         
}


main ()
{
IT0=1;
EX0=1;
EA=1;
while (1)
  {
   if (ok)
     {
            
             P0=recode[0];
         di1=0;
          scan_delay (10);
           di1=1;
            P0=0XFF;

       P0=recode[1];
        di2=0;
         scan_delay (10);
          di2=1;
           P0=0XFF;

                P0=recode[2];
         di3=0;
          scan_delay (10);
           di3=1;
            P0=0XFF;

        P0=recode[3];
         di4=0;
          scan_delay (10);
           di4=1;
            P0=0XFF;
                      }
       
               
         
         /*  else
             {
                  P0=0xbf;
         di1=0;
          scan_delay (10);
           di1=1;
            P0=0XFF;

       P0=0xbf;
        di2=0;
         scan_delay (10);
          di2=1;
           P0=0XFF;

          P0=0xbf;
       di3=0;
        scan_delay (10);
         di3=1;
          P0=0XFF;

      P0=0xbf;
       di4=0;
        scan_delay (10);
         di4=1;
          P0=0XFF;
                 }*/               
  }
}

出0入0汤圆

发表于 2009-9-17 23:18:03 | 显示全部楼层
标记

出0入0汤圆

发表于 2009-9-28 15:48:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-9 11:18:35 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-27 10:48:01 | 显示全部楼层
Good job!!!

出0入0汤圆

发表于 2010-8-30 15:58:02 | 显示全部楼层
标记···

出0入12汤圆

发表于 2013-9-24 22:38:47 | 显示全部楼层
学习记号备用
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 14:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表