打印

贴个SC6122红外解码程序,高手别笑我呵呵

[复制链接]
4448|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kinggate|  楼主 | 2007-4-29 10:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
哎,终于把红外线解码程序给弄出来了,原来问题就出在:
SC6122资料上说的编码格式是9MS高,4.5MS低的引导码,我按上面的编程,但总是
按了第二次之后就出错,而且检测不到引导码,后来实在疯了,用示波器测了一下,居然发现编码格式是:9MS低,4.5MS高!!!难道我遥控器里面的芯片不是SC6122?????现在好了,终于好了!贴出来跟大家分享一下,上次把那个出问题的程序贴出来,有个高手说我在中断里延时,要打我PP啊,打我PP!!!!,这次贴出来,大家看如果有哪里不够好的话,帮忙指点一下.

/*--------------------------------------------------------------------------------
  遥控器处理程序
  算法:测两个下降沿的的时间,作判断 0?  1?,遇到引导码,计数清0

---------------------------------------------------------------------------------*/

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long    

extern show(uchar showdata); 

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

volatile uint customcode=0x0000;      //16位用户码
volatile uint time_us=0x0000;      //两个下降沿之间的时间    

volatile uchar timeH,timeL;     //保存TH1 TL的值

uchar Lcustomcode=0x00;      //低8用户码
uchar Hcustomcode=0x00;     //高8
uchar datacode=0x00;       //8位键数据码
uchar Rdatacode=0x00;      //8位键数据反码

 
sbit power=P1^7;  //电源开关
bit NewIRcode=0;  //指示当处理完了32位码后,就有了新的遥控码
bit DataRight=0;   //为1时读取数据正确 


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
  IP=0x01;   //?????  
}

//-------------------------------------interrupt0-------------------------------------
void IR_ISR() interrupt 0 using 1    //遥控器中断处理函数
{   
  static uchar cn=0;   
 
  TR1=0;     
  timeH=TH1;
  timeL=TL1;
  TH1=0;
  TL1=0;
  TR1=1;
  
  time_us=(unsigned int)timeH;
  time_us=time_us<<8;
  time_us=time_us|timeL;

  if(time_us>13300&&time_us<13700) {cn=1;IRcode=0;}  //遇到引导码,就把cn清0,IRcode清0    
   
  if(cn<34)
  {
  if(time_us>1000&&time_us<1300) //0  
          {IRcode=IRcode|0x00000000; if(cn<33) IRcode=IRcode>>1;}

  else if(time_us>2000&&time_us<2450) //1     
          {IRcode=IRcode|0x80000000;if(cn<33) IRcode=IRcode>>1;}
  }
          
  else if(time_us>11000&&time_us<11500) {IRcode=IRcode;}; //遇到重复码
                                                                                                 
   cn++; 

  if(cn==34) {NewIRcode=1;TR1=0;}  //读完32位码,则有新码产生 

}

//--------------------------------------timer_ISR------------------------------
void Timer0_ISR() interrupt 1 using 2        //定时器0中断函数
{
    //TR1=0;    
    //TR1=1; 
}
void Timer1_ISR() interrupt 3 using 3        //定时器1中断函数
{
  
}
                   
//------------------------------------main()----------------------------------------------
void main()
{    
    
    init();       
    power=1;
    
    
 while(1)       
  { 
           
  if(NewIRcode==1)    //如果有新的遥控码就读
      {        
       
       customcode=IRcode;    //取红外码中的用户码
       Lcustomcode=IRcode;   //取低8位用户码
       IRcode=IRcode>>8;                
       Hcustomcode=IRcode;     //取高8位用户码
       IRcode=IRcode>>8;     
       datacode=IRcode;    //取数据码
       IRcode=IRcode>>8;    
       Rdatacode=IRcode;      //取数据码的反码       
     
      if((customcode!=0xFF80)&&(~Rdatacode!=datacode)) {DataRight=0;IRcode=0;} //校验
        
        else DataRight=1;        
    
        NewIRcode=0; //读完之后清零,表示新码已读 
       }
        
if(DataRight==1)  {show(datacode);} //显示其中的数据码                                
        
  }    

}

相关帖子

沙发
xiaopet| | 2007-4-30 16:14 | 只看该作者

呵呵,接收端与发射端是相反的!

使用特权

评论回复
板凳
happystar| | 2007-4-30 19:48 | 只看该作者

帮你顶一下

目前工作中还没有用到,收藏先。
谢谢

使用特权

评论回复
地板
xwj| | 2007-4-30 20:47 | 只看该作者

呵呵,因为红外接收头出来的是反的

使用特权

评论回复
5
wenhaoo| | 2009-4-3 14:36 | 只看该作者

那个定义的外部函数是什么呀。。。

使用特权

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

本版积分规则

13

主题

37

帖子

0

粉丝