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

数字音乐盒的设计

电子技术课程设计《数字音乐盒》课程设计报告院(系)名称信息工程学院专业班级10级测控技术与仪器学号*********学生姓名刘祖林指导教师杨全玖目录第一章摘要 (2)第二章概述 (3)第一节单片机总体功能简介 (3)第二节AT89C51芯片功能和硬件 (4)第三节功能键介绍 (6)第三章系统总体方案及硬件设计 (7)第一节系统设计要求 (7)第二节总体设计方案 (7)第三节系统硬件设计 (7)第四节软件设计 (8)第四章程序设计流程图 .......................... 错误!未定义书签。

第五章P ROTEUS功能仿真 (12)总结 ........................................................ 错误!未定义书签。

致谢 . (15)附1原程序代码 (16)附2系统原理图 (22)第一章摘要本设计是基于51系列单片机,蜂鸣器,数码管LED的数字音乐盒设计,通过利用I/o一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演奏各种乐曲(本设计为四首,若有必要,可以增加),可以通过功能键来选择乐曲,暂停,播放,前进,后退等功能。

音乐盒的电路设计过程在硬件与软件方面进行同步。

其中,硬件方面选择内部存储资源丰富的AT89C51单片机,时钟采用12MHZ晶体振荡电路。

软件方面,从分析电路各个功能子模块的功能、流程图设计,在到程序的编写设计均进行了综合的考虑。

编成语言从程序总体设计以及高效性的硬件方面考虑,采用汇编语言进行编写。

在设计的同时对单片机的理论基础和外围扩展知识进行了比较全面复习与准备。

在硬件与软件设计时,没有良好的基础知识和实践经验会受到很大的限制,每项功能实现时需要那种硬件,程序该如何编写,如何调试等,没有一定的基础就不可能很好的实现。

具体实现功能:1、利用I/O一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演奏各种乐曲2、采用LED显示信息3、播放时显示歌曲序号4、可通过功能键选择乐曲,暂停,播放。

第二章概述目前,各种传感器、变送器、控制仪表已经普遍采用单片机应用系统。

它测量、处理、控制功能于一单片机是单片微型机的简称,故又称为微控制器MCU。

通常由单块集成电路芯片组成,内部含有计算机的基本功能部件:中央处理器CPU,存储器和I/O接口电路等。

因此,单片机只要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。

第一节单片机总体功能简介单片机是在工业测控需要背景下而产生的,在一个应用系统中。

按照测控系统的特点和要求,单片机的应用可分为单机应用和多机应用两大类。

我们这次要完成的单片机课程设计就是它的单机应用,下面介绍一下单片机应用领域内的主要内容。

(1)智能产品单片机与传统机械产品相结合,使传统机械产品结构简化,控制智能化,购成新一代机电一体化产品。

目前,利用单片机构成的智能产品已广泛应用于家用电器、办公设备、数控机床、纺织机械、工业设备等行业。

(2)智能仪表目前,各种传感器、变送器、控制仪表已经普遍采用单片机应用系统。

它测量、处理、控制功能于一体,具有各种智能化功能,如存储、数据处理、查找、判断、联网和语音等功能。

单片机构成的智能仪表,能使仪表具有数字化、智能化、多功能化、综合化等优点。

(3)测控技术用于单片机结构的各种工业控制系统中的数据采集系统具有工作稳定可靠、抗干扰能力强的优点。

(4)智能接口在计算机系统,特别是较大型的工业测控系统中,除通用外部设备外,还由许多外部通信、采集、多路分配管理、驱动控制等接口。

这些外部设备与接口如果完全由主机进行管理,势必会造成主机负担过重,运行速度降低,接口的管理水平也不可能提高。

如果用单片机进行接口的控制与管理,单片机与主机可并行加工处理,可以大量降低接口的通信密度,极大的提高了接口控制广利水平。

在一些通用计算机外部设备上,以实现了单片机的键盘管理、打印机控制、硬盘驱动控制等。

第二节AT89C51芯片功能和硬件本系统采用的是51系列的AT89C51单片机进行的计算器设计。

下图为AT89C51单片机的管脚图。

(图1 AT89C51引脚图)VCC:正电源端GND:单片机的接地端XTAL1/XTAL2:片内振荡电路输入/输出端,两端跨接晶体或陶瓷谐振器,与单片机内部反相器构成稳定的自激振荡器。

发出的脉冲直接送入片内定的控制部件RESET:复位端EA/VPP:寻址外部ROM控制端/编程电源输入端。

ALE/PROG:地址锁存允许/编程脉冲输入端。

PSEN:寻址外部程序存储器,选通外部EPROM的端口(OE)。

P0.0~P0.7 P1.0~P1.7 P2.0~P2.7:准双向I/O口。

P3.0~P3.7:具有特定的第二功能(准双向I/O口)。

第三节功能键介绍(图2音乐盒功能键)START: 播放键判断SELECT: 选择键判断PUASE: 停止播放STOP: 停止键判断ORDER: 顺序键判断RAND: 随机键判断第三章系统总体方案及硬件设计第一节系统设计要求音乐盒的可实现功能:1 利用I/O口产生一定的方波,驱动蜂鸣器,发出不同的音调,从而演奏乐曲;2 采用LED 显示信息;3 可通过功能键选择乐曲,暂停,播放。

第二节总体设计方案由于计算器需要比较多的输入输出口,所以选择使用内部存储资源比较的多AT89C51单片机,8位LED动态显示。

扬声器可以用一个准I/O口,采用AT89C51作为运算和控制单元完全满足系统的需要。

第三节系统硬件设计方波电路:51核片内由一个反相放大器构成振荡器,本系统采用内部方式,在XTAL1和XTAL2端外接石英晶体作为定时元件,内部反相放大器自激振荡,产生时钟。

时钟发生器对振荡脉冲二分频。

如下图所示:(图3 时钟发生器)第四节软件设计本设计的流程如下:(图4 系统流程图)先从主程序开始,接着初始化变量及LED接口,然后初始化方波发生器、晶振管,使LED显示信息,就进入了开机状态,等待动作——选择按键,包括播放键、暂停键、停止键,当然也可以选择返回:加入选择的是播放键,LED上就会显示歌曲编号,与此同时演奏相应的乐曲,此时,你就可以用按键控制乐曲的播放了。

第四章程序设计流程图电路图的设计及程序设计是否合理,通过proteus软件进行仿真;若不合理就需要修改,直至符合要求。

(1)软件的使用使用W A VE6000软件的目的是取得源程序的编译文件(2)Proteus软件介绍protues是英国Labcenter公司开发的电路分析与实物仿真软件。

它运行于Windows操作系统上,可以仿真、分析各种模拟器件和集成电路。

Proteus ISIS的工作界面是一种标准的Windows界面,如下图所示包括:标题栏、主菜单、标准工具栏、绘图工具栏、状态栏、对象选择按钮、预览对象方位控制按钮、仿真进程控制按钮预览窗口、对象选择器窗口、图形编辑窗口。

运行Proteus程序后,进入软件的界面。

通过左侧工具栏的P命令,在Pick Devices左侧窗口中选择所需元件的关键字,然后放置元件并调整方向和位置以及参数设置,最后进行连线。

(图5 Proteus界面)第五章Proteus功能仿真下面是几张仿真图,由于本次设计是数字音乐盒,而声音没有仿真图,所以仿真图主要是LCD显示歌曲编号和LED灯的显示。

(图6 LED显示仿真)如图6:LED等全灭:播放没有开始D1亮:选择歌曲D2亮:顺序模式D3亮:随机模式全亮:播放暂停(图7LCD显示仿真)如图7:LCD显示的数字是歌曲的编号。

(图8音乐盒总体仿真图)总结本学期在做课程设计时,对单片机的硬件设计,软件设计掌握的深度不够,但通过次次课程设计,却改变了很多,首先对于硬件电路的工作原理有了进一步的学习,同样就有了进一步的认识;其次软件方面,在程序的设计,程序的调试方面都学到了很多东西,这是第一次自己独立完成课程设计,很有成就感。

