你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于一块测线板,让你从STM8S从入门到提高  

[复制链接]
w453509596 发布时间:2015-1-8 21:14
阅读主题, 点击返回1楼
收藏 5 评论44 发布时间:2015-1-8 21:14
44个回答
w453509596 回答时间:2015-1-9 13:17:58

基于STM8S的外部I/O 中断 红外遥控解码

本帖最后由 w453509596 于 2015-1-11 10:48 编辑

基于STM8S的红外遥控功能。我给大家分享一段代码。由于是产品了,不上传全部程序了
FuncState InfraredWate_Flag;  //等待按键松开标志
Uint8 InfraredWate_Index;     //用于等待按键松开计时
FuncState InfraredRec_Flag;   //红外采集完成标志
Uint8 InfraredCode;           //红外接收代码
Uint8 InfraredCode_Index;     //红外接位计数
Uint8 InfraredBuffer_H;       //红外识别码接收缓存
Uint8 InfraredBuffer_L;       //红外接收代码缓存
Uint8 InfPeriod_Status;       //红外周期状态
Uint16 TimeCounterVal;        //计数器临时值
Uint8 ReciveIndex;            //红外接收计数

static void TimeCounter_Start(void)    //启动计数
{
    TIM2->CNTRH = 0;
    TIM2->CNTRL = 1;
    TIM2->CR1 |= 0x01;
}

void TimeCounter_Stop(void)    //停止计数
{
    TIM2->CR1 &= 0xfe;
}

static void InfraredRec_Bit(Uint8* BufferAddr)
{
   if((12000 < TimeCounterVal)&&(TimeCounterVal < 22000))    //0周期约为17000
   {
     *BufferAddr = (*BufferAddr) * 2;
   }
   else if((30000 < TimeCounterVal)&&(TimeCounterVal < 40000))  //1周期约为35000
   {
     *BufferAddr = ((*BufferAddr) * 2) + 1;
   }
   else ReciveIndex = 0;
}

void InfraredInterrupt_Process(void)
{
  if(InfraredWate_Flag != L_FASE)       //等待接收到按键松开的间隔符,才开始下次接收  每次中断4ms,10次约40ms
  {
    if(InfraredWate_Index <10) InfraredWate_Index ++;  
    else
    {
      InfraredWate_Flag = L_FASE;                                   //已等到间隔符,清标志位      
      TimeCounter_Stop();  
      InfPeriod_Status = InfPeriod_Start;
    }
  }
  else                            //防止计数中间产生的,错把间隔符当成正常位。还有一种是由于排除红外不工作时产生的干扰。
  {
    TimeCounter_Stop();
    InfPeriod_Status = InfPeriod_Start;
  }
}

void PeripheralInfrared_Receive(void)
{
  if(InfraredWate_Flag == L_FASE)                            //处于非等待间隔符状态,开始正常接收  
  {
    if(InfPeriod_Status == InfPeriod_Stop)                   //开始接收数据
    {
      disableInterrupts();
      TimeCounterVal  = ((uint16_t)TIM2->CNTRH << 8);
      TimeCounterVal |= (uint16_t)(TIM2->CNTRL);
      TimeCounter_Start();
      enableInterrupts();                                //存在一些硬件上的互锁机制,为了使得数据更准确,这里关掉中断,防止其它干扰
      
      ReciveIndex ++;
      if(ReciveIndex <= 8)  InfraredRec_Bit(&InfraredBuffer_H); //前8位数据
      else  InfraredRec_Bit(&InfraredBuffer_L);                 //后8位数据               
      if(ReciveIndex >= 16)
      {
        InfPeriod_Status = InfPeriod_Start;
        if(InfraredBuffer_H == InfraredUser_Code)   //如果识别码正确
        {
          InfraredWate_Flag = L_TRUE;               //已接收到功能码,等待间隔符
          InfraredWate_Index = 0;
          InfraredRec_Flag = L_TRUE;               //
          InfraredCode = InfraredBuffer_L;         // 将数据送入缓存区  
        }
      }
    }
    else                                      //如果接收到了启始符,置标志位,开始接收数据
    {
      TimeCounter_Start();
      InfPeriod_Status = InfPeriod_Stop;
      ReciveIndex = 0;
    }

  }
  else InfraredWate_Index = 0;                //在等待按键松开,理论上讲,是不允许再接收重复红外信号的
}https://www.stmcu.org.cn/module/foru ... &pid=2049512&page=1

void Infrared_InitVar(void)
{
  InfPeriod_Status = InfPeriod_Start;
  TimeCounterVal = 0;
  ReciveIndex = 0;
  InfraredBuffer_H = 0;
  InfraredBuffer_L = 0;
  InfraredCode = 0;
  InfraredCode_Index = 0;
  InfraredRec_Flag = L_FASE;
  InfraredWate_Flag = L_FASE;
  InfraredWate_Index = 0;
}


在这个红外编码中由16位组成一串字帧。0 由 0.26ms的低电平和0.8ms的高电平表示, 1由 0.26ms的低电平和1.8的高电平表示。
两者的周期相差一倍,我把红外信号由红外接收头HS3818接收后送到STM8S的外部中断I/O上面,我是根据数据周期来判断是0
还是1的。
w453509596 回答时间:2015-1-10 16:34:01
我感觉我分享的东西还是可以的吧,怎么就没什么人看呢
hfei 回答时间:2015-1-13 22:09:03
谢谢,刚转入STM8,请多指点。。
w453509596 回答时间:2015-1-13 22:46:15
hfei1980 发表于 2015-1-13 22:09
谢谢,刚转入STM8,请多指点。。

STM8S还是挺简单的,好好学,专心学习,天天学两周应该就可以了
mlxy123xy 回答时间:2015-1-14 09:59:43
很详细,可以作为教程。。。
jcrorxp 回答时间:2015-1-14 12:06:11
为什么要用220V变压器.我觉得不如用个5V USB充电器实际点吧, 把强电也弄到这里.除非你有塑料外壳.
不然不安全
w453509596 回答时间:2015-1-14 17:00:45
jcrorxp 发表于 2015-1-14 12:06
为什么要用220V变压器.我觉得不如用个5V USB充电器实际点吧, 把强电也弄到这里.除非你有塑料外壳.
不然不安 ...

实际的产品中绝大部分都是直接用市电220V的
linlangxiyue 回答时间:2015-1-14 18:44:49
侧线板不用单片机吧。。。
mubingml 回答时间:2015-1-14 20:07:12
好长,,居然看完了。。
成力lll 回答时间:2015-1-14 20:16:00
学习。。。。。。。。好好学,专心学习,
德政m 回答时间:2015-1-14 20:38:57
这个好详细,有点牛刀的感觉。。。
埃斯提爱慕 回答时间:2015-1-17 14:43:16
提示: 作者被禁止或删除 内容自动屏蔽
fjjjnk1234 回答时间:2015-1-17 15:26:57
感谢分享!顶一个!
leehehe 回答时间:2016-8-2 02:35:54
这么洋气,谢谢
leehehe 回答时间:2016-8-2 02:36:08
为了下载,刷一次,不好意思
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版