?? pwm音樂.c
字號:
/************************************
實(shí)驗(yàn)名稱:采用PWM實(shí)現(xiàn)音樂播放
實(shí)驗(yàn)日期:2008,3,30
排線連接:J14短路帽連到外面
作者: 劉啟明
實(shí)驗(yàn)?zāi)康模菏煜WM各寄存器
************************************/
#include "iolpc2132.h"
#define Fpclk 1000000
// 以4分音符為1拍
#define TEMPO 8
#define _1 TEMPO*4 //全音符
#define _1d TEMPO*6 //附點(diǎn)全音符
#define _2 TEMPO*2 //2音符
#define _2d TEMPO*3 //附點(diǎn)2音符
#define _4 TEMPO*1 //4分音符
#define _4d TEMPO*3/2 //附點(diǎn)4分音符
#define _8 TEMPO*1/2 //8分音符
#define _8d TEMPO*3/4 //附點(diǎn)8音符
#define _16 TEMPO*1/4 //16分音符
#define _16d TEMPO*3/8 //附點(diǎn)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,
};
/* 歌曲節(jié)拍 */
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; // 不分頻,計(jì)數(shù)頻率為Fpclk
PWMMCR = 0x02; // 設(shè)置PWMMR0匹配時(shí)復(fù)位PWMTC
PWMPCR = 0x0400; // 允許PWM2輸出,單邊PWM
PWMMR0 = Fpclk / 1000;
PWMMR2 = PWMMR0 / 2; // 50%占空比
PWMLER = 0x05; // PWM0和PWM2匹配鎖存
PWMTCR = 0x02; // 復(fù)位PWMTC
PWMTCR = 0x09; // 啟動(dòng)PWM輸出
while(1)
{
for(i = 0; i < 62; i++)
{
PWMMR0 = Fpclk / HCMM[i]; // 設(shè)置輸出頻率
PWMLER = 0x05; // 更新匹配值后,必須鎖存
Delay(HCMM_L[i]); // 延時(shí),控制播放速度
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -