当前位置:文档之家› 数字音乐盒的设计与实现

数字音乐盒的设计与实现

716
86
Fa
1397
43
43
Fa#
370
1351
162
Fa#
740
676
81
Fa#
1480
41
41
So
392
1276
153
So
784
638
77
So
1568
38
38
So#
415
1205
145
So#
831
602
72
So#
1661
36
36
La
440
1136
136
La
880
568
68
La
1760
34
34
La#
附录(关键部分程序清单)
#in elude <reg51.h>
#defi ne ucharu nsig nedchar
#defi neuint un sig nedi nt
#define LEDLen 6
xdataunsignedcharOUTBIT _at_0x8002;//位控制口
xdataunsignedcharOUTSEG _at_0x8004;//段控制口
社,20154பைடு நூலகம்
[2]张仁彦,高正中,黄鹤松.单片机原理及应用.北京:机械工业出版社,
2016.3.
[3]付先成,,高恒强,蔡红娟.单片机原理与C语言程序设计.武汉:华中科技大
学出版社,2015.8.
[4]张校珩.单片机C语言编程100例■北京:中国电力出版社,2014.1.
⑸唐颖■单片机综合设计实例与实验■北京:电子工业出版社,2015.1.
0xFE,0xF9, 0xFF,0x16};
codeunsignedcharLEDMAP[] = {//八段管显示码
0x3f, 0x06,0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e,0x79, 0x71
1.2
1.2.1
频率的高低决定了音调的高低。音乐的十二平均率规定:每两个八度音(如 简谱中的中音1和高音1)之间的频率相差一倍。在两个八度音之间又分为十二 个半音。另外,音名A(简谱中的低音6)的频率为440Hz,音名B到C之间、E到F之间为半音,其余为全音。由此可以计算出简谱中从低音1到高音1之间每
在键盘中选择了1就会调用tiger[],则蜂鸣器就会按照tiger数组中存储的 十六进制码产生的频率响起音乐,播放结束后就会继续播放序号为2的歌曲。如
图3.6所示。
图3.6音乐函数流程图
4
“A”按键:播放上一首歌曲
B'按键:播放下一首歌曲
“C'按键:暂停键
时,第五六位显示歌曲的秒钟计时。在键盘中选择“T— “6”按键,就会播放 相应的歌曲,六首歌曲循环播放,若当前播放的是第一首,选择“A”按键播放
ucharplay=0;
ucharflag1=0;
uint flag=0;
void delay1(uint z);〃延时1ms
void delay(uint z);〃延时165ms即十六分音符
void song();
〃简谱音调对应的定时器初值适合11.0592M的晶振
ucharcodechuzhi[]={
加一,并且个位清零;秒钟的十位加到5时,分钟个位加一,并且将秒钟清零, 分钟的十位同理,最后通过缓冲区在数码管中显示。计时函数如图3.5所示。
3
音乐函数song()是使蜂鸣器响起音乐的核心,一共有六首歌曲,分别用
0x01――0x06控制着六首歌曲,通过用switch语句控制判断选择的是哪首歌曲, 选择歌曲的序号后,调用相对应的并且储存了用十六进制数表示歌曲的数组,若
在扫描键盘的过程中,先是扫描哪一个的按键别按下,把第几列记录下来后,
再扫描是哪一行的按键,记录是哪一行;最后根据公式“键值=列x4 +行”, 就能计算出是哪一个按键被按下。如图3.4所示。
3.2.4
为了对歌曲进行计时,所以设计了一个计时函数jishi()。分钟和秒钟分别 用两个数码管来显示,当歌曲响起时开始计时,若秒钟个位加到10时,则十位
上一首歌曲就会播放第六首,若当前播放的是第六首,选择“B'按键播放下一 首歌曲就会播放第一首,选择“C'按键时,歌曲和计时都会暂停,再按一次则 继续播放音乐。
4.2
问题1: 六个数码管中所有的段位都会发生很严重的闪烁现象,导致看不清数码 管显示的数字,但运行的结果是正确的。
解决:经过测试发现,试验箱连错了I/O口,连的是P3.7口,该口的功能是读写, 改成连接P1.1口,闪烁消失。
5
5/8拍
6
1又1/2拍
6
3/4拍
8
2拍
8
1拍
A
2又1/2拍
A
1又1/4拍
C
3拍
C
1又1/2拍
F
3又3/4拍
每个音符使用1个字节,字节的高4位代表音符的高低,低
4位代表音符的
节拍。如果1拍为0.4秒,1/4拍为0.1秒,只要设定延迟时间就可求得节拍的时 间。假设1/4拍的延迟时间为1,则1拍的延迟时间应为4,以此类推。所以只要 求得1/4拍的延迟时间,其余的节拍就是它的倍数。表1.3所示。
利用51单片机的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方法。
此外结束符和休止符可以分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生相应的停顿效果。
例如频率为523Hz,其周期T=1/523=1912us,因此只要令计数器计时956us/1us=956在每次技术956次时将I/O反相,就可得到中音DO(523Hz)。计数脉冲值与频率的关系公式如下:
问题2:运行时数码管计数不稳定,有微弱的闪烁现象。
解决:调整中断时间,将中断一次的时间3ms改成2ms,在1秒内产生500次中
断,数码管变的更稳定 问题3:音乐跑调
解决:音调的产生是根据声音产生的频率,再用公式计算出定时器的初值,计算 错误导致音乐跑调。
参考文献
[1]张毅刚,刘杰.单片机原理及应用(第三版)■哈尔滨:哈尔滨工业大学出版
一首音乐是由许多不同的音符组成的,而每个音符对应着不同频率,这样就 可以利用不同的频率的组合,加以与拍数对应的延时,构成音乐。节拍与节拍码 对照表如表1.2所示。
表1.2节拍与节拍码对照
节拍码
节拍数
节拍码
节拍数
1
174^
1
1/8拍
2
2/4拍
2
1/4拍
3
3/4拍
3
3/8拍
4
1拍
4
2/1拍
5
1又1/4拍
277
1805
217
Do#
554
903
108
Do#
1109
54
54
Re3
294
1701
204
Re
587
852
102
Re
1175
51
51
Re#
311
1608
193
Re#
622
804
97
Re#
1245
48
48
Mi
330
1515
182
Mi
659
759
91
Mi
1318
45
45
Fa
349
1433
172
Fa
698
图2.4键盘电路图
2.3.3数码管
此次课程设计运用了六的数码管,第一个显示了歌曲的序号,第二个是空位, 第三和第四个显示了分钟的计时,第五和第六个显示了秒钟的计时。数码管的主 要作用就是显示出当前程序运行时的现象,数码管的位选位与ULN2003相连后
再接到键盘上,段选位则是连到74HC374译码器上,实验箱的数码管为共阴极, 显示方式为动态显示。由电路图得知,位选信号为1时有效。数码管示意图如图
图2.1系统原理框图
2.2
8051单片机是在课堂上学习的单片机型号,也是这次课程设计的核心器件,
它是8位的单片机,具有品种全、兼容性强、性能价格比高等特点。8051单片机 具有很多的I/O口,其中P2.4、P2.5、P2.6连接74LS138译码器,而译码器则可 以控制片选信号和位选信号;P0的八个I/O口要与译码器74HC374相连,然后在 与键盘连接,从而能确认数码管的段选信号,此次课程设计的位选码为0x8002。
74HC138芯片和74HC573芯片有效,计算出段控制口和位控制口分别为0x8004
和0x8002。流程图如图3.3所示
3.2.3
扫描键盘主要用的是unsigned char GetKey()函数,而且还是用定时器中断 的方法,设置每隔3毫秒中断一次,在一秒中大约会产生中断333次,就是说在 一秒钟扫描键盘333次。
0xff,0xff,//占位停顿
0xFC,0x8E,〃中音1-7 0xFC,0xED,
0xFD,0x43,
0xFD,0x6A,
0xFD,0xB3,
0xFD,0xF3,
0xFE,0x2D, 0xFE,0x47,〃高音1-7
0xFE,0x76,
0xFE,0xA1,
0xFE,0xC7,
0xFE,0xD9,
表1.31/4和1/8节拍的时间设定
曲调值
DELAY
曲调值
DELAY
调4/4
125毫秒
调4/4
62毫秒
相关主题