单片机的可控数字音乐盒设计 专业课程设计

更新时间:2023-05-16 12:17:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

目录

项目概述 ---------------------------------------------- 1 项目要求 ---------------------------------------------- 1 系统原理 ---------------------------------------------- 1 硬件设计 ---------------------------------------------- 4 软件设计 ---------------------------------------------- 6 系统仿真和调试 ---------------------------------------- 7 学习过程的体会 ---------------------------------------- 8 附录1 ------------------------------------------------- 9 附录2 ------------------------------------------------- 18

一、 项目概述

本设计是一个基于AT89C51系列单片机的音乐盒,依据单片机技术原理,

通过硬件电路制作以及软件编译,设计制作出一个多功能音乐盒。该音乐盒主要由按键电路、复位电路、时钟电路以及蜂鸣器组成。使用两个按键控制音乐盒,一个用来切换歌曲。播放歌曲时,蜂鸣器发出某个音调,与之对应的LED亮起。本设计利用KEILC编程软件对音乐盒源程序进行编程并调试,配合PROTEUS仿真软件对硬件进行仿真调试,节约了设计时间。

二、 项目要求

1.利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演奏乐曲

2.可通过功能键选择乐曲,暂停,播放。

三、系统原理

1.芯片AT89C51的介绍

AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压,高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 2.音调的产生

不同的音调对应着不同的物理频率,而若要产生一定频率的声音,我们只需用一定频率的方波来驱动蜂鸣器即可。对于固定频率的产生方法,本系统中用定时器0设置为工作方式1(TMOD=0x01),对不同的音调依据频率装入对应的计数初值,定时器计数完时将输出端取反(编程中采用异或),进而产生对应的方波。具体计算如下:

如对于编码为1的低音SO,其频率为392HZ,我们实验中采用的为12M晶振,因此机器周期为1us,那么该音调对应的计数初值为: 65536-1000000/(2*392)=65536-1276=64270

解释:由于工作方式0中计数器的THO和TL0所有位均用于装载计数初值,因此最大计数值为256*256=65536,周期为1x10s,频率为392HZ,每定时一次对输出

取反,因此计数初值应除以2。以下为所有音调标准频率及其在本设计中的的计数初值表 计数初值表

低音 Do Do﹟ Re Re﹟ Mi Fa Fa﹟ So So﹟ La La﹟ Si

频率 262 277 294 311 330 349 370 392 415 440 464 494

T 1908 1805 1701 1608 1515 1433 1351 1276 1205 1136 1078 1012

参数 229 217 204 193 182 172 162 153 145 136 129 121

中音 Do Do﹟ Re Re﹟ Mi Fa Fa﹟ So So﹟ La La﹟ Si

频率 523 554 587 622 659 698 740 784 831 880 932 988

T 956 903 852 804 759 716 676 638 602 568 536 506

参数 115 108 102 97 91 86 81 77 72 68 64 61

高音 Do Do﹟ Re Re﹟ Mi Fa Fa﹟ So So﹟ La La﹟ Si

频率 1046 1109 1175 1245 1318 1397 1480 1568 1661 1760 1865 1976

T 57 54 51 48 45 43 41 38 36 34 32 30

参数 57 54 51 48 45 43 41 38 36 34 32 30

-6

3.节拍的确定

学习音乐时,每个音符都有对应的节拍,我们唱拍的时候通常叫做打拍子,用来区分音符之间所间隔的时间,因此音符的产生不仅要有频率,还要有节拍。我们知道一共有12中不同的节拍,每一拍的时间都是最短拍的整数倍,例如4/4拍是1/4拍的4倍,因此我们可以确定一个基准的延时时间,然后用它的倍数表示不同的节拍,用一个无符号整数来表示其倍数。具体代码如下

void delay(uint p) { uint j; }

通过此程序,每一拍为107ms,可以实现要求,对于节拍没有固定的时间,也可以通过调节循环初值进行延时修改。

uint k,l; for(l=0;l<p;l++)

for(k=165;k>0;k--)

for(j=0;j<160;j++);

4.音符的编码

由计数初值表可以看到,如果采用将每一个音符的所对应的计数初值都直接编入音乐的码流中,每个码占两个字节,并且不易记忆,因此我们采用将不同音符的

