单片机音乐播放实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计
课程名称微机原理与单片机技术实践题目名称单片机制作与音乐播放
学生学院自动化学院
专业班级电子(2)
学号
学生姓名
指导教师张学习
2013年5 月24 日
单片机制作与音乐播放
一、课程设计的内容
1.用面包板焊一块PIC单片机最小系统,包括晶振,复位电路,按钮,LED灯。
2.自主添加新模块。
3.写程序驱动单片机工作。
二、课程设计的要求与数据
1.焊板所需原理图:
复位
晶振
LED灯蜂鸣器
2.音乐播放所需资料。
摘要:16F877A 单片机原理和控制理论来设计音乐盒的硬件电路,并利用16单片机语言进行程序设计。通过控制单片机内部的定时器来产生不同频率的方波,驱动喇叭发出不同音调的音乐,再利用延迟来控制发音时间的长短。该程序通过把乐谱转化成相应的定时常数来驱动发音设备演奏出悦耳动听的音乐。这种控制电路结构简单,可靠性高,应用性强;软件程序适应范围广,对于不同的音乐只需要改变相应的定时常数即可。
音乐产生的方法:
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。现在以单片机12MHZ 晶振为例,例出高中低音符与单片机计数T0相关的计数值如下表4.1所示: 表4.1 高中低音符与单片机计数T0相关的计数值 音符 对应的PR2值 音符 对应的PR2值 M_1 119 M_2 105 M_3 94 M_5 79 M_6 70 H_1 59 L_5
158
L_6
141
如表4.2所示:音乐的音拍,一个节拍为单位(C 调) 表4.2 音乐的音拍 曲调值 DELAY 曲调值 DELAY 调4/4 125ms 调4/4 62ms 调3/4 187ms 调3/4 94ms 调2/4 250ms
调2/4
125ms
对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。发音部分代码在程序中实现,靠单片机的一个管脚输出,考虑到声音可能不够大所以我们加入了功放电路,利用LM386来对声音信号进行放大。音频输出信号由ADU OUT 引出,信号可经功放电路LM386输出到扬声器或耳机。
按钮
AD 转换
三、课程设计应完成的工作
1.音乐播放源程序。
#include p16f877a.inc
#DEFINE youyi 0X2100
;乐谱编号
#define L_5 .158
#define L_6 .141
#define M_1 .119
#define M_2 .105
#define M_3 .94
#define M_5 .79
#define M_6 .70
#define H_1 .59
#define M_0 .0 ; tone[8]={158,141,119,105,94,79,70,59};声调的高低,实际上是PWM的周期值;计算方法是CCP的时钟1MHz除以预分频比16,再除以要产生的频率,最后再减去1。
PORTD_D EQU 20H ;显示缓冲器COUNT
COUNT1 EQU 21H
COUNT2 EQU 22H
COUNT3 EQU 23H
COUNT4 EQU 24H
SAVEW EQU 25H ;W保护寄存器
SAVES EQU 26H ;STATUS保护寄存器
COUNT5 EQU 27H ;节拍数
H EQU 28H ;地址寄存器
HANG EQU 29H ;行寄存器
LIE EQU 30H ;列寄存器
TMP1 EQU 31H ;TMP1缓存寄存器
Byte EQU 32H ;缓存
Count6 EQU 33H ;节拍数
Count7 EQU 34H ;节拍数
DD_RAM_ADDR EQU 35H ; 第一行显示地址寄存器
DD_RAM_UL EQU 36H ; 第二行显示地址寄存器
COUNT EQU 37H
Count EQU 38H ;计数寄存器
Count2 EQU 39H
;* 定义 LCD数据& 控制I/O口
#define LCD_DB7 PORTB,3 ;占用的I/O口定义
#define LCD_DB6 PORTB,2 ;LCD的DB6与RB2连接,其它类推
#define LCD_DB5 PORTB,1 ;
#define LCD_DB4 PORTB,0 ;
#define LCD_EN PORTC,0
#define LCD_RS PORTC,1
#define LCD_DB7_DIR TRISB,3 ;对应的方向寄存器定义
#define LCD_DB6_DIR TRISB,2 ;
#define LCD_DB5_DIR TRISB,1 ;
#define LCD_DB4_DIR TRISB,0 ;
#define LCD_EN_DIR TRISC,0 ;
#define LCD_RS_DIR TRISC,1 ;
;* LCD 模块命令
#define DISP_ON 0x00C ; 开显示
#define DISP_ON_C 0x00E ; 开显示, 开指针
#define DISP_ON_B 0x00F ; 开显示, 开指针,开闪烁
#define DISP_OFF 0x008 ; 关显示
#define CLR_DISP 0x001 ; 清显示的操作数
#define ENTRY_INC 0x006 ; 操作数
#define ENTRY_INC_S 0x007 ; 操作数
#define ENTRY_DEC 0x004 ; 操作数
#define ENTRY_DEC_S 0x005 ; 操作数
ORG youyi ;友谊天长地久
DE L_5,L_5,M_1,M_1,M_1,M_1,M_1,M_1,M_1,M_3,M_3,M_2,M_2,M_2,M_2 DE M_1,M_2,M_2,M_3,M_3,M_1,M_1,M_1,M_1,M_1,M_3,M_3,M_5,M_5,M_6 DE M_6,M_6,M_6,M_6,M_6,M_6,M_6,M_6,M_6,M_5,M_5,M_5,M_5,M_3,M_3 DE M_3,M_1,M_1,M_2,M_2,M_2,M_2,M_1,M_2,M_2,M_3,M_3,M_1,M_1,M_1 DE M_1,L_6,L_6,L_6,L_5,L_5,M_1,M_1,M_1,M_1,M_1,M_1,M_1,M_1,M_6 DE M_6,M_5,M_5,M_5,M_5,M_3,M_3,M_3,M_1,M_1,M_2,M_2,M_2,M_2,M_1 DE M_2,M_2,M_6,M_6,M_5,M_5,M_5,M_5,M_3,M_3,M_3,M_5,M_5,M_6,M_6 DE M_6,M_6,M_6,M_6,M_6,M_6,H_1,H_1,M_5,M_5,M_5,M_5,M_3,M_3,M_3