通用定时器PWM应用例程蜂鸣器演奏乐曲.docx

上传人:b****2 文档编号:1988554 上传时间:2022-10-25 格式:DOCX 页数:19 大小:47.78KB
下载 相关 举报
通用定时器PWM应用例程蜂鸣器演奏乐曲.docx_第1页
第1页 / 共19页
通用定时器PWM应用例程蜂鸣器演奏乐曲.docx_第2页
第2页 / 共19页
通用定时器PWM应用例程蜂鸣器演奏乐曲.docx_第3页
第3页 / 共19页
通用定时器PWM应用例程蜂鸣器演奏乐曲.docx_第4页
第4页 / 共19页
通用定时器PWM应用例程蜂鸣器演奏乐曲.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

通用定时器PWM应用例程蜂鸣器演奏乐曲.docx

《通用定时器PWM应用例程蜂鸣器演奏乐曲.docx》由会员分享,可在线阅读,更多相关《通用定时器PWM应用例程蜂鸣器演奏乐曲.docx(19页珍藏版)》请在冰豆网上搜索。

通用定时器PWM应用例程蜂鸣器演奏乐曲.docx

通用定时器PWM应用例程蜂鸣器演奏乐曲

通用定时器PWM应用例程:

蜂鸣器演奏乐曲

一.说明:

本例程是将流明LM3SLib_Timer.pdf文档中的例程9及例程10(PWM应用:

蜂鸣器演奏乐曲),移植到STM32F103上。

二.流明LM3SLib_Timer.pdf例程9及例程10的拷贝:

例程9.TimerPWM应用:

蜂鸣器发声

如图1.1所示,为EasyARM1138开发板上的蜂鸣器驱动电路。

蜂鸣器类型是交流蜂鸣器,也称无源蜂鸣器,需要输入一列方波才能鸣响,发声频率等于驱动方波的频率。

图1.1蜂鸣器驱动电路

程序清单1.9是Timer模块16位PWM模式的一个应用,可以驱动交流蜂鸣器发声,运行后蜂鸣器以不同的频率叫两声。

其中"buzzer.h"和"buzzer.c"是蜂鸣器的驱动程序,仅有3个驱动函数,用起来很简捷。

程序清单1.9TimerPWM应用:

蜂鸣器发声

文件:

main.c

#include"systemInit.h"

#include"buzzer.h"

//主函数(程序入口)

intmain(void)

{

jtagWait();//防止JTAG失效,重要!

clockInit();//时钟初始化:

晶振,6MHz

buzzerInit();//蜂鸣器初始化

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__

//蜂鸣器初始化

externvoidbuzzerInit(void);

//蜂鸣器发出指定频率的声音

externvoidbuzzerSound(unsignedshortusFreq);

//蜂鸣器停止发声

externvoidbuzzerQuiet(void);

#endif//__BUZZER_H__

文件:

buzzer.c

#include"buzzer.h"

#include

#include

#include

#include

#include

#definePART_LM3S1138

#include

#defineSysCtlPeriEnableSysCtlPeripheralEnable

#defineGPIOPinTypeOutGPIOPinTypeGPIOOutput

//声明全局的系统时钟变量

externunsignedlongTheSysClock;

//蜂鸣器初始化

voidbuzzerInit(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

voidbuzzerSound(unsignedshortusFreq)

{

unsignedlongulVal;

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计数

}

}

//蜂鸣器停止发声

voidbuzzerQuiet(void)

{

TimerDisable(TIMER1_BASE,TIMER_B);//禁止TimerB计数

GPIOPinTypeOut(CCP3_PORT,CCP3_PIN);//配置CCP3管脚为GPIO输出

GPIOPinWrite(CCP3_PORT,CCP3_PIN,0x00);//使CCP3管脚输出低电平

}

例程10.TimerPWM应用:

蜂鸣器演奏乐曲

程序清单1.10是Timer模块16位PWM模式的一个应用,能驱动交流蜂鸣器演奏一首动听的乐曲《化蝶》(乐谱参见图1.2)。

"music.h"和"music.c"是演奏乐曲的驱动程序。

图1.2乐谱《化蝶》

简谱是大众化的音乐记谱方式,比较容易理解和掌握。

我们可以把一首乐谱(score)看成是由若干个基本的音符(note)单元组成。

一个音符由音名和时值组成。

音名就是低音、中音、高音的1234567(唱作doremifasollasi),其本质是音符的发声频率。

在头文件"music.h"里,用L1~L7、M1~M7、H1~H7定义了低音、中音、高音所对应的发声频率。

时值是音符的发声时间长短,有全音符、二分音符、四分音符⋯⋯等等。

音符可以后缀一个“符点”,表示时值增加1/2,特殊地,二分音符加符点时用“-”代替圆点。

参见表1.26的描述。

表1.26常见简谱音符示例

音符

名称

相对时值

5―――

全音符

T

5-

二分音符

T/2

5

四分音符

T/4

5

八分音符

T/8

5

十六分音符

T/16

5――

符点二分音符

T/2+T/4

5.

符点四分音符

T/4+T/8

5.

符点八分音符

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.10TimerPWM应用:

蜂鸣器演奏乐曲

文件:

main.c

#include"systemInit.h"

#include"buzzer.h"

#include"music.h"

//主函数(程序入口)

intmain(void)

{

jtagWait();//防止JTAG失效,重要!

clockInit();//时钟初始化:

晶振,6MHz

buzzerInit();//蜂鸣器初始化

for(;;)

{

musicPlay();

SysCtlDelay(4000*(TheSysClock/3000));

}

}

文件:

music.h

#ifndef__MUSIC_H__

#define__MUSIC_H__

//定义低音音名(数值单位:

Hz)

#defineL1262//c

#defineL2294//d

#defineL3330//e

#defineL4349//f

#defineL5392//g

#defineL6440//a1

#defineL7494//b1

//定义中音音名

#defineM1523//c1

#defineM2587//d1

#defineM3659//e1

#defineM4698//f1

#defineM5784//g1

#defineM6880//a2

#defineM7988//b2

//定义高音音名

#defineH11047//c2

#defineH21175//d2

#defineH31319//e2

#defineH41397//f2

#defineH51568//g2

#defineH61760//a3

#defineH71976//b3

//定义时值单位,决定演奏速度(数值单位:

ms)

#defineT3600

//定义音符结构

typedefstruct

{

shortmName;//音名:

取值L1~L7、M1~M7、H1~H7分别表示低音、中音、高音的

//1234567,取值0表示休止符

shortmTime;//时值:

取值T、T/2、T/4、T/8、T/16、T/32分别表示全音符、

//二分音符、四分音符、八分音符⋯,取值0表示演奏结束

}tNote;

//演奏乐曲

externvoidmusicPlay(void);

#endif//__MUSIC_H__

文件:

music.c

#include"music.h"

#include"buzzer.h"

#include"systemInit.h"

//定义乐曲:

《化蝶》(梁祝)

consttNoteMyScore[]=

{

{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},

//省略后续乐曲数据,请感兴趣的读者补充完整

{0,0}//结束

};

//演奏乐曲

voidmusicPlay(void)

{

shorti=0;

for(;;)

{

if(MyScore[i].mT

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1