在设计过程中我遇到了很多问题,有知识方面的,但也有个人不良习惯方面的,例如在W A VE上编译程序时,出现好几处错误,经仔细检查才知道并不是程序错误,而是自己输入不规范和输错造成的,这就提醒我在设计过程中一定要细心认真的完成每一步骤每一个环节,才能避免不必要的失误。

另外,我觉得只有在一个好的氛围里才能踏下心来做东西,在设计出现问题时,一定要戒躁,脚踏实地,认真看书,仔细分析,仔细调试,就一定会发现错误,克服困难,这是非常重要。

参考文献【1】《单片机原理及应用技术》【2】《MC-51单片机应用技术》【3】《电子制作》【4】《51 系列单片机设计实例》【5】《单片机C51程序设计教程与实验》致谢历时将近两个星期的时间终于将这篇论文写完,在论文的写作过程中遇到了无数的困难和障碍,都在同学和老师的帮助下度过了。

尤其要强烈感谢我的论文指导老师老师,对我进行了无私的指导和帮助,不厌其烦的帮助进行论文的修改和改进。

另外,在校图书馆查找资料的时候,图书馆的老师也给我提供了很多方面的支持与帮助。

在此向帮助和指导过我的各位老师表示最中心的感谢!感谢这篇论文所涉及到的各位学者。

本文引用了数位学者的研究文献,如果没有各位学者的研究成果的帮助和启发,我将很难完成本篇论文的写作。

感谢我的同学和朋友,在我写论文的过程中给予我了很多你问素材,还在论文的撰写和排版灯过程中提供热情的帮助。

