历史上的今天
返回首页

历史上的今天

今天是:2025年01月02日(星期四)

正在发生

2020年01月02日 | 基于STM8单片机的蜂鸣器和弦声音的设计

2020-01-02 来源:eefocus

   1. 实验功能:本实验的功能是利用STM8单片机控制蜂鸣器发出和弦声音。
   2. 电路原理:按键接PB2口,蜂鸣器接PD4口,当按下按键时STM8利用TIM2的PWM模式驱动蜂鸣器就发出“123”的和弦声音。
   3. 采用IAR FOR STM8开发环境,外部晶振16M。
   4. 程序代码如下:

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

* 文件名称:STM8_Buzzer.c

* 开发环境:IAR FOR STM8 1.20

********************************************************************************/
#include "iostm8s105s4.h"

#define uchar                              unsigned char
#define uint                                  unsigned int

uchar SysDeal_Flag = 0;
uchar Sys_Count = 0;
uchar SendData_Flag =0;
uchar K_Flag = 0;
#define Sys_Time                      99 //100*4us = 400us
#define Sys_Prescaler             6 //2^6 = 64

#define Key_In_Power             PB_IDR_IDR2
#define Key_Delay                    10
uchar Key_In = 0;
uchar Key_Value = 0;
uchar Key_Flag = 0;

#define BELL_PWM1           640 //320us
#define BELL_PWM2           564 //282us
#define BELL_PWM3           540 //270us
#define BELL_PWM4           460 //230us
#define BELL_PWM5           408 //204us
#define Buzzer_Stop()         (TIM2_CR1 = 0x00)
#define BELL_MODE2         0
uchar Buz_Time = 0;
uchar Buz_State = 0;
uchar Buz_Mode = 0;
uchar Buz_Start = 0;
const uint BUZ_PWMTAB[][11]=  
{
  {BELL_PWM3,BELL_PWM3, BELL_PWM4,BELL_PWM4, BELL_PWM5,BELL_PWM5, 0xff,0xff,0xff,0xff,0xff}
};
const uchar BUZ_TIMETAB[][11]=

  {8,10,6,10,6,20,0xff,0xff,0xff,0xff,0xff}
};


void Delay_ms( uint ms )

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

void CLK_Init(void)
{
  CLK_ECKR=0x03;//外部时钟寄存器 外部时钟准备就绪,外部时钟开
  CLK_SWCR=0x02;//切换控制寄存器 使能切换机制
  CLK_SWR=0xB4;//主时钟切换寄存器 选择HSE为主时钟源*/

  while (!(CLK_SWCR & 0x08));  
  CLK_CSSR=0x01;//时钟安全系统寄存器    
}

void SysClk_Init(void)

  asm("sim");
  TIM4_IER = 0x00; //禁止中断
  TIM4_EGR = 0x01; //允许产生更新事件
  TIM4_PSCR = Sys_Prescaler;
  TIM4_ARR = Sys_Time;
  TIM4_CNTR = Sys_Time;
                        //定时周期= 400us
  TIM4_CR1 = 0x01;
  TIM4_IER = 0x01;
  asm("rim");
}

#pragma vector = TIM4_OVR_UIF_vector
__interrupt void TIM4_OVR_UIF(void)

  TIM4_SR = 0x00;
  Sys_Count ++;
//---------------------------------------
  if( Sys_Count % 5 == 1 )  //2ms
  { 
    SysDeal_Flag = 1; 
  }
  else if(Sys_Count  == 5)
  {
    SendData_Flag =1;
  }
  else if(Sys_Count >= 15)
  {
    Sys_Count = 0;
  }
  else
  { 
    K_Flag = 1;        
  }  
}

void Buzzer_Init(void)

  PD_DDR |= 0x90;           // 配置PD4方向为输出
  PD_CR1 |= 0x90;           // 设置PD4推挽输出
  PD_CR2 &= 0x6f;
  //------------------------------------
  TIM2_PSCR = 3;            //8分频。f=16m/8=2m----0.5us
  TIM2_CCMR1 = 0x70;        // PWM 模式 2
  TIM2_CCER1 = 0x03;        // CC1配置为输出
}

void Buzzer_Pwm(uint timenum)

  TIM2_ARRH = (uchar)(timenum>>8);
  TIM2_ARRL = (uchar)(timenum);
  TIM2_CCR1H = (uchar)(timenum>>9);
  TIM2_CCR1L = (uchar)(timenum>>1);
  TIM2_CR1 = 0x01;          // 计数器使能,开始计数
}

