📄 pwm音乐.c
字号:
/************************************
实验名称:采用PWM实现音乐播放
实验日期:2008,3,30
排线连接:J14短路帽连到外面
作者: 刘启明
实验目的:熟悉PWM各寄存器
************************************/
#include "iolpc2132.h"
#define Fpclk 1000000
// 以4分音符为1拍
#define TEMPO 8
#define _1 TEMPO*4 //全音符
#define _1d TEMPO*6 //附点全音符
#define _2 TEMPO*2 //2音符
#define _2d TEMPO*3 //附点2音符
#define _4 TEMPO*1 //4分音符
#define _4d TEMPO*3/2 //附点4分音符
#define _8 TEMPO*1/2 //8分音符
#define _8d TEMPO*3/4 //附点8音符
#define _16 TEMPO*1/4 //16分音符
#define _16d TEMPO*3/8 //附点16分音符
#define _32 TEMPO*1/8 //32分音符
/* 低音 */
#define _1DO 262
#define _1RE 294
#define _1MI 330
#define _1FA 349
#define _1SO 392
#define _1LA 440
#define _1TI 494
/* 中音 */
#define _DO 523
#define _RE 587
#define _MI 659
#define _FA 698
#define _SO 784
#define _LA 880
#define _TI 988
/* 高音 */
#define _DO1 1047
#define _RE1 1175
#define _MI1 1319
#define _FA1 1397
#define _SO1 1568
#define _LA1 1760
#define _TI1 1976
/* 歌曲曲谱 - 欢乐颂*/
const unsigned int HCMM[] =
{
_MI, _MI, _FA, _SO,
_SO, _FA, _MI, _RE,
_DO, _DO, _RE, _MI,
_MI, _RE, _RE,
_MI, _MI, _FA, _SO,
_SO, _FA, _MI, _RE,
_DO, _DO, _RE, _MI,
_RE, _DO, _DO,
_RE, _RE, _MI, _DO,
_RE, _MI, _FA, _MI, _DO,
_RE, _MI, _FA, _MI, _RE,
_DO, _RE, _1SO,
_MI, _MI, _FA, _SO,
_SO, _FA, _MI, _RE,
_DO, _DO, _RE, _MI,
_RE, _DO, _DO,
};
/* 歌曲节拍 */
const unsigned int HCMM_L[] =
{
_4, _4, _4, _4,
_4, _4, _4, _4,
_4, _4, _4, _4,
_4d,_4d,_4,
_4, _4, _4, _4,
_4, _4, _4, _4,
_4, _4, _4, _4,
_4d,_4d,_4,
_4, _4, _4, _4,
_4, _8, _8, _4, _4,
_4, _8, _8, _4, _4,
_4, _4, _2,
_4, _4, _4, _4,
_4, _4, _4, _4,
_4, _4, _4, _4,
_4d,_4d,_4,
};
void Delay(unsigned char dly)
{
unsigned int i;
for(; dly > 0; dly--)
for(i = 0; i < 0x12EFF; i++);
}
void main(void)
{
unsigned char i;
PINSEL0 = 0x02 << 14; // P0.7选择PWM2功能,接唪蜂鸣器。
/* PWM初始化 */
PWMPR = 0x00; // 不分频,计数频率为Fpclk
PWMMCR = 0x02; // 设置PWMMR0匹配时复位PWMTC
PWMPCR = 0x0400; // 允许PWM2输出,单边PWM
PWMMR0 = Fpclk / 1000;
PWMMR2 = PWMMR0 / 2; // 50%占空比
PWMLER = 0x05; // PWM0和PWM2匹配锁存
PWMTCR = 0x02; // 复位PWMTC
PWMTCR = 0x09; // 启动PWM输出
while(1)
{
for(i = 0; i < 62; i++)
{
PWMMR0 = Fpclk / HCMM[i]; // 设置输出频率
PWMLER = 0x05; // 更新匹配值后,必须锁存
Delay(HCMM_L[i]); // 延时,控制播放速度
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -