看到最近反馈还挺好的就多发点存货,所用板材51单片机开发板(普中科技),个人还是很喜欢李宗盛的音乐的,于是就有了今天这期为你我受冷风吹的蜂鸣器版(请使用无源蜂鸣器)
下面是主程序,这套模板也可以用于其他的蜂鸣器音乐编程,相关的音调由计算和后期调改(频率试听)得出,由于后期才想起51单片机内存资源相当有限,而音调是无需修改的常量,可以使用关键词CODE实现存储于ROM之中,从而实现所有音调都可以表示,不过实际用处不大,高频蜂鸣器声音非常难听且音调不准,一般都进行降调处理,本次程序已经经过降调处理,音调后三行是要按数值大小前插(如果借用本程序写新的音乐的话)
#include <REGX52.H>
#include "Delay.h"
#include "Timer0.h"
sbit Buzzer=P2^5;
#define SPEED 750
#define P 0
#define L1 1
#define L1_ 2
#define L2 3
#define L2_ 4
#define L3 5
#define L4 6
#define L4_ 7
#define L5 8
#define L5_ 9
#define L6 10
#define L6_ 11
#define L7 12
#define M1 13
#define M1_ 14
#define M2 15
#define M2_ 16
#define M3 17
#define M4 18
#define M4_ 19
#define M5 20
#define M5_ 21
#define M6 22
#define M6_ 23
#define M7 24
#define H1 25
#define H1_ 26
#define H2 27
#define H2_ 28
#define H3 29
#define H4 30
#define H4_ 31
#define H5 32
#define H5_ 33
#define H6 34
#define H6_ 35
#define H7 36
//#define VVL1 37
//#define VVL1_ 38
//#define VVL2 39
//#define VVL2_ 40
//#define VVL3 41
//#define VVL4 42
//#define VVL4_ 43
//#define VVL5 44
//#define VVL5_ 45
//#define VVL6 46
//#define VVL6_ 47
//#define VVL7 48
//#define VL1 49
//#define VL1_ 50
//#define VL2 51
//#define VL2_ 52
//#define VL3 53
//#define VL4 54
//#define VL4_ 55
//#define VL5 56
//#define VL5_ 57
//#define VL6 58
//#define VL6_ 59
//#define VL7 60
#define VH1 37
#define VH1_ 38
#define VH2 39
#define VH2_ 40
#define VH3 41
#define VH4 42
#define VH4_ 43
#define VH5 44
#define VH5_ 45
#define VH6 46
#define VH6_ 47
#define VH7 48
#define VVH1 49
//#define VVH1_ 74
//#define VVH2 75
//#define VVH2_ 76
//#define VVH3 77
//#define VVH4 78
//#define VVH4_ 79
//#define VVH5 80
//#define VVH5_ 81
//#define VVH6 82
//#define VVH6_ 83
//#define VVH7 84
unsigned int code FreqTable[]=
{
0,
63810,63911,63968,64054,64140,64215,64291,64360,64425,64524,64547,64607,
64655,64704,64751,64795,64837,64876,64913,64948,64981,65013,65042,65070,
65095,65120,65143,65166,65187,65206,65224,65242,65259,65274,65289,65303,
65316,65323,65334,65346,65356,65366,65376,65385,65393,65401,65409,65451,
65464,65429,65435,65440,65446,65450,65456,65460,65464,65468,65471,65475,
58447,58858,59224,59629,59984,60240,60527,60834,61063,61347,61564,61790,
62018,62221,62402,62582,62744,62903,63045,63185,63320,63441,63558,63671,
};
unsigned int code Music[]={
P,4,
P,4,
P,4,
M6,1,
M7,1,
M6,1,
M5,1,
M3,2,
M5,1,
M5,1+4+4,
M3,1,
M5,1,
M5,1,
M6,1,
M5,2,
M3,1,
M2,1+4+4,
M2,1,
M3,1,
M2,1,
M2,1,
L6,1,
M1,4,
M1,2,
M1,1,
L6,1,
M1,4,
M1,1,
L6,1,
M1,1,
M1,1,
M1,1,
M1,1,
M5,2,
M6,1,
M3,1+2,
M2,2,
M6,1,
M6,1,
M6,1,
M3,1,
M6,2,
M3,1,
M5,1+4+2,
M1,2,
M3,1,
M3,1,
M5,1,
M3,1,
M5,1,
M5,1,
M6,2+1,
M3,2,
M2,1+4,
M5,1,
M5,1,
M6,1,
M5,1,
H1,1,
M6,1,
P,2,
M5,1,
M5,1,
M6,1,
M5,1,
H1,1,
M6,1,
P,2,
P,1,
M5,1,
M6,1,
M5,1,
H1,1,
M6,1,
H1,1,
M6,1,
H1,2,
H1,1,
H2,1+1,
H3,1,
H2,1,
M5,1+2,
M5,1,
M6,1,
H3,1,
H2,1,
H3,1,
H2,1,
H3,2,
H5,1,
H2,1+1,
H2,1,
H2,1,
H2,1,
H3,2,
H5,1,
H1,1,
H1,4+4+4+2,
H1,1,
H2,1,
H3,1,
H2,1,
H3,1,
H2,1,
H3,1,
H3,2,
H3,1,
H2,1,
H2,1,
H2,1,
H2,1,
H6,2,
H5,2,
H2,2,
H1,2+2,
H1,1,
M7,2,
M7,1,
M7,1+1,
H1,2,
M6,4,
M5,4+4,
H3,1,
H2,1,
H1,1,
H2,1,
H3,1,
H2,1,
H3,1,
H2,1,
H3,2,
H5,1,
H2,1+1,
H2,1,
H2,1,
H2,1,
H3,2,
H5,1,
H1,1+4+4+4+2,
H1,1,
H2,1,//不盼
H3,1,
H2,1,
H3,1,
H2,1,
H3,1,
H5,2,
H1,1,
H2,1,
H2,1,
H2,1,
H2,1,
H6,2,
H5,2,
M7,2,
H1,2+2,
H1,2,
M7,2,
M7,1,
H1,1+1,
M7,2+1,
M5,2,
M6,4,
H3,2,
H2,4,
P,4,
P,4,
P,4,
M6,1,
M7,1,
M6,1,
M5,1,
M3,2,
M5,1,
M5,1+4+4,
M3,1,
M5,1,
M5,1,
M6,1,
M5,2,
M3,1,
M2,1+4+4,
M3,1,
M3,1,
M2,1,
M1,1,
M2,1,
L6,1,
M1,4,
M1,2,
M2,1,
L6,1,
M1,4,
M1,1,
L6,1,
M1,1,
M1,1,
M1,1,
M1,1,
M5,2,
M6,1,
M3,1+2,
M2,2,
M2,2+1,
M3,1,
M2,2,
M1,2+2,
M6,2,
M5,1,
M3,2,
M2,1+2+1,
M1,2+4+2,
M1,1,
M1,1,
M2,4+2,
M3,2,
M2,2,
M1,2+4+4+4,
0xFF,
};
unsigned int FreqSelect=0,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;//先关计时器延迟5MS然后再打开,中断是用于声音的频率,延时是声音的间隔
}
else
{
TR0=0;
while(1);
}
}
}
void Timer0_Routine() interrupt 1
{ static unsigned int T0Count;//static 用于延长函数生命
if(FreqTable[FreqSelect])
{
TL0 = FreqTable[FreqSelect]%256; //设置定时初值 这里是第一次以后的初值
TH0 = FreqTable[FreqSelect]/256;
Buzzer=!Buzzer;}
}
简单的延时函数(11.0592mhz)
#include<intrins.h>
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
_nop_();
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
也可以使用12MHZ区别不大,将NOP删掉即可
定时器段
#include <REGX52.H>
/**
* @brief 定时器0初始化,1毫秒@11.0592MHZ
* @param 无
* @retval 无
*/
void Timer0Init(void)
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式(按位或)配置第个计时器
TL0 = 0xCD; //设置定时初值
TH0 = 0xD4; //设置定时初值这里只决定第一次的初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1; //这三行是关于中断的配置
EA=1;
PT0=0;
}
以上就是全部内容了,建议不要久听,对听力影响较大。