打印

谁可以解释一下红外解码程序

[复制链接]
2381|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
heilongqq|  楼主 | 2010-4-26 19:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//使用12M晶振 适用于TC9012芯片,其他芯片请自行更改解码时序
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#define TURE 1
#define FALSE 0
sbit IR=P3^2;//红外接口标志
unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char  irtime;//红外用全局变量
bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char   irdata[33];
void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数
{
  irtime++;
}
void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数
{
  static unsigned char  i;
  static bit startflag;
if(startflag)
{
   
    if(irtime<42&&irtime>=33)//引导码 TC9012的头码
            i=0;
     
      irdata[i]=irtime;//一次存储32位电平宽度
      irtime=0;
      i++;
       if(i==33)
         {
       irok=1;
     i=0;
      }
          }
  
    else
  {irtime=0;startflag=1;}
}
void TIM0init(void)//定时器0初始化
{
  TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
  TH0=0x00;//reload value
  TL0=0x00;//initial value
  ET0=1;//开中断
  TR0=1;
}
void EX0init(void)
{
IT0 = 1;   // Configure interrupt 0 for falling edge on /INT0 (P3.2)
EX0 = 1;   // Enable EX0 Interrupt
EA = 1;  
}
  void Ir_work(void)//红外键值散转程序
  {
       switch(IRcord[2])//判断第三个数码值
          {
    case 0:P0=dofly[1];break;//1 显示相应的按键值
    case 1:P0=dofly[2];break;//2
    case 2:P0=dofly[3];break;//3
    case 3:P0=dofly[4];break;//4
    case 4:P0=dofly[5];break;//5
    case 5:P0=dofly[6];break;//6
    case 6:P0=dofly[7];break;//7
    case 7:P0=dofly[8];break;//8
    case 8:P0=dofly[9];break;//9
    }

    irpro_ok=0;//处理完成标志
  }
void Ircordpro(void)//红外码值处理函数
{
  unsigned char i, j, k;
  unsigned char cord,value;
  k=1;
  for(i=0;i<4;i++)//处理4个字节
     {
      for(j=1;j<=8;j++) //处理1个字节8位
         {
          cord=irdata[k];
          if(cord>7)//大于某值为1
      {
             value=value|0x80;
   }
          else
      {
             value=value;
   }
          if(j<8)
      {
    value=value>>1;
   }
           k++;
         }
     IRcord[i]=value;
     value=0;     
     } irpro_ok=1;//处理完毕标志位置1
   
}
void main(void)
{
EX0init(); // Enable Global Interrupt Flag
TIM0init();//初始化定时器0
P2=0x00;//1位数码管全部显示
while(1)//主循环
   {
    if(irok)
   {   
    Ircordpro();//码值处理
     irok=0;
   }
    if(irpro_ok)//step press key
   {
    Ir_work();//码值识别散转
     }
   }
}

在外部中断0程序中,TC9012使用的是 38Khz的载波。比如在发送1时的高脉冲是0.56MS,要发送21个载波脉冲,看程序时,发送载波,会不会引起外部中断呀,这是怎么执行的

相关帖子

沙发
hxlwjn| | 2010-4-27 08:32 | 只看该作者
一般红外接收头都会从载波中提取出红外信号,输出的信号并没有载波。ex0_isr用irdata[33]保存低电平的计数值,Ircordpro根据计数值的大小来判断是1还是0,从而得到解码值.

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
heilongqq + 1 谢谢!
板凳
heilongqq|  楼主 | 2010-4-28 18:52 | 只看该作者
感谢!

使用特权

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

本版积分规则

个人签名:希望每天进步

25

主题

48

帖子

0

粉丝