打印
[STM32F1]

出现乱码

[复制链接]
250|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yinxiangh|  楼主 | 2022-3-5 13:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.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;
}

使用特权

评论回复
沙发
stly| | 2022-3-5 13:18 | 只看该作者
这是 copy的例程还是 自己写的?

使用特权

评论回复
板凳
yszong| | 2022-3-5 13:21 | 只看该作者
你用定时器中断写的。

使用特权

评论回复
地板
kangzj| | 2022-3-5 13:22 | 只看该作者
楼主这个例程还是蛮不错的,出的问题的,看下你的延时的

使用特权

评论回复
5
jiajs| | 2022-3-5 13:24 | 只看该作者
是不是延时的时间不正确导致解码错误

使用特权

评论回复
6
wyjie| | 2022-3-5 13:26 | 只看该作者
现在用C语言软件延时不是很准,用定时器的那个函数还读不出Time值

使用特权

评论回复
7
yszong| | 2022-3-5 13:29 | 只看该作者
定时写没用过。我是用延时写的。没有问题。

使用特权

评论回复
8
juventus9554| | 2022-3-5 13:31 | 只看该作者
这个设计不是很复杂的啊

使用特权

评论回复
9
stly| | 2022-3-5 13:33 | 只看该作者
这个分享的程序的没啥问题的,看下主要是不是线路上有信号干扰的

使用特权

评论回复
10
kangzj| | 2022-3-5 13:35 | 只看该作者
这个可能我也觉得很大,只是一直没调出来

使用特权

评论回复
11
juventus9554| | 2022-3-5 13:37 | 只看该作者
共地了没偶啊

使用特权

评论回复
12
zwll| | 2022-3-5 13:39 | 只看该作者
51单片机乱码?你先找个不乱的例子参考去吧。波特率和格式没有匹配。

使用特权

评论回复
13
juventus9554| | 2022-3-5 13:43 | 只看该作者
红外解码出现乱码了,还是时间不对引起的,重新调解下时间范围。

使用特权

评论回复
14
dengdc| | 2022-3-5 13:46 | 只看该作者
我觉得是解码失败造成的,或者说是显示函数的问题。

使用特权

评论回复
15
juventus9554| | 2022-3-5 13:47 | 只看该作者
线路上的干扰怎么查?

使用特权

评论回复
16
yinxiangh|  楼主 | 2022-3-5 13:50 | 只看该作者

嗯,我再好好缕一缕吧,有了好消息及时通知大家

使用特权

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

本版积分规则

723

主题

7134

帖子

2

粉丝