电子科技大学
实习总结报告
实习类型 生产实习
实习单位 电子科学学院实习基地
实习起止时间 202X年X月X日至202X年X月X日
指导教师
所在院(系) 电子科学学院
班 级 电信12-3班
学生姓名
学 号
202X年 X 月XX日
音乐播放器设计
一、课题目的
1、设计目的及意义
(1)设计目的及意义
1)掌握51系列单片机的基本硬件结构及工作原理;
2)掌握51系列单片机的汇编语言及基本程序设计方法;
3)学习并掌握使用51系列单片机开发控制系统的基本步骤及方法。
(2)设计要求
单片机控制音乐播放器主要用于玩具的音乐播放和家用电器的报警提示音等方面。其设计要求如下:
采用蜂鸣器播放音乐;
51系列单片机控制整个系统工作;
至少能够播放5首音乐;
2、总体设计方案
(1)单片机开发板原理及各部分功能说明
单片机有很多的特点,主要表现在:体积小、功耗低、价格廉、控制功能强、应用现场环境恶劣等等。本设计核心采用了AT89C52单片机89C52芯片为40引脚双列直插封装,单一的+5V电源,它具有3个可编程I/O口,其中个2个口(A和B)为8位口,1个口(C)为6为口。此外还有256单元的RAM和1个14位计数结构的定时器/计数器。
1)89c52的主要性能:
①8位微处理器和控制器。
②内含一个一位布尔运算处理器,可直接对数据的位进行操作和运算,特别适用于逻辑控制。
③内部含有4KB的程序ROM。
④2个16位的计数/定时器。
⑤内部时钟振荡器。
⑥全双工方式的串行接口(UART)。
⑦两极中断优先权的6个中断源/5个中断矢量的中断逻辑。
2)89C52型号功能介绍:
VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作3 输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
管脚 备选功能
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(记时器0外部输入)
P3.5 T1(记时器1外部输入)
P3.6 /WR(外部数据存储器写选通)
P3.7 /RD(外部数据存储器读选通)
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
/EA / VPP:当/EA保持低电平时,则在此期间外部程序存储器 (0000H-FFFFH),不管是否有内部程序存储器。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
(2)音乐播放器设计
1)基本原理简述
声音是通过振动产生的。单片机对某一引脚以一定的频率循环置1置0,该引脚便产生一定频率的方波,方波通过放大,作用于一定的物理实件(扬声器),就产生了一定频率的声音。若改变输出方波的频率,产生的声音随之改变。通过控制输出方波的时间长短,声音的长短也可以得到控制,因此,根据乐谱,以类似的音及同样的节拍,单片机就可以产生电子音乐。音乐的播放模式及选择可以通过按键的输入得以实现。
方波的产生由定时器控制。定时器T0工作在定时方式1,改变TH0及TL0,产生不同的音频频率。必须考虑到中断响应时间的影响,尤其在高音部分,若忽略中断响应时间,会使音频频率比标准值低几十Hz,相当于1/4音程,很容易听出来,对低音部分影响不大。一般中断响应时间为3~6个机器周期,经过反复试验取5个机器周期作为校正最为恰当。另外,为避免T1中断可能引起杂音,应将定时器T0中断设为高优先级。这样编写出来的程序播放的音与标准音叉进行差频校音,非常准确和谐。
音乐播放器的基本硬件电路有六部分组成:单片机、时钟与复位电路、选择按键输入电路、音频发生器、音频放大器和扬声器。
利用单片机内部定时器/计数器T0与P3.0引脚配合,构成音频发生器,与外置电路组成音频放大器,驱动扬声器输出。选择按键通过P3.2 和P3.3引脚接入,也可以工作在查询方式,也可以工作在中断方式。
2)总体电路设计
图1-1 总体电路图
3)晶振时间电路设计
晶振电路由两个30pF的电容和一个12MHz的晶体振荡器组成。晶振电路如图所示。节点1与单片机的XTAL2相连接,节点2与单片机的XTAL1相连接,从而为单片机提供时间信号,为音乐的播放节拍控制提供基本时间单位:当晶体振荡频率为12MHz,定时器工作在方式1下时,若各音阶相对应的定时器计数初值为X。则可根据下式计算X:1/(f/2)=(216-X)*12/(12*106)。
图1-2 晶振电路
4)控制电路设计
控制电路中,按键K1与P3.2相连。当电键按下时接口接低电平,实现对音乐播放器的控制,可以实现歌曲切换操作。复位电路如图所示:
图1-3 控制电路
5)输出电路设计
发声电路由蜂鸣器连接P2.4接口实现音乐的输出,由控制电路发出操作指令后,单片机调用相应程序,并将音乐信号由P2.4口输出,通过驱动蜂鸣器发出美妙的音乐。输出电路如图所示:
图1-4 输出电路
(3)音调和节拍的产生
音符及定时器初始值:例如:中音1(do)的音频=523Hz,周期T=1/523s=1912us
定时器/计数器0的定时时间为:T/2=1912/2=956us。定时器956us的计数值=定时时间/机器周期(12MHz晶振)=956us/1us=956。装入T0计数器初始值为65536-956=64580(0xFC44)将0xFC44装入T0寄存器中(TH0装高八位即TH0=0xFC;TL0装低八位即TL=0x44),启动T0工作后,每计数956次将产生溢出中断,进入中断服务,每次对P1.0引脚的输出取反,就可得到中音do(523Hz)的音符频率。依此产生其他的不同音符,以下是给出四个八度的28个频率数据编码
音阶频率高八位数据code unsigned char FREQH[]={0xF2,0xF3,0xF5,0xF5, 0xF6,0xF7,0xF8,0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,};//音阶频率的低八位数据code unsigned char FREQL[]={0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6, 0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,0xEE,0x44,0x6B,0xB4,0xF4,0x2D,0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,};
音乐中的节拍用延时时间产生。例如:1拍=0.4s,1/2=0.2s,以此类推。只要求出1/2拍的延时时间,其余节拍是他的倍数就行了。
(4)乐理知识
音符名称
写法
时值
全音符
5---
四拍
二分音符
5-
二拍
四分音符
5
一拍
八分音符
5
-
半拍
十六分音符
5
=
四分之一拍
三十二分音符
5
≡
八分之一拍
表1-1 音长
二、软件编程
软件开发是产生音乐的重要部分,音乐各音符所对应的频率和音乐的节拍都是通过软件的设计来实现的,软件开发的好坏直接决定了产生的音乐是否正确。以下是主程序流程图:
N
Y
再次按键
图2-1
具体程序设计:
#include
sbit speaker=P2^4;
unsigned char timer0h,timer0l,time;
sbit K1=P3^2;
sbit K2=P3^3;
unsigned char K1num=0,K2num=0;
bit flag=0;
//NOKIA铃声
code unsigned char music1[42]={5,3,1,4,3,1,6,2,1,7,2,1,4,3,1,
3,3,1,4,2,1,5,2,1,2,3,1,1,3,1,
3,2,1,5,2,1,1,3,2,0,0,0
};
//手写的从前
code unsigned char music2[288] = {
5,2,1,2,3,1,1,3,1,5,2,1,2,3,2,1,3,1,5,2,1,
2,3,1,2,3,1,1,3,1,3,3,2,2,3,1,1,3,1,5,2,1,
2,3,2,1,3,1,5,2,1,2,3,1,2,3,1,1,3,1,3,3,2,
1,3,1,3,3,1,5,3,1,6,3,2,3,3,2,2,3,2,1,3,2,
7,2,1,1,3,1,2,3,1,1,3,1,6,2,1,1,3,1,5,2,1,
5,3,1,4,3,1,3,3,1,2,3,1,6,2,1,1,3,1,5,3,1,
5,3,1,4,3,1,3,3,1,2,3,3,5,2,1,2,3,1,1,3,1,
5,2,1,2,3,2,1,3,1,5,2,1,2,3,1,2,3,1,1,3,1,
3,3,2,2,3,1,1,3,1,5,2,1,2,3,2,1,3,1,5,2,1,
2,3,1,2,3,1,1,3,1,3,3,2,1,3,1,3,3,1,5,3,1,
6,3,2,3,3,2,2,3,2,1,3,2,7,2,1,1,3,1,2,3,1,
1,3,1,6,2,1,1,3,1,5,2,1,5,3,1,4,3,1,3,3,1,
2,3,1,3,3,1,4,3,1,5,3,1,5,3,1,4,3,1,3,3,1,
2,3,2,1,3,1,7,2,1,1,3,1,0,0,0
};
//时间煮雨
code unsigned char music3[99]={
3,2,1,5,2,1,6,2,2,1,3,2,7,2,3,5,2,1,3,2,2,
1,2,1,1,2,3,6,2,1,6,2,1,5,2,1,3,2,1,2,2,1,
3,2,4,3,2,1,5,2,1,6,2,2,1,3,2,7,2,3,3,2,1,
1,3,2,3,2,1,2,2,3,6,2,1,6,2,1,5,2,1,3,2,1,
2,2,1,1,2,1,1,2,1,1,2,4,0,0,0
};
//小苹果
Code unsigned char music4[525]={
3,3,2,1,3,2,2,3,2,6,2,2,3,3,1,2,3,1,1,3,1,
2,3,1,6,2,4,3,3,2,1,3,2,2,3,2,2,3,2,5,3,1,
3,3,1,7,2,2,1,3,2,1,3,1,7,2,1,6,2,2,7,2,1,
1,3,1,2,3,2,5,2,2,6,3,1,5,3,1,3,3,2,3,3,2,3,3,1,
2,3,1,1,3,2,2,3,1,3,3,1,2,3,1,3,3,1,2,3,1,5,3,1,
5,3,8,3,3,2,1,3,2,2,3,2,6,3,2,3,3,1,2,3,1,1,3,1,
2,3,1,3,2,4,3,3,2,1,3,2,2,3,2,2,3,1,2,3,1,5,3,1,
3,3,1,7,2,2,1,3,2,1,3,1,7,2,1,6,2,2,7,2,1,1,3,1,
2,3,2,5,2,2,6,3,1,5,3,1,3,3,2,3,3,2,3,3,1,2,3,1,
1,3,2,2,3,1,3,3,1,2,3,2,5,2,2,6,2,2,6,2,1,1,3,1,
6,2,4,0,0,0
};
//烟花易冷
code unsigned char music5[243]={5,3,1,3,3,1,2,3,2,2,3,1,2,3,1,3,3,1,
1,3,1,2,3,1,3,3,4,5,3,1,3,3,1,2,3,2,2,3,1,2,3,1,
5,2,1,3,3,1,4,3,1,3,3,4,3,3,1,3,3,1,7,3,3,3,3,1,
2,3,1,2,3,2,1,3,1,7,2,1,1,3,1,2,3,1,3,3,1,6,3,1,
6,3,2,6,2,1,1,3,1,3,3,1,2,3,1,6,2,1,1,3,1,7,2,2,
5,2,2,6,2,8,5,3,1,3,3,1,2,3,2,2,3,1,2,3,1,3,3,1,
1,3,1,2,3,1,3,3,4,5,3,1,3,3,1,2,3,2,2,3,1,2,3,1,
5,2,1,3,3,1,4,3,1,3,3,4,3,3,1,3,3,1,7,3,3,3,3,1,
2,3,1,2,3,2,1,3,1,7,2,1,1,3,1,2,3,1,3,3,1,6,3,1,
6,3,2,6,2,1,1,3,1,3,3,1,2,3,1,6,2,1,1,3,1,7,2,2,
0,0,0};
// 音阶频率表高八位
code unsigned char FREQH[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,0xF9,
0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
} ;
// 音阶频率表低八位
code unsigned char FREQL[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
void delay_1ms(unsigned int x) //按键按下延时x毫秒开始播放音乐