没有合适的资源?快使用搜索试试~ 我知道了~
STM32F103通用定时器PWM应用例程蜂鸣器演奏乐曲.doc
5星 · 超过95%的资源 需积分: 39 21 下载量 126 浏览量
2021-03-12
16:27:07
上传
评论
收藏 155KB DOC 举报
温馨提示
试读
13页
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(); // 时钟初始化:晶振,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__
// 蜂鸣器初始化
extern void buzzerInit(void);
// 蜂鸣器发出指定频率的声音
extern void buzzerSound(unsigned short usFreq);
// 蜂鸣器停止发声
extern void buzzerQuiet(void);
#endif // __BUZZER_H__
1
文件: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 常见简谱音符示例
音 符 名 称 相 对 时 值
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.10 Timer PWM应用:蜂鸣器演奏乐曲
文件:main.c
#include "systemInit.h"
#include "buzzer.h"
#include "music.h"
// 主函数(程序入口)
int main(void)
{
jtagWait(); // 防止JTAG失效,重要!
clockInit(); // 时钟初始化:晶振,6MHz
buzzerInit(); // 蜂鸣器初始化
for (;;)
{
musicPlay();
SysCtlDelay(4000 * (TheSysClock / 3000));
}
}
剩余12页未读,继续阅读
文档优选
- 粉丝: 88
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论10