stm32f103通用定时器pwm应用例程--蜂鸣器演奏乐曲
stm32f103电子琴课设报告 终极版(1)
单片机课程设计题目:实现简易电子琴院(系):专业:班级:学生:学号:指导教师:2016年6月26日简易电子琴的设计与实现摘要:本次设计是利用单片机设计简易电子琴。
其主要功能为:按下不同按键,发出不同1 、2 、3、4 、5 、6 、7 七个音符并且用LED 或LCD显示当前按键。
选用stm32f103VE,它有8个定时器,部分定时器有多达4个用于输入捕获/输出比较/PWM或脉冲计数的通道和增量编码器输入。
利用芯片内部相关定时器来输出PWM,从而来驱动蜂鸣器。
通过读取外部按键输入的值来相应改变定时器相关寄存器的值,从而来改变PWM的输出频率来达到发出不同音调。
关键词: STM32f103VE;蜂鸣器;定时器The Design of the Keyboard Abstract:This design is the professional direction of biomedical engineering design. Using Single Chip Microcomputer to achieve a simple Keyboard. Its main function is: While a user press the different keys, it will make different sounds from the buzzer and display different numbers which corresponded to the sounds. Using stm32f103- -C8T6 as control chip. It has16-bit timers. Some of them with up to 4 IC/OC/PWM or pulse counter. Making use of the Timers to generate driving signal .By reading the state of the external key to change the frequency of output . Different frequency of the PWM will control buzzer makes different sounds.Key words: STM32f103; signal; Timer一、设计目的:通过本次综合设计,旨在运用已经学过的知识,根据题目的要求进行软硬件系统的设计和调试,对在《单片机的原理及应用》课程中涉及的芯片结构、控制原理、硬件和编程等方面有一定的感性认识和实践操作能力。
STM32通用定时器基本定时功能与PWM
STM32通用定时器基本定时功能与PWM1.STM32的Timer简介STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。
其中系统嘀嗒定时器是前文中所描述的SyTick,看门狗定时器以后再详细研究。
今天主要是研究剩下的8个定时器。
定时器TIM1TIM8TIM2TIM3TIM4TIM5TIM6TIM716位向上1-65536之间的任意数可以0没有16位计数器分辨率16位向上,向下,向上/向下向上,向下,向上/向下1-65536之间的任意数1-65536之间的任意数可以4没有计数器类型预分频系数产生DMA请求可以捕获/比较通道4互补输出有其中TIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟由APB2的输出产生。
TIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。
由于STM32的TIMER功能太复杂了,所以只能一点一点的学习。
因此今天就从最简单的开始学习起,也就是TIM2-TIM5普通定时器的定时功能。
2.普通定时器TIM2-TIM5计数器时钟可以由下列时钟源提供:·内部时钟(CK_INT)·外部时钟模式1:外部输入脚(TI某)·外部时钟模式2:外部触发输入(ETR)·内部触发输入(ITR某):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。
由于今天的学习是最基本的定时功能,所以采用内部时钟。
TIM2-TIM5的时钟不是直接来自于APB1,而是来自于输入为APB1的一个倍频器。
这个倍频器的作用是:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其他数值时(即预分频系数为2、4、8或16),这个倍频器起作用,定时器的时钟频率等于APB1的频率的2倍。
MCU控制蜂鸣器演奏音乐小程序
MCU控制蜂鸣器演奏音乐小程序程序功能:MCU控制蜂鸣器演奏歌曲《祝你平安》----------------------------------------------
拨码开关设置:将BUZZER位拨至ON,其余位拨至OFF
测试说明:聆听蜂鸣器“唱出”的乐曲
既然是演奏乐曲对于一个音符应该包括两个部分
一是声调二是持续时间,在这个程序中声调是用简单的
延时-电平翻转来实现的,改变了延时的时间就改变了
声调,而时间是通过计数比较来实现的,当计数值相等时
就跳出循环演奏下一个音符。
*********************************************/
#include 《msp430x14x.h》
typedef unsigned char uchar;
#include “music.h”
#define Buzzer BIT7
#define Buzzer_Port P6OUT
#define Buzzer_DIR P6DIR
uchar counter;
void Play_Song(void);
/***************主函数****************/
void main(void)
{
uchar i;
/*下面六行程序关闭所有的IO口*/
P1DIR = 0XFF;P1OUT = 0XFF;
P2DIR = 0XFF;P2OUT = 0XFF;
P3DIR = 0XFF;P3OUT = 0XFF;
P4DIR = 0XFF;P4OUT = 0XFF;。
stm32f103通用定时器pwm应用例程--蜂鸣器演奏乐曲
stm32f103通用定时器pwm应用例程--蜂鸣器演奏乐曲STM32F103通用定时器PWM应用例程:蜂鸣器演奏乐曲一(说明:本例程是将流明LM3SLib_Timer.pdf文档中的例程9及例程10(PWM应用:蜂鸣器演奏乐曲),移植到STM32F103上。
二(流明LM3SLib_Timer.pdf例程9及例程10的拷贝:例程9( Timer PWM应用:蜂鸣器发声如图1.1所示,为EasyARM1138开发板上的蜂鸣器驱动电路。
蜂鸣器类型是交流蜂鸣器,也称无源蜂鸣器,需要输入一列方波才能鸣响,发声频率等于驱动方波的频率。
图1.1 蜂鸣器驱动电路程序清单1.9是Timer模块16位PWM模式的一个应用,可以驱动交流蜂鸣器发声,运行后蜂鸣器以不同的频率叫两声。
其中"buzzer.h"和"buzzer.c"是蜂鸣器的驱动程序,仅有3个驱动函数,用起来很简捷。
程序清单1.9 Timer PWM应用:蜂鸣器发声文件:main.c#include "systemInit.h"#include "buzzer.h"// 主函数(程序入口)int main(void) {jtagWait(); // 防止JTAG失效,重要~clockInit(); // 时钟初始化:晶振,6MHzbuzzerInit(); // 蜂鸣器初始化buzzerSound(1500); // 蜂鸣器发出1500Hz声音SysCtlDelay(400* (TheSysClock / 3000)); // 延时约400ms buzzerSound(2000); // 蜂鸣器发出2000Hz声音SysCtlDelay(800* (TheSysClock / 3000)); // 延时约800ms buzzerQuiet( ); // 蜂鸣器静音for (;;) {}}文件:buzzer.h#ifndef __BUZZER_H__#define __BUZZER_H__// 蜂鸣器初始化extern void buzzerInit(void);// 蜂鸣器发出指定频率的声音extern void buzzerSound(unsigned short usFreq); // 蜂鸣器停止发声extern void buzzerQuiet(void);1#endif // __BUZZER_H__文件:buzzer.c#include "buzzer.h"#include <hw_types.h>#include <hw_memmap.h> #include <sysctl.h>#include <gpio.h>#include <timer.h>#define PART_LM3S1138#include <pin_map.h> #define SysCtlPeriEnable SysCtlPeripheralEnable #define GPIOPinTypeOut GPIOPinTypeGPIOOutput// 声明全局的系统时钟变量extern unsigned long TheSysClock;// 蜂鸣器初始化void buzzerInit(void){SysCtlPeriEnable(SYSCTL_PERIPH_TIMER1); // 使能TIMER1模块SysCtlPeriEnable(CCP3_PERIPH); // 使能CCP3所在的GPIO端口GPIOPinTypeTimer(CCP3_PORT, CCP3_PIN); // 设置相关管脚为Timer功能TimerConfigure(TIMER1_BASE, TIMER_CFG_16_BIT_PAIR | // 配置TimerB为16位PWM TIMER_CFG_B_PWM); }// 蜂鸣器发出指定频率的声音// usFreq是发声频率,取值 (系统时钟/65536)+1 , 20000,单位:Hz void buzzerSound(unsigned short usFreq) {unsigned long ulVal;if ((usFreq <= TheSysClock / 65536UL) || (usFreq > 20000)) {buzzerQuiet( );}else {GPIOPinTypeTimer(CCP3_PORT, CCP3_PIN); // 设置相关管脚为Timer功能ulVal = TheSysClock / usFreq;TimerLoadSet(TIMER1_BASE, TIMER_B, ulVal); // 设置TimerB初值TimerMatchSet(TIMER1_BASE, TIMER_B, ulVal / 2); // 设置TimerB匹配值TimerEnable(TIMER1_BASE, TIMER_B); // 使能TimerB计数 }}// 蜂鸣器停止发声void buzzerQuiet(void){TimerDisable(TIMER1_BASE, TIMER_B); // 禁止TimerB计数GPIOPinTypeOut(CCP3_PORT, CCP3_PIN); // 配置CCP3管脚为GPIO输出GPIOPinWrite(CCP3_PORT, CCP3_PIN, 0x00); // 使CCP3管脚输出低电平 } 例程10(Timer PWM应用:蜂鸣器演奏乐曲程序清单1.10是Timer模块16位PWM模式的一个应用,能驱动交流蜂鸣器演奏一首动听的乐曲《化蝶》(乐谱参见图1.2)。
单片机课程设计报告利用蜂鸣器播放音乐
课程设计:嵌入式系统应用题目名称:利用蜂鸣器实现音乐播放功能姓名:学号:班级:完成时间:1设计的任务设计内容:动手焊接一个51单片机设计目标:利用单片机上的蜂鸣器实现音乐播放功能2设计的过程基本结构在本次的试验中采用了STC89C52RC单片机,STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期,工作电压:~5V单片机/~3V单片机,工作频率范围:0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz,用户应用程序空间为8K字节;STC89C52RC引脚图STC89C52RC单片机的工作模式:(1)典型功耗<μA,可由外部中断唤醒,中断返回后,继续执行原程序(2)空闲模式:典型功耗2mA(3)正常工作模式:典型功耗4Ma~7mA4唤醒,适用于水表、气表等电池供电系统及便携设备2.蜂鸣器及其工作原理:蜂鸣器按其结构分主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型;电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成;接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声;本实验采用的是电磁式蜂鸣器;蜂鸣器按其是否带有信号源又分为有源和无源两种类型;有源蜂鸣器只需要在其供电端加上额定直流电压,其内部的震荡器就可以产生固定频率的信号,驱动蜂鸣器发出声音;无源蜂鸣器可以理解成与喇叭一样,需要在其供电端上加上高低不断变化的电信号才可以驱动发出声音;本实验采用的是有源蜂鸣器;蜂鸣器与单片机连接电路图软件设计过程1.蜂鸣器发声原理本实验由于采用有源蜂鸣器,只需将引脚端口P3^4清零,蜂鸣器即可发声;P3^4置位,蜂鸣器停止发声;采用置1置0的方法只能使蜂鸣器发声或停止发声,想要使蜂鸣器发出声音,必须对蜂鸣器发出声音的音频和节拍进行控制;音乐基础音调:不同音高的乐音是用C、D、E、F、G、A、B来表示,这7个字母就是音乐的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱成简谱的1、2、3、4、5、6、7,相当于汉字“多来米发梭拉西”的读音,这是唱曲时乐音的发音,所以叫“音调”,即Tone;把C、D、E、F、G、A、B这一组音的距离分成12个等份,每一个等份叫一个“半音”;两个音之间的距离有两个“半音”,就叫“全音”;在钢琴等键盘乐器上,C–D、D–E、F–G、G–A、A–B两音之间隔着一个黑键,他们之间的距离就是全音;E–F、B–C两音之间没有黑键相隔,它们之间的距离就是半音;通常唱成1、2、3、4、5、6、7的音叫自然音,那些在它们的左上角加上﹟号或者b号的叫变化音;﹟叫升记号,表示把音在原来的基础上升高半音,b叫降记音,表示在原来的基础上降低半音;例如高音DO的频率1046Hz刚好是中音DO的频率523Hz的一倍,中音DO的频率523Hz刚好是低音DO频率266Hz的一倍;同样的,高音RE 的频率1175Hz刚好是中音RE的频率587Hz的一倍,中音RE的频率587Hz 刚好是低音RE频率294Hz的一倍;节拍:节拍是让音乐具有旋律固定的律动,而且可以调节各个音的快满度;“节拍”,即Beat,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚;若1拍实,则1/4拍为;至于1拍多少s,并没有严格规定,就像人的心跳一样,大部分人的心跳是每分钟72下,有些人快一点,有些人慢一点,只要听的悦耳就好;音持续时间的长短即时值,一般用拍数表示;休止符表示暂停发音;1)控制发声频率要产生音频脉冲,只要算出某一音频的周期1/频率,然后将此周期除以2,即为半周期的时间;利用定时器计时这半个周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O 脚上得到此频率的脉冲;利用STC89C52RC的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0从而产生不同频率;此外结束符和休止符可以分别用代码00H和FFH来表示,若查表结果为0x00,则表示曲子终了;若查表结果为0xff,则产生相应的停顿效果;以标准音高A为例,A的频率是440Hz,周期T=1/440=2272us;在占空比为50%的情况下,导通时间=断开时间=半周期t=2272us/2=1136us,利用P3^4端口的位操作,经过不断地反相变换即可得到标准音高A的音频脉冲;端口导通时间与断开时的时间利用定时器实现;具体的方法是将单片机定时器的中断触发时间设为半周期t,这样每隔半周期端口反相,输出连续的对应音高的频率;设晶振的频率为f0,中断触发时间半周期为t,定时器工作在模式1时计数器的初值为THL,高8位为THL,低8位为TL;时钟周期即为1/f0,定时器每一次累加用去一个机器周期,一个机器周期包含12个时钟周期,即定时器每次加一所用时间是12/f0;定时器在模式1下计时采用16位数,最大计数为2^16-165535,再次加一65536溢出触发中断;根据以上分析可得如下关系:音频对应定时器初值的高8位TH=THL/2^8=65536-tf/12/256;音频对应定时器初值的低8位TL=THL%2^8=65536-tf/12%256;附:八度12音阶定时器初值表只含自然音低音音名 频率Hz 晶振12MHz 晶振 中音音名 频率Hz 晶振12MHz 晶振 高音音名 频率Hz 晶振12MHz 晶振 Do 262 0xF885 0xF91B Do 523 0xFC43 0xFC8E Do 1046 0xFE21 0xFE47 Re 294 0xF95A 0xF9DF Re 587 0xFCAD 0xFCED Re 1175 0xFE56 0xFE76 Mi 330 0xFA13 0xFA8A Mi 659 0xFD0A 0xFD43 Mi 1318 0xFE85 0xFEA1 Fa 349 0xFA68 0xFAD8 Fa 698 0xFD34 0xFD6A Fa 1397 0xFE9A 0xFEC7 So 392 0xFB04 0xFB68 So 784 0xFD82 0xFDB3 So 1568 0xFEC1 0xFED9 La 440 0xFB90 0xFBE9 La 880 0xFDC8 0xFDF3 La 1760 0xFEE4 0xFEF9 Si4940xFC0C0xFC5BSi9880xFE060xFE2DSi19760xFF030xFF162控制发声节拍每个音符的节拍可通过延时一定的时间来实现,在具体实现时需要有一个基本的带参延时程序,用于主函数根据不同的音符调用不同的时延;若以十六分之一音符的时长为基本延时时间,则十六分音符只需调用一次延时程序,八分音符则需调用两次延时程序,以此类推;3) 简谱及其编码用数字1至7表示;这7个数字就等于的;如果是C 大调,加上音名,就会是这样:八度如果是高一个八度,就会在数字上方加上一点;如果是低一个八度,就会数字下方加上一点;在中间的那一个就什么也不用加;如果要再高一个八度,就在上方垂直加上两点如:;要再低一个八度,就在下方垂直加上两点如:,如此类推;见下表所示: 大调 ... ... 小调......音长通常只有数字的是;数字下加一条横线,就可令四分音符的长度减半,即成为;两条横线可令八分音符的长度减半,即成为,余此类推;简单来説,下音阶CDEFGAB唱名 do re mi fa so la si数字 1 2 3 4 5 6 7加横綫数目与五綫谱的符尾数目相对应;数字后方的横线延长音符,每加一条横线延长一个的长度;正如五綫谱的附点一样,数字后方加一点会将音符长度增加一半;休止符休止符用“0”来表示;比四分休止符长,就只需在每一个四分休止符再多加一个“0”,不需在后方加上横线;若整个小节均是休止状态的话,就在每个四分音符加一个“0”,就像是3拍4就写成“|000|”,而4拍4就写成“|0000|”;无音高音符就像敲击乐的乐器那样是没有音高的,这时,简谱就需要用“X”或“x”表达;例如拍手时,简谱上就需如此表达:小节线正如五綫谱一样,小节与小节之间以纵綫称分隔,乐曲终止以一粗一细的直綫表示但是一般不分粗细;重复乐段以纵綫后两点表示开始,纵綫前两点表示终止;拍号的表达方式为:“2/4”、“3/4”、“4/4”、“6/8”等等;拍号一般都是置于的后方;变调与调号表示有两种方法:可以直接写“C调”,“C小调”或“Key:C”,“Key:Cm”;亦可写清楚主音代表哪一个音,例如1=C,就是C大调大调以1为主音;6=C就是C小调小调以6为主音;2=D就是D多利安调以2为主音;五线谱有,简谱同样有升降号;在简谱中,若需表达升降号,就把符号加在数字1至7的前方,让该音升高或降低;若要把升降号加在调号跟CDEFGAB七个字母,就须加在它们的后方;在五綫谱中,C小调要把B-E-A三个音降低半音;所以表达它的和声小调时,就会把一个放在B前面;简谱就一定得写 5,因为5不能下降;延音线、圆滑线与其他音乐符号简谱Tie跟slur都是跟五线谱相同,一定得置在数字上方;表达staccato时需要特别小心,因为很容易会跟低八度的那一点混淆,因此在表达跳音时把那一点写得粗点及低点;简谱编码将简谱中的每个音符进行编码,每个音符用一个unsignedchar字符类型表示,简谱可用一个unsignedchar字符数组表示;字符的前四位表示音频,可以表示0-f共十六个音符;本实验中采用了中音区和高音区;中音do-si分别编码为1~7,高音do-si分别编码为8~E,停顿编为0;字符的后四位表示节拍,节拍以十六分音符为单位在本程序中为165ms,一拍即四分音符等于4个十六分音符,编为4,其它的播放时间以此类推;以0xff作为曲谱的结束标志;程序从数组中取出一个数,然后分离出高4位得到音调,将值赋给定时器0,得到音调;接着分离出该数的低4位,得到节拍;本实验中播放音乐使用简谱如下:将其编码成:ucharcodezbjbxf={0x64,0xA3,0xC1,0xA2,0x62,0x84,0x61,0x81,0x61,0xA4,0xA1,0x91,0xA1,0x81,0 x64,0xA3,0xC1,0xD2,0xD2,0xD2,0xA2,0xC4,0xA1,0xC1,0xA1,0xC1,0xD2,0xD2,0x D2,0xA2,0xC4,0xC2,0x62,0xC2,0x62,0xA2,0xA2,0x84,0x94,0x94,0x92,0x81,0x9 1,0xA2,0xC2,0xD4,0xE4,0xA4,0xE4,0xA2,0xE2,0xA2,0xE2,0xA2,0xA2,0x84,0x94 ,0x94,0x92,0x81,0x91,0xA2,0xC2,0xD8};程序流图及说明主程序流程图程序代码:include<> defineucharunsignedchardefineuintunsignedintsbitfm=P3^4;算机与单片机的连接不上问题计算机与单片机的连接需要在电脑端安装相应的USB转串的驱动,由于我组没有使用实验室windowsxp系统,而使用的是个人计算机windows7系统,所以需要针对win7的驱动;后来联网搜索下载相应的驱动之后解决了这一问题;2.如何使蜂鸣器发出声音而非Be-Be声为了解决这个问题,我们深入研究了蜂鸣器发声原理与乐谱相关的知识;通过学习相关知识发现,不同的音符对应不同的音高,音高取决于发声频率;所以可以通过构造不同频率的方波来使蜂鸣器发出不同频率的声音,具体实现时利用定时器计时,定时器每一次累加消耗一个机器周期,即12个时钟周期;本实验采用晶振频率为12MHz,即定时器每一次累加消耗1us,通过设置定时器初值设定蜂鸣器取法的时间间隔,从而产生相应的音频;每个音符不但有频率属性,还有节拍属性;对不同节拍的控制可以采用延迟一定的时间来得到; 5总结在本次课程设计中,我们进一步加深了对小型嵌入式系统的认识;实验初期单片机需要自己焊接,通过亲手焊接电路板,了解了如何将实验原理图转化为具体的硬件实物连接;通过使用TN单片机开发板和STC89C52RC系统,对单片机应用开发有了初步的熟悉;在实验的过程中,使用到了C51的编译环境KeilC和单片机通讯程序STC_ISP,两者是单片机开发所不可缺少的工具;在具体实施的过程中,通过一一解决遇到的问题,增强了动手实践能力;。
STM32定时器PWM输出总结
STM32定时器PWM输出总结STM32是意法半导体(STMicroelectronics)公司推出的一系列32位微控制器(MCU)的产品,相较于传统的8位和16位MCU,STM32具有更强的处理能力和更多的外设资源。
其中,定时器是STM32系列MCU的重要外设之一,可以用于实现各种定时、计数和PWM输出等功能。
定时器是STM32系列MCU中一个非常重要的外设,可以提供一些基本的定时、计数和计时功能。
除了基本功能外,定时器还可以通过配置不同的工作模式、输入捕获和输出比较等功能来实现更多的应用。
在STM32中,每个定时器可以被划分为多个通道,每个通道可以配置为不同的工作模式。
其中,PWM输出功能通常使用定时器的输出比较模式来实现,通过配置不同的占空比来实现不同的PWM波形输出。
使用STM32定时器的PWM输出功能,一般需要进行以下步骤:1.选择合适的定时器和通道:在STM32系列MCU中,一般会有多个定时器可供选择,根据实际需求选择合适的定时器和通道。
2.配置定时器的工作模式:定时器的工作模式取决于具体的应用需求,可以选择定时模式、计数模式、输入捕获模式或者输出比较模式。
3.配置输出比较模式:输出比较模式是实现PWM输出的关键,通过配置不同的比较值和占空比来实现不同的PWM波形输出。
4.配置GPIO引脚:将定时器的输出引脚与GPIO引脚相连,实现PWM波形的输出。
使用STM32定时器的PWM输出功能,可以实现多种应用。
比如:-控制电机的转速和方向:通过调整PWM波形的占空比,可以控制电机的转速和方向。
-LED灯的亮度调节:通过调整PWM波形的占空比,可以实现LED灯的亮度调节。
-蜂鸣器的声音控制:通过调整PWM波形的频率,可以实现蜂鸣器的声音控制。
总结起来,STM32定时器的PWM输出功能是一种非常有用且灵活的功能,可以通过配置不同的定时器和通道,实现多种不同的应用。
通过控制输出比较模式和占空比,可以实现精确的PWM波形输出。
单片机蜂鸣器唱歌程序(二)
单片机蜂鸣器唱歌程序(二)引言概述:本文档主要介绍了单片机蜂鸣器唱歌程序(二),包括使用单片机控制蜂鸣器发出不同音乐的方法和具体实现步骤。
本文将从五个大点进行阐述,每个大点包含5-9个小点,以便读者更好地理解和实践。
正文:一、引脚连接设置1. 确定单片机的输出引脚和蜂鸣器的输入引脚2. 将单片机的输出引脚与蜂鸣器的输入引脚连接3. 确保连接的稳定性和正确性4. 利用电路图进行布线二、编程环境配置1. 安装适合单片机的编程软件2. 创建新的项目3. 配置单片机的型号及选项4. 导入相关的库文件5. 编写代码框架三、发声原理及代码实现1. 理解蜂鸣器工作原理2. 使用单片机的PWM输出功能控制蜂鸣器的频率3. 利用PWM输出的方式实现不同音调的发声4. 编写音调转换函数5. 编写歌曲的音乐片段代码四、优化和调试1. 测试不同频率的声音2. 调整蜂鸣器的音量3. 避免噪音的干扰4. 检查代码的正确性和合理性5. 不断尝试,优化代码和音效五、实验结果及总结1. 运行程序,测试蜂鸣器的唱歌效果2. 记录实验结果和观察结果3. 分析实验过程中遇到的问题和解决方法4. 总结实验经验和注意事项5. 展望将来的改进和研究方向总结:本文详细介绍了单片机蜂鸣器唱歌程序(二)的实现方法和步骤。
通过连接设置、编程环境配置、发声原理及代码实现、优化和调试、实验结果及总结等五个大点的阐述,读者可以深入了解单片机控制蜂鸣器发声的原理和方法,并通过实验得到具体的唱歌效果。
同时,读者在实践过程中也要注意优化和调试,不断尝试和改进,以实现更好的音效效果。
希望本文对读者有所帮助,为单片机蜂鸣器唱歌程序的开发提供了指导和参考。
基于STM32的PWM音乐播放器应用设计_马志强
基于STM32的PWM音乐播放器应用设计_马志强一、引言随着科技的不断进步和人们对音乐的追求,音乐播放器已经成为人们日常生活中不可或缺的一部分。
本文将介绍一种基于STM32单片机的PWM 音乐播放器应用设计方案。
二、设计方案1.系统结构本系统主要由三个模块组成:音乐数据存储模块、音乐数据解码模块和PWM输出控制模块。
2.音乐数据存储模块音乐数据存储模块主要负责存储音乐文件,可以选择外部存储介质,如SD卡、U盘等。
STM32单片机通过相应的驱动和接口与外部存储介质进行通信。
3.音乐数据解码模块音乐数据解码模块主要负责将存储在外部存储介质上的音乐数据进行解码,转换为数字信号,用于PWM输出控制模块的控制。
可以选择合适的音乐解码芯片,如VS1053等。
4.PWM输出控制模块PWM输出控制模块主要负责控制音乐数据解码后的数字信号输出。
STM32单片机通过相应的PWM输出模块和控制寄存器进行设置和控制。
5.系统功能设计该音乐播放器应用设计方案具备以下功能:-支持常见的音乐文件格式,如MP3、WAV等。
-支持音乐的播放、暂停、停止、上一曲、下一曲等操作。
-支持音量调节功能,并具备音量记忆功能。
-支持音乐列表显示和选择功能。
-支持定时开关机功能,并具备关机记忆功能。
6.软件设计-操作界面:设计简洁、直观的音乐播放器操作界面,可通过按键、旋钮等控制音乐的播放、暂停、切换等操作。
-音乐解码:通过音乐解码芯片将音乐文件解码为数字信号,并通过I2S或SPI等接口传输给STM32单片机进行PWM输出控制。
-控制逻辑:通过编程实现音乐列表的显示和选择功能,控制音乐的播放、暂停、停止、切换等操作。
通过定时器实现定时开关机功能。
-存储管理:通过相应的文件系统和存储管理算法管理音乐文件的存储和读取。
7.硬件设计-选用STM32系列的合适型号单片机,具备足够的存储空间和计算能力。
-选用合适的音乐解码芯片,具备支持常见音乐文件格式的解码能力。
STM32f103PWM(用于电调)程序
}
if(tmp_buf[8]==0xf0&tmp_buf[9]==0x00)//判断是否为设置电调最大值
{
CH21_PWM_VAL = 2000;//设置最大值
CH22_PWM_VAL = 2000;//设置最大值
CH23_PWM_VAL = 2000;//设置最大值
CH24_PWM_VAL = 2000;//设置最大值
//后两位00表示输入状态;此时前两位00模拟输入;01浮空输入;10上拉/下拉输入;11保留
//后两位01/10/11分别表示10/20/50MHz的输出速度;此时前两位00通用推完输出;01通用开漏输出;10复用推挽;11复用开漏
GPIOA->CRL&=0XFFFFFF0F;//PA1清除之前的设置
TIM2->ARR=arr;//设定计数器自动重装值
TIM2->PSC=psc;//预分频器不分频
TIM2->CCMR1|=6<<4;//CH1 PWM1模式
TIM2->CCMR1|=6<<12;//CH2 PWM1模式
TIM2->CCMR2|=6<<4;//CH3 PWM1模式
TIM2->CCMR2|=6<<12;//CH4 PWM1模式
}
if(tmp_buf[8]==0xf0&tmp_buf[9]==0xf0)//判断是否为设置电调最小值
{
CH21_PWM_VAL = 1000;//设置最小值
CH22_PWM_VAL = 1000;//设置最小值
CH23_PWM_VAL = 1000;//设置最小值
CH24_PWM_VAL = 1000;//设置最小值
单片机控制蜂鸣器鸣奏音乐
单片机控制蜂鸣器鸣奏音乐——中北大学:马政贵首先介绍蜂鸣器的发声原理。
我们都知道,音调和音调的时长是音符的主要特征,通过产生不同的音调和音调的时长可以奏出不同的音符来。
然后一个个音}}void yanzou(unsigned char i,unsigned int pai) {unsigned char y;unsigned int j;for(j=0;j<pai;j++){fmq=0;for(y=0;y<i;y++) ;yanzou(55,262); //1/2拍高音1yanzou(58,247); //1/2拍中音7 yanzou(44,660); //1拍高音3 yanzou(49,587); //1拍高音2yanzou(65,880); //2拍中音6yanzou(44,330); //1/2拍高音3 yanzou(37,392); //1/2拍高音5yanzou(37,392); //1/2拍高音5 yanzou(65,440); //1拍中音6yanzou(41,698); //1拍高音4yanzou(41,698); //1拍高音4yanzou(37,392); //1/2拍高音5yanzou(41,349); //1/2拍高音4yanzou(44,660); //1拍高音3yanzou(55,262); //1/2拍高音1 yanzou(44,660); //1拍高音3 yanzou(49,587); //1拍高音2 yanzou(65,880); //2拍中音6yanzou(37,392); //1/2拍高音5 yanzou(41,349); //1/2拍高音4 yanzou(44,660); //1拍高音3 yanzou(49,293); //1/2拍高音2 yanzou(55,262); //1/2拍高音1yanzou(49,587); //1拍高音2yanzou(65,880); //2拍中音6yanzou(65,880); //2拍中音6delay(5000);for(j=0;j<115;j++);}}void yanzou(unsigned char pinlv,unsigned int jiepai){unsigned char pl;unsigned int jp;if(jiepai==1) delay(250); //1/2拍暂停,即1/2拍的0else if(jiepai==2) delay(500); //1拍暂停,即1拍的0elseunsigned char code pinlv[]={131,110,98, 87, 73, 87, 110,98, 131,0,110,98,87, 73, 73, 65, 98,87,87,87,73,65,73,65,55,58,65,73,65,87,110,98,87,73,110,131,110,98,87,65 ,73,73,0,87,65,65,73,82,87,98,87,73,131,110,98,0,110,98,87,73,65,55,58,65,73,87,65,65};unsigned int codejiepai[]={110,131,147,494,196,165,131,294,440,1,131,147,165,588,196,440, 294,660,330,165,196,880,588,220,262,124,110,196,220,330,131,147,495,196, 262,220,131,147,165,220,784,392,2,660,660,220,196,175,330,588,495,196,11 0,131,147,2,131,147,330,392,440,524,247,220,196,165,880,880};。
基于stm32的pwm音乐播放器应用设计分析
- 20 -高 新 技 术近几年,随着电子行业的快速发展,电子产品也在发生着一定的改变,功能型的电子设备开始进入人们的视线当中。
因此,根据人们对电子的需求,电子行业对PWM 音乐播放器做出了一些改变,主要是基于STM32的功能,实现音乐的播放,并且在播放期间可以对音乐随时进行调整。
另外,基于STM32对PWM 音乐播放器进行设计,其设计相对较为简单,可以大大降低其设计成本,并且功能相对较为多样化,在满足人们对音乐播放器需求的同时,也可以保证电子行业符合现代社会的发展需求,实现良好的经济效益。
1 STM32分析STM32属于嵌入式单片机的一种,专门为高性能、低成本、低功耗的电子设备所设计,所包括的功能也是非常多,下面就对其相关内容展开分析和阐述。
1.1 定时时长定时时长是STM32中的一项重要指标,是指在超出设定时间时,系统会产生一个溢出。
另外可以利用定时器时钟实施分频处理,只需设置计数溢出大小即可。
但是,为了保证定时的准确性,一定要预先设定时钟,这样才能降低异常现象的发生频率。
1.2 参数设定定时器参数的设定,是STM32重点需要考虑的问题,主要是由其结构决定的,包括预分频系数、计数器模式、计数溢出大小等方面。
一般情况下,在设定参数的时候,首先会产生一个时长为1 s 的定时,并且对系统时钟进行设定。
其次需要设置预分频系数,并且如果时钟呈现72 MHz,可以确定此时系统处于分割的状态。
2 PWM音乐播放器分析在将STM32应用到PWM 音乐播放器之前,需要明确PWM 音乐播放器的运行原理,这样可以对其中可能产生的很多问题进行有效规避,避免产生各种异常现象。
下面就PWM 音乐播放器运行原理展开分析和阐述。
2.1 PWM音乐播放器使用性能数字输出形式是PWM 音乐播放器的主要输出形式,这种输出形式通过模拟电路工作过程,处理主控芯片之后再输出,主要是发挥嵌入式处理器的作用。
同时,PWM 音乐播放器具有经济性优势,其空间需求也相对较小,并且抗噪声性能相对较强,这样看来PWM 音乐播放器的使用性能是非常好的。
基于STM32的PWM音乐播放器应用设计_马志强
基于STM32的PWM音乐播放器应用设计马志强,王建刚,孙少林,胡明(总参谋部通信训练基地,宣化075100)摘要:基于32位的STM32F103,利用PWM产生的音频信号驱动蜂鸣器演奏乐曲,实现了音乐播放器的应用设计。
该播放器能实现从低音到高音的21个音阶,并能根据乐谱演奏完整的曲目。
测试结果表明,PWM的输出信号与各音阶对应的声音频率基本一致,方案切实可行。
这一方法也可用于电机控制、电子琴设计等方面,具有较好的实用性。
关键词:STM32;PWM;蜂鸣器;定时器;音乐中图分类号:TP273文献标识码:AApplicationDesignofPWMMusicPlayerBasedonSTM32MaZhiqiang,WangJiangang,SunShaolin,HuMing(CommunicationTrainingBaseofPLAGeneralStaffHeadquarters,Xuanhua075100,China)Abstract:Basedon32-bitSTM32F103,usingaudiosignalsproducedbyPWMtodriveabuzzertoplaymusic,amusicplayerisde-signed.Theplayercanrealize21scalesfrombasstotrebleandplaycompletesongsaccordingtomusicscores.TestresultsshowthattheoutputsignalsofPWMareconsistentwiththecorrespondingvoicefrequencyofthescales,andtheschemeisfeasible.Thismethodcanalsobeusedinmotorcontrol,keyboarddesignandsoon,showinggoodpracticality.Keywords:STM32;PWM;buzzer;timer;music在科研项目开发中,有时会遇到需要播放电话铃声、音乐等情况。
STM32F103通用定时器PWM应用例程--蜂鸣器演奏乐曲解析
STM32F103通用定时器PWM应用例程:蜂鸣器演奏乐曲一.说明:本例程是将流明LM3SLib_Timer.pdf文档中的例程9及例程10(PWM应用:蜂鸣器演奏乐曲),移植到STM32F103上。
二.流明LM3SLib_Timer.pdf例程9及例程10的拷贝:例程9.Timer PWM应用:蜂鸣器发声如图1.1所示,为EasyARM1138开发板上的蜂鸣器驱动电路。
蜂鸣器类型是交流蜂鸣器,也称无源蜂鸣器,需要输入一列方波才能鸣响,发声频率等于驱动方波的频率。
图1.1 蜂鸣器驱动电路程序清单1.9是Timer模块16位PWM模式的一个应用,可以驱动交流蜂鸣器发声,运行后蜂鸣器以不同的频率叫两声。
其中"buzzer.h"和"buzzer.c"是蜂鸣器的驱动程序,仅有3个驱动函数,用起来很简捷。
程序清单1.9 Timer PWM应用:蜂鸣器发声文件:main.c#include "systemInit.h"#include "buzzer.h"// 主函数(程序入口)int main(void){jtagWait(); // 防止JTAG失效,重要!clockInit(); // 时钟初始化:晶振,6MHzbuzzerInit(); // 蜂鸣器初始化buzzerSound(1500); // 蜂鸣器发出1500Hz声音SysCtlDelay(400* (TheSysClock / 3000)); // 延时约400msbuzzerSound(2000); // 蜂鸣器发出2000Hz声音SysCtlDelay(800* (TheSysClock / 3000)); // 延时约800msbuzzerQuiet( ); // 蜂鸣器静音for (;;){}}文件:buzzer.h#ifndef __BUZZER_H__#define __BUZZER_H__// 蜂鸣器初始化extern void buzzerInit(void);// 蜂鸣器发出指定频率的声音extern void buzzerSound(unsigned short usFreq);// 蜂鸣器停止发声extern void buzzerQuiet(void);#endif // __BUZZER_H__文件:buzzer.c#include "buzzer.h"#include <hw_types.h>#include <hw_memmap.h>#include <sysctl.h>#include <gpio.h>#include <timer.h>#define PART_LM3S1138#include <pin_map.h>#define SysCtlPeriEnable SysCtlPeripheralEnable#define GPIOPinTypeOut GPIOPinTypeGPIOOutput// 声明全局的系统时钟变量extern unsigned long TheSysClock;// 蜂鸣器初始化void buzzerInit(void){SysCtlPeriEnable(SYSCTL_PERIPH_TIMER1); // 使能TIMER1模块SysCtlPeriEnable(CCP3_PERIPH); // 使能CCP3所在的GPIO端口GPIOPinTypeTimer(CCP3_PORT, CCP3_PIN); // 设置相关管脚为Timer功能TimerConfigure(TIMER1_BASE, TIMER_CFG_16_BIT_PAIR | // 配置TimerB为16位PWM TIMER_CFG_B_PWM);}// 蜂鸣器发出指定频率的声音// usFreq是发声频率,取值(系统时钟/65536)+1 ~20000,单位:Hzvoid buzzerSound(unsigned short usFreq){unsigned long ulVal;if ((usFreq <= TheSysClock / 65536UL) || (usFreq > 20000)){buzzerQuiet( );}else{GPIOPinTypeTimer(CCP3_PORT, CCP3_PIN); // 设置相关管脚为Timer功能ulVal = TheSysClock / usFreq;TimerLoadSet(TIMER1_BASE, TIMER_B, ulVal); // 设置TimerB初值TimerMatchSet(TIMER1_BASE, TIMER_B, ulVal / 2); // 设置TimerB匹配值TimerEnable(TIMER1_BASE, TIMER_B); // 使能TimerB计数}}// 蜂鸣器停止发声void buzzerQuiet(void){TimerDisable(TIMER1_BASE, TIMER_B); // 禁止TimerB计数GPIOPinTypeOut(CCP3_PORT, CCP3_PIN); // 配置CCP3管脚为GPIO输出GPIOPinWrite(CCP3_PORT, CCP3_PIN, 0x00); // 使CCP3管脚输出低电平}例程10.Timer PWM应用:蜂鸣器演奏乐曲程序清单1.10是Timer模块16位PWM模式的一个应用,能驱动交流蜂鸣器演奏一首动听的乐曲《化蝶》(乐谱参见图1.2)。
STM32F103PWM输出实验(HAL库)
STM32F103PWM输出实验(HAL库)1、芯⽚输出PWM波形打码步骤 1.0主函数int main(void){HAL_Init(); //初始化HAL库Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72Mdelay_init(72); //初始化延时函数uart_init(115200); //初始化串⼝LED_Init(); //初始化LEDTIM1_PWM_Init(20000,72); //72分频,即1M 。
1000000/20000 = 50 Hz ,即20mswhile(1){TIM_SetTIM1Compare1(1500);}} 1.1初始化输出PWM波形的定时器和IO⼝(例程使⽤定时器1的通道1,输出在PA8)GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_TIM1_CLK_ENABLE(); //使能定时器1__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟GPIO_Initure.Pin=GPIO_PIN_8; //PA8GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复⽤推挽输出GPIO_Initure.Pull=GPIO_PULLUP; //上拉GPIO_Initure.Speed=GPIO_SPEED_HIGH; //⾼速HAL_GPIO_Init(GPIOA,&GPIO_Initure); 1.2初始化定时器1,HAL库中,使⽤定时器的 PWM 输出功能时, HAL 库为我们提供了⼀个独⽴的定时器初始化函数 HAL_TIM_PWM_Init ()TIM_HandleTypeDef TIM1_Handler; //定时器句柄TIM1_Handler.Instance=TIM1; //定时器1TIM1_Handler.Init.Prescaler=psc; //定时器分频TIM1_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式TIM1_Handler.Init.Period=arr; //⾃动重装载值TIM1_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;HAL_TIM_PWM_Init(&TIM1_Handler); //初始化PWM 1.3初始化通道并开启PWMTIM_OC_InitTypeDef TIM1_CH1Handler; //定时器1通道1句柄TIM1_CH1Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1TIM1_CH1Handler.Pulse=arr/2; //设置⽐较值,此值⽤来确定占空⽐,默认⽐较值为⾃动重装载值的⼀半,即占空⽐为50%TIM1_CH1Handler.OCPolarity=TIM_OCPOLARITY_HIGH; //输出⽐较极性为⾼HAL_TIM_PWM_ConfigChannel(&TIM1_Handler,&TIM1_CH1Handler,TIM_CHANNEL_1);//配置TIM1通道1HAL_TIM_PWM_Start(&TIM1_Handler,TIM_CHANNEL_1);//开启PWM通道1 1.4提供设置⽐较值的函数//设置TIM1通道1的占空⽐//compare:⽐较值void TIM_SetTIM1Compare1(u32 compare){TIM1->CCR1=compare;}2、输出PWM原理及代码解释 设置PWM周期和⼀个⽐较值,技术过程中⽐较值和计数值进⾏⽐较,判断输出有效电平还是⽆效电平,达到输出PWM波的⽬的。
定时器实验(单片机控制蜂鸣器播放曲子——最炫民族风)
#include <REGX51.H>unsigned char h, l, time;sbit beep = P3^7;code unsigned char high[] = {0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音12345670xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, //1,2,3,4,5,6,7,0xFC, 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音i2345670xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF}; //超高音1234567code unsigned char low[] = {0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, //低音12345670x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, //1,2,3,4,5,6,7,0x8F, 0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音i2345670x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音1234567code unsigned char music[] ={6,1,2, 6,1,1, 5,1,1, 6,1,2, 6,1,1, 1,2,1, 1,2,2, 2,2,1, 1,2,1, 6,1,4, 1,2,2, 1,2,1, 5,1,1, 1,2,1,2,2,1, 3,2,1, 5,2,1, 5,2,1, 3,2,1, 2,2,2, 3,2,4, 6,2,1, 6,2,1, 6,2,1, 5,2,1, 3,2,1, 3,2,2, 1,2,1, 6,1,1,6,1,1, 6,1,1, 3,2,1, 2,2,4, 3,2,1, 3,2,1, 5,2,1, 3,2,1, 2,2,1, 3,2,1, 2,2,1, 1,2,1, 6,1,1, 5,1,1, 6,1,4,3,2,1, 3,2,1, 5,2,1, 3,2,1, 3,2,1, 5,2,1, 5,2,1, 6,2,1, 1,3,1, 6,2,1, 5,2,2, 6,2,4, 6,1,2, 6,1,1, 5,1,1,6,1,2, 1,2,2, 2,2,1, 3,2,1, 2,2,1, 1,2,1, 2,2,1, 3,2,4, 6,1,1, 6,2,1, 6,2,1, 5,2,1, 2,2,1, 3,2,1, 2,2,1, 0,0,0,};void nint() interrupt 1 //T0中断程序,控制发音的音调{TR0 = 0; //先关闭T0beep =~beep; //输出方波, 发音TH0 = h; //下次的中断时间, 这个时间, 控制音调高低TL0 = l;TR0 = 1; //启动T0}void delay(unsigned char t) //延时子函数,控制发音的时间长度{unsigned char t1;unsigned long t2;for(t1 = 0; t1 < t; t1++) //嵌套循环, 共延时t个半拍for(t2 = 0; t2 < 4000; t2++); //延时期间, 可进入T0中断去发音TR0 = 0; //关闭T0, 停止发音}void song() //演奏一个音符{TH0 = h; //控制音调TL0 = l;TR0 = 1; //启动T0, 由T0输出方波去发音beep =~beep;delay(time); //控制时间长度}void main() //j表示第n+1首曲{ unsigned char k, i;i = 0;TMOD = 1; //置T0定时工作方式1ET0 = 1; //开T0中断EA = 1;time = 1;while(time) {k = music[i] + 7 * music[i + 1] - 1;//第i个是音符, 第i+1个是第几个八度h = high[k]; //从数据表中读出频率数值l = low[k]; //实际上, 是定时的时间长度time = music[i + 2]; //读出时间长度数值i += 3;song(); //发出一个音符}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
stm32f103通用定时器pwm应用例程--蜂鸣器演奏乐曲STM32F103通用定时器PWM应用例程:蜂鸣器演奏乐曲一(说明:本例程是将流明LM3SLib_Timer.pdf文档中的例程9及例程10(PWM应用:蜂鸣器演奏乐曲),移植到STM32F103上。
二(流明LM3SLib_Timer.pdf例程9及例程10的拷贝:例程9( Timer PWM应用:蜂鸣器发声如图1.1所示,为EasyARM1138开发板上的蜂鸣器驱动电路。
蜂鸣器类型是交流蜂鸣器,也称无源蜂鸣器,需要输入一列方波才能鸣响,发声频率等于驱动方波的频率。
图1.1 蜂鸣器驱动电路程序清单1.9是Timer模块16位PWM模式的一个应用,可以驱动交流蜂鸣器发声,运行后蜂鸣器以不同的频率叫两声。
其中"buzzer.h"和"buzzer.c"是蜂鸣器的驱动程序,仅有3个驱动函数,用起来很简捷。
程序清单1.9 Timer PWM应用:蜂鸣器发声文件:main.c#include "systemInit.h"#include "buzzer.h"// 主函数(程序入口)int main(void) {jtagWait(); // 防止JTAG失效,重要~clockInit(); // 时钟初始化:晶振,6MHzbuzzerInit(); // 蜂鸣器初始化buzzerSound(1500); // 蜂鸣器发出1500Hz声音SysCtlDelay(400* (TheSysClock / 3000)); // 延时约400ms buzzerSound(2000); // 蜂鸣器发出2000Hz声音SysCtlDelay(800* (TheSysClock / 3000)); // 延时约800ms buzzerQuiet( ); // 蜂鸣器静音for (;;) {}}文件:buzzer.h#ifndef __BUZZER_H__#define __BUZZER_H__// 蜂鸣器初始化extern void buzzerInit(void);// 蜂鸣器发出指定频率的声音extern void buzzerSound(unsigned short usFreq); // 蜂鸣器停止发声extern void buzzerQuiet(void);1#endif // __BUZZER_H__文件:buzzer.c#include "buzzer.h"#include <hw_types.h>#include <hw_memmap.h> #include <sysctl.h>#include <gpio.h>#include <timer.h>#define PART_LM3S1138#include <pin_map.h> #define SysCtlPeriEnable SysCtlPeripheralEnable #define GPIOPinTypeOut GPIOPinTypeGPIOOutput// 声明全局的系统时钟变量extern unsigned long TheSysClock;// 蜂鸣器初始化void buzzerInit(void){SysCtlPeriEnable(SYSCTL_PERIPH_TIMER1); // 使能TIMER1模块SysCtlPeriEnable(CCP3_PERIPH); // 使能CCP3所在的GPIO端口GPIOPinTypeTimer(CCP3_PORT, CCP3_PIN); // 设置相关管脚为Timer功能TimerConfigure(TIMER1_BASE, TIMER_CFG_16_BIT_PAIR | // 配置TimerB为16位PWM TIMER_CFG_B_PWM); }// 蜂鸣器发出指定频率的声音// usFreq是发声频率,取值 (系统时钟/65536)+1 , 20000,单位:Hz void buzzerSound(unsigned short usFreq) {unsigned long ulVal;if ((usFreq <= TheSysClock / 65536UL) || (usFreq > 20000)) {buzzerQuiet( );}else {GPIOPinTypeTimer(CCP3_PORT, CCP3_PIN); // 设置相关管脚为Timer功能ulVal = TheSysClock / usFreq;TimerLoadSet(TIMER1_BASE, TIMER_B, ulVal); // 设置TimerB初值TimerMatchSet(TIMER1_BASE, TIMER_B, ulVal / 2); // 设置TimerB匹配值TimerEnable(TIMER1_BASE, TIMER_B); // 使能TimerB计数 }}// 蜂鸣器停止发声void buzzerQuiet(void){TimerDisable(TIMER1_BASE, TIMER_B); // 禁止TimerB计数GPIOPinTypeOut(CCP3_PORT, CCP3_PIN); // 配置CCP3管脚为GPIO输出GPIOPinWrite(CCP3_PORT, CCP3_PIN, 0x00); // 使CCP3管脚输出低电平 } 例程10(Timer PWM应用:蜂鸣器演奏乐曲程序清单1.10是Timer模块16位PWM模式的一个应用,能驱动交流蜂鸣器演奏一首动听的乐曲《化蝶》(乐谱参见图1.2)。
"music.h"和"music.c"是演奏乐曲的驱动程序。
2图1.2 乐谱《化蝶》简谱是大众化的音乐记谱方式,比较容易理解和掌握。
我们可以把一首乐谱(score)看成是由若干个基本的音符(note)单元组成。
一个音符由音名和时值组成。
音名就是低音、中音、高音的1234567(唱作do re mi fa sol la si),其本质是音符的发声频率。
在头文件"music.h"里,用L1,L7、M1,M7、H1,H7定义了低音、中音、高音所对应的发声频率。
时值是音符的发声时间长短,有全音符、二分音符、四分音符??等等。
音符可以后缀一个“符点”,表示时值增加1/2,特殊地,二分音符加符点时用“,”代替圆点。
参见表1.26的描述。
表1.26 常见简谱音符示例音符名称相对时值T 5――― 全音符5, 二分音符 T/25 四分音符 T/45 八分音符 T/85 十六分音符 T/165―― 符点二分音符 T/2+T/45( 符点四分音符 T/4+T/85( 符点八分音符 T/8+T/16在头文件"music.h"里定义有一个音符结构体tNote,有两个数据成员:音名mName和时值mTime。
在C文件"music.c"里定义有一个tNote型常量数表MyScore[ ],用来保存实际乐谱转换成tNote格式的数据。
有了上述一点点乐谱基础知识,我们就可以很方便地编辑这个数表了。
比如音符“3”转换为“{M3,T/4}”,音符“3(”转换为“{M3, T/4+T/8}”,等等。
在"music.c"里,已经在数表MyScore[ ]里给出了乐谱《化蝶》开头一部分音符转换结果,其余部分请感兴趣的读者补充完整。
程序清单1.10 Timer PWM应用:蜂鸣器演奏乐曲文件:main.c#include "systemInit.h"#include "buzzer.h"#include "music.h"// 主函数(程序入口)int main(void){jtagWait(); // 防止JTAG失效,重要~clockInit(); // 时钟初始化:晶振,6MHzbuzzerInit(); // 蜂鸣器初始化for (;;){musicPlay();SysCtlDelay(4000 * (TheSysClock / 3000)); } }3文件:music.h#ifndef __MUSIC_H__ #define __MUSIC_H__// 定义低音音名(数值单位:Hz)#define L1 262 // c #define L2 294 // d #define L3 330 // e #define L4 349 // f #define L5 392 // g #define L6 440 // a1 #define L7 494 // b1// 定义中音音名#define M1 523 // c1 #define M2 587 // d1 #define M3 659 // e1#define M4 698 // f1 #define M5 784 // g1 #define M6 880 // a2 #define M7 988 // b2// 定义高音音名#define H1 1047 // c2 #define H2 1175 // d2 #define H3 1319 // e2 #define H4 1397 // f2 #define H5 1568 // g2 #define H6 1760 // a3#define H7 1976 // b3// 定义时值单位,决定演奏速度(数值单位:ms) #define T 3600// 定义音符结构typedef struct{short mName; // 音名:取值L1,L7、M1,M7、H1,H7分别表示低音、中音、高音的// 1234567,取值0表示休止符 short mTime; // 时值:取值T、T/2、T/4、T/8、T/16、T/32分别表示全音符、// 二分音符、四分音符、八分音符?,取值0表示演奏结束}tNote;// 演奏乐曲extern void musicPlay(void);#endif // __MUSIC_H__ 文件:music.c#include "music.h" #include "buzzer.h" #include "systemInit.h"// 定义乐曲:《化蝶》(梁祝)const tNote MyScore[ ] = {{L3, T/4},{L5, T/8+T/16}, {L6, T/16},{M1, T/8+T/16},{M2, T/16},{L6, T/16},{M1, T/16}, {L5, T/8},{M5, T/8+T/16},{H1, T/16},{M6, T/16},{M5, T/16}, {M3, T/16},{M5, T/16},{M2, T/2},// 省略后续乐曲数据,请感兴趣的读者补充完整4{ 0, 0} // 结束};// 演奏乐曲void musicPlay(void) {short i = 0;for (;;){ if (MyScore[i].mTime == 0) break;buzzerSound(MyScore[i].mName);SysCtlDelay(MyScore[i].mTime * (TheSysClock/ 3000)); i++;buzzerQuiet( ); SysCtlDelay(10 * (TheSysClock/ 3000)); }}三(移植到STM32F103上:Timer3部分重映射 TIM3_CH2->PB5:PB5作为PWM输出。