基于PIC16F887单片机的数字音乐盒剖析.docx
《基于PIC16F887单片机的数字音乐盒剖析.docx》由会员分享,可在线阅读,更多相关《基于PIC16F887单片机的数字音乐盒剖析.docx(18页珍藏版)》请在冰豆网上搜索。
![基于PIC16F887单片机的数字音乐盒剖析.docx](https://file1.bdocx.com/fileroot1/2023-1/31/d644ab04-8c74-4f65-8d7e-4d3e4dd143c3/d644ab04-8c74-4f65-8d7e-4d3e4dd143c31.gif)
基于PIC16F887单片机的数字音乐盒剖析
《单片机原理及应用》课程设计
题目:
数字音乐盒
******
学号:
******xxx
学院:
电气工程与自动化
专业:
电气工程及其自动化
年级:
13级
指导教师:
高伟老师
设计任务书
一、技术要求
制作一个数字音乐盒,盒内存3首流行歌曲,每首不少于30s。
采用LCD显示乐曲信息,开机时显示欢迎提示字符(自定),播放时显示歌曲序号及名称。
可通过按下功能键K1、K2、K3之一,选择3首乐曲中的1首;然后按下播放键K4,即开始播放所选择的乐曲;K5键位暂停键。
二、拟采用方法
选用PIC16F887型单片机,利用单片机I/O口产生一定频率的方波,驱动蜂鸣器,发出各种不同的音调,利用延迟函数实现节拍。
并由16*2LCD显示歌曲信息。
键盘在单片机应用系统中能实现向单片机输入数据,传送命令等功能,是人工干预单片机的主要手段。
本设计采用4*4键盘,在演奏过程中可通过功能键选择乐曲,暂停,播放。
基于PIC16F887单片机的数字音乐盒
摘要:
本设计的数字音乐盒以PIC16F887单片机为核心,用C语言编写。
利用单片机的定时器产生不同频率的声波,由I/O口输出,继而启动蜂鸣器发出音乐。
通过外部中断进行歌曲切换和播放、暂停。
同时LCD显示正在播放歌曲名称。
关键词:
数字音乐盒,PIC16F887,LCD
1绪论
电子音乐已广泛的应用于社会生活的各个领域,其类型从音乐卡片到CD、MP3等多种多样。
利用单片机控制的电子音乐发生器软硬件上具有独特的优点,系统的开发周期短,成本低,电路制作容易。
更换歌曲时,硬件电路无需作任何修改,只需修改软件即可实现。
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是毋庸置疑的,其中智能音乐盒就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、生活、提供更好的更方便的服务就需要从单片机技术着手,一切向着数字化控制,智能化控制方向发展。
音乐盒的起源,可追溯至中世纪欧洲文艺复兴时期。
当时为使教会的的钟塔报时,而将大小的钟表上机械装置,被称为“可发出声音的组钟”。
17世纪初,音乐盒的工业成为瑞士超过制表和缝制蕾丝业的第一大产业,这使得位于瑞士侏罗山边的小镇闻名于世。
音乐盒300多年的产品发展,同时也是人类文明300多年发展的历史鉴证。
每个不同时期的音乐盒造型,都能折射出当时不同的社会心态和文明发展现状,它也成了时代的一面镜子。
现今,音乐盒的制造,延袭传统,结合现代,正日益成为人们或为了典藏一段岁月,或为了收藏一份情感,或出于对音乐的追求,或对于旧时代的怀念,或为了居室的美化,等等,而得到众多品位人士的追求。
每个不同时期的音乐盒造型,都能折射出当时不同的社会心态和文明发展现状,它也成了时代的一面镜子。
音乐盒悠扬的乐声,经常勾起人们对美好往事的会议,甚至魂牵梦萦,坠入时光岁月的追忆中。
300多年来席卷全球市场的机械音乐盒的最大魅力也许就在于它能将抽象的音乐,凝固成具象的艺术品,成为人们表达美好情感,追思逝去年华的最佳选择。
2数字音乐盒的硬件设计
如图1所示,本产品拟采用以PIC16F887单片机为核心芯片的电路来实现,主要由PIC16F887芯片、文字型LCD(16×2)显示、4×4按键、蜂鸣器4部分组成。
图1系统结构图
2.1主要元器件的选型
一PIC单片机作为控制芯片
PIC16F887单片机共有40个引脚,其中有33个端口引脚,7个电源﹑地和复位引脚。
外部晶振设为4MHz,引脚1接复位按键。
二液晶显示部分
本次课设所用字符型LM016L液晶显示器。
要求用4位数据线通讯,传送命令也传送地址。
板上要使用LCD时短路插P38、P22均要插上,若要背光控制,可将P22的短路插8短接,如不用背光,该短路插不接。
三按键部分
采用4X4按键,K1、K2、K3之一,选择3首乐曲中的1首,然后按下播放键K4,即开始播放所选择的乐曲;K5键暂停键。
2.2电路设计
为了保证CPU低功耗运行,关键在于如何对电路进行低功耗设计。
注意事项有如下几点:
1)电路的总功耗为CPU以及外围电路功耗之和。
所以不仅要降低CPU本身的运行功耗,还应该降低外围电路的功耗。
因此应尽量选择低电压、低功耗的CMOS元件。
2)单片机的工作电流正比于自身的工作频率与工作电压。
因此应尽量采用低电压供电,并使单片机工作于最低频率(4MHz晶振),因此在需要时可对晶振电路另行设计。
3)单片机外围电路应尽可能少的采用阻性元件。
如果使用上拉电阻,应尽可能加大电阻阻值并保证电平正常。
基于以上几方面,设计出的电路图如下
图2设计的电路图
3音乐盒的软件设计
1.发音原理
发音原理:
播放一段音乐需要的是两个元素,一个是音调,另一个是音符。
首先要了解对应的音调,音调主要由声音的频率决定,同时也与声音强度有关。
对一定强度的纯音,音调随频率的升降而升降;对一定频率的纯音、低频纯音的音调随声强增加而下降,高频纯音的音调却随强度增加而上升。
另外,音符的频率有所不同。
音符的发音主要靠不同的音频脉冲。
利用单片机内部定时器/计数器0,使其工作在模式1,定时中断,然后控制RC2引脚的输出音乐。
只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期
时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。
2.音符频率的产生
音符及定时器初始值:
例如:
中音1(do)的音频=256HZ,周期T=1/256s=3906us
定时器的定时时间为:
T/2=3906/2us=1953us
定时器1953us的计数值=定时时间/机器周期=1953us/1us=1953(时钟频率=4MHZ)装入TMR2计数器初值为1953
将1953装入寄存器中,启动工作后,每计数1953次时将产生溢出中断,进入中断服务时,每次对RC2引脚的输出值进行取反,就可得到中音DO(256HZ)的音频。
所以综上所述,分别算出各个发音对应的PR2及占空比X。
低音
PR2
X
中音
PR2
X
高音
PR2
X
1
238
574
1
119
287
1
59
143
2
212
510
2
105
256
2
52
128
3
188
455
3
94
228
3
46
114
4
178
430
4
89
215
4
44
107
5
158
383
5
79
191
5
39
96
6
141
341
6
70
170
6
35
85
7
126
304
7
62
152
7
31
76
3.节拍频率的发生
节拍的产生与编码:
音乐中的节拍用延时时间产生。
例如,1拍=0.4s,1/4拍=0.1s,以此类推。
假设1/4拍执行一次延时程序,则1/2拍就执行两次延时程序,所以只要求出1/4拍的延时时间,其余节拍就是它的倍数。
3.1主模块的设计
初始化程序的主要任务是当PIC单片机上电后,对单片机的内部功能寄存器进行初始化设置。
初始化的主要流程如图所示。
主模块是系统软件的主框架。
结构化程序设计一般有“自上而下”和“自下而上”两种方式,“自上而下”法的核心就是主框架的构建。
它的合理与否关系到程序最终的功能的多少和性能的好坏。
本系统的主模块的程序框图如图3所示。
LCD初始化:
LCD1602是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它由若干个5X7点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。
但是LCD在每次使用前都必须初始化,对相关参数进行设置以后方可正常使用。
LCD初始化的程序框图如图4所示。
4结束语
1)本次课程设计,了解了音乐盒的发展背景和国内研究现状和发展趋势,音乐盒在300多年前就有了,不过不是数字的,是机械带动的,随着时代的发展,电能的普及和电子元器件的发展,音乐盒也从机械化朝着数字化的趋势发展,而且功能实现越来越多。
2)本文通过对基于单片机音乐演奏控制设计的研究和设计,分析了设计的意义和可行性。
单片机PIC16F887是一种非常小巧但功能非常多,应用非常广的一种芯片,功率也非常的小,采用PIC16F887作为系统核心制作音乐演奏控制设计电路简单了很多。
本设计外部采用单片机的复位电路设计、LCD数码管显示正在播放的音乐序号和歌曲名称,按键控制等,但由于PIC16F887分辨率不是太高,音乐有点单调,另外,由于时间关系具体电路还有的地方不尽完善之处。
3)在设计的过程中不仅巩固了所学过的知识,加深了我对所学知识的理解,而且学到了很多在书本上所没有的知识。
提高了实际动手能力和独立思考的能力。
参考文献
[1]《PIC16系列单片机C程序设计与PROTEUS仿真》江和北京航空航天大学出版社.2010
[2]杨刚,周群.电子系统设计与实践.电子工业出版社.2004
[3]何立民.单片机高级教程(应用与设计).北京航空航天大学出版社,2000
[4]涂时亮,张友德.单片微机控制技术.清华大学出版社.1994
[5]《融会贯通Protel99电路设计》弘道工作室人民交通出版设,2000
[6]《单片机原理及接口技术实验》朱定华北方交通大学出版社2002
[7]《单片机原理及应用》蔡振江电子工业出版社2008
[8]《单片机原理及应用》张鑫电子工业出版社2010
[9]《单片机原理及应用系统设计》胡学海电子工业出版社2010
[10]《单片机课程设计指导》杨居义清华大学出版社2009
程序:
#include
__CONFIG(0x00F1);
__CONFIG(0x3FFF);
//歌曲相关参数设置
#defineT1_250MS3036
unsignedinti=0;
unsignedintP1=0;
unsignedintP2=0;
unsignedintP3=0;
unsignedintb,n;
unsignedintx=0;
volatileunsignedinta=1;
volatileunsignedcharp=0,bo=0;
//九月
unsignedconstintCEF_PR2[]={46,46,46,46,52,52,59,59,59,
52,59,70,79,79,79,79,70,79,52,46,59,59,94,79,79,79,94,70,70,62,
70,70,70,79,59,59,59,119,70,59,70,79,79,94,79,79,79,94,70,70,62,
70,70,70,79,59,59,59,59,70,70,119,52,52,39,39,39,39,39,46,52,59,
59,70,70,70,59,70,59,52,52,52,52,59,52,59,46,105,52,};
unsignedconstintCEF_X[]={114,114,114,114,128,128,143,
143,143,128,143,170,191,191,191,191,170,191,128,114,143,143,228,
191,191,191,228,170,170,152,170,170,170,191,143,143,143,287,170,
143,170,191,191,228,191,191,228,170,170,152,170,170,170,191,143,
143,143,143,170,170,287,128,128,96,96,96,96,96,96,96,114,128,143,
143,170,170,170,143,170,143,128,128,128,128,143,128,143,114,256,
128,};
unsignedconstintCEF_TM[]={100,200,200,100,100,200,100,
200,200,100,100,100,200,100,200,200,100,100,100,200,200,100,100,
100,100,100,200,50,50,50,100,100,50,100,100,50,100,50,50,50,100,
200,100,50,100,100,50,100,50,50,50,100,50,50,100,100,100,100,50,
50,50,100,200,200,200,200,50,100,50,50,50,100,50,200,50,100,50,
50,50,100,100,100,100,100,200,100,100,100,200,200,};
//北国
unsignedconstintjinglebells_PR2[]={94,94,94,88,79,94,105,62,119,119,119,105,94,94,125,125,62,
141,94,105,62,141,94,105,62,141,94,105,119,119,62,
94,105,79,88,94,105,62,79,88,94,105,79,94,105,62,
141,94,105,62,141,94,105,62,88,94,88,94,119,62,88,94,88,94,59,
105,119,119,};
unsignedconstintjinglebells_X[]={189,189,189,179,159,189,212,0,239,239,239,212,189,189,253,253,0,
283,189,212,0,283,189,212,0,283,189,212,239,239,0,
189,212,159,179,189,212,0,159,179,189,212,159,189,212,0,
283,189,212,0,283,189,212,0,179,189,179,189,239,0,179,189,179,189,120,
212,239,239,};
unsignedconstintjinglebells_TM[]={400,200,200,400,600,800,800,800,400,200,200,400,400,800,200,500,800,
400,400,1000,200,400,400,1000,200,400,400,800,300,1600,500,
300,500,1500,300,300,1600,200,300,300,500,300,800,500,2000,200,
400,400,1000,100,400,400,1000,100,200,200,200,200,1000,200,250,250,250,250,600,
400,200,2000,};
//亲亲我
unsignedconstintsuper_PR2[]=
{35,119,119,94,119,94,105,119,105,
119,141,119,94,79,79,94,79,79,94,79,79,119,105,105,141,119,119,
94,94,94,105,119,105,94,79,79,94,79,79,94,79,79,94,79,79,119,105,
105,141,119,119,94,94,94,105,119,105,94,79,79,94,79,79,94,79,70,
70,94,70,70,94,89,94,105,141,119,119,94,94,119,94,105,119,105,
119,141,119};
unsignedconstintsuper_TM[]={100,100,100,100,100,100,200,100,100,
200,100,100,200,100,100,100,100,200,200,100,200,200,100,200,200,
100,100,100,100,200,200,100,100,100,100,200,200,100,200,200,100,
200,100,200,100,200,200,100,100,100,200,100,100,100,100,100,100,
200,100,100,200,100,100,200};
unsignedconstintsuper_X[]={85,287,287,228,228,287,228,256,287,
256,287,341,287,228,191,191,228,191,191,228,191,191,287,256,256,
341,287,287,228,228,228,256,287,256,228,191,191,228,191,228,191,
170,170,228,170,170,228,215,228,256,341,287,287,228,228,287,228,
256,287,256,287,341,287};
//子程序声明
voidplay_cef(void);
voidplay_jinglebells(void);
voidplay_super(void);
//voidjinglebells_lrc(void);
voidDELAY(unsignedint);
//voidanjian(void);
//LCD显示相关
#defineDATA1//LCD写数据时为1
#defineCOM0//LCD写命令时为0
#defineLINE10b10000000
voidLCD_CSH(void);//初始化
voidLCD_BUSY(void);//检测LCD是否忙
voidLCD_WRITE(unsignedchar,unsignedchar);//LCD写1字节,命令或数据
voidLCD_WRITE_4(unsignedchar,unsignedchar);//LCD写半字节
unsignedcharLCD_READ(void);//读LCD,忙检测用
voidDISP_T(unsignedint);//在制定行中显示字符,字符在数组DD中
voidDELAY(unsignedint);
voidDELAY_US(unsignedchar);
voidinterruptSER(void);//中断控制显示不同歌名
constunsignedcharAA[17]="Welcome";//每行16个字符,最后有一个结束符,故下标为17
constunsignedcharCEF[17]="1.JiuYue";
constunsignedcharJB[17]="2.BeiGuo";
constunsignedcharsuper[17]="3.QinQinWo";
#defineLCD_ERD6
#defineLCD_RWRD5
#defineLCD_RSRD4
voidmain(void)
{unsignedinti;
//p=0;
RD7=1;
ANSEL=0;
ANSELH=0;
TRISD=0x00;//RD为输出
TRISB=0B11110111;
RB3=0;
OPTION_REG=0B00000000;
INTCON=0b10001000;
WPUB=0b11110111;
IOCB=0b11111111;
DELAY(30);
LCD_CSH();
LCD_WRITE(LINE1,COM);
for(i=0;i<16;i++)
{LCD_WRITE(AA[i],DATA);
}
DELAY(1000);
while
(1)
{
while(p==1)
{
LCD_WRITE(LINE1,COM);
for(i=0;i<16;i++)
{
LCD_WRITE(CEF[i],DATA);
};
while(b==1&&bo==1)
{play_cef();}
}
while(p==2)
{
LCD_WRITE(LINE1,COM);
for(i=0;i<16;i++)
{
LCD_WRITE(JB[i],DATA);
};
while(b==2&&bo==1)
{play_jinglebells();}
}
while(p==3)
{
LCD_WRITE(LINE1,COM);
for(i=0;i<16;i++)
{
LCD_WRITE(super[i],DATA);
};
while(b==3&&bo==1)
{play_super();}
}
}
}
//播放北国
voidplay_jinglebells(void)
{
if((p==2)&&(a==1))
{TRISC2=0;
PR2=jinglebells_PR2[P1];
x=jinglebells_X[P1];
CCPR1L=(jinglebells_X[P1])>>2;
x=x&0b00000011;
CCP1CON=(x<<4)&0b00110000;
CCP1CON=CCP1CON|0b00001100;
T2CON=0b00000110;
DELAY(jinglebells_TM[P1]);
P1++;
if(PR2==62)
{CCP1CON=0;RC2=0;}
}
if((p==2)&&(a==0))
{CCP1CON=0;
RC2=0;
}
}
//播放九月
voidplay_cef(void)
{
if((p==1)&&(a==1))
{TRISC2=0;
PR2=CEF_PR2[P2];
x=CEF_X[P2];
CCPR1L=(CEF_X[P2])>>2;
x=x&0b00000011;
CCP1CON=(x<<4)&0b00110000;
CCP1CON=CCP1CON|0b00001100;
T2CON=0b00000110;
DELAY(CEF_TM[P2]);
P2++;
}
if((p==1)&&(a==0))
{CCP1CON=0;
RC2=0;
}
}
//播