频率写入一个如下所示码表中,通过查表确定计数初值。

uchar code yd[]={

0xff,0xff,//占位 0xFC,0x8E,//中央C调1-7 0xFC,0xED, 0xFD,0x43, 0xFD,0x6A, 0xFD,0xB3, 0xFD,0xF3, 0xFE,0x2D, 0xFE,0x47, 0xFE,0x76, 0xFE,0xA1, 0xFE,0xC7, 0xFE,0xD9, 0xFE,0xF9, 0xFF,0x16 };

编码表如下

简谱 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5

发音 低音SO 低音LA 低音TI 中音DO 中音RE 中音MI 中音FA 中音SO 中音LA 中音TI 高音DO 高音RE 高音MI 高音FA 高音SO

简谱码 1 2 3 4 5 6 7 8 9 A B C D E F

T值 64260 64400 64524 64580 64684 64777 64820 64898 64968 65030 65058 65110 65157 65178 65217

节拍码 1 2 3 4 5 6 8 A C F

节拍数 1/4拍 2/4拍 3/4拍 1拍 1又1/4拍 1又1/2拍

2拍 2又1/2拍

3拍 3又3/4拍

//高八度1-7

对照乐谱编码时,可以查上表进行对应的编码

四、硬件电路

1.电路图

电路参数:

芯片:AT89C51

C1:10uF C3:30pF R2:1KΩ

C2:30pF R1:200Ω 晶振:12MHZ

1、晶振回路:12MHZ晶振电路,其中C1和C2为微调电容 2、复位电路:采用按键电平复位

原理介绍:

电路运行时,通过中断int0和int1向cpu发出中断申请,执行相应中断服务,通过调整各标志位实现相应的功能

五.软件设计

1.主程序流程图(主程序为死循环,在此略去主循环部分,没有结束框)

2、中断服务子程序流程图

外部中断服务0:暂停与继续播放

外部中断服务1:开始、停止、切歌子程序流程图

流程图说明:由于外部中断服务执行与否来取决于外部硬件,并且可能在执行主程序的任何一个时刻发生,因此在此单独列出两个中断服务子程序,执行完之后将自动跳回主程序中继续执行。 3.具体代码见附录

六.仿真调试

1.运行结果

由运行时的电路变化可以看出LS1相连的端口电压不断变化,这是由于定时器产生了驱动电流驱动其发声,当按下与int1相连的按钮时开始唱歌,按与int0相连的按钮时唱歌暂停,再次按下时继续播放,并且无论歌曲是否暂停,如果当前播放不为最后一首音乐,当按下int1相连按钮时系统将播放下一首音乐,如果为最后一首则停止播放,系统恢复至初始化之后状态。

2.程序调试中出现的问题及解决的办法:

(a)编程时要注意,在程序开始时,要写入各定时器中断的入口地址。

(b)编程过程中要注意加注释或分割线,否则,在程序过长时容易变得很乱,

不便于查找或更改。

(c)程序的结构要设计的合理,避免上下乱调用的现象,这样会使程序更加清

晰化。 (d)编程前要加流程图,这样会使思路清晰,例如数字音乐盒的设计思路完全

可以按着MP3的工作方式列写流程图。 LCD计时正常显示的解决办法:

(a)两个定时器同时工作,存在中断时序问题,刚开始时我们把定时器1设定

在方式3,计250us,由于定时中断过于频繁,使CPU负载过大,导致音乐不能正常播放,时间不能正常显示。解决办法:将定时器1设定在工作方式1,16位计数,计50ms,效果有很大改观。但还有问题。

(b)当音乐为全4拍起始时,此时音乐节奏与定时器T1中断频率错开,LCD显

示和音乐播放都会好一些。

(c)另外,在歌曲中,当遇到一个音符发音为4拍,在编曲中为*CH,托因时间

长,当定时器T1此时来中断时,就会对歌曲播放产生影响,若改为发音一拍,中断对歌曲播放影响减弱,但音乐效果变差。

七.体会

一分耕耘,一分收获。只有亲自用实践来验证这句话,在能得其要领。经过这次单片机课程设计,我从一个单片机实践的门外汉,已经越升为略知一二的新手。虽然还有很多有关单片机的应用有待学习,但万变不离其宗,只要深入了解单片的原理,全部知识点,各个细节,一切设计皆有可能。在实验的开始几天,基本上没有收获,不知何从下手,不知所措。为了看得更远,不妨站在前人的肩膀上,我在整体思路模糊的情况下,在网上大量招资粮,各种与电子时钟相关的文章,我阅读了不少。随着涉猎的点滴积累,我对电子时钟的设计方案已经慢慢酝酿而成。有了方向和不少知识储备后,在接下来的几天,几乎每天都有突破,虽然有时只是一句程序的修改或诞生,但那种收获的感觉很暖人心。在课程设计的过程中:遇到的最大的问题就是硬件问题,在自己课程设计的过程中遇到的很多情况下或是导线损坏或是实验箱上的I/O口不能正确的输出。在这一方面,我们所能做的是,每天开始做实验时就要检查所用的导线没有问题及各个I/O接口是否能够正确输出。具体方法如下:把每一根导线连接每个I/O口到发光二极管,上电后每个发光二极管是不是能点亮,按一下复位键后,发光二极管是不是还是继续正确的亮着。在整个课程设计中我懂得了许多东西,也培养了我独立工作的能力,树立了对自己工作能力的信心,相信会对今后的学习工作生活有非常重要的影响。而且大大提高了动手的能力,使我充分体会到了在创造过程中探索的艰难和成功时的喜悦。虽然这个课程设计做的还是有一些遗憾,但是在设计过程中所学到的东西是这次课程设计的最大收获和财富。最后,无论如何都要好好的感谢指导老师的帮助,在整个课程设计过程中,几乎每一个程序的设计成功都离不开老师的指导和帮助。在老师的辛勤指导之下,学到了很多有用的经验和使用的知识。而且还得感谢身边同学的帮助和交流,在互相帮助和交流的过程中能够学到很多很有创意的编程思想,自己也有所提高。

八.附录(代码)

#include"reg51.h" #include"stdio.h"

#define uchar unsigned char #define uint unsigned int

sbit p3_2=P3^3; sbit fout=P2^3; sbit key=P3^7; sbit p0_2=P2^0; //p0_2=0; uchar fout1=0; uint i; uint id=0; uchar t1; uchar t2; uint count=0; uchar S; //寂寞沙洲冷 uchar code S1[]={

0x34,0x62,0x74,0x62,0x74,0x82,0x36, 0x34,0x62,0x74,0x62,0x96,0xa6,

0xb3,0xa1,0x91,0x81,0x72,0x82,0x92,0xa3,0x91,0x81,0x71,0x66, 0x73,0x81,0x71,0x61,0x73,0x81,0x71,0x61, 0x76,0x02,0x71,0x81,0x91,0xa1,0xff};

