打印
[STM8]

红外解码

[复制链接]
1820|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
弹痕CJP|  楼主 | 2015-10-29 11:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在做stm8s003红外解码的程序,调试了几天,目前遇到一个难点迟迟未解决,就是:第一次按下遥控器按键,没有反应,接下来的每一次按下按键都能正常工作,不知道是什么原因呢?为什么每次上电后第一次没有反应?还请各位前辈指教一下!!!
#include "stm8s.h"

/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/*
*********************************************************************************************************
*
*        模块名称 : 红外遥控解码
*
   引导码   地址码   地址反码   数据码  数据反码
\ 9+4.5ms \ c0-c07 \ c0-c07 \ c0-c07 \ c0-c07 \
*********************************************************************************************************
*/
#define LED_GPIO_PORT   (GPIOC)
#define LED_GPIO_PINS1  (GPIO_PIN_5)
#define LED_GPIO_PINS2  (GPIO_PIN_6)
#define REMOTE_ID 1     //红外遥控识别码(ID)

u8  Ir_Status=0;              //红外接收处理状态
u8  Ir_Receive_Count=0;       //红外接收数据位计数
u32 Ir_Receive_Data=0;        //32位的红外接收数据
u8  Ir_receive_ok=0;          //红外接收完成标志

void Delay(u32 __IO nCount)
{
        while(nCount!=0)
          nCount--;
}

/*
********************************************************************************
            GPIO初始化
********************************************************************************
*/
void GPIO_Config(void)
{
  GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_IN_PU_IT);                                     //PB4
  GPIO_Init(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS1, GPIO_MODE_OUT_PP_LOW_FAST);//PC5
  GPIO_Init(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS2, GPIO_MODE_OUT_PP_LOW_FAST);//PC6
}
/*
********************************************************************************
            定时器初始化
********************************************************************************
*/
void TIM2_Config(void)
{
  TIM2_DeInit();
  TIM2_TimeBaseInit(TIM2_PRESCALER_2, 60000);//定时器设置1M的计数频率,1US的分辨率 ,计时60ms
  TIM2_ClearFlag(TIM2_FLAG_UPDATE);
  TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);
  TIM2_Cmd(DISABLE);
}
/*
********************************************************************************
            外部中断初始化
********************************************************************************
*/
void EXTIB_Config(void)
{
  disableInterrupts();
  EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB, EXTI_SENSITIVITY_FALL_ONLY);//下降沿中断
  enableInterrupts();
}

/*
********************************************************************************
                          红外解码初始化函数
********************************************************************************
*/
void Ir_Init(void)
{
  GPIO_Config();
  EXTIB_Config();
  TIM2_Config();
}

/*
********************************************************************************
            定时器溢出中断内处理
********************************************************************************
*/
void TIM_IT_Updata_Handdle(void)
{
  TIM2_Cmd(DISABLE);
  Ir_Status=0;
   TIM2_ClearITPendingBit(TIM2_IT_UPDATE);
   TIM2_SetCounter(0);
   //TIM2_Cmd(DISABLE);
   // GPIO_WriteHigh(GPIOC,GPIO_PIN_5);  
}


/*
********************************************************************************
                          红外接收数据处理函数
********************************************************************************
*/
u8 Ir_Process(void)
{
  u8 Ir_num=0;                  //最终处理后的键值返回值
  u8 Address_H,Address_L;       //地址码,地址反码
  u8 Data_H,Data_L;             //数据码,数据反码
  
  if(Ir_receive_ok==1)          //接收完成
  {
       Address_H=Ir_Receive_Data>>24;                //得到地址码
       Address_L=(Ir_Receive_Data>>16)&0xff;         //得到地址反码
       //if((Address_H==(u8)~Address_L)&&(Address_H==REMOTE_ID))//检验遥控识别码(ID)及地址
       if((Address_H==(u8)~Address_L))//检验遥控识别码(ID)及地址
       {
            Data_H=Ir_Receive_Data>>8;              //得到数据码
            Data_L=Ir_Receive_Data;                 //得到数据反码
            if(Data_H==(u8)~Data_L)                 //接收数据码正确
            {
                  Ir_num=Data_H;                      //正确键值
                                  Ir_Receive_Data=0;
            }
        }   
   }
   return  Ir_num;      //返回键值
}

