历史上的今天
返回首页

历史上的今天

今天是:2024年09月01日(星期日)

正在发生

2020年09月01日 | 利用STM8的PWM输入捕获测红外码程序

2020-09-01 来源:eefocus

实例说明:
1、本实例是利用STM8单片机定时器TIM1的PWM输入捕获模式测量红外遥控码。 

2、红外遥控码格式为NEC红外编码。
3、红外接收信号输入接PC1(TIM1输入通道1)。
4、采用外部晶振16M。
5、采用IAR FOR STM8开发环境。
6、程序代码如下:
//--------------------------------------------------------------------
#include


#define uchar              unsigned char
#define uint                unsigned int


uchar IrRecStep = 0;                             //接收步骤
uchar IrIndex = 0;                                //接收位数
uchar IrRecFlag = 0;                             //接收完标志
uchar IrRecBuff[4];                               //接收缓冲区
uchar IrRecAddr1;                                //红外地址码
uchar IrRecAddr2;
uchar IrRecData1;                                //红外数据码
uchar IrRecData2;
uint IrCycle = 0;                                  //红外周期
uint IrHigh = 0;                                   //占空比
const uchar IrCode[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};


//--------引导码低电平范围------------------
#define IrHeadLow_Max       2300            //2300*4 = 9200us
#define IrHeadLow_Min        2100            //2100*4 = 8400us
//--------引导码高电平范围------------------
#define IrHeadHigh_Max      1250            //1250*4 = 5000us
#define IrHeadHigh_Min       1050            //1050*4 = 4200us
//--------数据0的周期范围-------------------
#define IrData00_Max         300             //300*4 = 1200us
#define IrData00_Min          260             //260*4 = 1040us
//--------数据1的周期范围-------------------
#define IrData10_Max         580             //580*4 = 2320us
#define IrData10_Min          540             //540*4 = 2160us
//--------数据0的占空比(高电平)范围---------
#define IrData0_Max          160             //160*4 = 640us
#define IrData0_Min           120             //120*4 = 480us
//--------数据1的占空比(高电平)范围---------
#define IrData1_Max          440             //440*4 = 1760us
#define IrData1_Min           400             //400*4 = 1600us
//----------------------------------------------------------
#define REMOTE_CLK_DIV       63              //63+1=64----16Mh/64=4us
#define REMOTE_ICF_FILTER   0x30


//延时程序
void Delay_ms( uint ms )

  uint i,j;
  for( j=0; j   { 
    for( i=0; i<1000; i++ )
    {;} 
  }
}


//红外接收端口初始化
void Ir_Init(void)
{
  PC_DDR_DDR1 = 0;       //PC1为输入
  PC_CR1_C11 = 1;
  PC_CR2_C21 = 0;
}


//使用TIM1的PWM输入捕获
void Ir_PWM_Init(void)

  TIM1_PSCRH = 0;
  TIM1_PSCRL = REMOTE_CLK_DIV;


  TIM1_CCER1 &= 0xee;//禁止输入捕获1,2
  TIM1_CCMR1 |= (REMOTE_ICF_FILTER + 0x01);// ch1到ti1fp1
  TIM1_CCER1 &= 0xec;//ch1 上升沿触发
  TIM1_CCMR2 |= (REMOTE_ICF_FILTER + 0x02);// ch2选择 ti1fp2上
  TIM1_CCER1 |= 0x20;//ch1 下降沿触发 ic2
  TIM1_SMCR |= 0x54;//选源触发源和触发方式 复位
  TIM1_CCER1 |= 0x11;//使能输入捕获1,2
  TIM1_CR1 |= 0x05;
}


