56Mi3300xFA13Mi6590xFD0AMi13180xFE85Fa3490xFA68Fa6980xFD34Fa13970xFE9ASo3920xFB04So7840xFD82So15680xFEC1La4400xFB90La8800xFDC8La17600xFEE4Si4940xFC0CSi9880xFE06Si19760xFF03
f2控制发声节拍
每个音符的节拍可通过延时一定的时间来实现在具体实现时需要有一个基本的带参延时程序用于主函数根据不同的
音符调用不同的时延。若以十六分之一音符的时长为基本延时
时间则十六分音符只需调用一次延时程序八分音符则需调
用两次延时程序以此类推。
简谱编码
将简谱中的每个音符进行编码每个音符用一个u
sig
edchar字符类型表示简谱可用一个u
sig
edchar字符数组表示。字符的前四位表示音频可以表示0f共十六个音符。本实验中采用了中音区和高音区。中音dosi分别编码为17高音dosi分别编码为8E停顿编为0。字符的后四位表示节拍节拍以十六分音符为单位在本程序中为165ms一拍即四分音符等于4个十六分音符编为4其它的播放时间以此类推。以0xff作为曲谱的结束标志。程序从数组中取出一个数然后分离出高4位得到音调将值赋给定时器0得到音调接着分离出该数的低4位得到节拍。
本实验中播放音乐使用简谱如下
f将其编码成
ucharcodesb定义送别简谱
0x540x320x520x880x640x840x580x540x120x220x340x220x12
0x280x000x00
0x540x320x520x860x720x640x840x580x540x220x320x460xf2
0x180x000x00
0x640x840x880x740x620x720x880x620x720x820x620x620x52
0x320x120x280x000x00
f0x540x320x520x860x720x640x840x580x540x220x320x460xf20x180x000x00
0x540x320x520x880x640x840x580x540x120x220x340x220x120x280x000x00
0x540x320x520x860x720x640x840x580x540x220x320x460xf20x180x000x00
23程序流图及说明
ff主程序流程图
程序代码
i
cludereg52h
defi
eucharu
sig
edchar
defi
eui
tu
sig
edi
t
ui
ta0全局变量控制速度变换
sbitfmP14蜂鸣器控制端口
sbiti
t0P32
sbiti
t1P33
uchartimehtimel用于存放定时器的高8位和低8位
ucharcodesb定义送别简谱
0x540x320x520x880x640x840x580x540x120x220x340x220x120x280x000x00
0x540x320x520x860x720x640x840x580x540x220x320x460xf20x180x000x00
0x640x840x880x740x620x720x880x620x720x820x620x620x520x320x120x280x000x00
0x540x320x520x860x720x640x840x580x540x220x320x460xf20x180x000x00
0x540x320x520x880x640x840x580x540x120x220x340x220x120x280x000x00
0x540x320x520x860x720x640x840x580x540x220x320x460xf20x180x000x00
适合12M的晶振定时器初值表高低8位分开
ucharcodechuzhi
f0xff0xff占位
0xFC0x43中央C调17
0xFC0xad
0xFd0x0a
0xFD0x34
0xFD0x82
0xFD0xc8
0xFE0x06
0xFe0x21高音
0xFe0x56
0xFe0x85
0xFer