众拳【剑齿虎STM8】开发板学习笔记(无51基础可学) 第37讲 无源蜂鸣器实验 目 录 37.1 蜂鸣器应用 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。 37.2 有源蜂鸣器与无源蜂鸣器的区别从“图37.1 无源蜂鸣器和有源蜂鸣器的差别” a、b外观上看,两种蜂鸣器好像一样,但仔细看,两者的高度略有区别,有源蜂鸣器a,高度为9mm,而无源蜂鸣器b的高度为8mm。如将两种蜂鸣器的引脚都朝上放置时,可以看出有绿色电路板的一种是无源蜂鸣器,没有电路板而用黑胶封闭的一种是有源蜂鸣器。 图37.1 无源蜂鸣器和有源蜂鸣器的差别 迸一步判断有源蜂鸣器和无源蜂鸣器,还可以用万用表电阻档测试:用黑表笔接蜂鸣器 "-"引脚,红表笔在另一引脚上来回碰触,如果触发出咔、咔声的且电阻只有8Ω(或16Ω)的是无源蜂鸣器;如果能发出持续声音的,且电阻在几百欧以上的,是有源蜂鸣器。 有源蜂鸣器直接接上额定电源(新的蜂鸣器在标签上都有注明)就可连续发声;而无源蜂鸣器则和电磁扬声器一样,需要接在音频输出电路中才能发声。
注意:这里的“源”不是指电源,而是指震荡源。 也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫;而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K-5K的方波去驱动它有源蜂鸣器往往比无源的贵,就是因为里面多个震荡电路。 无源蜂鸣器的优点是: 1. 便宜。 2. 声音频率可控,可以做出“哆来咪发梭拉西哆”的效果。 3. 在一些特例中,可以和LED复用一个控制口。 有源蜂鸣器的优点是: 程序控制非常简单。 在剑齿虎开发板上我们集成了无源蜂鸣器,具体控制原理请参考“图37.1 蜂鸣器控制原理图”。 图37.2 蜂鸣器控制原理图 37.3 实验目的 掌握无缘蜂鸣器发声的程序设计方法。 37.4 程序文件设计 37.4.1 main.c文件中的程序主程序就实现初始化和调用驱动程序,这样主程序控制思路清晰,流程简单。要想了解全面详实的程序,请大家参考光盘(网盘)中程序及程序注释。 /*********************************************************************** * 说 明: 蜂鸣器实验 * 开发平台: 剑齿虎STM8开发板 * 关注微信公众平台微信号:"zxkj-ly",免费获取STM8资料。 * STM8技术交流QQ群【335123291】 * 哈尔滨卓恩科技开发有限公司 * * 作 者: 刘洋 张殿东 * 版 本: V1.0 * 日 期: 2016-05-03 * * IAR开发环境 版本 V2.20.1 * ST库函数 版本 V2.2.0 ***********************************************************************/ #include "pbdata.h"//引入自定义公共头文件 void BSP_Configuration(void);//硬件初始化函数声明 /*********************************************************************** * 函 数 名: main * 功能说明: c程序入口 * 形 参:无 * 返 回 值: 错误代码(无需处理) ***********************************************************************/ int main(void) { BSP_Configuration();//硬件驱动初始化函数 while(1)//主程序循环,反复执行循环体里的语句 { printf("蜂鸣器频率:1KHZ\r\n");//当前状态串口输出提示 BEEP_Configuration(BEEP_FREQUENCY_1KHZ);//1K频率发声 delay_ms(1000); printf("蜂鸣器频率:2KHZ\r\n");//当前状态串口输出提示 BEEP_Configuration(BEEP_FREQUENCY_2KHZ);//2K频率发声 delay_ms(1000); printf("蜂鸣器频率:4KHZ\r\n");//当前状态串口输出提示 BEEP_Configuration(BEEP_FREQUENCY_4KHZ);//4K频率发声 delay_ms(1000); } } /*********************************************************************** * 函 数 名: BSP_Configuration * 功能说明: 初始化硬件设备。只需要调用一次。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。 * 形 参:无 * 返 回 值: 无 ***********************************************************************/ void BSP_Configuration(void) { CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//时钟速度为内部16M,1分频, UART1_Congfiguration();//调用RS232串口1初始化函数 LED_Init();//调用LED初始化函数 rim();//打开总中断 } /*断言函数:它的作用是在编程的过程中为程序提供参数检查*/ #ifdef USE_FULL_ASSERT void assert_failed(u8* file,u32 line) { while(1) { } } #endif 37.4.2 pbdata.c文件中的程序#include "pbdata.h" //引入自定义公共头文件 /*************************************************************************** * 函 数 名: delay_us * 功能说明: 微秒延时程序,注意此函数的运行环境为(16M时钟速度) * 形 参:nCount要延时的微秒数,输入nCount=1微妙 * 返 回 值: 无 ***************************************************************************/ void delay_us(u16 nCount) //16M 晶振时 延时 1个微妙 { nCount*=3;//等同于 nCount=nCount*3 相当于把nCount变量扩大3倍 while(--nCount);//nCount变量数值先减一,再判断nCount的数值是否大于0,大于0循环减一,等于0退出循环。 } /*************************************************************************** * 函 数 名: delay_ms * 功能说明: 毫秒延时程序,注意此函数的运行环境为(16M时钟速度) * 形 参:nCount要延时的毫秒数,输入nCount=1毫秒 * 返 回 值: 无 ***************************************************************************/ void delay_ms(u16 nCount) //16M 晶振时 延时 1个毫秒 { while(nCount--)//先判断while()循环体里的nCount数值是否大于0,大于0循环,减一执行循环体,等于0退出循环。 { delay_us(1000);//调用微妙延时函数,输入1000等译演示1毫秒。 } } /*************************************************************************** * 函 数 名: Get_decimal * 功能说明: 获得数值小数部分 * 形 参:dt输入数据 deci小数位数,最多保留4位小数 * 返 回 值: 放大后的小数部分 ***************************************************************************/ u16 Get_decimal(double dt,u8 deci) //获得数值小数部分 { long x1=0; u16 x2=0,x3=0; if(deci>4) deci=4; if(deci<1) deci=1; x3=(u16)pow(10, deci); x1=(long)(dt*x3); x2=(u16)(x1%x3); return x2; } 37.4.3 pbdata.h文件中的程序#ifndef _PBDATA_H//宏定义,定义文件名称 #define _PBDATA_H #include "stm8s.h"//引入STM8的头文件 #include <stdio.h>//需要引用这个头文件才能实现 #include "math.h"//需要引用这个头文件才能实现 #include "led.h" //引用LED头文件 #include "uart1.h"//引用RS232头文件 #include "beep.h" void delay_us(u16 nCount); //微秒延时程序 void delay_ms(u16 nCount); //毫秒延时程序 u16 Get_decimal(double dt,u8 deci); //获得数值小数部分 #endif //定义文件名称结束 37.4.4 beep.c文件中的程序#include "pbdata.h" /************************************************************************** * 函 数 名: BEEP_Configuration * 功能说明: 蜂鸣器初始化 * 形 参:无 * 返 回 值: 无 **************************************************************************/ void BEEP_Configuration(BEEP_Frequency_TypeDef BEEP_Frequency) { CLK_LSICmd(ENABLE);//使能内部低速时钟 BEEP_LSICalibrationConfig(128000);//校准时钟 BEEP_Init(BEEP_Frequency);//初始化蜂鸣器 BEEP_Cmd(ENABLE);//使能蜂鸣器 } 37.4.5 beep.h文件中的程序#ifndef _BEEP_H //宏定义,定义文件名称 #define _BEEP_H #include "stm8s.h"//引用STM8头文件 void BEEP_Configuration(BEEP_Frequency_TypeDef BEEP_Frequency);//蜂鸣器初始化程序 #endif 37.4.6 uart1.c文件中的程序设计串口通讯软件是为了通过串口uart1能把光敏电阻模拟量数值和电位器模拟量数值输出到计算机上显示出来,能直观的看到通讯数据是否和设计一致。 ……详细程序请参考程序例程。 37.4.7 uart1.h文件中的程序 ……详细程序请参考程序例程。 37.4.8 led.c文件中的程序 ……详细程序请参考程序例程。 37.4.9 led.h文件中的程序 ……详细程序请参考程序例程。 37.5 修改选项字 程序设计完成,还要修改选项字蜂鸣器才能发生,下面我们把修改选项字的过程以图片的形式加以说明。双击“
”图标,打开“ ST Visual”软件,进入修改选项字界面。选中第三块选项卡“OPTION BYTE”,拖动下拉条找到“AFR7”,在Description类中单击对应的项会变为有下拉框的选项,把此项修改为“Port D4 Alternate Function = BEEP”。在把修改过的选项字下载到芯片中。关闭下载选项字的软件后,可以听到蜂鸣器可以正常发声了。可以分辨出,蜂鸣器根据PWM波形的频率变化音调在不停的改变。 图37.3 蜂鸣器控制选项字修改 图37.4 蜂鸣器控制选项字下载 在程序中我们设计成每间隔一秒钟PWM波形输出的频率改变一次,有3种频率改变,蜂鸣器就会有3种不同的声音。为方便检查程序设计效果,我们把PWM波形的频率改变过程通过蓝精灵多功能监控软件显示在屏幕上,请参考“图37.5 PWM频率改变顺序”。 图37.5 PWM频率改变顺序
|