微控制器技术
课程设计报告
设计题目:简易电子琴设计
专业: 电机与电器
班级: 电器132
学号: 130312239
姓名: 王小起
指导教师:
设计时间:
微控制器技术课程设计任务书
设计题目: 简易电子琴设计
设计时间: 2014.6.8--2014.6.19
设计任务:
画出设计原理图,绘制程序流程图,编制程序,实现以下功能:
1、键盘每个键代表一个音阶,按下按键后,小喇叭发出对应音阶;
2、开始按键,喇叭即开始发音;释放按键,停止发音;
3、数码管显示所按下键对应的音阶符号;
4、LED可闪烁装饰。
背景资料:1、单片机原理与应用
2、检测技术
3、计算机原理与接口技术
进度安排:
1、第1天,领取题目,熟悉设计内容,分解设计步骤和任务。
2、第2-3天,规划设计软硬件,编制程序流程、绘制硬件电路。
3、第4-6天,动手制作硬件电路,或编写软件,并调试。
4、第7天,中期检查。
5、第9-10天,完善设计内容,书写设计报告。
6、第11天,提交设计报告,整理设计实物,等待答辩。
7、第12天,设计答辩。
题目:简易电子琴设计
一、设计目的
单片机课程设计过程中,学生通过查阅资料,接口设计,程序设计,安装调试等环节,完成一个基于AT89C51系列单片机,涉及多种资源应用,并且有综合功能的小应用系统设计。使学生不但能够将课堂上学到的理论知识与实际应用结合起来,而且能够对电子电路,电子元器件等方面的知识进一步加深认识,同时在软件编程,调试,相关仪器设备和相关软件的使用技能等方面得到较全面的锻炼和提高。使学生增进对单片机的感性认识,加深对单片机理论方面的理解,加深单片机的内部功能模块的应用,如定时器/计数器,中断,片内外存储器,I/O接口,串行口等。使学生了解和掌握单片机应用系统的软硬件设计过程,方法及实现,强化单片机应用电路的设计与分析能力。提高学生在单片机应用方面的实践技能和科学作风,培育学生综合运用理论知识解决问题的能力。
二、设计要求
主要内容是用AT89C51单片机为核心控制元件,设计一个电子琴。以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器。本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。 。
三、方案设计与论证
(1)播放模块是由喇叭构成,它几乎不存在噪音,音响效果较好,而且由于所需驱动功率较小,且价格廉价,所以,才被才用
(2)按键模块,电子琴设有8个按键,其中7个作为音符输入,另外一个作为模式转换按键,实现用户存放的自动播放歌曲。7个按键分别代表7个音符,包括中音段的全部音符,通过软硬件设计,模式转换按键触发外部中断,中断使程序跳转,实现模式转换,启动电子琴。然后通过查询电子琴所按下的按键,读取电子琴输入状态,跳转到对应的程入口,实现自编歌曲的。
(3)该设计方案是通过按键随意按下所要表达的音符,作为电平送给主体电路,中央处理器通过识别,解码输出音符,在扬声器中发出有效的声音。通过这样可以不断的弹奏我们想要的音符或者是音调,电路由复位电路,指示灯电路,和功能按键电路组成。
通过上述分析,可规划出系统的总体原理图,如图1-1所示。
图1-1
四、设计原理和电路图
1.硬件电路
(1)时钟晶振电路
XTAL1脚为片内振荡电路的输入端,XTAL2脚为片内振荡电路的输入端。内部时钟方式由单片机内部的高增益反相放大器和外部跨接的晶振、微调电容构成时钟电路产生时钟的方法,其工作原理如图1-3所示。C1、C2的值通常选择30PF,C1、C2对频率有微调作用,晶振的频率选择12MHz。
图1-2时钟晶振电路
(2)复位电路
此复位电路是是上电/按键复位,按下按键,电源对电容C充电,使RST端快速达到高电平;松开按键,电容向芯片的内阻放电,恢复为低电平,从而使单片机可靠复位,既可上电复位,又可按键复位。
图1-3 复位电路
(3)按键电路
键盘是最常用的单片机输入设备,大致可以分为独立连接式键盘和矩阵式。独立连接式键盘是最简单的键盘电路,每个键独立接入一根数据线。这种键盘结构简单,使用方便,但是占用的I/O口线较多。矩阵式键盘由行线和列线组成,按键位于行列的交叉点上,行列式键盘可以节省I/O口,适合键数较多的场合,所以设计4*4键盘采用矩阵式键盘。
图1-4 按键电路
(4)振荡电路
单片机的时钟信号用来提供单片机内各种位操作的时间基准,时钟信号通常由两种电路形式的到:内部振荡方式和外部振荡方式。在引脚XTAL1和XTAL2外接晶体振荡器,就构成了内部振荡方式,有用单片机内部有一个高增益反相放大器,当外接晶振荡后,就构成了自激振荡器并产生振荡时钟脉冲。晶振通常采用6MHz.12MHz或者24MHz。本设计中采用的是12MHz.电容C1.C2起稳定振荡频率、快速起振的作用,电容值一般5-30pF。内部振荡方式所得的时钟信号比较稳定,电路中使用较多。振荡方式如下图:
图1-5 声音提示电路
(5)LED数码管
数码管的显示方式采用动态显示,在动态显示下,每位数码管的对应段选线连接在一起,共8段,连接到一个8位输出口上。由于单片机P0口内部无上拉电阻,所以P0口要加上拉电阻。每位数码管的位选线连接到一根独立的I/O口线上,显示信息时,段选码由同一个8位I/O口送出,由位选线控制具体哪位数码管显示。工作原理为:先在段选线上送出第一位数码管的段选码,然后让第一位数码管的位选线有效,则第一位数码管显示信息,其余数码管熄灭,延时一下,位码送关断数码管延时一下(作用:消除数码管的阴影),再送第二位数码管的信息,方法与第一位的相同,直到所有的数码管扫描一遍。由于每位数码管轮流点亮,利用人眼的视觉暂留现象可造成所有数码管同时显示的效果。亮度较静态显示方式时暗,所以在位选线上加有译码器,增加驱动能力使数码管点亮。
图1-6 显示电路
2.软件
(1)软件工作的基本流程
图(c) 按键程序流程图
图(a) 播放程序流程图 图(b) 中断程序流程图
图(d) 主程序流程图
五、元件清单
表1 元件清单
六、硬件制作与调试
本设计中用到单片机开发板和keil软件加上相应的下载线,构成软硬件调试环境,支持对单片机的在线调试功能,这样就能方便快速地调试出相应的程序,建议:尽量创造条件完成硬件电路,用硬件电路来调试程序是最好的选择。实际硬件电路与程序结合完成我们想要的结果才是本次设计的目的。
在仿真电路制作期间,发现元件的选择至关重要,元件型号的选择、元件数值的选择都是经过准确计算后得到的。然后就仿真电路的布局,有条理的布局可以使仿真电路整齐美观,更重要的是使人一目了然,电路的可读性、维护性大大提高。
在程序调试期间,在KEIL跟PEROTEUS上仿真调试取得了成功。达到了设计初的预期目标,单片机的功能符合要求,需要反复检查程序,发现问题解决问题,直到运行结果正确。
七、设计总结
本次课程设计制作简易电子琴,虽然自己在网上查找资料,将自己的理论知识与实践相结合起来,进一步巩固了专业基础知识和相关专业课程知识;另一方面,也培养了自己独立自主、综合分析的思维与创新能力,设计的过程不是一帆风顺,遇到过各种各样的问题。特别是设计软件时,一些很细小的问题都可能导致功能性的错误,修改了多次才通过仿真。在设计过程中我发现自己对以前所学过的知识理解得不够深刻,掌握得不够牢固,所以也利用图书馆、网络资源查阅了大量文献资料,也请教了同学,书本上的知识很多都是理想化后的结论,忽略了很多实际的因素,或者涉及的不全面,可在实际的应用时这些是不能被忽略的,我不得不考虑这方面的问题,这也让我更深刻地体会到在今后的学习工作中也要注重理论联系实际。
八、参考文献
[ 1] 李群芳,肖看,《单片机原理、接口及应用》,北京,清华大学出版社,20##年
[2] 戴佳,戴卫恒 ,《51单片机C语言应用程序设计实例精讲》 , 电子工业出版社,20##年
[3] 刘海成,《单片机及应用系统设计原理与实践》,北京,北京航空航天大学出版社,20##年
[4] 楼然苗,李光飞,《单片机课程设计指导》,北京,北京航空航天大学出版社,20##年
[6] 吴国经,《单片机应用技术》,北京,中国电力出版社, 2004.年
附录1 总体电路
附录2 完整程序
#include <reg52.h>
#define unint unsigned int
#define unchar unsigned char
#define keyport P2
sbit sound =P2^7; //蜂鸣器j45
unchar keyvalue;
/*unchar music[]={64021,64103,64260,64400,
64524,64580,64684,64777,
64820,64898,64968,65030,
65058,65110,65157,65178};*/
unchar music0 [9]={0,0xF8,0xF9,0xFa,0xFa,0xFb,0xfb,0xfc,0xf8};
unchar music1 [9]={0,0x8c,0x5b,0x15,0x67,0x04,0x90,0x0c,0x8c};
unchar keyvalue;
unchar MUSICTH0;
unchar MUSICTL0;
unchar dat;
void delayms(unsigned int i)//延时函数
{
unsigned int j;
for(;i>0;i--)
for(j=100;j>0;j--);
}
//键盘检测函数
void keyscan(void)
{
if(keyport!=0xff)
{
delayms(10);
if(keyport!=0xff)
{
keyvalue=keyport;
swswitch(keyvalue)
{
case 0xfe:dat=1;break;//比较keyvalue是否=0xfe 如相等 返回 值1
case 0xfd:dat=2;break;
case 0xfb:dat=3;break;
case 0xf7:dat=4;break;
case 0xef:dat=5;break;
case 0xdf:dat=6;break;
case 0xbf:dat=7;break;
//default:dat=0;break;
}
}
}
MUSICTH0=music0[dat];
MUSICTL0=music1[dat];
ET0=1;
TR0=1;
while(P2==0xff)
{
ET0=0;
TR0=0;
}
第二篇:单片机电子琴课程设计报告
1 课程设计的意义
单片机自20世纪70年代问世以来,已对人类社会产生了巨大的影响。尤其是美国Intel公司生产的MCS-51系列单片机,由于其具有集成度高、处理功能强、可靠性高、系统结构简单、价格低廉、易于使用等优点,在工业控制、智能仪器仪表、办公室自动化、家用电器等诸多领域得到广泛的应用。20世纪80年代中期以后,Intel公司已把精力集中在CPU芯片的开发、研制上,并逐渐放弃了单片机芯片的生产,但是以MCS-51内核技术为主导的单片机已经成为许多厂家及公司竞相选用的对象。因此,Intel公司以专利转让或技术交换的形式把MCS-51的内核技术转让给了许多国际上著名的半导体芯片生产厂家,如ATMEL、PHILIPS、Cygnal等公司。这些厂家生产的与MCS-51系列单片机兼容的各种增强型、扩展型单片机,已成为世界上8位单片机市场的主流产品。估计在今后若干年内,它们仍是我国8位单片机应用领域的主流机型。
音乐已经成为现代人们生活所不可缺少的艺术,美妙的音乐可以让人放松,使人愉悦,电子琴作为一种乐器已经得到很多音乐人的重视和应用,一个质量好的电子琴可以做出让人欣赏的美好音乐,所以作为从事电子技术领域的我们来说,能做出质量优越的电子琴是我们的义务和责任,虽然今天我们做的是简易电子琴,但其已经具有电子琴的基本功能,为以后的进一步开发研究奠定一个良好的基础。本课程设计的目的是为了深入了解MCS-51系列单片机的功能以及应用,学会制作简单的电子琴。会使用LCD显示屏,对其有进一步的了解。
2 方案论证
2.1 设计的任务
本课程设计的任务是应用单片机制作一个简易的电子琴,能够准确发出基本的音符,并且同时能将音符在显示屏上现实出来。
2.2 设计的要求
利用所给键盘的1,2,3,4,5,6,7,8八个键,能够发出8个不同的音调,并且要求按下键发声,松开延时一段时间停止,中间再按别的键则发另外一音调的声音。
当系统扫描到有按键被按下,则快速检测出是哪一个键被按下,然后单片机的定时器被启动,发出一定频率的脉冲,该频率的脉冲经喇叭驱动电路放大滤波后,就回发出相应的音调。如果在前一个按下的键发声的同时有另一个键被按下,则启用中断系统,前面键的发音停止,转到后按的键发音程序,发出后按的键的音调。
2.3创新部分
1.用一个诺基亚5110显示屏来显示当前所发出的音符,便于使用者对音符的识别,还可以编辑一首歌并同时显示歌词和时间。
2.可播放音乐。
2.4各部分元器件选用方案论证
2.4.1 单片机的选用
STC单片机是一款增强型5l单片机,完全兼容MCS-51。STC89C52可以代替AT89C51,而且功能更强,速度更快,寿命更长,价格更低。该单片机具有40个引脚,采用双列直插DIP-40封装。STC89C52可以完成ISP在线编程功能,而AT89C51则不能。因此,将AT89C51中的程序直接烧录到STC89C52中后,STC89C52就可以代替AT89C51直接工作。STC推出的系列51单片机芯片全面兼容其它51单片机。STC89C52内部有E2PROM,可以在程序中修改,而且断电不丢失数据。此外,还增加了两级中断优先级等等。
2.4.2 显示元件的选用
液晶显示模块采用的是NOKIA公司生产的LCD5110液晶显示模块。该液晶屏为48*84点阵的格式,每个英文字符占用6*8个点阵,一行可以显示14个字符,可以显示六行。汉字可以采用两种点阵方式显示,一种是12*12点阵,一种是16*16点阵,一共可以显示3行汉字。
LCD5110有10个引脚,原理图如图1所示:
引脚1为LCD5110的复位键,由软件控制即可。引脚2为片选端,引脚3用于控制输入的数据是命令还是普通数据。引脚5为液晶显示器的时钟输入,引脚6为电源输入端,引脚8为电源地。引脚7为背光控制开关,低电平打开背光。引脚9、10用于扩展。
2.4.3 键盘的选用
常用键盘分为独立式键盘接口和行列式键盘接口。本次课题设计使用的是独立式键盘接口。独立式键盘接口就是各键是相互独立的,每个按键各接一条输入线,检验输入线电平的高低可以很容易判断哪个按键被按下。这种键盘适用于按键较少后操作速度较高的场合。我们共用了9个按键,其中8个按键控制1、2、3、4、5、6、7、i的发音。还有一个按键控制LCD屏的显示。
2.4.4 电源的选用
要想使单片机正常运行,可靠、稳定的电源必不可少,在以往的电子设计中,我们一般制作5V电源,这样做的目的是通过变压器变压,将民用220V电直接转为5V电供单片机使用,在没有电脑USB时可以直接找一个插座接上便可使用。但缺点是制作成本较高,且体积较大,烧录程序时还需要另配烧录器。
由于我们在课程设计过程中时刻都要使用笔记本电脑,且程序需要在线烧写,故我们选择使用了USB烧录器,既可以在线烧写程序也可以当作电源使用,方便快捷。
2.4.5 其他元器件的选用
在确定了单片机芯片、诺基亚5110显示屏、电源模块和按键后,我们还确定选用排针、排阻、导线若干以及用于单片机最小系统的电容、晶振、电阻等。
3 系统硬件设计
3.1 总体设计
本设计采用STC89C50032RC单片机作为系统控制芯片,单片机对P0口的按键进行查询,如果有按键按下,则产生相应频率的脉冲通过P2.0口输出,再经过放大电路驱动扬声器,发出相应的音调。在显示系统中对当前的音符进行显示。系统的总体框图如图2所示:
3.2 单片机最小系统
最小系统包括晶振电路、复位电路和电源部分。最小系统电路图如图3所示:
3.3 按键的连接
一共有八个按键,分别和单片机的P1口相连,并分别连接一个上拉电阻。电路图如图4所示:
3.4 蜂鸣器的连接
蜂鸣器经过一个放大电路和单片机的P2.0口相连,选用无源蜂鸣器。电路图如图5所示:
3.5 显示屏的连接
显示屏总共有八个引脚,其中VCC和GND分别接3.3V电源和接地,其他引脚与单片机的P0口相连。电路图如图6所示:
3.6 整体电路
综合上面所介绍的各个模块的电路图的连接情况,最后总结出整体的电路图。整体电路图如图7所示:
4 系统软件设计
4.1主程序的设计
设计软件应从设计主程序着手开始,而设计程序应从流程图开始,经过考察论证,查阅资料,再根据所学的单片机编程的知识,最后总结出主程序的流程图如图8所示:
4.2 显示子程序的设计
指令格式分为两种模式:如果D/C(模式选择)置为低,当前字节解释为命令字节(见表1)。如果D/C置为高,接下来的字节将存储到显示数据RAM。每一个数据字节存入之后,地址计数自动递增。在数据字节最后一位期间会读取D/C信号的电平。每一条指令可用任意次序发送到PCD8544。首先传送的是字节的MSB(高位)。当SCE为高时,串行接口被初始化。在这个状态,SCLK时钟脉冲不起作用,串行接口不消耗电力。SCE上的负边缘使能串行接口并指示开始数据传输。
4.3 定时子程序的设计
定时子程序只需将TAB中对应的数值送给定时器的初值寄存器,然后开始定时。
5 软硬件联调
5.1 调试步骤
第一:按照整体电路图焊接硬件,硬件实物图如图9所示:
第二:编辑软件程序,用Uv4对程序进行编译,编译无误后保存,再用protuse对软件进行仿真。
第三:将硬件通过USB与RS-232串口转换线与电脑连接,用STC下载软件将编译完成后的程序下载烧录到硬件中,观察硬件的运行结果。硬件运行结果如图10所示:
5.2 软硬件联调过程中出现的问题和解决办法
◎问题1:
将USB烧写器尾部的短路帽子摘掉后插上电脑,程序无法烧写进芯片。
解决措施:
将STC中单片机的设置更改为STC89C52型号的,再将波特率改小一点,端口设置正确即可。
◎问题2:
程序烧录进去后显示屏不显示任何数字。
解决措施:
将USB口从电脑上拔下然后再插入即可。
◎问题3:
按键按下之后扬声器的声音抖动。
解决措施:
将放大电路检查一遍再将每个焊点焊实即可。
6 课设计总结
6.1 收获
通过一个多星期的课程设计,从选题到查资料,从完善原理图到写报告文档,让我明白了课程设计是名副其实的综合性训练,不仅要运用学过的单片机技术及应用,数字电路、模拟电路以及电子技术实验等知识,还要学会查阅各种图书资料和工具书,并将新知识和所学的结合起来为自己所用。在做整个课程设计的过程中,我进一步熟悉使用了protuse仿真软件和Uv4软件编辑软件,能较好的应用这些软件,不管是文本程序的编写还是在顶层原理图的设计都有所提高,还增强了动手能力。应用软件的时候,要注意积累每次的体会和错误,下次碰到该注意的地方就要小心点,碰到出过错误的地方就要格外注意不要再犯同样的错误,这种方法应该适用做任何一件事吧。在设计中遇到一些困难和问题,在向老师请教和与同学的讨论中,解决了问题,觉得很有收获。
6.2 心得体会
一个星期很快就过去了,这一周我收获了很多。在过去的一周里,我和耿勇杰、张兴旺、张扬组成的小组,经过大家一起坚持不懈的努力,最终完成了我们选择的单片机课题设计——电子琴设计。在原设计的基础上,我们还加入了显示模块。用诺基亚5110的液晶显示屏,完成弹奏音符的显示,使设计更加完美。
在这一个星期里,我们先把以前收集的资料进行了整理。在做课设之前,我们已经通过学校的图书馆和网络,进行了资料的收集,对基于单片机的电子琴设计有了大体的了解和认识。
并且在这学期得课余时间,我们经过研究和讨论,制定了设计的基本思路,并焊接完成了硬件电路。
这个星期我们的任务安排主要是完成电子琴的程序和5110液晶显示的程序,进行程序调试,使之在硬件上实现,最后完成任务书。
在最初的两天里,先进行的是电子琴的程序设计,了解的音乐产生的原理。音乐的产生是通过单片机的I\O端口输出高低不同的脉冲信号来控制蜂鸣器发声。不同的音频信号的周期不同,通过单片机的定时器,给定时器设置不同的初值,通过定时器中断,中断过程中对I\O端口取反,就得到了音频信号的脉冲。通过这次课设,我掌握了单片机设计单子琴的工作原理,又复习了单片机定时器的工作原理,熟练了计数初值的计算。把自己感兴趣的电子琴和学习的单片机知识联系到了一起,设计过程中,既再次学习了单片机的知识,对学习的知识有了更深刻的认识和理解;又获得了快乐,自己设计了简易的电子琴。用自己的设计弹奏出简单的音乐,还挺有成就感的。兴趣是最好的老师,把自己的兴趣和所学的知识结合起来,学以致用,理论应用于实践,这是我最大的收获。
完成电子琴的发音程序后,我们开始编写5110液晶显示屏的程序。5110液晶屏与一般课本上介绍的液晶显示屏不太一样。我们用的5110液晶显示屏,只有8个引脚,引脚越少,电路的连接越简单。可是看着越简单的东西,实际上要弄明白它的工作和使用就越难。由于5110液晶显示屏的资料比较少,我们又没有接触过。一开始我们先从其它的液晶显示屏资料开始研究,希望可以通过类比,了解5110液晶显示屏。再弄明白了其它液晶显示屏以后,我们开始编写5110的显示程序,编写完成后,与硬件进行调试却失败了。改程序,与硬件连接调试,失败;再改程序,再与硬件连接调试,再失败……这样的过程重复了不知多少遍。调试了两天以后,我们又把5110液晶显示屏的资料拿出来认真的研究,把指令集看了又看,这次我们注重分析了5110液晶屏与其它液晶屏的区别。放弃了通过其它液晶屏来认识5110,而是直接分析5110液晶屏。因为通过学习我们发现,两样东西即使它是类似的,可是在汇编的过程中,一点微小的区别也是不同的。后来在网上我们找到了5110液晶显示驱动PCD8544的使用手册,经过讨论和研究,我们再次编写了程序,结果和硬件连接了几次,还是失败了。最后我们只得求助于柳老师,刘老师编写完程序后,一开始也没有显示,老师把硬件断电再接电后,显示成功。于是我们也把自己写的程序下载到硬件中,断电再接电,显示也成功了。再郁闷了这么长时间后,发现只是因为这个小动作,所以一直没有显示,我们在显示成功高兴的同时,也有点小无奈。真是细节决定成败啊。
通过对5110液晶显示屏的使用,锻炼了我的自学能力。对一个从来没有接触过的器件,通过自己的学习,分析和研究,最终完成任务。这对我来说还是第一次,在这第一次的过程中,我走了很多弯路。一开始不知道如何下手,先是研究错了方向,学习和研究了许多其他的液晶显示屏。而后又拿着5110的资料不知道从哪看起,不知道那是编程要用的重点,只好把资料都看了。再后来又对5110的资料有不少不理解的地方,对引脚的控制和它的工作有许多模糊的地方,只好在编程时,一次次的实验,验证那种理解是正确的。
虽然这个过程曲折,而又让我觉得无奈。但是,在最后显示成功后,通过自己的努力而获得的喜悦,是无以言表的。并且,通过这次学习,我初步学会了看器件的使用手册,看指令表。学会了要想使用一个你不了解的器件,应该看什么,应该注意什么。你要看器件的参数,看各个引脚的连接和作用,看指令表。在编程的过程中,要严格按照指令表编写程序,不能自己想当然。大学教育和课题设计的目的,就是教会我们如何自学,锻炼我们独立思考的能力,在这次课设中,我有了切身的体会。
老师在编写5110显示程序时,本身老师也没有接触过5110的汇编。老师根据资料,通过简单的阅读,就把C语言的5110的显示程序,改成了汇编,并且显示成功。我们的资料和老师看的差不多,却折腾了两三天才把程序编写出来。我们一定会通过努力向老师看齐。
最后,我们还发现了蜂鸣器的问题,一开始我们用的蜂鸣器是有源的,声音小,把分压电阻短路后,声音大了,可是一直“滴滴”响个不停。上网查证后,发现蜂鸣器分为有源和无源的,电子琴设计要用无源的蜂鸣器。虽然是个小问题,但是也增加了一个小知识点。
通过这次课题设计,我的收获很大。我们获得了知识,完成了设计,锻炼了独立思考能力,和动手能力。我也体会到无论是硬件设计还是软件编程,细节决定成败,一定要认真对待每一个小步骤。
最后,谢谢柳延领老师的指导和帮助。
参考文献
1.《基于Proteus的8051单片机实例教程》 李学礼 主编 电子工业出版社
2.《Proteus教程——电子线路设计、制版与仿真》 朱清慧 张凤蕊 翟天嵩 王志奎 编著 清华大学出版社
3.《单片机原理及应用技术》 陈益飞主编 国防工业出版社
4.《单片机控制实训指导及综合应用实例》 张大明 主编 机械工业出版社
附录
电子琴课程设计程序源代码
SCE EQU P2.1
RES EQU P2.2
DC EQU P2.3
SDIN EQU P3.0
SCLK EQU P3.1
RX DATA 55H
RY DATA 56H
;单片机初始化
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP PNT0
ORG 000BH
LJMP INT_T0
ORG 001BH
LJMP TIME1
;设置定时器0\1工作方式0,开中断
MAIN:MOV SP,#70H
MOV TMOD,#11H
SETB EA
SETB ET0
SETB ET1
SETB F0
;LCD5110复位,清屏,初始化功能
SRART:
SETB RES
SETB SCE
SETB SCLK
CALL CLEAR
CLR RES
NOP
SETB RES
NOP
LCALL LCDRST
LCALL LCD
;判断是否有键按下
KEY: MOV P1,#0FFH
MOV A,P1
XRL A,#0FFH
JZ KEY2
LCALL DE10MS
MOV A,P1
MOV R5,A
XRL A,#0FFH
JNZ TKEY
SJMP KEY
KEY2:MOV A,P2
JNB ACC.5,L1
L2:SJMP KEY
L1:LCALL DE10MS
MOV A,P2
JB ACC.5,L2
LJMP FLCD
;判断那个键按下了
TKEY:MOV A,R5
JNB ACC.0,K1
SJMP K2
K1: MOV R2,#0
MOV DPTR,#TLCD1 ;设置LCD5110显示字的表格位置
MOV 51H,DPH
MOV 50H,DPL
LCALL SLCD
LJMP MUSIC
K2: JNB ACC.1,KK2
SJMP K3
KK2:MOV R2,#2
MOV DPTR,#TLCD2
MOV 51H,DPH
MOV 50H,DPL
LCALL SLCD
LJMP MUSIC
K3: JNB ACC.2,KK3
SJMP K4
KK3:MOV R2,#4
MOV DPTR,#TLCD3
MOV 51H,DPH
MOV 50H,DPL
LCALL SLCD
LJMP MUSIC
K4: JNB ACC.3,KK4
SJMP K5
KK4:MOV R2,#6
MOV DPTR,#TLCD4
MOV 51H,DPH
MOV 50H,DPL
LCALL SLCD
LJMP MUSIC
K5: JNB ACC.4,KK5
SJMP K6
KK5:MOV R2,#8
MOV DPTR,#TLCD5
MOV 51H,DPH
MOV 50H,DPL
LCALL SLCD
LJMP MUSIC
K6: JNB ACC.5,KK6
SJMP K7
KK6:MOV R2,#10
MOV DPTR,#TLCD6
MOV 51H,DPH
MOV 50H,DPL
LCALL SLCD
LJMP MUSIC
K7: JNB ACC.6,KK7
SJMP K8
KK7:MOV R2,#12
MOV DPTR,#TLCD7
MOV 51H,DPH
MOV 50H,DPL
LCALL SLCD
LJMP MUSIC
K8: JNB ACC.7,KK8
LJMP KEY
KK8:MOV R2,#14
MOV DPTR,#TLCD8
MOV 51H,DPH
MOV 50H,DPL
LCALL SLCD
;取按键对应音符,设置定时器0的初值
MUSIC:MOV A,R2
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV R7,A
MOV TH0,R7
INC R2
MOV A,R2
MOVC A,@A+DPTR
MOV R6,A
MOV TL0,R6
SETB TR0
;判断按键是否释放
LOOP:MOV P1,#0FFH
MOV A,P1
XRL A,#0FFH
JNZ LOOP
;按键释放后再响一段时间
DETY:MOV R4,#200
LP1:MOV R3,#126
DJNZ R3,$
DJNZ R4,LP1
CLR TR0
LJMP KEY
;消除抖动延时10MS
DE10MS:MOV R1,#10
LP2:MOV R0,#248
DJNZ R0,$
DJNZ R1,LP2
RET
;片P2.0口取反,提供音乐脉冲
INT_T0:PUSH PSW
PUSH ACC
MOV TH0,R7
MOV TL0,R6
CPL P2.0
POP ACC
POP PSW
RETI
PNT0:PUSH PSW
PUSH ACC
JNB TR0,RE2
KEY1:CLR TR0
MOV P1,#0FFH
MOV A,P1
XRL A,#0FFH
JZ KEY1
LCALL DE10MS
MOV P1,#0FFH
MOV A,P1
MOV R5,A
XRL A,#0FFH
JNZ RE3
RE3:POP PSW
POP ACC
LJMP TKEY
RE2:POP PSW
POP ACC
RETI
;LCD5110清屏
CLEAR:MOV 52H,#6
CLR1:MOV 53H,#84
CLR2:MOV A,#0
CALL WR_D
DJNZ 53H,CLR2
DJNZ 52H,CLR1
RET
;LCD5110初始化
LCDRST:MOV A,#21H
LCALL WR_C
MOV A,#0C8H
LCALL WR_C
MOV A,#20H
LCALL WR_C
MOV A,#0CH
LCALL WR_C
RET
;LCD5110显示“电子琴设计”
LCD:SETB F0
MOV RY,#40H
MOV RX,#80H
LCALL SET_XY
MOV DPTR,#LCD0
LCALL WDATA
MOV RY,#41H
MOV RX,#80H
LCALL SET_XY
MOV DPTR,#LCD1
LCALL WDATA
MOV RY,#40H
MOV RX,#90H
LCALL SET_XY
MOV DPTR,#LCD2
LCALL WDATA
MOV RY,#41H
MOV RX,#90H
LCALL SET_XY
MOV DPTR,#LCD3
LCALL WDATA
MOV RY,#40H
MOV RX,#0A0H
LCALL SET_XY
MOV DPTR,#LCD4
LCALL WDATA
MOV RY,#41H
MOV RX,#0A0H
LCALL SET_XY
MOV DPTR,#LCD5
LCALL WDATA
MOV RY,#40H
MOV RX,#0B0H
LCALL SET_XY
MOV DPTR,#LCD6
LCALL WDATA
MOV RY,#41H
MOV RX,#0B0H
LCALL SET_XY
MOV DPTR,#LCD7
LCALL WDATA
MOV RY,#40H
MOV RX,#0C0H
LCALL SET_XY
MOV DPTR,#LCD8
LCALL WDATA
MOV RY,#41H
MOV RX,#0C0H
LCALL SET_XY
MOV DPTR,#LCD9
LCALL WDATA
RET
;LCD5110写指令子程序
WR_C:CLR SCE
CLR DC
CALL SENT
SETB SCE
RET
;LCD5110写数据子程序
WR_D:CLR SCE
SETB DC
CALL SENT
SETB SCE
RET
;LCD5110设置XY坐标
SET_XY:MOV A, RY
CALL WR_C
MOV A,RX
CALL WR_C
RET
;LCD5110串行输入8位数据
SENT:MOV 54H,#08H
RS:RLC A
MOV SDIN,C
CLR SCLK
NOP
NOP
SETB SCLK
DJNZ 54H,RS
RET
;写入汉字数据
WDATA:MOV 57H,#16
STR0:MOV A,#00H
MOVC A,@A+DPTR
LCALL WR_D
INC DPTR
DJNZ 57H,STR0
RET
//电
LCD0:DB 0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF
DB 0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00
LCD1:DB 0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F
DB 0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00
//子
LCD2:DB 0x80,0x82,0x82,0x82,0x82,0x82,0x82,0xE2
DB 0xA2,0x92,0x8A,0x86,0x82,0x80,0x80,0x00
LCD3:DB 0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F
DB 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
//琴
LCD4:DB 0x82,0x92,0x92,0xFE,0x92,0x92,0x82,0x00
DB 0x82,0x92,0x92,0xFE,0x92,0x92,0x82,0x00
LCD5:DB 0x08,0x08,0x08,0x14,0x14,0x12,0x16,0x99
DB 0x52,0x32,0x14,0x04,0x08,0x08,0x08,0x00
//设
LCD6:DB 0x40,0x40,0x42,0xCC,0x00,0x40,0xA0,0x9E
DB 0x82,0x82,0x82,0x9E,0xA0,0x20,0x20,0x00
LCD7:DB 0x00,0x00,0x00,0x3F,0x90,0x88,0x40,0x43
DB 0x2C,0x10,0x28,0x46,0x41,0x80,0x80,0x00
//计
LCD8:DB 0x40,0x40,0x42,0xCC,0x00,0x40,0x40,0x40
DB 0x40,0xFF,0x40,0x40,0x40,0x40,0x40,0x00
LCD9:DB 0x00,0x00,0x00,0x7F,0x20,0x10,0x00,0x00
DB 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00
;LCD5110音符显示
SLCD:MOV RY,#43H
MOV RX,#0A8H
LCALL SET_XY
LCALL WDATA1
RET
;写入音符数据
WDATA1:MOV 55H,#6
STR:MOV A,#00H
MOVC A,@A+DPTR
LCALL WR_D
INC DPTR
DJNZ 55H,STR
RET
;音符数据
TLCD1: DB 00H,84H,0FEH,0FEH,80H,00H
TLCD2:DB 86H,0C3H,0E3H,0B3H,9FH,8EH
TLCD3:DB 44H,83H,92H,92H,0FEH,6CH
TLCD4:DB 38H,2CH,26H,0FFH,20H,20H
TLCD5:DB 00H,0DEH, 9EH, 92H,0F2H, 62H
TLCD6:DB 7CH, 0FEH, 92H, 92H, 0E2H,64H
TLCD7:DB 03H, 01H, 0E1H, 0F1H, 0FH,07H
TLCD8:DB 00H, 84H, 0fdH, 0FDH, 80H,00H
;音符频率初值
TAB:DW 64580,64684,64777,64820
DW 64898,64968,65030,65058
FLCD:JNB F0,CHEN ;跳转到显示“谢谢”的子程序
LJMP START2 ;跳转到播放音乐子程序
CHEN:SETB F0
MOV RY,#40H
MOV RX,#80H
LCALL SET_XY
LCALL CLEAR
NOP
NOP
MOV RY,#40H
MOV RX,#80H
LCALL SET_XY
MOV DPTR,#FLCD0
LCALL WDATA
MOV RY,#41H
MOV RX,#80H
LCALL SET_XY
MOV DPTR,#FLCD1
LCALL WDATA
MOV RY,#40H
MOV RX,#90H
LCALL SET_XY
MOV DPTR,#FLCD0
LCALL WDATA
MOV RY,#41H
MOV RX,#90H
LCALL SET_XY
MOV DPTR,#FLCD1
LCALL WDATA
MOV RY,#40H
MOV RX,#0A0H
LCALL SET_XY
MOV DPTR,#FLCD2
LCALL WDATA
MOV RY,#41H
MOV RX,#0A0H
LCALL SET_XY
MOV DPTR,#FLCD3
LCALL WDATA
MOV RY,#40H
MOV RX,#0B0H
LCALL SET_XY
MOV DPTR,#FLCD4
LCALL WDATA
MOV RY,#41H
MOV RX,#0B0H
LCALL SET_XY
MOV DPTR,#FLCD5
LCALL WDATA
MOV RY,#40H
MOV RX,#0C0H
LCALL SET_XY
MOV DPTR,#FLCD6
LCALL WDATA
MOV RY,#41H
MOV RX,#0C0H
LCALL SET_XY
MOV DPTR,#FLCD7
LCALL WDATA
SJMP KEY ;跳转回键盘扫描子程序
//谢
FLCD0:DB 0x40,0x42,0xCC,0x04,0x00,0xFC,0x56,0x55
DB 0xFC,0x50,0x90,0x10,0xFF,0x10,0x10,0x00
FLCD1:DB 0x00,0x00,0x3F,0x50,0x29,0x11,0x4D,0x83
DB 0x7F,0x00,0x41,0x80,0x7F,0x00,0x00,0x00
//柳
FLCD2:DB 0x10,0x10,0xD0,0xFF,0x90,0x10,0xFC,0x04
DB 0x02,0xF8,0x00,0xFC,0x04,0x04,0xFC,0x00
FLCD3:DB 0x04,0x03,0x00,0xFF,0x00,0x01,0x8F,0x44
DB 0x32,0x0F,0x00,0xFF,0x04,0x08,0x07,0x00
//老
FLCD4:DB 0x20,0x20,0x24,0x24,0x24,0x24,0xBF,0x64
DB 0x24,0x34,0x28,0x24,0x22,0x20,0x20,0x00
FLCD5:DB 0x10,0x08,0x04,0x02,0x3F,0x45,0x44,0x44
DB 0x42,0x42,0x42,0x41,0x78,0x00,0x00,0x00
//师
FLCD6:DB 0x00,0xFC,0x00,0x00,0xFF,0x00,0x02,0xE2
DB 0x22,0x22,0xFE,0x22,0x22,0xE2,0x02,0x00
FLCD7:DB 0x00,0x87,0x40,0x30,0x0F,0x00,0x00,0x1F
DB 0x00,0x00,0xFF,0x08,0x10,0x0F,0x00,0x00
START2:CLR F0 ;音乐播放子程序
LCALL WORD2
MAIN2: MOV 60H,#00H ;设置初始指针
NEXT2: MOV A,60H
MOV DPTR,#MTAB
MOVC A,@A+DPTR
CJNE A,#00H,PLAY
LJMP STOP
PLAY: MOV 61H,A
ANL A,#0FH
MOV 62H,A ;把节拍值存放在62H中
MOV A,61H
ANL A,#0F0H
CJNE A,#0,MUSIC2
LJMP DEL2
MUSIC2:SWAP A
DEC A
MOV 63H,A ;把音符值存放在63H中
ADD A,63H
MOV 64H,A
MOV DPTR,#MTAB1
MOVC A,@A+DPTR
MOV TH1,A
MOV 65H,A
MOV A,64H
INC A
MOVC A,@A+DPTR
MOV TL1,A
MOV 66H,A
SETB TR1 ;打开定时器1
DEL2:LCALL DETY2
INC 60H ;指针加一,取下一个音符
LJMP NEXT2
TIME1:PUSH ACC
PUSH PSW
CPL P2.0 ;播放音乐
MOV TH1,65H
MOV TL1,66H
POP PSW
POP ACC
RETI
;音乐播放完毕,关闭定时器1,返回键盘扫描
STOP: CLR TR1
LJMP KEY
DETY2: MOV 67H,#2
L0P2: MOV 68H,#125
L0P1: MOV 69H,#248
DJNZ 69H,$
DJNZ 68H,L0P1
DJNZ 67H,L0P2
DJNZ 62H,DETY2
RET
WORD2: ;显示播放音乐的名字
MOV RY,#40H
MOV RX,#80H
LCALL SET_XY
LCALL CLEAR
NOP
NOP
MOV RY,#42H
MOV RX,#90H
LCALL SET_XY
MOV DPTR,#WLCD0
LCALL WDATA
MOV RY,#43H
MOV RX,#90H
LCALL SET_XY
MOV DPTR,#WLCD1
LCALL WDATA
MOV RY,#42H
MOV RX,#0A0H
LCALL SET_XY
MOV DPTR,#WLCD2
LCALL WDATA
MOV RY,#43H
MOV RX,#0A0H
LCALL SET_XY
MOV DPTR,#WLCD3
LCALL WDATA
MOV RY,#42H
MOV RX,#0B0H
LCALL SET_XY
MOV DPTR,#WLCD4
LCALL WDATA
MOV RY,#43H
MOV RX,#0B0H
LCALL SET_XY
MOV DPTR,#WLCD5
LCALL WDATA
RET
;音乐的所有音符
MTAB1:DW 64524,64580,64684,64777,64820
DW 64898,64968,65030,65058
;音乐对应的音符和节拍
MTAB:DB 64H,42H,62H,98H,74H,92H,72H,68H
DB 64H,22H,32H,44H,32H,22H,3CH
DB 64H,42H,62H,94H,04H,82H,74H,94H
DB 68H,64H,32H,42H,54H,04H,12H,2CH
DB 74H,94H,98H,84H,72H,82H,98H,72H
DB 82H,92H,72H,72H,62H,42H,22H,3CH
DB 64H,42H,62H,94H,04H,82H,74H,94H
DB 68H,64H,32H,42H,54H,04H,12H,2CH
DB 00H
;音乐名
//长
WLCD0:DB 0x80,0x80,0x80,0x80,0xFF,0x80,0x80,0xA0
DB 0x90,0x88,0x84,0x82,0x80,0x80,0x80,0x00
WLCD1:DB 0x00,0x00,0x00,0x00,0xFF,0x40,0x21,0x12
DB 0x04,0x08,0x10,0x20,0x20,0x40,0x40,0x00
//亭
WLCD2:DB 0x00,0x04,0x04,0x74,0x54,0x54,0x55,0x56
DB 0x54,0x54,0x54,0x74,0x04,0x04,0x00,0x00
WLCD3:DB 0x04,0x03,0x01,0x05,0x05,0x45,0x85,0x7D
DB 0x05,0x05,0x05,0x05,0x01,0x05,0x03,0x00
//外
WLCD4:DB 0x00,0xC0,0x30,0x1F,0x10,0x10,0xF0,0x00
DB 0x00,0xFF,0x20,0x40,0x80,0x00,0x00,0x00
WLCD5:DB 0x81,0x40,0x21,0x12,0x0C,0x03,0x00,0x00
DB 0x00,0xFF,0x00,0x00,0x00,0x03,0x00,0x00
;结束
END