void Bell_DealFun(void)

  static uchar index = 0;
  switch( Buz_State )
  { 
  case 0: 
         Buz_Time = 0; 
         Buzzer_Stop(); 
         index = 0;
         if( Buz_Start == 1 )
         { 
           Buz_State ++; 
           Buzzer_Pwm( BUZ_PWMTAB[Buz_Mode][index] );
         }
         break;
  case 1: 
         Buz_Time++;
         if( Buz_Time >= BUZ_TIMETAB[Buz_Mode][index] )
         { 
           Buz_Time = 0; 
           Buz_State = 2; 
           index ++;
           if( BUZ_TIMETAB[Buz_Mode][index] == 0xff )
           { 
             Buz_State = 0; 
             Buzzer_Stop(); 
             Buz_Start = 0; 
           }
             else
             { 
               Buzzer_Pwm( BUZ_PWMTAB[Buz_Mode][index] ); 
             }
         }
         break;
  case 2: 
         Buz_Time++;
         if( Buz_Time >= BUZ_TIMETAB[Buz_Mode][index] )
         { 
           Buz_Time = 0; 
           Buz_State = 1; 
           index ++;
           if( BUZ_TIMETAB[Buz_Mode][index] == 0xff )
           { 
             Buz_State = 0; 
             Buzzer_Stop();
             Buz_Start = 0;
           }
           else
           { 
             Buzzer_Pwm( BUZ_PWMTAB[Buz_Mode][index] );
           }
         }
         break;
  default: 
         Buz_State = 0; 
         Buz_Time = 0; 
         index = 0;
         break;
  }
}

void Buzzer_Start(uchar mode)

  if( Buz_Start == 0 )
  { 
    Buz_Mode = mode; 
    Buz_Start = 1; 
  }
}


void Get_Key(void)
{
  Key_In = 0;
  if(!Key_In_Power)
  {
    Key_In |= 0x01;
  }
}

uchar Scan_Key(void)

  static uchar Key_Task=0,Key_Count=0;
  switch( Key_Task )
  { 
  case 0: 
          if( Key_In != 0 )
          { 
            Key_Task = 1; 
            Key_Count = 0; 
          } 
       break;
  case 1: 
          Key_Count++;
          if( Key_Count >= Key_Delay )
          { 
            Key_Task = 2; 
            Key_Count = 0; 
          }
          break;
  case 2: 
          if( Key_In != 0 )
          { 
            Key_Task = 3; 
            Key_Count = 0; 
            Key_Value = Key_In; 
            return(1); 
          }
          else
          { 
            Key_Task = 0; 
          }
          break;
  case 3: 
          if( Key_In == 0 )
          { 
            Key_Task = 0; 
            Key_Count = 0; 
          } 
          break;
  default: 
          Key_Task = 0; 
          Key_Count = 0; 
          break;
  }   
  return(0);
}

推荐阅读

史海拾趣

Etron公司的发展小趣事

1991年,台湾的电子行业正蓬勃发展,钰创科技(Etron)在这一时期应运而生,创始人凭借对市场敏锐的洞察力,决定专注于利基型缓冲记忆体产品与系统晶片的设计与生产。初创时期,公司面临着技术、资金和市场等多重挑战。然而,钰创科技凭借其团队的技术实力和创新精神,成功开发出了一系列具有竞争力的产品,逐渐在市场上崭露头角。

Fong Ya Enterprise Co Ltd公司的发展小趣事

在发展过程中,钰创科技非常注重与产业链上下游企业的合作与共赢。公司积极与国内外知名企业开展合作,共同研发新技术、新产品,推动整个产业链的升级和发展。同时,钰创科技也积极参与行业交流和合作活动,与同行分享经验和技术成果,促进整个行业的共同进步。

CONEXANT公司的发展小趣事

在无线通信技术快速发展的时代,Conexant公司积极寻求与业界领先企业的合作机会。2001年,Conexant宣布将其无线业务部门与Alpha Industries合并,共同创建一个价值约30亿美元的新企业。这一合并不仅扩大了Conexant在无线通信领域的市场份额,也为其带来了更多的技术资源和市场机会。合并后的新企业以Conexant为主导,通过整合双方的优势资源,实现了无线业务的快速发展和市场份额的稳步提升。