/*
********************************************************************************
                          红外接收中断处理函数
********************************************************************************
*/
void Ir_Receive_Handle(void)
{
  u16 Interval_tim=0;//两个下降沿间隔时间
  switch(Ir_Status)
  {
    case 0://第一个下降沿,定时器开始计数                   
           Ir_Status=1;
            TIM2_Cmd(ENABLE);                   //Enable TIM2
            TIM2_SetCounter(0);                 //定时器计数值清零
            break;
                       
    case 1://第二个下降沿,定时器关闭,读取定时器计数值                                             
                          TIM2_Cmd(DISABLE);
            Interval_tim=0;
            Interval_tim=TIM2_GetCounter();     //读取定时器计数值
            TIM2_SetCounter(0);                 //定时器计数值清零
            TIM2_Cmd(ENABLE);                   //Enable TIM2
                    //GPIO_WriteHigh(GPIOC,GPIO_PIN_5);//正常
            if( (Interval_tim>=12500)&&(Interval_tim<=14500) )//判断引导码是否正确9+4.5ms                       
            {
                Ir_Status=2;                    //进入下一状态  
            }
            else                                //引导码错误,从新接收
            {
                Ir_Status=0;
                Ir_Receive_Count=0;
            }                       
            break;
                       
    case 2://开始32位数据的接收
            TIM2_Cmd(DISABLE);
            Interval_tim=0;
            Interval_tim=TIM2_GetCounter();
            TIM2_SetCounter(0);
            TIM2_Cmd(ENABLE); //Enable TIM2
       
            if( (Interval_tim>=1000)&&(Interval_tim<=1300) )        //间隔1.12ms ->0
            {
                  Ir_Receive_Data=Ir_Receive_Data<<1;
                  Ir_Receive_Count++;                               
            }
            else if( (Interval_tim>=2000)&&(Interval_tim<=2600) )   //间隔2.25ms ->1
            {
                  Ir_Receive_Data=Ir_Receive_Data<<1;
                  Ir_Receive_Data=Ir_Receive_Data|0x0001;
                  Ir_Receive_Count++;
                                  
            }
            else//不是0,1 接收错误,从新接收
            {
                  Ir_Status=0;
                  Ir_Receive_Data=0;
                  Ir_Receive_Count=0;
            }
           
            //超出接收数据位数,接收下一个
          while(Ir_Receive_Count==32)
            {         
                Ir_receive_ok=1;//红外接收完成
                Ir_Status=0;
                Ir_Receive_Count=0;
                break;
            }                       
            break;
                       
    default :
            break;
    }
}

/*
********************************************************************************                       
********************************************************************************
*/

//当红外接收到信号进入中断,运行定时器执行程序,红外未收到信号空闲时无中断定时器关闭
void main(void)
{
  uint8_t key_val;
  Ir_Init();

  while(1)  
  {
     if( Ir_receive_ok == 1 ) //一帧红外数据接收完成
     {
      key_val = Ir_Process();
          Ir_receive_ok=0;
      
      //不同的遥控器面板对应不同的键值 0-9
      switch( key_val )
      {                                               
      }
    }
            
  }
}

/*****************************/
INTERRUPT_HANDLER(EXTI_PORTB_IRQHandler, 4)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */

  disableInterrupts();
  Ir_Receive_Handle();
  enableInterrupts();
}
/*****************************/
INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
   
  */
   TIM_IT_Updata_Handdle();
}[/code]
沙发
foxglove| | 2015-10-29 11:46 | 只看该作者
stm8s003红外解码

使用特权

评论回复
板凳
弹痕CJP|  楼主 | 2015-10-29 11:56 | 只看该作者

恩 有什么见解吗:D

使用特权

评论回复
地板
zhuotuzi| | 2015-10-29 14:15 | 只看该作者
51单片机做这个红外最好弄。

使用特权

评论回复
5
huangcunxiake| | 2015-10-29 16:43 | 只看该作者
红外就跟单线协议的设备差不多。

使用特权

评论回复
6
yiyigirl2014| | 2015-10-29 16:48 | 只看该作者
先写几个基本的宏,读取,输出,延时,然后按照时序排列。

使用特权

评论回复
7
弹痕CJP|  楼主 | 2015-10-29 17:43 | 只看该作者
zhuotuzi 发表于 2015-10-29 14:15
51单片机做这个红外最好弄。

恩 现在是项目需要

使用特权

评论回复
8
弹痕CJP|  楼主 | 2015-10-29 17:43 | 只看该作者
huangcunxiake 发表于 2015-10-29 16:43
红外就跟单线协议的设备差不多。

原理什么都懂,下载就是程序有点问题,还没有找出来

使用特权

评论回复
9
eggbiscuit| | 2015-10-29 18:33 | 只看该作者
应该是程序上的问题,初始化的时候没有弄好。

使用特权

评论回复
10
zhuotuzi| | 2015-10-29 21:30 | 只看该作者
这个东西最好有个逻辑分析仪和示波器,方便多了。要不哪儿的问题不好找。

使用特权

评论回复
11
xunfeng0862| | 2015-11-5 15:39 | 只看该作者
会不会开机的时候遥控接收有个干扰信号,导致开始就记录了一个下降沿。
再发遥控码第一个下降沿变为第二个了接收错误

使用特权

评论回复
12
icecut| | 2015-11-5 16:11 | 只看该作者
莫非是初始化有误??

使用特权

评论回复
13
shauew| | 2015-11-5 16:13 | 只看该作者
或许第一次的时候红外还没唤醒

使用特权

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

本版积分规则

2

主题

7

帖子

0

粉丝