打印

哪位大哥帮我看一下我编的红外线接收程序好吗?

[复制链接]
2632|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kinggate|  楼主 | 2007-4-25 09:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long


extern show(uchar showdata);   //这是用595和数码管显示的函数

ulong IRcode=0x00000000;  //32位的键代码

uint customcode=0x0000;          //16位用户码
uchar Lcustomcode=0x00;      //低8用户码
uchar Hcustomcode0x00;     //高8位用户码
uchar datacode=0x00;       //8位键数据码
uchar Rdatacode=0x00;      //8位键数据反码

sbit IR=P3^2;

void delay()
{
 uchar i,j,k;
 for(i=200;i>0;i--)
    for(j=200;j>0;j--)
       for(k=55;k>0;k--) ;
}


void delay4_3ms()       //延时4.3ms
{
  TH1=0xef;
  TL1=0x34;
  TR1=1;
  while(TF1==0);
  TF1=0;
  TR1=0;
}

void delay1_120ms()   //延时1.120ms
{
  TH1=0xFB;
  TL1=0xA0;
  TR1=1;
  while(TF1==0);
  TF1=0;
  TR1=0;
}

void init()        
{  
  TMOD=0x11; //定时器0,工作方式1 ;  定时器1,工作方式1
  TCON=0x01; //外中断0下降沿触发,(包括TR1=0,TR0=0)
  TH0=0x3c;     //初始化定时器0,定时50ms
  TL0=0xb0;
  TH1=0x00;     //初始化定时器1 
  TL1=0x00;
  
  EA=1;          //开全中断
  ET0=1;      //开放T0中断
  ET1=1;          //开放T1中断
  EX0=1;      //开放INT0    
}

void remoteint() interrupt 0 using 1    //遥控器中断0处理函数,读取32位码
{
  uchar k ;        
  EX0=0;
  
  delay4_3ms();
  if(IR!=0) return;  //判断是否有干扰
  while(IR==0);
  for(k=0;k<32;k++)
  {
   while(IR==1);
   delay1_120ms();   
   if(IR==1) IRcode=IRcode|0x80000000;
   else IRcode=IRcode|0x00000000;
   IRcode=IRcode>>1;    
  }  
       
   //if(customcode!=0xFFC0) return;  //判断,防止其他遥控器干扰
    Lcustomcode=IRcode;  //取低8位用户码
    IRcode=IRcode>>8;                
    Hcustomcode=IRcode;  //取高8位用户码
    IRcode=IRcode>>8;     
    datacode=IRcode;     //取数据码
    IRcode=IRcode>>8;    
    Rdatacode=IRcode;      //取数据码的反码
    
  EX0=1;
  
}

void Timer0INT() interrupt 1 using 2        //定时器0中断函数
{
    //TR1=0;    
    //TR1=1;


void Timer1INT() interrupt 3 using 3        //定时器1中断函数
{
    //TR1=0;    
    //TR1=1;
}



//------------------------------------主函数--------------------------------
void main()
{  
   init();    
  
  while(1)       
  {  
     loop:    
     if(customcode==0) goto loop;   
    //if(~Rdatacode!=datacode) goto loop;            
    
     show(Lcustomcode);      //显示低8位用户码     
     delay();
    
     show(Hcustomcode);      //显示高8位用户码
     delay();      
          
     show(datacode);         //显示数据码
     delay();
    
     show(Rdatacode);     //显示数据反码
     delay();      
     
     
      }                                                            
}

//因为我不知道遥控器各个键的数据码,所以我想用以上程序测出来,但程序读取发生了一些问题:1:有两个键测出来的数据码是一样的 2:有些键数据反码跟原码不吻合 3:if(IR==1) IRcode=IRcode|0x80000000;   else IRcode=IRcode|0x00000000;这两句根据数据格式应该调换过来,但反而这样才能测出码,而且这样测出的用户码跟厂家给的用户码是一样的,好奇怪啊。而且,我觉得那个1.12MS的定时不太对的,应该在0.9MS时候做判断比较好,但改成0.9MS的话就更不行了
哪位高手能帮帮我忙啊,好可怜,昨天搞了一天了都没搞出来
遥控器发射码格式如下图:


相关帖子

沙发
kinggate|  楼主 | 2007-4-25 09:58 | 只看该作者

还有一个图 ,32位码

使用特权

评论回复
板凳
xwj| | 2007-4-25 11:44 | 只看该作者

去我的Blog看那个HT6222的程序实例吧

使用特权

评论回复
地板
kinggate|  楼主 | 2007-4-25 11:54 | 只看该作者

你的HT6222的数据编码格式是怎样的呵

我看不出哪里是接收32位码的,你的红外接收管数据管脚是不是接在外中断0上的呢?你帮我看看我的程序有什么不对好吗?

使用特权

评论回复
5
xwj| | 2007-4-25 12:12 | 只看该作者

不会自己去看DataSheet或搜索资料吗?

你那程序不看也罢,没法实用的
中断中用延时,这样的程序实在该打PP!!!


学习时多找、多看、多想,实在想不通了再问,
要知道别人的好心和耐心是有限的,指标有限,你这样子将会没人愿意理你!

使用特权

评论回复
6
kinggate|  楼主 | 2007-4-25 13:36 | 只看该作者

呵呵,5楼你说的对,但我都搞了一天了,才问你的啊

那个红外接收管是输入到外中断0的,一共有32位数据,既然是在中断里读,我觉得就要一位一位的把他读过来啊,那就得根据它进来数据的脉宽来判断是0还是1啊,谁都知道,在编写程序时,尽量使中断处理的时间尽量少,但不在中断里延时,我怎么读呢?
您能给我提示一下吗,我学单片机不久,有很多东西没有考虑到,有些问题在您们大虾的眼中可能是很可笑的,希望您能理解啊,谢谢!

使用特权

评论回复
7
drq1997| | 2007-4-25 13:39 | 只看该作者

可以用定时器

使用特权

评论回复
8
xwj| | 2007-4-25 13:41 | 只看该作者

唉...你先去看懂我的程序吧,很简单的原理哦

最后一贴,再不理你了...

使用特权

评论回复
9
xxdcq| | 2007-4-26 22:43 | 只看该作者

现在还用固定红外遥控码的解码吗?

已经落伍了!
我们的红外接收解码可以识别市面上任意格式的红外遥控器
http://www.yofeng.com/IrCtrR.asp

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

37

帖子

0

粉丝