Uchar code S2[]={0x08,0x08,0x08,0x11,0x11,0x21,0x32,0x31,0x22,0x21,0x22, //自你走后心憔悴

0x21,0x31,0x51,0x52,0x31,0x52,0x61,0x13,0x12, //白色油桐风中纷飞

0x51,0x52,0x31,0x52,0x62,0x13,0x11,0x13,0x32,0x28,0x08, //落花似人有情 这个季节

0x31,0x32,0x31,0x32,0x11,0x21,0x51,0x52,0x51,0x52, //河畔的风放肆拼命地吹

0x51,0x31,0x32,0x31,0x32,0x81,0x72,0x63, //不断拨弄离人的眼泪

0x62,0x71,0x81,0x72,0x61,0x61,0x52,0x31,0x21,0x32,0x51,0x54, //那样浓烈的爱再也无法给

0x22,0x12,0x11,0x12,0x11,0x12,0x12,0x14,0x26,0x32,0x26, //伤感一夜一夜

0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51, //当记忆的线缠绕过往支离破碎

0x02,0x32,0x81,0x81,0x81,0x81,0x62,0x52,0x34, //是慌乱占据了心扉

0x31,0x81,0x81,0x81,0x61,0x91,0x82,

//有花儿伴着蝴蝶

0x51,0x51,0x51,0x51,0x31,0x61,0x53, //孤雁可以双飞

0x21,0x11,0x21,0x11,0x22,0x11,0x21,0x26, //夜深人静独徘徊

0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,0x52, //当幸福恋人寄来红色分享喜悦

0x31,0x31,0x81,0x81,0x81,0x61,0x91,0x81,0x61,0x31,0x56, //闭上双眼难过头也不敢回

0x32,0x32,0x81,0x81,0x81,0x81,0x91,0x81,0x61,0x81,0x61,0x51,0x31,0x51,0x34,

//仍然捡尽寒枝不肯安歇微带着后悔

0x21,0x31,0x51,0x31,0x21,0x11,0x61,0x21,0x16, //寂寞沙洲我该思念谁 0xff};

void song(void); void delay(uint); uchar code yd[]={ 0xff,0xff,//占位 0xFC,0x8E,//中央C调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, 0xFE,0xF9, 0xFF,0x16 };

//#define p3_2 p3^2 void main() { EA=1; p0_2=1; EX0=1; IT0=1; EX1=1;

IT1=1;

TMOD=0x01;//计数器工作方式1 TH0=0; TL0=0;

ET0=1;//允许定时器中断 //delay(6); fout=0; key=0; while(1) { } }

void delay(uint p) { uint j; uint k,l; for(l=0;l<p;l++)

i=0; if(count!=0)

song();

else

delay(5);//延时半秒(495ms)

for(k=165;k>0;k--) for(j=0;j<160;j++);

}

void song() {

uchar jp; uchar d; i=0;

while(count!=0) { switch(count) { case 1:S=S1[i];break; case 2:S=S2[i];break;

}

if(S!=0xff) { d=S/16; jp=S%16; if(d!=0)

{

t1=yd[2*d]; t2=yd[2*d+1]; TR0=1;

}

else

fout=0;

delay(jp); TR0=0; fout=0; i++;

}

else//播放下一首 { fout=0; i=0; count+=1; if(count==3)

count=0;

}

while(id!=0) {

delay(1);

}

}

TR0=0; }

void timer(void) interrupt 1 { TH0=t1; TL0=t2; fout1=fout1^1; fout=fout1; //TR0=1; }

void int1(void) interrupt 2//qiege { i=0; count+=1; if(count==3)

count=1;

id=0; p0_2=1; }

void int0(void) interrupt 0//zanting { TR0=0; fout=0; id=id^1; }

附录二

//千年之恋

0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,0x42,0x34,0x84,0x72,0x82,0x94,0xA8,0x08,

0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62, 0x32,0x31,0x21,0x32,0x82,0x71,0x81,0x71,0x51,0x32,0x22, 0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62, 0x32,0x31,0x21,0x32,0x82,0x83,0x71,0x72,0x02, 0x63,0xA1,0xA2,0x62,0x92,0x82,0x52,

0x31,0x51,0x63,0x51,0x63,0x51,0x63,0x51,0x62,0x82,0x7C,0x02, 0x61,0x71,0x82,0x71,0x62,0xA2,0x71,0x76, 0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36, 0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53, 0x42,0x63,0x83,0x83,0x91,0x91,

0x61,0x71,0x82,0x71,0x62,0x0A2,0x71,0x76, 0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36, 0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53, 0x42,0x82,0x88,0x02,0x74,0x93,0x89, 0xff//结束标志 } //

{0x34,0x62,0x74,0x62,0x74,0x82,0x36, 0x34,0x62,0x74,0x62,0x96,0xa6,

0xb3,0xa1,0x91,0x81,0x72,0x82,0x92,0xa3,0x91,0x81,0x71,0x66,

0x73,0x81,0x71,0x61,0x73,0x81,0x71,0x61,0x76,0x02,0x71,0x81,0x91,0xa1, 0xc2,0xb3,0x61,0xc2,0xb4,0xb2,0xa3,0x61,0xb2,0xa4,

0xa2,0x93,0x71,0xa2,0x93,0x71,0x81,0x71,0x81,0x91,0xa2,0xa6, 0xc2,0xb3,0x61,0xc2,0xb4,0xb2,0xa3,0x61,0xb2,0xa4, 0xa2,0x93,0x71,0xa2,0x93,0x71,0x66,0x66, 0xff}

注:音乐《寂寞沙洲冷》和《千年之恋》来自互联网

本文来源:https://www.bwwdw.com/article/bgc4.html

Top