单片机演奏曲子频率不对

问题遇到的现象和发生背景

想编一首2/4拍的曲子,跟b站江科大学了蜂鸣器编曲,但是编出来的音乐好像不太对,音不太准,我怀疑可能是频率搞错了,但是不知道怎么改,还有不知道不同的音符连音在代码中怎么写

问题相关代码,请勿粘贴截图

#include
#include "Delay.h"
#include "Timer0.h"

//蜂鸣器端口定义
sbit Buzzer=P2^5;

//播放速度,值为四分音符的时长(ms)
#define SPEED 500

//音符与索引对应表,P:休止符,L:低音,M:中音,H:高音,下划线:升半音符号#
#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

//索引与频率对照表
unsigned int FreqTable[]={
0,
63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,
64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,
65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283,
};

//乐谱
unsigned char code Music[]={
//音符,时值,

//1 前奏

// P, 3,
// M1, 1/2,
// M2, 1/2,
//
// M3, 1,
// M2, 1,
// M1, 1,
// M2, 1,
// M3, 3,
// M4,1/2,
// M3,1/2,
//
// M2, 1,
// M1, 1,
// L7, 1,
// M1, 1,
// M2, 3,
// L6, 1/2,
// L7, 1/2,
//
// M1, 1,
// L7, 1,
// L6, 1,
// L7, 1,
// M1, 2,
// M1, 1,
// M1, 1,
//
// L7, 2,
// L6, 2,
// L5, 4,
//
// L6, 1,
// L5, 1,
// L4, 1,
// L5, 1,
// L7, 1,
// M1, 1,
// L7, 1,
// L6, 1,
//
// M4, 3,
// M3, 1,
// M1, 2,
// M2, 2,
//
// M1, 4,
// M1, 2,
// M4, 2,
//
// M3, 8,

//承认不勇敢,你能不能别离开
M3, 2,
M5, 1,
M5, 2,
M6, 2,
M5, 1,

M5, 4,
P,  2,
M6, 1,
M7, 1,

H1, 2,
M7, 1,
H1, 3,
M3, 1,
M5, 9,

// //很多爱不能重来
// M6, 2,
// H3, 1,
// H2, 3,
// H1, 1,
// M7, 3,
// M6, 1,
// M5, 5,
//
// //,我应该释怀
// M4, 2,
// M5, 1,
// M6, 3,
// M3, 1,
// M2, 9,
//
// //在街头徘徊,下雨时为你撑伞
// M3, 2,
// M5, 1,
// M5, 2,
// M6, 2,
// M5, 1,
//
// M5, 4,
// P, 2,
// M6, 1,
// M7, 1,
//
// H1, 2,
// M7, 1,
// H1, 3,
// M3, 1,
// M5, 9,
//
// //对你的爱成阻碍
// M6, 2,
// H3, 1,
// H2, 3,
// H1, 1,
// M7, 3,
// M5, 1,
// H1, 5,
//
// //祝福你愉快
// H4, 2,
// H3, 2,
// H1, 1,
// H1, 1,
// M7, 1,
// H1, 9,
//
// //窗外的天气,像你心忐忑不定,如果这是结局,我希望你是真的满意
// H3, 2,
// M6, 2,
// H3, 1,
// H3, 2,
// H2, 1,
//
// H2, 4,
// P, 2,
// M7, 1,
// H1, 1,
//
// H2, 2,
// M5, 2,
// H2, 2,
// H2, 1,
// H1_,5,
// P, 2,
// M6, 1,
// M7, 1,
//
// H1, 2,
// M6, 1,
// H1, 2,
// H2, 3,
//
// H3, 2,
// H2, 1,
// H2, 1,
// H1, 1,
// H1, 3,
// H4, 2,
// H3, 1,
// H5, 3,
// H1, 1,
// H2, 9,
//
// //休止
// P, 4,
// P, 4,
//
// //你就是我的小星星
// H3, 4,
// H3, 1,
// H3, 1,
// H2, 1,
// H1, 1,
//
// H2, 2,
// H5, 2,
// H5, 4,
//
// //挂在那天上放光明,我已经决定要爱你
// H1, 4,
// H1, 1,
// H1, 1,
// H1, 1,
// M6, 1,
//
// M7, 2,
// H3, 2,
// H3, 2,
// M5, 2,
//
// M6, 4,
// H6, 2,
// H5, 1,
// H4, 1,
//
// H3, 2,
// H2, 1,
// H1, 1,
// H1, 4,
//
// //就不会轻易放弃
// M6, 1,
// H1, 1,
// H2, 1,
// H5, 2,
// H2, 1,
// H1, 1,
// H2, 9,
//
// //海上流浪的许愿瓶
// H3, 4,
// H3, 1,
// H3, 1,
// H2, 1,
// H1, 1,
//
// H2, 2,
// H5, 2,
// H5, 4,
//
// //每个心愿都是为你,就算不能够在一起
// H1, 4,
// H1, 1,
// H1, 1,
// H1, 1,
// M6, 1,
//
// M7, 2,
// H3, 2,
// H3, 2,
// M5, 2,
//
// M6, 4,
// H6, 2,
// H5, 1,
// H4, 1,
//
// H3, 2,
// H2, 1,
// H1, 1,
// H1, 4,
//
// //我还是为你担心
// M6, 1,
// H1, 1,
// H2, 1,
// H5, 2,
// M5, 1,
// H2, 2,
//
// H1, 8,
//
// //间奏
// M2, 1,
// M1, 1,
// L7, 1,
// M1, 1,
// M2, 3,
// L6, 1/2,
// L7, 1/2,
//
// M1, 1,
// L7, 1,
// L6, 1,
// L7, 1,
// M1, 2,
// M1, 1,
// M1, 1,
//
// L7, 2,
// L6, 2,
// L5, 4,
//
// L6, 1,
// L5, 1,
// L4, 1,
// L5, 1,
// L7, 1,
// M1, 1,
// L7, 1,
// L6, 1,
//
// M4, 3,
// M3, 1,
// M1, 2,
// M2, 2,
//
// M1, 4,
// M1, 2,
// M4, 2,
//
// M3, 8,
//
// //把悲伤写成协奏曲
// H3, 4,
// H3, 1,
// H3, 1,
// H2, 1,
// H1, 1,
//
// H2, 2,
// H5, 2,
// H5, 4,
//
// //在角落里为你弹琴,就算你可能听不清
// H1, 4,
// H1, 1,
// H1, 1,
// H1, 1,
// M6, 1,
//
// M7, 2,
// H3, 2,
// H3, 2,
// M5, 2,
//
// M6, 4,
// H6, 2,
// H5, 1,
// H4, 1,
//
// H3, 2,
// H2, 1,
// H1, 1,
// H1, 4,
// //也代表我的心意
// M6, 1,
// H1, 1,
// H2, 1,
// H5, 2,
// H2, 1,
// H1, 1,
// H2, 9,
// //爱不一定要很甜蜜
// H3, 4,
// H3, 1,
// H3, 1,
// H2, 1,
// H1, 1,
//
// H2, 2,
// H5, 2,
// H5, 4,
// //说山盟海誓的言语,只要那幸福在心底
// H1, 4,
// H1, 1,
// H1, 1,
// H1, 1,
// M6, 1,
//
// M7, 2,
// H3, 2,
// H3, 2,
// M5, 2,
//
// M6, 4,
// H6, 2,
// H5, 1,
// H4, 1,
//
// H3, 2,
// H2, 1,
// H1, 1,
// H1, 4,
//
// //哪怕我一人演戏
// M6, 1,
// H1, 1,
// H2, 1,
// H5, 2,
// M5, 1,
// H2, 2,
//
// H1, 8,
//
// //间奏
// M2, 1,
// M1, 1,
// L7, 1,
// M1, 1,
// M2, 3,
// L6, 1/2,
// L7, 1/2,
//
// M1, 1,
// L7, 1,
// L6, 1,
// L7, 1,
// M1, 2,
// M1, 1,
// M1, 1,
//
// L7, 2,
// L6, 2,
// L5, 4,
//
// L6, 1,
// L5, 1,
// L4, 1,
// L5, 1,
// L7, 1,
// M1, 1,
// L7, 1,
// L6, 1,
//
// M4, 3,
// M3, 1,
// M1, 2,
// M2, 2,
//
// M1, 4,
// M1, 2,
// M4, 2,
//
// M3, 8,
// //间奏2
// M2, 1,
// M1, 1,
// L7, 1,
// M1, 1,
// M2, 3,
// L6, 1/2,
// L7, 1/2,
//
// M1, 1,
// L7, 1,
// L6, 1,
// L7, 1,
// M1, 2,
// M1, 1,
// M1, 1,
//
// L7, 2,
// L6, 2,
// L5, 2,
// //其实每个人的心里
// M5, 2,
//
// M6, 4,
// H6, 2,
// H5, 1,
// H4, 1,
//
// H5, 2,
// H3, 1,
// H2, 1,
// H1, 4,
//
// //都有一颗小星星
// M6, 1,
// H1, 1,
// H2, 1,
// H5, 2,
// M5, 1,
// H2, 2,
//
// H1, 8,

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;
// while(1);
// }

}

}

void Timer0_Routine() interrupt 1
{
if(FreqTable[FreqSelect]) //如果不是休止符
{
/取对应频率值的重装载值到定时器/
TL0 = FreqTable[FreqSelect]%256; //设置定时初值
TH0 = FreqTable[FreqSelect]/256; //设置定时初值
Buzzer=!Buzzer; //翻转蜂鸣器IO口
}
}

运行结果及报错内容

音不太准,感觉有点快,还有连音符号的地方不知道怎么写

我的解答思路和尝试过的方法

感觉有可能是频率不对

我想要达到的结果

演奏如图所示的音乐

img

1.每个声调到底什么频率,这是公开的,调音师在调音的时候都需要用到的
上网一搜就有
2.你用电子发音,不好发连音的
乐器发音能发连音的也只有弦乐,因为弦长是连续的
长号也没问题
而像钢琴之类的乐器,它能发出的音频都是固定的,是没办法从一个音连续变成另一个音的

首先可以仔细检查一下pwm用的定时器的参数,去找站里有几篇博客写了pwm输出频率的计算公式,注意时钟源的参数。
关于连音,刻意把音头音量调低一下(把音头藏),然后回调到前一个音的音量,听起来应该会像一点。