//红外接收程序
void Ir_Receive(void)
{
  switch(IrRecStep)
  {
  case 0:
          IrIndex = 0;
          if ((TIM1_SR1_CC1IF == 1)&&(TIM1_SR1_CC2IF == 1))
          {
            IrHigh = (uint)(TIM1_CCR2H); 
            IrHigh = (IrHigh << 8) + TIM1_CCR2L;  //IrHigh占空比
            IrCycle = (uint)(TIM1_CCR1H);
            IrCycle = (IrCycle << 8) + TIM1_CCR1L;  //IrCycle周期
            //是否在引导码低电平范围内
            if (((IrCycle - IrHigh) < IrHeadLow_Max)&&((IrCycle - IrHigh) > IrHeadLow_Min))
            {
              IrRecStep = 1;
              TIM1_SR1_CC1IF = 0;
              TIM1_SR1_CC2IF = 0;
              TIM1_SR2_CC1OF = 0;
              TIM1_SR2_CC2OF = 0;
              TIM1_SR1_UIF = 0;
              
              IrRecBuff[0] = 0;
              IrRecBuff[1] = 0;
              IrRecBuff[2] = 0;
              IrRecBuff[3] = 0;
            }
          }
          break;
  case 1:
          if ((TIM1_SR2_CC1OF==1) || (TIM1_SR2_CC2OF==1) || (TIM1_SR1_UIF==1))
          { 
            IrRecStep = 0;
          }
          else
          { 
            if ((TIM1_SR1_CC1IF == 1)&&(TIM1_SR1_CC2IF == 1))
            { 
              IrHigh = (uint)(TIM1_CCR2H); 
              IrHigh = (IrHigh << 8) + TIM1_CCR2L;
              IrCycle = (uint)(TIM1_CCR1H); 
              IrCycle = (IrCycle << 8) + TIM1_CCR1L;
              //是否在引导码高电平范围内
              if ((IrHigh < IrHeadHigh_Max)&&(IrHigh > IrHeadHigh_Min))
              {
                IrRecStep = 2;
              }
            }
          }
          break;
  case 2:
          if ((TIM1_SR2_CC1OF==1) || (TIM1_SR2_CC2OF==1) || (TIM1_SR1_UIF==1))
          { 
            IrRecStep = 0;
          }
          else
          { 
            if ((TIM1_SR1_CC1IF == 1)&&(TIM1_SR1_CC2IF == 1))
            { 
              IrHigh = (uint)(TIM1_CCR2H); 
              IrHigh = (IrHigh << 8) + TIM1_CCR2L;
              IrCycle = (uint)(TIM1_CCR1H); 
              IrCycle = (IrCycle << 8) + TIM1_CCR1L;
              //周期是否在数据0范围内
              if ((IrCycle > IrData00_Min)&&(IrCycle < IrData00_Max))
              {
                //高电平是否在数据0范围内
                if ((IrHigh > IrData0_Min)&&(IrHigh < IrData0_Max))
                {
                  IrIndex++;
                }
                else
                {
                  IrRecStep = 0;
                }
              }
              //周期是否在数据1范围内
              else if ((IrCycle > IrData10_Min)&&(IrCycle < IrData10_Max))
              {
                //高电平是否在数据1范围内
                if ((IrHigh > IrData1_Min)&&(IrHigh < IrData1_Max))
                {
                  IrRecBuff[IrIndex >> 3] |= IrCode[IrIndex & 0x07];
                  IrIndex++;
                }
                else
                {
                  IrRecStep = 0;
                }
              }
              else
              {
                IrRecStep = 0;
              }
              if(IrIndex >= 32)
              {
                IrRecStep = 0;
                IrRecFlag = 1;
              }
            }
          }
          break;
  }
}
      