Afero公司的发展小趣事

Afero公司成立于XXXX年,当时的市场中物联网平台技术正处于探索和发展阶段。Afero的创始团队凭借对物联网技术的深刻理解和前瞻性的视野,决定专注于物联网平台即服务(PaaS)的研发。他们投入大量资源,成功开发出一种具有创新性的物联网平台,该平台在安全性、易用性和可扩展性等方面表现出色,吸引了业界的广泛关注。

Esico-Triton公司的发展小趣事

近年来,Esico-Triton越来越重视企业的可持续发展和社会责任。公司开始着手研发更加环保的电子产品,减少有害物质的使用,推动循环经济的发展。此外,Esico-Triton还积极参与社会公益活动,支持教育事业和环境保护项目,以实际行动回馈社会。这些举措不仅提升了公司的品牌形象,也为电子行业的可持续发展树立了典范。

EiKO Global LLC公司的发展小趣事

随着LED技术的不断成熟,EiKO敏锐地意识到这将为照明行业带来革命性的变革。于是,公司投入大量研发资源,开始研发LED照明产品。经过数年的努力,EiKO成功推出了一系列高效、节能、环保的LED照明产品,如LED灯具、LED改装和替换灯等。

这些LED照明产品不仅具有出色的性能和品质,还满足了不同用户的需求。例如,EiKO的LED灯具适用于室内和室外各种场所,包括高棚、超薄面板、暗灯槽等;而LED改装和替换灯则为用户提供了多种瓦数、形状和色温的选择,满足不同场景下的照明需求。

问答坊 | AI 解惑

帮我看看这个电路

帮我看看这个电路,怎么回没有放大信号哪,我在mutisim仿真软件中的仿真效果,很好,但是做出电路板后,怎么也调不出来。S+和S-是差分输入信号,ADC是输出后的放大信号…

查看全部问答>

极低纹波峰峰值1毫伏电源设计

接到设计任务,要求24V/2A,12V/2A组合电源,纹波峰峰值1毫伏,成本1万以内。不知哪位高手能做到如此苛刻条件?线性电源亦可!…

查看全部问答>

招聘兼职

短信发送和接收 神达pda发送短信息,服务器接受 移动端windows mobile系统 采用公网,服务器接收,2个程序 联系qq 412925762…

查看全部问答>

wince 5.0 evc++4.0 显示JPG

     我在这个网站得到一个解决方法:http://www.mscto.com/VC/25800105.html,但是存问题。 摘录如下:          Microsoft eMbedded Visual C V3.0或更高版本,该软件是免费的(您需要支付运 ...…

查看全部问答>

把文件读成二进制流再把图片转换成屏幕上

void read_from_binary_file(char * instream, int & count) {         int size=0;         long curpos;         FILE *fp=NULL;         if((fp=fopen ...…

查看全部问答>

关于在应用层调用DeviceIoControld的问题

在驱动程序里面,在XXX_IOControl()里面定义的...IOCTL_POWER_OFF...,我在应用程序里面,用DeviceIoControl(hFile,IOCTL_POWER_OFF,NULL,0,NULL,0,NULL,NULL)....结果程序报错: \'IOCTL_POWER_OFF\' : undeclared identifier... 是不是不能 ...…

查看全部问答>

我刚重装的系统,可是发现没有图片查看器!这是怎么一回事!

我刚重装的系统,可是发现没有图片查看器!这是怎么一回事!害的我要查看图片还要另外装个专门的看图软件 acdsee 呢,真是麻烦,那为高手帮我解决一下,帮我找回它!…

查看全部问答>

下载中心主题大梳理,找资料SO EASY!

通知:下载中心论坛专版在今天调整了主题,由原来的“随便聊聊、我要推荐、求资源、精华汇总、活动专区、我的建议”调整为现在的“单片机、电子电路、嵌入式系统、其他资源、电子书专区、活动公告、资源讨论”7个新主题。 每个主题中都有很多 ...…

查看全部问答>

MSP430对IO口输入高电平采点问题??

请教各位朋友!!如题设一IO口为输入,初始为低电平,收到一高平信号,相对这个高电平采100个点,如果这100个点都是高,则这个收到的高电平信号有效。不知道该怎么写这个程序??请帮帮忙吧…

查看全部问答>