由于我的学术水平有限,所写论文难免有不足之处,恳请各位老师和学友批评和指正!附1 原程序代码#include<at89x52.h>#include<stdlib.h>#define K_Order P3_6#define K_Rand P3_7#define K_Start P3_0#define K_Select P3_1#define K_Puase P3_2#define K_Stop P3_3extern void Play_Music(unsigned char music_num); extern void Delay10us(unsigned char tmep);extern void Delay10ms(unsigned char tmep);extern void Delay1s(unsigned char tmep);extern void Press_Start(void);extern void Press_Select(void);extern void Press_Order(void);extern void Press_Rand(void);extern void Press_Puase(void);extern void Press_Stop(void);void music(unsigned int code *Song);static unsigned int count;static unsigned char startflag,selectflag,orderflag,randflag,stopflag,flag,Ledflag;static unsigned char i,k,temp,step,freq,music_num,randnum;unsigned char code *ptr;//LED显示代码,共阳极unsigned char code Seg[4]={ 0xF9,0xA4,0xB0,0x99};//song1八月桂花香unsigned char code Song1[]={0x18,0x30,0x1c,0x20,0x10,0x40,0x1c,0x10,0x18,0x10,0x20,0x10,0x1c,0x10,0x18,0x40,0x1c,0x20,0x20,0x20,0x1c,0x20,0x18,0x20,0x20,0x80,0xff,0x20,0x30,0x1c,0x10,0x18,0x20,0x15,0x20,0x1c,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0xff,0x20,0x20,0x1c,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2b,0x20,0x30,0x20,0x2b,0x40,0x20,0x20,0x1c,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2b,0x20,0x30,0x20,0x2b,0x40,0x20,0x30,0x1c,0x10,0x18,0x20,0x15,0x20,0x1c,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,0x1c,0x10,0x20,0x10,0x1c,0x10,0x20,0x20,0x26,0x20,0x2b,0x20,0x30,0x20,0x2b,0x40,0x20,0x15,0x1f,0x05,0x20,0x10,0x1c,0x10,0x20,0x20,0x26,0x20,0x2b,0x20,0x30,0x20,0x2b,0x40,0x20,0x30,0x1c,0x10,0x18,0x20,0x15,0x20,0x1c,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x30,0x30,0x20,0x30,0x1c,0x10,0x18,0x40,0x1c,0x20,0x20,0x20,0x26,0x40,0x13,0x60,0x18,0x20,0x15,0x40,0x13,0x40,0x18,0x80, 0x00};//song2波斯猫部分unsigned char codeSong2[]={0x40,0x19,0x40,0x19,0x40,0x19,0x4c,0x19,0x4c,0x19,0x48,0x19,0x4c,0x19, 0x40,0x19,0x40,0x19,0x40,0x19,0x4c,0x19,0x4c,0x19,0x48,0x19,0x4c,0x19,0x40,0x19,0x40,0x19,0x40,0x19,0x4c,0x19,0x40,0x19,0x39,0x19,0x33,0x19,0x30,0x19,0x30,0x19,0x33,0x19,0x33,0x19,0x30,0x32,0x30,0x32,0x30,0x32,0x39,0x19,0x40,0x19,0x39,0x19,0x40,0x19,0x4c,0x32,0x4c,0x32,0x39,0x32,0x39,0x32,0x39,0x32,0x40,0x19,0x4c,0x19,0x40,0x19,0x4c,0x19,0x55,0x32,0x55,0x32,0x30,0x32,0x30,0x32,0x30,0x32,0x39,0x19,0x40,0x19,0x39,0x19,0x40,0x19,0x4c,0x32,0x4c,0x32,0x55,0x32,0x39,0x19,0x4c,0x19,0x4c,0x32,0x4c,0x19,0x40,0x19,0x39,0x32,0x39,0x19,0x39,0x32,0x24,0x00,0x00};//song3两只老虎unsigned char code Song3[]={0x60,0x32,0x55,0x32,0x4c,0x32,0x60,0x32,0x60,0x32,0x55,0x32,0x4c,0x32,0x60,0x32,0x4c,0x32,0x48,0x32,0x40,0x32,0x40,0x32,0x4c,0x32,0x48,0x32,0x40,0x32,0x40,0x32,0x40,0x19,0x40,0x0d,0x39,0x0d,0x40,0x19,0x40,0x0d,0x48,0x0d,0x4c,0x32,0x60,0x32,0x40,0x19,0x40,0x0d,0x39,0x0d,0x40,0x19,0x40,0x0d,0x48,0x0d,0x4c,0x32,0x60,0x32,0x60,0x32,0x40,0x32,0x60,0x32,0x60,0x32,0x60,0x32,0x40,0x32,0x60,0x32,0x60,0x32,0x00};//song4兰花草unsigned char code Song4[]={0x72,0x19,0x4c,0x19,0x4c,0x19,0x4c,0x19,0x4c,0x19,0x4c,0x32,0x55,0x19,0x60,0x19,0x55,0x19,0x60,0x19,0x65,0x19,0x72,0x32,0x72,0x32,0x39,0x19,0x39,0x19,0x39,0x19,0x39,0x19,0x39,0x32,0x39,0x32,0x40,0x19,0x97,0x19,0x40,0x19,0x40,0x19,0x48,0x19,0x4c,0x32,0x4c,0x32,0x4c,0x19,0x39,0x19,0x39,0x19,0x40,0x19,0x4c,0x32,0x4c,0x32,0x55,0x19,0x60,0x19,0x55,0x19,0x60,0x19,0x65,0x19,0x72,0x32,0x97,0x19,0x97,0x19,0x60,0x19,0x60,0x19,0x65,0x19,0x72,0x32,0x72,0x32,0x4c,0x19,0x55,0x19,0x60,0x19,0x65,0x19,0x7f,0x19,0x39,0x32,0x39,0x32,0x00};///////////////////////////////-MAIN-///////////////////////////////void main(void){P1=0xff;//初始化设置?SP=0x60; TH0=0xD8; TL0=0xF0; TMOD=0x01;IE=0x83; IP=0x02; music_num=0; startflag=0; flag=0;while(1){ Press_Start();if(startflag==1){ Play_Music(music_num); Delay1s(200); Delay1s(200);}Press_Select();if(selectflag==1){ Delay1s(100); P2=0x0E; if(music_num>=0&&music_num<=3) //选择音乐使其在可选音乐的范围内{ P1=Seg[music_num++];} else music_num=0; Delay1s(100);}Press_Order();if(orderflag==1) { flag=0; while(1){ P2=0x0D; if(K_Start==0||flag==1)//flag指示上次是否播放音乐,如播放过{ if(music_num!=0)//则循环下去,直到有按键.P1=Seg[music_num-1];elseP1=Seg[music_num]; Play_Music(music_num); music_num++; flag=1; }if(music_num==5) music_num=0;Delay1s(100);if(K_Stop==0) break; } }Press_Rand();if(randflag==1){ flag=0; while(1){P2=0x0B;randnum=rand(); music_num=randnum%10;if((music_num>=0&&music_num<4)&&(flag==1||K_Start==0)){ flag=1;if(music_num!=0)P1=Seg[music_num-1]; elseP1=Seg[music_num]; Play_Music(music_num);} Delay1s(200);if(K_Stop==0) break; }}Press_Stop();if(stopflag==1){ P1=0xFF; P2=0xFF; music_num=0;} }while(1) ;}//*----------------子程序区段----------------//包括:按键判断程序、延时程序、中断处理程序、// 音乐播放程序、音乐选择程序//------------------------------------------*///按键判断程序,如果有按键,则相应标志位置1,否则置0void Press_Start(void)//播放键判断{ if(K_Start==0){ Delay10ms(100);if(K_Start==0) startflag=1; }else startflag=0;}void Press_Select(void)//选择键判断{ if(K_Select==0){ Delay10ms(100);if(K_Select==0) selectflag=1; }else selectflag=0;}void Press_Order(void)//顺序键判断{ if(K_Order==0) { Delay10ms(100);if(K_Order==0) orderflag=1;}else orderflag=0;}void Press_Rand(void)//随机键判断{ if(K_Rand==0) { Delay10ms(100);if(K_Rand==0) randflag=1; }else randflag=0;}void Press_Stop(void)//停止键判断{ if(K_Stop==0) { Delay10ms(100);if(K_Stop==0) stopflag=1; }else stopflag=0;}//-----------音乐播放子程序--------------void music(unsigned int code *Song){ ptr=Song;while(*ptr!=0x00){ if(K_Stop==0) Delay10ms(100);if(K_Stop==0)break; freq=*ptr++;if(freq==0xFF)//如果频率常数为0xFF,则休止100ms??Delay1s(10);else{step=*(ptr++); TR0=1;for(i=0;;i++){ P2_4=0;Delay10us(freq);P2_4=1;Delay10us(freq);if(count==step) break; }TR0=0; count=0;} }}//---------------------------------------------//音乐选择程序void Play_Music(unsigned char music_num){ switch(music_num){ case 1: music(&Song1); break;case 2: music(&Song2);break;case 3: music(&Song3); break;case 4: music(&Song4); break;}}//-----------------------------------//------------中断子程序------------- //定时器0中断void Intt0(void) interrupt 1 using 3{ count++; TH0=0xD8; TL0=0xF0;}//外部中断void Int0(void) interrupt 0 using 2{ if(K_Puase==0) { Delay10ms(100);if(K_Puase==0){ Ledflag=P2;while(1) { P2=0x00;Delay1s(100);P2=0x0f;if(K_Stop==0||K_Start==0) break; } P2=Ledflag; } }}//------------------------------------//-----------延时子程序--------------- void Delay10us(unsigned char temp){ unsigned char i,j;for(i=0;i<temp;i++) for(j=0;j<1;j++) ;}void Delay10ms(unsigned char temp){ unsigned char i,j; for(i=0;i<temp;i++) for(j=0;j<12;j++) ;}void Delay1s(unsigned char temp){unsigned char i,j;for(i=0;i<temp;i++)for(j=0;j<10;j++)for(k=0;k<120;k++);}附 2 系统原理图(图9系统原理图)。

相关主题