1、数字音乐盒的设计 摘 要 传统音乐盒,多是机械型的,体积笨重,发音单调,水、灰尘等外在因素,容易使内部金属发音条变形,从而造成发音跑调。另外,机械音乐盒放音时为了让音色稳定,必须放平不能动摇,而且价格昂贵,不能实现大批量生产。本设计是一个基于AT89C51系列单片机的音乐盒。该音乐盒主要由按键电路、复位电路、时钟电路、显示电路以及蜂鸣器组成。使用四个按键控制音乐盒,其中两个按键用来控制歌曲的播放、暂停,另两个用来控制液晶上歌曲次序的变化,本音乐盒共有三首歌曲。播放歌曲时,相应歌曲对应相应数码管上歌曲次序及歌名的显示。 关键词:AT89C51,蜂鸣器,LCD液晶显示,音乐盒 目 录
2、 1 绪论 1 1.1 课题描述 1 1.2 基本工作原理及框图 1 2 相关芯片及硬件电路设计 1 2.1 AT89C51芯片 2 2.1.1 AT89C51的功能特性 2 2.1.2 AT89C51的主要性能参数 2 2.2时钟电路 3 2.3 复位电路 3 2.4 按键电路 4 2.5 蜂鸣器电路 4 2.6 显示电路 5 2.6.1 线段的显示 5 2.6.2 字符的显示 5 2.7 总体电路 6 3 系统软件设计 7 3.1 程序主要流程 7 3.2 程序设计 8 4 系统软件仿真 15 总 结 18
3、 致 谢 19 参考文献 20 1 绪论 1.1 课题描述 随着人类社会的发展,人们对视觉、听觉方面的享受提出了越来越高的要求。小小的音乐盒可以给人们带来美好的回忆,提高人们的精神文化享受。传统的音乐盒大多数是机械型的,体积笨重,发音单调,不能实现批量生产。本文设计的音乐盒是以单片机为核心元件的电子式音乐盒,体积小,重量轻,能演奏和旋音乐,功能多,使用方便,可以批量生产,具有一定的商业价值。本设计是基于单片机的数字音乐盒设计,由单片机AT89C51芯片和LED数码管为核心,辅以必要的电路,构成的一个单片机电子数字音乐盒[1]。 1.2 基本工作原理及框图 本次
4、设计是一个基于AT89C51单片机的音乐盒,该音乐盒主要由时钟电路、复位电路、按键电路、蜂鸣器以及显示电路组成。使用其中两个按键来控制播放和暂停另外两个按键用来控制换曲。利在液晶上显示曲目的更换,共三首音乐,蜂鸣器每播放一首歌时液晶上显示相对应的歌曲次序。系统组成框图如图1。 AT89C51 单片机 LCD液晶显示 蜂鸣器 时钟电路 复位电路 按键电路 图1 基本工作原理框图 2 相关芯片及硬件电路设计 2.1 AT89C51芯片 图2 AT89C51引脚图 2.1.1 AT89C51的功能特性 AT89C51提供以下标准功能:4K字节Fla
5、sh闪速存储器,128字节内部RAM,32个I/O口线,两个十六位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其他所有部件工作直到下一个硬件复位。 2.1.2 AT89C51的主要性能参数 AT89C51主要性能参数如下: l 与MC-51产品指令系统完全兼容 l K字节可编程闪烁存储器 l 寿命:1000写/擦循环 l 数据保
6、留时间:10年 l 全静态工作:0Hz-24Hz l 三级程序存储器锁定 l 128*8位内部RAM l 32可编程I/O线 l 两个16位定时器/计数器 l 5个中断源 l 可编程串行通道 l 低功耗的闲置和掉电模式 2.2时钟电路 时钟电路在单片机系统中起着非常重要的作用,是保证系统正常工作的基础。在一个单片机应用系统中,时钟是保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢[2]。为达到振荡周期是12MHZ的要求,这里要采用12MHZ的晶振,另外有两个22PF的电容,晶振引脚分别连到XTAL
7、1和XTAL2振荡脉冲输入引脚。时钟电路如图3。 图3时钟电路 2.3 复位电路 单片机在启动时都需要进行复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。51系列单片机的复位信号是从RST引脚输入到芯片内的施密特触发器中的。当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位[3]。单片机系统的复位方式有:手动按钮复位和上电复位。复位电路如图4。 图4复位电路 2.4 按键电路 按键的闭合与否,反映在行线输出电压上就呈现高电平或低电平,如果高电平表示键断开,低电平
8、则表示键闭合,通过对行线电平高低状态的检测,便可确认按键按下与否。P1.0,P1.1,P1.4,P1.5作为控制按键,其中P1.0-P1.1扫描行,P1.4-P1.5扫描列;可通过功能键选择乐曲、暂停、播放。按键电路如图5。 图5 按键电路 2.5 蜂鸣器电路 电路中蜂鸣器是发声元件,在其两端施加直流电压(有源蜂鸣器)或者方波(无源蜂鸣器)就可以发声,其主要参数是外形尺寸、发声方向、工作电压、工作频率、工作电流、驱动方式(直流/方波)等[4]。 由于蜂鸣器的工作电流一般比较大,单片机的I/O口是无法直接驱动的(但AVR可以驱动小功率蜂鸣器),所以要利用放大电路来驱动,一般使用三极
9、管来放大电流就可以了。蜂鸣器由一个三极管,两个电阻和一个二极管组成。蜂鸣器电路如图6。 图6 蜂鸣器电路 2.6 显示电路 2.6.1 线段的显示 点阵图形式液晶由M×N显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。例如屏的第一行的亮暗由RAM区的000H——00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显
10、示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,……(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。这就是LCD显示的基本原理[5]。 2.6.2 字符的显示 用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行
11、的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可[6]。显示电路如图7。 图7 显示电路 2.7 总体电路 总结时钟电路、复位电路、按键电路、蜂鸣器以及显示电路,把其放入一个电路。得到总体的电路。总体电路如图8。 图8 总体电路图 3 系统软件设计 3.1 程序主要流程 流程图如图9所示。 图9流程图 3.2 程序设计 对音乐do re mi fa so la si分别编码为1~7,重音do编为8,重音re编为9,停顿编为0。播放长度以十六分音符为单位(在本程序中为165ms),一拍即四分音符等于4个十六分音符,编为4,其它的播放时
12、间以此类推。音调作为编码的高4位,而播放时间作为低4位,如此音调和节拍就构成了一个编码。以0xff作为曲谱的结束标志[7]。举例1:音调do,发音长度为两拍,即二分音符,将其编码为0x18。举例2:音调re,发音长度为半拍,即八分音符,将其编码为0x22歌曲播放的设计。先将歌曲的简谱进行编码,储存在一个数据类型为unsigned char的数组中。程序从数组中取出1个数,然后分离出高4位得到音调,接着找出相应的值赋给定时器0,使之定时操作蜂鸣器,得出相应的音调;接着分离出该数的低4位,得到延时时间,接着调用软件延时。
程序:
#include 13、ntrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar m,n;
uchar i,timecount=0,timesec=0,timemin=0,timecheck=0;
char r0=2;
sbit beepIO=P3^0;
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;
sbit rs = P2^0;
sbit rw = P2^1;
sbit ep = P2^2;
s 14、bit pausekey=P1^1;
uchar k,q,f;
uchar code dis1[] ={"1 ji mo sha zhou"};
uchar code dis2[] = {"2 tong hua"};
uchar code dis3[] ={"3 qian nian lian"};
uchar code T[49][2]={{0,0},
{0xF8,0x8B},{0xF8,0xF2},{0xF9,0x5B},{0xF9,0xB7},{0xFA,0x14},{0xFA,0x66},{0xFA,0xB9} 15、{0xFB,0x03},{0xFB,0x4A},{0xFB,0x8F},{0xFB,0xCF},{0xFC,0x0B},
{0xFC,0x43},{0xFC,0x78},{0xFC,0xAB},{0xFC,0xDB},{0xFD,0x08},{0xFD,0x33},{0xFD,0x5B},{0xFD,0x81},{0xFD,0xA5},{0xFD,0xC7},{0xFD,0xE7},{0xFE,0x05},
{0xFE,0x21},{0xFE,0x3C},{0xFE,0x55},{0xFE,0x6D},{0xFE,0x84},{0xFE,0x99},{0xFE,0xAD},{0xFE,0 16、xC0},{0xFE,0x02},{0xFE,0xE3},{0xFE,0xF3},{0xFF,0x02},
{0xFF,0x10},{0xFF,0x1D},{0xFF,0x2A},{0xFF,0x36},{0xFF,0x42},{0xFF,0x4C},{0xFF,0x56},{0xFF,0x60},{0xFF,0x69},{0xFF,0x71},{0xFF,0x79},{0xFF,0x81}
};
uchar code music1[][2]={{0,4},
{22,4},{22,4},{17,4},{15,4},{15,4},{17,12},
{15,4},{15,2},{17, 17、2},{15,4},{13,4},{13,4},{15,12},{0,4},
{20,4},{20,4},{20,4},{17,4},{20,4},{20,4},{20,4},{17,4},
{22,4},{17,4},{17,4},{15,4},{15,4},{17,12},
{22,4},{22,4},{17,4},{15,4},{15,4},{17,12},
{15,4},{15,2},{17,2},{15,4},{13,4},{13,4},{15,12},
{20,4},{20,4},{20,2},{17,2},{17,4},{20,4},{20,4},{20,2},{17, 18、2},{17,2},{17,2},
{24,4},{20,4},{20,2},{17,2},{17,4},{20,4},{22,12},
{17,4},{22,4},{25,4},{25,4},{17,4},{22,4},{25,8},
{24,4},{22,2},{24,2},{22,4},{20,4},{15,4},{17,12},
{15,4},{15,4},{15,4},{10,4},{15,4},{17,4},{20,8},
{17,4},{24,4},{24,4},{20,4},{15,4},{17,12},
{17,4},{22,4},{25,4},{25,4},{1 19、7,4},{22,4},{25,8},
{29,4},{27,2},{29,2},{27,4},{25,4},{25,4},{27,12},
{29,4},{29,2},{27,4},{25,4},{27,6},{27,2},{25,4},{24,4},
{20,4},{20,2},{17,2},{20,4},{20,2},{22,2},{22,16},
{0xFF,0xFF}};
uchar code music2[][2]={{0,4},
{16,6},{19,2},{19,6},{16,2},{14,6},{0,10},{16,6},{19,2},{19,6},{16,2} 20、{14,8},{0,8},
{26,8},{21,6},{24,2},{23,6},{21,2},{19,8},{21,16},{0,8},
{16,6},{19,2},{19,6},{16,2},{14,8},{0,8},{26,8},{21,6},{23,2},{21,14},
{24,6},{23,2},{21,6},{19,2},{16,6},{14,2},{13,8},{14,16},{0,4},
{19,6},{19,2},{21,6},{21,2},{23,8},{21,4},{0,4},{19,6},{19,2},{16,6},{19,2},{16,8},{14,6} 21、{0,4},
{19,6},{19,2},{21,6},{21,2},{23,8},{21,4},{0,4},{19,6},{19,2},{16,6},{19,2},{16,8},{14,6},{0,4},
{26,16},{21,4},{26,4},{21,4},{26,16},{21,4},{26,16},{0,4},
{16,8},{16,8},{14,8},{16,8},{21,4},{26,4},{21,4},{26,4},{0,8},{16,8},{16,8},{14,8},{16,8},{21,4},{26,4},{21,4},{26,4},{0,8},
{19,8}, 22、{19,6},{21,2},{16,8},{0,8},{19,6},{21,2},{19,6},{21,2},{16,8},{0,8},
{21,8},{26,8},{21,4},{24,12},{23,6},{21,2},{19,8},{21,16},
{14,4},{21,4},{14,4},{19,4},{16,6},{14,2},{13,8},{14,16},
{0xFF,0xFF}};
uchar code music3[][2]={{0,4},
{27,4},{19,4},{19,4},{27,4},{26,4},{26,2},{27,2},{24,8},
{22,4} 23、{17,4},{24,4},{22,4},{19,16},
{15,4},{12,4},{12,4},{15,4},{17,8},{19,8},
{26,6},{26,2},{26,4},{24,4},{24,4},{19,4},{19,8},
{27,4},{19,4},{19,4},{27,4},{26,4},{26,2},{27,2},{24,6},{24,2},
{22,4},{17,4},{24,4},{22,4},{19,16},
{15,4},{12,4},{12,4},{15,4},{17,8},{19,8},{19,6},{19,2},{19,4},{17,4}, 24、{14,4},{14,4},{14,4},{7,4},{12,24},
{0xFF,0xFF}};
uchar timetable[] ="00:00";
void delay(uchar p)
{
uchar i,j;
for(;p>0;p--)
for(i=181;i>0;i--)
for(j=181;j>0;j--);
}
BOOL lcd_bz()
{
BOOL result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_no 25、p_();
result = (BOOL)(P0 & 0x80);
ep = 0;
return result;
}
void lcd_wcmd(BYTE cmd)
{
while(lcd_bz());
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
26、void lcd_pos(BYTE pos)
{
lcd_wcmd(pos | 0x80);
}
void lcd_wdat(BYTE dat)
{
while(lcd_bz());
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
void lcd_init()
{
l 27、cd_wcmd(0x38);
delay(1);
lcd_wcmd(0x0c);
delay(1);
lcd_wcmd(0x06);
delay(1);
lcd_wcmd(0x01);
delay(1);
}
void pause()
{
uchar i,j;
for(i=150;i>0;i--)
for(j=150;j>0;j--);
}
void timecount_init() interrupt 3
{
TH1=(65535-45872)/256;
TL1=(65535-45 28、872)%256;
timecount++;
if(timecount==20)
{
timesec++;
timecount=0;
if(timesec==60)
{timesec=0;
timemin++;
}
}
}
void adfa() interrupt 0
{ timesec=0;
timemin=0;
r0++;
delay(5);
if(r0>11)
r0=11;
}
void adfii() interrupt 2
{
if(pausekey==0) 29、
{
beepIO=0;
while(pausekey==0);
while(pausekey==1);
while(pausekey==0);
delay(8);
}
else
{
timesec=0;
timemin=0;
r0--;
delay(5);
if(r0<=0)
r0=1;
}
}
void T0_int() interrupt 1
{
beepIO=!beepIO;
TH0=T[m][0]; TL0=T[m][1];
}
void zhuanhuan( 30、)
{
timetable[3]=timesec/10+'0';
timetable[4]=timesec%10+'0';
timetable[2]=':';
timetable[0]=timemin/10+'0';
timetable[1]=timemin%10+'0';
}
void timedis()
{
if(timecheck!=timesec)
{
timecheck=timesec;
zhuanhuan();
lcd_pos(0x49);
lcd_wdat(timetable[0]);
lcd_wdat(timetable[1]);
lcd_wd 31、at(timetable[2]);
lcd_wdat(timetable[3]);
lcd_wdat(timetable[4]);
}
}
void main()
{
uchar i=0,lcd_check=0;
TMOD=0x11;
TH1=(65535-45872)/256;
TL1=(65535-45872)%256;
PX0=1;
PX1=1;
EX0=1;
EX1=1;
EA=1;
ET0=1;
ET1=1;
TR1=1;
pausekey=1;
lcd_init();
while(1)
{
32、 if(r0==0)
{
delay(1);
lcd_pos(0);
i = 0;
while(dis1[i] != '\0')
{
lcd_wdat(dis222[i]);
i++;
}
}
if(r0==1)
{
timedi 33、s();
if(lcd_check!=r0)
{ lcd_wcmd(0x01);
delay(1);
lcd_check=r0;
lcd_pos(0);
i = 0;
while(dis1[i] != '\0')
{
lcd_wdat(dis1[i]);
i++;
}
} 34、
m=music1[i][0];n=music1[i][1];
if(m==0x00)
{TR0=0;delay(n);i++;}//
else if(m==0xFF)
{TR0=0;delay(30);i=0;timesec=0;timemin=0;}//
else if(m==music1[i+1][0])
{ 35、TR0=1;delay(n);TR0=0;pause();i++;}
else
{TR0=1;delay(n);i++;}
if(r0==2)
{ timedis();
if(lcd_check!=r0)
{ lcd_wcmd(0x01);
delay(1);
lcd_check=r0;
lcd_pos(0);
i = 0;
while(dis2[i] != ' 36、\0')
{
lcd_wdat(dis2[i]);
i++;
}
}
m=music2[i][0];n=music2[i][1];
if(m==0x00)
{TR0=0;delay(n);i++;}//
else if(m==0xFF)
{TR0=0;delay(30);i=0;ti 37、mesec=0;timemin=0;}//
else if(m==music2[i+1][0])
{TR0=1;delay(n);TR0=0;pause();i++;}
else
{TR0=1;delay(n);i++;}
}
}
4 系统软件仿真
在这里系统仿真我们使用实验室常用的Protues仿真软件,把总电路画入ISIS软件,把程序加入Keil软件,然后进行软件和硬件的统一调试[8]。
图10 仿真初始界面
图11 仿真播放第一首
38、图12 仿真播放第二首
图13 仿真播放第三首
总 结
经过这段时间努力,在老师的耐心指导下,从设计、论证、修改到编程、调试,我的设计终于完成了。使我无论在理论基础知识还是在实际的操作能力上都有了较大的提高。论文的完成使我体会到了成功的喜悦,也懂得了一分耕耘一分收获的道理。
学了一学期的单片机,对单片机的硬件设计,软件设计掌握的深度不够,但通过此次课程设计,却改变了很多,首先对于硬件电路的工作原理有了进一步的学习,同样就有了进一步的认识;其次软件方面,在程序的设计,程序的调试方面都学到了很多东西,这是第一次编写单片机的大程序,很有成就感。掌握了通过wave6000、KEIL 39、进行程序编译,以及Proteus软件仿真。通过单片机的设计,不断的发现错误,修改错误,在一个设计项目中都是一个团队协作,一个人的能力和知识都是有限的,要有较强的团队协作精神,组员之间互补。
在这个过程中,老师的付出最多,给我们指导,为我们讲解,给我们检查错误,在此表示感谢,这次课程设计非常成功。
致 谢
转眼间,十多天的单片机课程设计已经接近尾声。在这次的单片机课程设计过程中,我得到了许多人的帮助和指导。首先,我要感谢我的指导老师在课程设计中给予我的指导和无私的帮助,这是我能顺利完成这次单片机课程设计的主要原因,其次,我也要感谢帮助过我的同学,他们也为我解决了不少设计上的难题。在此 40、期间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。最后,再一次感谢所有再设计中帮助过我的良师益友。
数字音乐盒的课程设计
参考文献
[1] 谢辉.单片机原理及应用[M]..北京:化学工业出版社,2010
[2] 杨居易.单片机课程设计指导书[M]..北京:清华大学出版社,2009
[3] 张永枫.单片机应用实训教程[M]..北京:清华大学出版社,2008
[4] 姜志红.51单片机技术与应用系统开发案例精选.[M]..北京:清华大学出版社,2008
[5] 于凤明.单片机原理及接口技术[M].北京:中国轻工业出版社.1998.5.
[6] 张荫等.单片机应用系统开发综合实例. [M].北京:清华大学出版社,2008
[7] 戴仙金.51单片机及其C语言程序开发实例.[M]..北京:清华大学出版社,2008
[8] 夏继强. 单片机实验与实践教程[M]. 北京:北京航空航天大学出版社,
2001.4.






