打印

430急 HS0038 红外解码 出现乱码的 怎么解决啊

[复制链接]
1724|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
木子不二|  楼主 | 2013-7-7 00:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式






#include <msp430x14x.h>
#include "hs0038ir.h"
unsigned char TN=0;
unsigned char   IR_COM[4]={0,0,0,0};//存放解码出来的数据  
/*******************************************************************************
* Function Name  : void Delay100us(unsigned int dly)
* Description    : 延时100us
* Input          : dly
* Output         : None
* Return         : None
*******************************************************************************/
void Delay100us(unsigned int dly)
{
  unsigned int j,k;
  for(j=dly;j>0;j--)
    for(k=16;k>0;k--);
}
/*******************************************************************************
* Function Name  : void Delay50Us(unsigned char dly)
* Description    : 延时50us
* Input          : dly
* Output         : None
* Return         : None
*******************************************************************************/
void Delay50us(unsigned int dly)
{
  while(dly--);
}
/*******************************************************************************
* Function Name  : void TimeA_Init()
* Description    : 定时器A 初始化配置  捕获模式
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void TimeA_Init()
{
   TACTL |= TASSEL_2 + TACLR +ID_0 + MC_1;//MCLK 0分频 计数器清零
}
/*******************************************************************************
* Function Name  : void IR_Init(void)
* Description    : 管脚配置配置
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void IR_Init(void)
{
  P1DIR |= BIT5;
  P1OUT |= BIT5;
  P1DIR &=~BIT5;   //红外数据输入端
  P1OUT |= BIT5;
//  P6DIR |= BIT7;   //蜂鸣器
//  P6OUT |= BIT7;
  P1IE  |= BIT5;   //使能P1.5中断功能
}
/*******************************************************************************
* Function Name  : unsigned char Get_data(void)
* Description    : 读取IR管脚数据
* Input          : None
* Output         : None
* Return         : 读取到的数据
*******************************************************************************/
unsigned char Get_data(void)
{
  unsigned char stat;
  stat = P1IN & BIT5;
  return (stat);
}
/*******************************************************************************
* Function Name  : unsigned char Get_HighTime(void)
* Description    : 计算高脉冲宽度
* Input          : None
* Output         : None
* Return         : 脉冲宽度
*******************************************************************************/
unsigned char Get_HighTime(void)
{
unsigned int n=0;
// TimeA_Init();                   //连续计数模式
// CCR0=60000;
while(Get_data()==0x20)           //等待低电平
{
    n++;
    Delay50us(10);                 //延时  50us
    if(n==120)return n ;           //最大延时 6ms   
}
// n = TAR;
// TACTL = 0;
return  n;                        //返回脉冲宽度
}
/*******************************************************************************
* Function Name  : unsigned char Get_HighTime(void)
* Description    : 计算低脉冲宽度
* Input          : None
* Output         : None
* Return         : 脉冲宽度
*******************************************************************************/
unsigned char Get_LowTime(void)
{
   unsigned char n=0;
//   TimeA_Init();                  //连续计数模式
//   CCR0=60000;
   while(Get_data()==0)             //等待高电平
   {
      n++;
      Delay50us(10);                //延时 50us
      if(n==250) return n;          //最大延时 12.5ms
   }
//  n = TAR;
//  TACTL = 0;
  return n;                         //返回脉冲宽度
}
/*******************************************************************************
* Function Name  : unsigned int Remote_decode(void)
* Description    : 解码过程1
* Input          : None
* Output         : None
* Return         : 解码出来的数据
*******************************************************************************/
unsigned int *Remote_decode(void)
{
  unsigned char i,j,t=0,rd;
//  unsigned int *pr=0;
  while(Get_data()==0x20);        //等待IR低电平   
// if(Get_data()!=0x20)
// {
  t = Get_LowTime();              //获取低电平时间
  if(t==250) return 0;            //超时 不是有用信号
  if((t<80)||(t>100)) return 0;   //不在8到10ms内 跳出
//  while(Get_data()==0x20);        //跳过4.5ms高信号
  //开始解码   
  for(i=0;i<4;i++)
  {
    for(j=8;j>0;j--)
    {
      IR_COM>>=1;  
      while(Get_data()==0x20);     //等低电平           
      t = Get_LowTime();            //计算低电平时间
//      _NOP();
//      if((t<4)||(t>7))return 0;    //不在0.5~0.6ms内 跳出         
      Delay50us(150);               //延时0.8ms
      if((Get_data()==0x20))        //"1"
      {
        IR_COM |= 0x80;
      }
      else                          //"0"
      {
        IR_COM &= 0x7f;
      }
     }  if(j==0)j=8;
   }
      P6OUT ^= BIT7;
      Delay100us(5);
//  }  
//  *pr = IR_COM[0];
  return 0;
}
望大神 指导下!
望大神 指导下!
望大神 指导下!

相关帖子

沙发
木子不二|  楼主 | 2013-7-7 00:24 | 只看该作者
解码出来的码  有时候貌似是对的,有时候是错的,
还有一个按键会解出几种码来  调了几天 没头绪为什么啊

使用特权

评论回复
板凳
hejialun| | 2013-7-7 13:51 | 只看该作者
这是 copy的例程还是 自己写的?

使用特权

评论回复
地板
木子不二|  楼主 | 2013-7-7 16:24 | 只看该作者
自己写的啊,

使用特权

评论回复
5
51xlf| | 2013-7-7 23:25 | 只看该作者
你用定时器中断写的。

使用特权

评论回复
6
smilingangel| | 2013-7-7 23:27 | 只看该作者
楼主这个例程还是蛮不错的,出的问题的,看下你的延时的

使用特权

评论回复
7
51xlf| | 2013-7-7 23:27 | 只看该作者

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
木子不二 + 1 其实就是延时不准,今天 调好了.
8
木子不二|  楼主 | 2013-7-7 23:34 | 只看该作者
smilingangel 发表于 2013-7-7 23:27
楼主这个例程还是蛮不错的,出的问题的,看下你的延时的

是不是延时的时间不正确导致解码错误,这个可能我也觉得很大,只是一直没调出来,现在用C语言软件延时不是很准,用定时器的那个函数还读不出Time值,

使用特权

评论回复
9
木子不二|  楼主 | 2013-7-7 23:34 | 只看该作者
51xlf 发表于 2013-7-7 23:27
http://wenku.baidu.com/view/6975a5d476a20029bd642dff.html

:handshake

使用特权

评论回复
10
51xlf| | 2013-7-7 23:35 | 只看该作者
木子不二 发表于 2013-7-7 23:34

:handshake

使用特权

评论回复
11
木子不二|  楼主 | 2013-7-7 23:41 | 只看该作者
你是否刚刚做过这个啊

使用特权

评论回复
12
木子不二|  楼主 | 2013-7-7 23:42 | 只看该作者
你是否刚刚做过这个啊

使用特权

评论回复
13
ldc2qt| | 2013-7-15 21:57 | 只看该作者
定时写没用过。我是用延时写的。没有问题。

使用特权

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

本版积分规则

36

主题

306

帖子

6

粉丝