单片机音乐盒课程设计DOC.docx
《单片机音乐盒课程设计DOC.docx》由会员分享,可在线阅读,更多相关《单片机音乐盒课程设计DOC.docx(17页珍藏版)》请在冰豆网上搜索。
![单片机音乐盒课程设计DOC.docx](https://file1.bdocx.com/fileroot1/2022-11/26/077a5e3a-847b-48be-9443-e5ffca479045/077a5e3a-847b-48be-9443-e5ffca4790451.gif)
单片机音乐盒课程设计DOC
51单片机的电子音乐盒的设计
班级:
自动化112202H
姓名:
王秀芳
学号:
201122060222
前言
随着科技越来越发达,单片机技术也越来越纯熟,单片机的应用也越来越广泛,可以说几乎很难找到哪个领域没有单片机的踪迹。
如今,单片机在各个领域都起着至关重要的作用[1]。
单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
随着人类社会的发展,人们对于视听方面的享受提出了更高的要求。
而传统的音乐盒大部分是机械型的,体积庞大,而且沉重,发音单调,且不悦耳,不能实现大批量的生产,所以很难满足当代人们的需求。
但是本文设计的数字音乐盒是以单片机为核心元件的数字音乐盒。
单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点。
因此该数字音乐盒也就具有体积小,重量轻,能演奏各种各样的音乐,功能多,外观绚丽多彩,使用非常方便等诸多优点。
而且具有一定的开发价值。
1设计目的和要求
1.1设计目的
(1)通过设计,查阅相关资料,掌握如何利用单片机设计产品,同时了解与单片机有关的软件模拟器的使用及取字模块软件的使用方法。
(2)通过本课程设计巩固并扩展单片机课程的基本概念、基本理论、分析方法和实现方法。
结合Proteus和Keil软件等,学习单片机产品的设计方法,有效地将理论和实际紧密结合,培养创新思维和设计能力,增强软件编程实现能力和解决实际问题的能力。
(3)学习Proteus软件,掌握Proteus中各种芯片的功能以及模拟。
由于Proteus提供了实验室无法相比的大量的元器件库,提供了修改电路设计的灵活性、提供了实验室在数量、质量上难以相比的虚拟仪器、仪表,因而也提供了培养实践精神、创造精神的平台。
1.2设计要求
(1)利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演乐曲(内存四首乐曲);
(2)用LCD显示歌曲序号和歌曲名字;
(3)可通过功能键进行选择歌曲和暂停的操作。
2、硬件电路设计
2.1总体方案设计
图1总体方案图
以AT89C51为核心,通过单片机的定时器产生一定长度的方波,方波脉冲驱动蜂鸣器发声。
要产生音频脉冲,只需算出某一音频的周期(1/音频),然后取半周期的时间定时。
利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O口反相,就可在I/O脚上得到此频率的脉冲。
当键盘有键按下时,判断键值,启动计数器T0,产生一定频率的脉冲,驱动蜂鸣器,放出乐曲。
同时在LCD显示歌曲序号和歌曲名称。
2.2器件的选择
2.2.1单片机的选择
随着当代单片机技术的突飞猛进,单片机的功能也越来越强大,主要包括:
(1)单片机集成度高;
(2)系统结构简单,使用方便,实现模块化;
(3)单片机可靠性高,处理功能强,速度快;
(4)低电压,低功耗,便于生产便携式产品;
(5)控制功能强大。
单片机型号的选择是根据控制系统的目标、功能、可靠性、性价比、精度和速度等来决定的。
根据本课题的实际情况,单片机型号的选择主要从以下两点考虑;一是要有较强的抗干扰能力。
二是要有较高的性价比。
由于51系列在我国使用最广,且该系列的资料和能够兼容的外围芯片也比较多,特别是ATMEL公司89C系列单片机,其典型产品AT89C51单片机,具有较高的性能价格比。
故本系统采用ATMEL公司生产的AT89C51单片机作为电子音乐盒的核心部件,AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4kbytes的可反复擦写的只读程序存储器(PEROM)和128bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89C51单片机可提供许多高性价比的应用场合,可灵活应用于各种控制领域。
所以本次设计采用的是AT89C51单片机,这是一款性价比非常高的单片机。
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器。
俗称单片机。
如图2:
图2AT89C51单片机实物图
引脚功能:
P0.0-P0.7:
为一个8位漏级开路双向I/O口;
P1.0-P1.7:
是一个内部提供上拉电阻的8位双向I/O口;
P2.0-P2.7:
为一个内部上拉电阻的8位双向I/O口;
P3.0-P3.7:
管脚是8个带内部上拉电阻的双向I/O口;
P3.0:
RXD(串行输入口);
P3.1:
TXD(串行输出口);
P3.2:
INT0(外部中断0);
P3.3:
INT1(外部中断1);
P3.4:
T0(记时器0外部输入);
P3.6:
WR(外部数据存储器写选通);
P3.7:
RD(外部数据存储器读选通);
EA:
当EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,EA将内部锁定为RESET;当EA端保持高电平时,此间内部程序存储器;
P3.5:
T1(记时器1外部输入);
ALE:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节;
PRST:
复位输入;
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入;
XTAL2:
来自反向振荡器的输出;
SEN:
外部程序存储器的选通信号。
2.2.2LCD1602简介
LCD液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16×1,16×2,20×2和40×2行等的模块。
LCD1602分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图2所示:
图3LCD尺寸图
1602LCD主要技术参数:
显示容量:
16×2个字符;
芯片工作电压:
4.5—5.5V;
工作电流:
2.0mA(5.0V);
模块最佳工作电压:
5.0V;
字符尺寸:
2.95×4.35(W×H)mm。
引脚功能说明
LCD1602采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表1所示。
表1引脚接口说明表
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
数据
3
VL
液晶显示偏压
11
D4
数据
4
RS
数据/命令选择
12
D5
数据
5
R/W
读/写选择
13
D6
数据
6
E
使能信号
14
D7
数据
7
D0
数据
15
BLA
背光源正极
8
D1
数据
16
BLK
背光源负极
第1脚:
VSS为地电源。
第2脚:
VDD接5V正电源。
第3脚:
VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
背光源正极。
第16脚:
背光源负极。
1602液晶模块内部的控制器共有11条控制指令,如表2所示:
表2控制命令表
序号
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清显示
0
0
0
0
0
0
0
0
0
1
2
光标返回
0
0
0
0
0
0
0
0
1
*
3
置输入模式
0
0
0
0
0
0
0
1
I/D
S
4
显示开/关控制
0
0
0
0
0
0
1
D
C
B
5
光标或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符发生存贮器地址
0
0
0
1
字符发生存贮器地址
8
置数据存贮器地址
0
0
1
显示数据存贮器地址
9
读忙标志或地址
0
1
BF
计数器地址
10
写数到CGRAM或DDRAM)
1
0
要写的数据内容
11
从CGRAM或DDRAM读数
1
1
读出的数据内容
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
(说明:
1为高电平、0为低电平)
指令1:
清显示,指令码01H,光标复位到地址00H位置。
指令2:
光标复位,光标返回到地址00H。
指令3:
光标和显示模式设置I/D:
光标移动方向,高电平右移,低电平左移S:
屏幕上所有文字是否左移或者右移。
高电平表示有效,低电平则无效。
指令4:
显示开关控制。
D:
控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:
控制光标的开与关,高电平表示有光标,低电平表示无光标B:
控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:
光标或显示移位S/C:
高电平时移动显示的文字,低电平时移动光标。
指令6:
功能设置命令DL:
高电平时为4位总线,低电平时为8位总线N:
低电平时为单行显示,高电平时双行显示F:
低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:
字符发生器RAM地址设置。
指令8:
DDRAM地址设置。
指令9:
读忙信号和光标地址BF:
为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:
写数据。
指令11:
读数据。
与HD44780相兼容的芯片时序表如下:
表3芯片时序图
读状态
输入
RS=L,R/W=H,E=H
输出
D0—D7=状态字
写指令
输入
RS=L,R/W=L,D0—D7=指令码,E=高脉冲
输出
无
读数据
输入
RS=H,R/W=H,E=H
输出
D0—D7=数据
写数据
输入
RS=H,R/W=L,D0—D7=数据,E=高脉冲
输出
无
2.3单元电路设计
2.3.1晶振电路
单片机需要一个时间基准来为各种操作提供秩序,此电路叫时钟电路,采用不同的接线方式可以获得不同时钟电路,有内部时钟电路和外部时钟电路,如图4.3所示,外部时钟电路会使电路复杂,故采用的是内部时钟电路。
时钟电路在单片机的外部通过XTAL1,XTAL2这两个引脚跨接晶体振荡器和微调电容,构成稳定的自激振荡器.本系统采用的为12MHz的晶振,一个机器周期为1us,C1,C2为30uF。
2.3.2复位电路
复位电路的基本功能是:
系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。
为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。
复位电路分为上电自动复位和按键手动复位,如图3所示。
RST引脚是复位信号的输入端,复位信号是高电平有效.这次采用的是手动复位,复位通过电容C3,C4和电阻R1,R2来实现,按键手动复位是图中复位键来实现的。
图4晶振与复位电路
2.3.3键盘部分
键盘是由一组按压式或触摸式开关构成的阵列,是一种常用的输入设备。
键盘可分为编码式键盘和非编码式键盘两种。
1.编码键盘通过硬件电路产生被按按键的键码,这种键盘所需程序简单,但硬件电路复杂、价格昂贵通常不被单片机系统采用。
2.非编码键盘常用一些按键排列成行列矩阵,其硬件逻辑与按键编码不存在严格的对应关系,而要由所用的程序来决定。
非编码键盘的硬件接口简单,但是要占用较多的CPU时间,通常采用可编程键盘管理芯片来克服这个缺点。
本设计使用两种按键,一种是按键式非编码键盘和轻触式非编码开关。
图5键盘电路
2.3.4LCD显示电路
LCD的8根数据线与P1口相连,RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
R/W为读写信号线,RS与P2.0相连,由P2.0控制LCD的写指令或写数据操作。
R/W与P2.1相连,由P2.1决定是读操作还是写操作。
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
E端与P2.2相连。
图6LCD显示电路
2.3.5蜂鸣器部分
一般所指的蜂鸣器是以压电陶瓷为主要元件的。
压电陶瓷是一类有将压力与电流相互转换能力的特殊陶瓷。
这种能力缘于其特殊的晶体结构。
当压电陶瓷在一定方向上受到一个压力使其晶体结构发生形变时,它就会在内部产生一个电流,并且电流的变化与压力的变化密切相关。
反之亦然。
所以利用这一特性,在压电陶瓷上通过一定频率的电流,就会引起压电陶瓷微小形变,这一形变带动空气发生振动,如果频率适当,就可以被人耳所听见,也就是产生了蜂鸣声。
由于蜂鸣器的工作电流一般比较大,以致于单片机的I/O口是无法直接驱动的,所以要利用放大电路来驱动,一般使用三极管来放大电流就可以了。
图6蜂鸣器电路
2.4整体电路
图7整体电路
3.软件设计
3.1主程序流程图
图8主程序流程图
3.2主程序
main()
{uinti;
k=8;
init();
for(i=0;i<15;i++)
{
WriteData(tab[i]);//LCD写数据函数写第一行
mydelay(50);
}
mydelay(1000);
WriteCMD(0x80+0x40+2);//将指针设到第二行空两字符
for(i=0;i<6;i++){
WriteData(tab1[i]);
mydelay(50);}
InitialSound();//发音初始化程序
while
(1)
{Getch();//扫描键盘,获得键值
if(k==0)//若键值为0
{uinti;
init();
for(i=0;i<10;i++){
WriteData(tab2[i]);//写第一首歌序号
mydelay(50);}
mydelay(1000);
WriteCMD(0x80+0x40);//转到第二行
for(i=0;i<9;i++)
{WriteData(tab3[i]);//写歌名
mydelay(50);}
Play(Music_Girl,0,3,360);//播放第一首歌
Delay1ms(500);
break;
}
elseif(k==1)//若键值为1
{uinti;
init();
for(i=0;i<11;i++)
{WriteData(tab4[i]);//写第二首歌序号
mydelay(50);}
mydelay(1000);
WriteCMD(0x80+0x40);//转到第二行
for(i=0;i<11;i++)
{WriteData(tab5[i]);//写歌名
mydelay(50);}
Play(Music_Jingle,0,3,360);//播放第二首歌
Delay1ms(500);
break;
}
elseif(k==2)//若键值为2
{uinti;
init();
for(i=0;i<10;i++)
{WriteData(tab6[i]);//写第三首歌序号
mydelay(50);}
mydelay(1000);
//WriteCMD(0x01);
WriteCMD(0x80+0x40);//转到第二行
for(i=0;i<6;i++)
{
WriteData(tab7[i]);//写歌名
mydelay(50);}
Play(Music_Two,0,3,360);//播放第三首歌
Delay1ms(500);
break;
}
elseif(k==3)//若键值为3
{uinti;
init();
for(i=0;i<10;i++)
{WriteData(tab8[i]);//写第四首歌序号
mydelay(50);}
mydelay(1000);
WriteCMD(0x80+0x40);//转到第二行
for(i=0;i<6;i++)
{WriteData(tab9[i]);//写歌名
mydelay(50);}
Play(Music_Four,0,3,360);//播放第三首歌
Delay1ms(500);
break;
}
}