生日歌+流水灯课程设计.docx
《生日歌+流水灯课程设计.docx》由会员分享,可在线阅读,更多相关《生日歌+流水灯课程设计.docx(17页珍藏版)》请在冰豆网上搜索。
生日歌+流水灯课程设计
1.1单片机简介..........................1
1.2任务简介....................................2
2.1音乐的产生......................................3
2.2系统方案.....................................5
3.2蜂鸣电路......................................8
3.3流水灯电路...................9
3.4时钟电路...................9
4.2设计方案.......................................11
第1章概述
1.1单片机简介
单片机又称单片微控制器,它不是完成某一逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
概括的讲,一个芯片就成了一台计算机。
MCS-51单片机是美国INTEL公司于1980年推出的产品,于MCS-48单片机相比,它的结构更先进,功能更强,在原来的基础上增加了更多的电路单元和指令,指令数达111条,MCS-51单片机可以算是相当成功的产品,一直到现在,MCS-51系列或其兼容的单片机仍是应用的主流产品,各高校及专业学校的培训教材仍与MCS-51单片机作为代表进行理论基础学习。
单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分为如下几个范畴:
一、在智能仪器仪表的应用
单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、频率、温度、流量、速度、厚度、角度、长度、硬度、元素、湿度、压力等物理量的测量。
采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大。
例如精密的测量设备(功率计,示波器,各中分析仪)。
二、在家用电器中的应用
可以这样说,现在的家用电器基本上都采用了单片控制,从电饭煲、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子称量设备,五花八门,无所不在。
三、在工业控制中的应用
用单片机可以构成形式多样的控制系统、数据采集系统。
例如工厂流水线的智能化管理,点滴智能化控制、各种报警系统,与计算机联网构成二级控制系统等。
单片机现在可以说是百花齐放,百家争鸣的时期,世界各大芯片制造公司都推出自己的单片机,从8位、16位到32位、数不胜数,应有尽有,有与主流MCS-51系列兼容的,也有你兼容的,但他们各具特色,互成互补,为单片机的应用提供了广阔的天地。
1.2任务简介
以51系列单片机为核心,以开发板为平台;设计一个音乐播放器,完成播放生日快乐歌曲的功能,流水灯控制电路,使连接在该电路上的8个发光二极管按顺序以次闪烁。
设计任务包括控制系统硬件设计和应用程序设计。
第2章系统总体方案设计
2.1音乐产生原理
2.1.1演奏音乐原理
通过控制单片机定时器的定时时间产生不同频率的音频脉冲,经放大后驱动蜂鸣器发出不同音节的声音,即声调。
用软件延时来控制发音时间的长短,控制节拍。
把乐谱中的音符和相应的节拍变换为定时常数和延时常数,作为数据表格存放在存储器中,由程序查表得到定时常数和延时常数,分别用来控制定时器产生的脉冲频率和发出该音频脉冲的持续时间。
2.1.2定时常数(计数值)与延时常数的确定
产生音乐通过单片机的I/O口输出高低不同的脉冲信号来控制蜂鸣器发音。
要想产生音频脉冲信号,需要算出某一音频周期(1/频率),然后将此周期除以2,即为半周期的时间。
利用单片机定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O口反相,然后重复计时此半周期时间再对I/O口反相,这样就能在此I/O口上得到此频率的脉冲。
用软件延时来控制发音时间的长短,控制节拍,各调1/4节拍时间如下:
曲调值延时时间
调4/4125ms
调3/4187ms
调2/4250ms
本课题要求以单片机为核心设计一个简易音乐播放器,具有自动播放乐曲的功能。
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,音阶对应频率关系图:
C调各音符频率与计数值T的关系
音符
频率(Hz)
半周期(ms)
简谱码T值
定时值(H)
简谱码T值
定时值(D)
低1Do
262
1.90
F894H
62628
低2Re
294
1.70
F95CH
63835
低3Mi
330
1.51
FA1AH
64021
低4Fa
349
1.43
FA6AH
64103
低5So
392
1.28
FB00H
64260
低6La
440
1.14
FB8CH
64400
低7Si
494
1.01
FC0EH
64524
中1Do
523
0.95
FC4AH
64580
中2Re
587
0.85
FCAEH
64684
中3Mi
659
0.76
FD08H
64777
中4Fa
698
0.72
FD30H
64820
中5So
784
0.64
FD80H
64896
中6La
880
0.57
FDC6H
64966
中7Si
988
0.51
FE02H
65030
高1Do
1046
0.47
FE2AH
65058
高2Re
1175
0.42
FE5CH
65110
高3Mi
1318
0.38
FE84H
65157
高4Fa
1397
0.36
FE98H
65178
高5So
1568
0.32
FEC0H
65217
高6La
1760
0.28
FEE8H
65252
高7Si
1967
0.25
FF06H
65283
2.2系统方案
本设计用89C51单片机为核心,在上个程序中我们是逐个控制P1端口的每个位来实现的,因此程序显得有点复杂,下面我们利用循环移位指令,采用循环程序结构进行编程。
我们在程序一开始就给P1口送一个数,这个数本身就让P1.0先低,其他位为高,然后延时一段时间,再让这个数据向高位移动,然后再输出至P1口,这样就实现“流水”效果啦。
由于8051系列单片机的指令中只有对累加器ACC中数据左移或右移的指令,因此实际编程中我们应把需移动的数据先放到ACC中,让其移动,然后将ACC移动后的数据再转送到P1口,这样就可以实现“流水”效果。
同时扬声器播放生日快乐歌曲!
按复位键,单片机重新工作!
第3章硬件设计
3.189C51单片机
AT89C51简介
AT89C51是一种带4K字节FLASH存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机
编辑本段管脚说明:
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P0口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚备选功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
3.2蜂鸣电路
发音由单片机程序控制,P3.7端口输出不同频率的高低电平,P3.7输出的脉冲频率不同,从而扬声器根据不同频率的脉冲发出的声音也不相同,发音电路如下图所示:
3.3流水灯电路
单片机给P1口送一个数,这个数本身就让P1.0先低,其他位为高,然后延时一段时间,再让这个数据向高位移动,然后再输出至P1口,这样就实现“流水”效果。
如下图
3.4最小系统电路
如图
第4章软件设计
4.1.软件设计
主程序设计的第一步为初始化,初始化I/O口,设置定时器定时时间,写定时器工作方式寄存器,设置允许T0中断。
刚开始需要将存储单元置1,全部置1之后更新显示缓冲区。
接着进行显示初始化,开定时器T0,这样就可以开始显示了。
设置完以后程序就不断检测按键情况。
检测使用软件去抖,也就是第一次检测到有键按下后,如果有键按下则执行相应指令。
本设计还设计了防误操作程序,也就是对于一个键,按一下和一直按着的效果是一样的,这样可以防止用户还没放开此键时,程序已进行第二次或多次同样的操作。
程序中根音选取的是C调三个8度内的音符,共21个音。
每个音符对应频率由定时器T0产生(音符频率及对应计数初值见附表)。
为了程序调用方便,每个音符都对应一个编码,占用一个字节。
在程序中以查表的方式加载计数初值。
当值为00H时表示空拍,与节拍码配合完成节拍发音。
节拍码也占一个字节,其总时间长度等于基本时间乘以节拍码的值。
节拍码值为01H时,表示当前乐曲结束,为00H时,表示全部乐曲结束。
为了编码简单,一般节拍码高半字节表示整拍,低半字节表示分数,只要基本延时设定恰当即可,为了及时响应键盘操作,键扫描指令安排在基本延时时间子程序中。
按键每按下一次,乐曲数目计数器R5加"1"或减"1",然后根据R5的内容转向不同的乐曲。
4.2系统方案
系统初始化后,进入播放功能。
开始从第一首曲目开始循环播放。
播放过程中如果出现跳选曲目.则进入相应的曲目程序.程序设计流程如下所示。
根据流程图写程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitBEEP=P3^7;
ucharcodeSONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,
212,212,106,126,159,169,190,119,119,126,159,142,159,0};
ucharcodeSONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,
9,3,12,12,12,12,12,9,3,12,12,12,24,0};
voidDelayMS(uintx)
{
uchart;
while(x--)for(t=0;t<120;t++);
}
voidPlayMusic()
{
uinti=0,j,k;
P1=0xfe;
while(SONG_LONG[i]!
=0||SONG_TONE[i]!
=0)
{
for(j=0;j{
BEEP=~BEEP;
for(k=0;k}
P1<<=1;
P1|=0x01;
DelayMS(10);
i++;
if(P1==0x7f)
{
DelayMS(30);
P1=0xfe;
}
}}
voidmain()
{
BEEP=0;
while
(1)
{
PlayMusic();
DelayMS(500);
}
}
第5章系统调试与仿真
5.1软件仿真阶段
单片的程序用KEIL编写的。
在keil内建立工程后建立汇编文件,编写MCS-51程序。
1、编译成功后,分模块调试,分别采用“白盒”和“黑盒”测试法验证程序的正确性
2、将调试成功的各模块,合并到总程序中,进行总体性能测试。
3、联调PROTEUS进行硬件仿真,单步,断点调试,观察运行结果,并修改源程序
5.2系统的仿真调试阶段
基于单片机的音乐播放器的是利用PROTEUS软件来实现电脑仿真的,仿真步骤如下:
4、打开PROTEUS软件,选择器件,连接电路图;
5、添加已经编译的HEX文件到单片机内;
6、单步运行,观察结果,比较预定结果,修改源程序;
7、总体调试运行;
8、分组测试,看是否达到任务要求。
调试图
5.3调试问题处理
1、是否短路
用万用表检查P2两端是短路。
电阻为0,则短路,电阻为一适值,电路正常。
2、焊接顺序
焊接的顺序很重要,按功能划分的器件进行焊接,顺序是功能部件的焊接--调试--另一功能部件的焊接,这样容易找到问题的所在。
3、器件功能
1)检查原理图连接是否正确
2)检查原理图与器件的DATASHEET上引脚是否一致
3)用万用表检查是否有虚焊,引脚短路现象
4)查询器件的DATASHEET,分析一下时序是否一致,同时分析一下命令字是否正确
4、另外,我们有在同学的帮助下做一硬件开发板,由于开发板上用12MHZ的晶振管的晶振管,而老师给的乐谱转换条件为6MHZ,导致在音谱转换过程中,是按6MHZ进行的,在实际播放时,音乐的播放不是特别的清楚。
第6章心得体会
这学期学习单片机的时间只有2周时间,对单片机的硬件设计,软件设计掌握的深度不够,但通过此次课程设计,却改变了很多,首先对于硬件电路的工作原理有了进一步的学习,同样就有了进一步的认识;其次软件方面,在程序的设计,程序的调试方面都学到了很多东西,这是第一次编写单片机的大程序,很有成就感。
2. 在一个好的氛围里才能踏下心来做东西,在这几天课设的时间里,实验室的氛围对我们的影响很大,大家一起努力,这也是我们能完成课设的动力。
另外在编程中出现问题时,一定要戒骄戒躁,脚踏实地,认真看书,仔细分析,仔细调试,就一定会发现错误,克服困难,我们也是这么做的,这在课设中十分重要。
3这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在周向红老师的辛勤指导下,终于游逆而解。
同时,在周老师那里我学得到很多实用的知识,在次我表示感谢!
同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
参考文献
1、《单片机原理与应用》王迎旭等编机械工业出版社
2、《51系列单片机设计实例》楼然苗等编北京航空航天大学出版社
3、《计算机硬件技术基础实验教程》黄勤等编重庆大学出版社
4、《微型计算机接口技术及应用》刘乐善主编华中科技大学出版社
5、《单片微型计算机原理及接口技术》陈光东等编华中科技大学出版社
6、《单片机典型模块设计实例导航》求是科技编著人民邮电出版社出版
7、《单片机程序设计实例》先锋工作室编著清华大学出版社出
附录A:
音乐播放器电路设计图
附录B:
程序清单
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitBEEP=P3^7;
ucharcodeSONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,
212,212,106,126,159,169,190,119,119,126,159,142,159,0};
ucharcodeSONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,
9,3,12,12,12,12,12,9,3,12,12,12,24,0};
voidDelayMS(uintx)
{
uchart;
while(x--)for(t=0;t<120;t++);
}
voidPlayMusic()
{
uinti=0,j,k;
P1=0xfe;
while(SONG_LONG[i]!
=0||SONG_TONE[i]!
=0)
{
for(j=0;j{
BEEP=~BEEP;
for(k=0;k}
P1<<=1;
P1|=0x01;
DelayMS(10);
i++;
if(P1==0x7f)
{
DelayMS(30);
P1=0xfe;
}
}}
voidmain()
{
BEEP=0;
while
(1)
{
PlayMusic();
DelayMS(500);
}
}
附录C:
实物图
附录D:
实物调试图