目录
一、基本乐理知识
1、键盘与音符对照
2、音符时值
3、索引与频率对照表
二、乐谱
三、代码
1、main.c
2、Timer0.c
3、Timer0.h
4、Delay.c
5、Delay.h
闲的没事干,我试着用蜂鸣器演奏《机里太美》,与想象中的有点不一样,莫得灵魂【捂脸】。
一、基本乐理知识 1、键盘与音符对照 2、音符时值 3、索引与频率对照表 二、乐谱 三、代码只演奏精华部分
1、main.c #include #include "Delay.h"#include "Timer0.h"typedef unsigned int u16;typedef unsigned char u8;#define SPEED 500//播放速度,值为四分音符的时长(ms)sbit Buzzer = P2^5; //蜂鸣器端口定义//音符与索引对应表,P:休止符,L:低音,M:中音,H:高音,下划线:升半音符号##define P0#define L11#define L1_2#define L23#define L2_4#define L35#define L46#define L4_7#define L58#define L5_9#define L610#define L6_11#define L712#define M113#define M1_14#define M215#define M2_16#define M317#define M418#define M4_19#define M520#define M5_21#define M622#define M6_23#define M724#define H125#define H1_26#define H227#define H2_28#define H329#define H430#define H4_31#define H532#define H5_33#define H634#define H6_35#define H736//索引与频率对照表u16 FreqTable[] = {0, 63628,63731,63835,63928,64021,64103,64185,64260,64331, 64400,64463,64524,64580,64633,64684,64732,64777,64820, 64860,64898,64934,64968,65000,65030,65058,65085,65110, 65134,65157,65178,65191,65217,65235,65252,65268,65283};//乐谱u8 code Music[] = {//音符, 时值,P, 2,L6, 1,L6, 1,M3, 2,M3, 2,L6, 4,P, 4,P, 4,P, 2,L6, 1,L6, 1 + 2,P, 2,P, 4, P, 2,L6, 1,L6, 1,M3, 2,M3, 2,L6, 4,P, 4,P, 4,P, 2,L6, 1 + 2,P, 2,P, 2,L6, 1,L6, 1,L6, 2,L6, 1,L6, 1,M3, 2,M3, 2,L6, 4,P, 4,P, 4,P, 2,L6, 1,L6, 1 + 2,P, 2,P, 4,P, 2,L6, 1,L6, 1,M3, 2,M3, 2,L6, 4,P, 4,P, 4,P, 2,L6, 1,L6, 1,0xFF//终止标志};unsigned char FreqSelect,MusicSelect;void main(){Timer0Init();while(1){if(Music[MusicSelect]!=0xFF)//如果不是停止标志位{FreqSelect=Music[MusicSelect];//选择音符对应的频率MusicSelect++;Delay(SPEED/4*Music[MusicSelect]);//选择音符对应的时值MusicSelect++;TR0=0;Delay(5);//音符间短暂停顿,相当于抬手TR0=1;}else//如果是停止标志位{TR0=0;Delay(50);TR0 = 1;MusicSelect = 0;//停顿后循环播放}}}void Timer0_Routine() interrupt 1{if(FreqTable[FreqSelect])//如果不是休止符{/*取对应频率值的重装载值到定时器*/TL0 = FreqTable[FreqSelect]%256;//设置定时初值 //第二次中断实现TH0 = FreqTable[FreqSelect]/256;//设置定时初值//Buzzer=!Buzzer;//翻转蜂鸣器IO口}} 2、Timer0.c #include /** * @brief 定时器0初始化,1毫秒@12.000MHz * @param 无 * @retval 无 */void Timer0Init(void){TMOD &= 0xF0; //设置定时器模式TMOD |= 0x01; //设置定时器模式TL0 = 0x18; //设置定时初值TH0 = 0xFC;//设置定时初值TF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时ET0 = 1;EA = 1;PT0 = 0;} 3、Timer0.h #ifndef __TIMER0_H__#define __TIMER0_H__void Timer0Init(void);#endif 4、Delay.c void Delay(unsigned int xms){unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}} 5、Delay.h #ifndef __DELAY_H__#define __DELAY_H__void Delay(unsigned int xms);#endifproteus 仿真图
需要自取