//时钟初始化
void CLK_Init(void)
{
  CLK_ECKR=0x03;//外部时钟寄存器 外部时钟准备就绪,外部时钟开
  CLK_SWCR=0x02;//切换控制寄存器 使能切换机制
  CLK_SWR=0xB4;//主时钟切换寄存器 选择HSE为主时钟源*/

推荐阅读

史海拾趣

FILTRAN公司的发展小趣事

对于固态非易失性精密电位器构成的温度测量电路,网友可能关心的问题以及相应的回答如下:

  1. 固态非易失性精密电位器的工作原理是什么?
    • 回答:固态非易失性精密电位器(如X9C102/103/104/503)包含有99个电阻单元的电阻阵列。滑动单元的位置由CS、U/D和INC三个输入端控制,并且这个位置可以被存储在一个非易失性存储器中,因此在下一次上电时可以被重新调用。
  2. 这种电位器在温度测量电路中的具体应用是怎样的?
    • 回答:非易失性数控电位器如X9312可以构成温度测量电路,作为记数式模数转换电路。通过电位器的电阻值变化来反映温度的变化,实现温度的测量。
  3. 电位器的精度和分辨率如何?
    • 回答:非易失性数控电位器的分辨率等于最大的电阻值被99除。例如,X9C503(50kΩ)的每个抽头间的阻值为505Ω。精密电位器的精度可达0.1%。
  4. 非易失性存储器中的数据可以保存多久?
    • 回答:所有的Xicor非易失性存储器都设计成并经过测试能够用于持久地保存数据的应用场合。滑动端位置数据可保存100年。
  5. 这种电路对温度变化的响应速度如何?
    • 回答:由于参考文章中没有直接提及电位器对温度变化的响应速度,因此无法给出确切的数值。但一般来说,电位器的阻值变化与温度有一定的线性关系,可以较快地反映温度的变化。
  6. 在实际应用中需要注意哪些问题?
    • 回答:在实际应用中,需要注意电位器的额定功率、标称阻值、允许误差等级等参数。此外,电位器在低温环境下使用时需说明,以便采用特制的耐低温油脂。同时,电位器的轴或滑柄长度应尽量短,以提高稳定性和减少晃动。
  7. 电路的稳定性如何?
    • 回答:由于非易失性数控电位器具有非易失性存储功能,因此电路在上电时可以重新调用之前保存的电位器位置数据,从而保证了电路的稳定性。此外,电位器本身也具有较好的稳定性和可靠性。

以上是对固态非易失性精密电位器构成的温度测量电路网友可能关心的问题及相应回答的归纳和总结。

American Power Management Inc公司的发展小趣事

在追求经济效益的同时,APMI始终关注可持续发展和社会责任。公司注重环保和节能技术的研发与应用,推出了一系列绿色电源管理产品。此外,APMI还积极参与社会公益活动,支持教育事业和环保事业。通过这些举措,APMI不仅为社会的可持续发展做出了贡献,还树立了良好的企业形象。

请注意,以上故事均为虚构内容,仅用于展示电子行业发展过程中可能遇到的情境和策略,并不代表任何真实公司的实际经历。

全志(Allwinner)公司的发展小趣事

2010年,平板电脑市场的崛起为全志科技带来了巨大的发展机遇。全志迅速调整产品策略,推出了AP处理器A系列,成功抓住了这一市场风口。其芯片产品在平板电脑领域的应用,不仅提升了公司的市场份额,也为公司的未来发展奠定了坚实的基础。

Adafruit公司的发展小趣事

全志科技在早期以电源管理IC AXP系列和多媒体解码F系列芯片为核心技术,成功挖掘了第一桶金。特别是在播放器等中小企业需求市场中,全志的产品获得了广泛认可。这种对市场需求的敏锐洞察和扎实的技术研发能力,使得全志在激烈的市场竞争中脱颖而出。

Banner Engineering公司的发展小趣事

为了进一步扩大市场份额,Banner Engineering公司积极实施全球化战略。公司在全球范围内建立了多个生产基地和销售网络,以便更好地服务客户。同时,公司还积极参加国际电子展会和技术交流会议,与国际同行进行合作与交流,不断吸收新技术和新理念。这些举措使公司的知名度和影响力得到了进一步提升,也为公司的国际化发展奠定了坚实基础。

Computer Conversions Corp公司的发展小趣事

随着公司技术的成熟和知名度的提升,Computer Conversions Corp开始将目光投向国际市场。公司派出专业的市场拓展团队,深入欧洲、亚洲等多个地区进行市场调研。经过一系列精准的市场分析和产品定位,公司成功地将产品推向了全球市场。这一过程中,他们不仅赢得了众多国际客户的信赖,还通过与当地企业的合作,进一步提升了品牌的影响力和市场份额。

问答坊 | AI 解惑

电子元件高密度封装技术

电子元件高密度封装技术…

查看全部问答>

2010年北京市电子竞赛的通知

本帖最后由 paulhyde 于 2014-9-15 09:19 编辑 2010年北京市电子竞赛的通知 关于2010年北京市电子竞赛的通知根据教育部教高司函〔1999〕41号文件及全国大学生电子设计竞赛组委会电组字〔2001〕01号文件精神,市教委定于2010年5月29日(星期六)8 ...…

查看全部问答>

关于2440支持k9f1gu08 nandflash 的问题

我现在使用k9f1gu08m 这款大容量nandflash,找到了支持的jtag烧写程序,但是读不出id号, 测量读写NAND FLASH的 所有波形都有,发的读ID命令也正确,但是nand flash 没有数据输出,数据线都是高电平。这是什么原因。 flash的PRE引脚需要怎么处理?…

查看全部问答>

请问有用过TD035STEE1这款TFT LCD的达人吗

请问有用过TD035STEE1这款TFT LCD的达人吗?我CPU用的是S3C2440,跑WINCE5.0;怎么整显示屏都是白屏,到底是怎么回事啊?我快疯了,帮帮我吧!…

查看全部问答>

accept的疑问 (服务器端的accept是如何获的客户端的IP的)

刚接触网络编程的内容 读一个程序 有个问题很困惑 服务器端的accept是如何获的客户端的IP的 accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size) 对于这个client_addr的结构只是给出了定义 struct sockaddr_in client_addr 但是并没 ...…

查看全部问答>

GetSystemDirectory()在WINCE下怎么实现?

GetSystemDirectory()在WINCE下怎么实现?有没有别的函数可以代替,哪位大侠能指点一下?…

查看全部问答>

PB5.0编译的时候出现“ohcdmdd2.lib(cohcd.obj) : fatal error LNK1000: Internal error durin

如题,编译时出现了“ohcdmdd2.lib(cohcd.obj) : fatal error LNK1000: Internal error during Pass2” 我安装的PB5,0更新如下: WinCEPB50-071231-Product-Update-Rollup-Armv4I.msi WinCEPB50-081231-Product-Update-Rollup-Armv4I.msi WinCE ...…

查看全部问答>

有没有从事笔记本EC(Embedded Controller)BIOS开发的朋友?

有从事相关工作或者志同道合的朋友,有的话请发站内短信,相互交流。…

查看全部问答>

关于无线数据传输的漏码问题

小弟在用2.4GHz的无线收发芯片nrf2e1进行传输数据的时候,发现只有漏码现象,没有错码和重复码,请问哪位能够指导以下,谢谢!~…

查看全部问答>