数字电子琴说明书
单片机课程
----数字电子琴设计
单片机课程设计
设计
目:数字电子琴
姓 名:王明海 徐向前 初晓峰 学 号:201156501317 班 级:机111-3班
指导老师:陈素
单片机课程设计----数字电子琴设计
目录
课设题目....................................................................................3 【摘要】....................................................................................3 一、引言....................................................................................4 1.1电子琴的设计背景..............................................................4 1.2电子琴的设计意义..............................................................4 1.3电子琴的设计目标..............................................................4 二、
的选择........................................................................5 2.1控制模块选择方案..............................................................5 2.2按键选择方案......................................................................5 三、硬件设计及说明................................................................6 3.1系统组成及总体框图..........................................................6 3.2元件简介..............................................................................7
3.2.1MCS-51 80C51.............................................................7
3.2.2LED数码管..................................................................9 3.3显示电路..............................................................................10 3.4各功能模块原理图.............................................................10
3.4.1MCS80C51模块电路原理图......................................10
3.4.2键盘扫描模块电路原理图.........................................11
3.4.3数码管显示模块电路原理图.....................................12
3.4.4音频处理模块电路原理图..........................................12
单片机课程设计----数字电子琴设计
四、软件设计...........................................................................13 4.1音乐相关知识.....................................................................13 4.2如何用单片机实现音频脉冲.............................................14
4.3系统总体流程图.................................................................16 五、系统调试...........................................................................19 5.1硬件调试.............................................................................19 5.2软件调试.............................................................................19 六、课程设计总结及心得体会...............................................20
七、参考文献...........................................................................21 附录1:元器件清单................................................................22 附录2:主要电路原理图........................................................24 附录3:程序清单....................................................................24
汇编程序...................................................................24
C语言程序................................................................35
单片机课程设计----数字电子琴设计
课设题目:数字电子琴的设计
【摘要】
随着电子技术的发展,电子技术正在逐渐改善着人们的学习、生活、工作,因此开发本系统希望能够给人们多带来一点生活上的乐趣,电子技术与音乐的结合不断加深。由此而产生的电子琴在这种形势下,因其体积小,易于携带,经济适用,对初学者,尤其对识谱的人来说是很容易弹奏的,一首简单的曲子灵感好的人甚至不用很多的练习和教师的指导就能很快的弹奏出来。是一般家庭都能承受得了的经济投入,而且电子琴键盘操作直观易于掌握。这样就强烈地激发了学习者的学习兴趣,迅速地提高了电子琴的普及率。电子琴使用简单。深受广大音乐爱好者推崇。
作为电子专业的学生,掌握电子琴的制作是很好检验我们所学知识应用。它所包含的知识基本上覆盖我们的模拟电子技术基础、数字电子技术基础、EDA技术、电子线路、单片机基础以及接口技术课程的重要章节。虽然我们不能设计出很复杂的电子琴,主要是考虑到设备以及成本等一系列问题,因此我打算设计并制作一个简易的电子琴。采用集成电路设计,基于MCS-51 80C51单片机设计一款简易的电子琴,采用4*4距阵键盘,鉴于传统电子琴可以用键盘上的“k0”到“k16”键演奏从低So到高DO等16个音,从而可以用来弹奏喜欢的乐曲。特点是设计思路简单、清晰,成本低。
1
单片机课程设计----数字电子琴设计
【关键词】 单片机 电子琴 80C51 一、引言
1.1电子琴的设计背景
随着电子科技的飞速发展,电子技术正在逐渐改善着人们的学习、生活、工作,因此开发本系统希望能够给人们多带来一点生活上的乐趣。
基于当前市场上的玩具市场需求量大,其中电子琴就是一个很好的应用方面。单片机技术使我们可以利用软硬件实现电子琴的功能,从而实现电子琴的微型化,可以用作玩具琴、音乐转盘以及音乐童车等等。并且可以进行一定的功能扩展。鉴于传统电子琴可以用键盘上的“k0”到“k16”键演奏从低So到高DO等16个音,从而可以用来弹奏喜欢的乐曲。
1.2电子琴的设计意义
该设计具有以下优点:
(1)可以随意弹奏想要
达的音乐。
(2)制作简单,成本低。
(3)比传统电子琴功能更完善。
1.3电子琴的设计目标
由于本设计主要用于人们娱乐方面,因此在设计上尽量使其安全以及简单易操作。其次,在这次设计可行性上进行
如下:
1、经济可行性:
所谓经济可行性,即在这次设计上需要投入资金的多少,由于课
2
单片机课程设计----数字电子琴设计
程设计是提高我们的动手能力以及资金有限。因此在经济上必须能够承受,比较理想化的对于我们课程设计来说是不可行的。通过分析后,无论是在器件价格或是常见度上均是可行的。
2、技术可行性:
技术可行性主要是分析技术条件上是否能够顺利开展并完成课程设计的主要问题,硬件、软件能否满足设计者的需要等。通过分析各种软件环境,硬件仿真环境等均已经具备。
综上所述,本系统设计目标已经明确,在经济与技术上均可行,因此本系统的开发是完全可行的。
二、方案的选择
2.1控制模块选择方案
采用80C51单片机进行控制,由于其性价比高,完全满足了本作品智能化的要求,它的内部程序存储空间达到4K,使软件设计有足够的内部使用空间并且方便日后系统升级,使用方便,抗干扰性能提高。
2.2 按键选择方案
传统电子琴可以用键盘上的“1”到“A”键演奏从低SO到高DO等11音。该设计有16个按钮矩阵,设计成16个音,可以实现音阶在低音4---高音5之间。比传统音阶范围大,弹奏效果好。 三、硬件设计及说明
3.1系统组成及总体框图
硬件设计的任务是根据总体设计要求,在选择的机型的基础上,
3
单片机课程设计----数字电子琴设计
具体确定系统中所要使用的元器件,设计出系统的原理框图、电路原理图。
该设计要实现一种由单片机控制的电子琴,单片机工作于12MHZ时钟频率,使用其定时/计数器T0,工作模式为1,改变计数值TH0和TL0可以产生不同频率的脉冲信号。该设计具有11个音节的键盘,用户可以根据乐谱在键盘上进行演奏,音乐发生器会根据用户的弹奏,通过扬声器将音乐播放出来。由于本例实现的音乐发生器是由用户通过键盘输入弹奏乐曲的,所以节拍由用户掌握,不由程序控制。用单片机产生的音频脉冲直接驱动扬声器并不能产生所要实现的音乐,因为它没有足够的驱动能力,这就需要音频功率放大电路。
本例使用国家半导体公司的低压音频功率放大器LM386来实现音频功放电路。
单片机音频功放电路 按键 80C51
`扬声器 LED显示
电路
图3-1 系统结构图
3.2元件简介
3.2.1MCS-51 80C51
80C51单片机属于MCS-51系列单片机,由Intel公司开发,其结构是8048的延伸,改进了8048的缺点,增加了如乘(MUL)、除(DIV)、减(SUBB)、比较(CMP)、16位数据指针、布尔代数运算等指令,以及串行通信能力和5个中断源。采用40引脚双列直插
4
单片机课程设计----数字电子琴设计
式DIP(Dual In Line Package),内有128个RAM单元及4K的ROM。80C51有两个16位定时计数器,两个外中断,两个定时计数中断,及一个串行中断,并有4个8位并行输入口。80C51内部有时钟电路,但需要石英晶体和微调电容外接,本系统中采用12MHz的晶振频率。由于80C51的系统性能满足系统数据采集及时间精度的要求,而且产品产量丰富来源广,应用也很成熟,故采用来作为控制核心。
Vss(20脚):接地
VCC(40脚): 主电源+5V
XTAL1(19脚):接外部晶体的一端。在片内它是振荡电路反相放大器的输入端。在采用外部时钟时,对于HMOS单片机,该端引脚必
5
单片机课程设计----数字电子琴设计
须接地;对于CHMOS单片机,此引脚作为驱动端。
XTAL2(18脚): 接外部晶体的另一端。在片内它是一个振荡电路反相放大器的输出端,振荡电路的频率是晶体振荡频率。若需采用外部时钟电路,对于HMOS单片机,该引脚输入外部时钟脉冲;对于CHMOS单片机,此引脚应悬浮。
RST(9脚): 单片机刚接上电源时,其内部各寄存器处于随机状态,在该脚输入24个时钟周期宽度以上的高电平将使单片机复位(RESET)
PSEN(29脚): 在访问片外程序存储器时,此端输出负脉冲作为存储器读选通信号。CPU在向片外存储器取指令期间,PSEN信号在12个时钟周期中两次生效。不过,在访问片外数据存储器时,这两次有效PSEN信号不出现。PSEN端同样可驱动8个LSTTL负载。我们根据PSEN、ALE和XTAL2输出端是否有信号输出,可以判别80C51是否在工作。
ALE/PROG(30脚):在访问片外程序存储器时,此端输出负脉冲作为存储器读选通信号。CPU在向片外存储器取指令期间,PSEN信号在12个时钟周期中两次生效。不过,在访问片外数据存储器时,这两次有效PSEN信号不出现。PSEN端同样可驱动8个LSTTL负载。我们根据PSEN、ALE和XTAL2输出端是否有信号输出,可以判别80C51是否在工作。
6
单片机课程设计----数字电子琴设计
EA/VPP(31脚): 当EA端输入高电平时,CPU从片内程序存储器地址0000H单元开始执行程序。当地址超出4KB时,将自动执行片外程序存储器的程序。当EA输入低电平时,CPU仅访问片外程序存储器。在对87C51EPROM编程时,此引脚用于施加编程电压VPP。
输入/输出引脚:
(1)P0.0—P0.7 (39脚—32脚)
(2)P1.0—P1.7 (1脚—8脚)
(3)P2.0—P2.7 (21脚—28脚)
(4)P3.0—P3.7 (10脚—17脚)
3.2.2LED数码管
本次课程设计的显示电路采用LED数码管显示,LED(Light-Emitting Diode)是一种外加电压从而流过电流并发出可见光的器件。LED是属于电流控制器件,使用时必须加限流电阻。LED有单个LED和八段LED之分,也有共阴和共阳两种。
常用的七段显示器的结构如图下图所示。发光二极管的阳极连在一起的称为共阳极显示器(如图b所示),阴极连在一起的称为共阴极显示器(如图c所示)。1位显示器由八个发光二极管组成,其中七个发光二极管a~g控制七个笔画(段)的亮或暗,另一个控制一个小数点的亮和暗,这种笔画式的七段显示器能显示的字符较少,字符的开
7
单片机课程设计----数字电子琴设计
头有些失真,但控制简单,使用方便。
此外,要画出电路图,首先还要搞清楚他的引脚图的分布,在了解了正确的引脚图后才能进行正确的字型段码编码。才能显示出正确的数字来。
(a)外形 (b)共阳极 (C)共阴极
图3-6 数码管引脚
3.3显示电路
本次课程设计显示电路采用LED数码管显示,由于 LED是属于电流控制器件,使用时必须加限流电阻。通过单片机查表得出数码管显示编码,传送给数码管显示,以此来实现按键与显示程序的一致性。 3.4各功能模块原理图
3.4.1MCS-51 8051模块电路原理图
单片机主程序模块通过对键盘扫描程序信号的读取,在通过对应的表,取出数码管显示编码和定时器初始值以产生不同的声音信号。在这一过程中,对数码管编码是直接赋值,对声音信号则是通过中断程序进行控制。
8
单片机课程设计----数字电子琴设计
80C51模块电路原理图
3.4.2键盘扫描模块电路原理图
对键盘扫描电路的扫描方式有行扫描法和线反转法,在此次程序编写中,采用行扫描法,通过在P3.0~p3.3上循环送出0扫描信号,P3.4~p3.7输入按键上的高低电平信息给单片机,经处理程序,判断出是哪个开关按下,并送主程序以实现不同功能。
键盘扫描模电路实际图
9
单片机课程设计----数字电子琴设计
3.4.3数码管显示模块电路原理图
数码管显示模块核心是共阳级数码管,通过来自单片机I/O口的电平高低来点亮和熄灭数码管上的发光二极管,通过单片机送来的数码管显示编码可以在数码管上显示数字和字符,使应用人员可以很容易的理解按键按下所对应的音符。
数码管显示模块电路实际图
3.4.4音频处理模块电路原理图
由于单片机驱动能力不够,在处理音符信号时,需加功率放大装置,因LM386芯片具有低功耗、高增益的特点,这合适单片机低功耗输出,所以加装LM386音频信号放大器对信号进行放大。
音频处理模块电路实际图
10
单片机课程设计----数字电子琴设计
音频处理模块电路实际图
四、软件设计
本软件设计关键是要实现一种由单片机控制的简单音乐发生器,它由16个音节组成的的键盘,用户可以根据乐谱在键盘上进行演奏,音乐发生器会根据用户的弹奏,通过扬声器将音乐播放出来。
4.1 音乐相关知识
乐音听起来有的高,有的低,这就叫音高,音高是由发音物体振
11
单片机课程设计----数字电子琴设计
动频率的高低决定的,频率高声音就高,频率低声音就低,不同音商的乐音是用C、D、E、F、G、A、B表示的,这7个字母就是乐音的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,这是唱曲时乐音的发音,所以叫唱名。
音持续时间的长短即时值,一般用拍数表示,休止符表示暂停发音。一首音乐是由许多不同的音符组成的,而每个音符对应着不同的频率,这样就可以利用不同频率的组合,加以与拍数对应的延时,构成音乐。
4.2如何用单片机产生音频脉冲
了解音乐的一些基本知识后可知,产生不同频率的音频脉冲即能产生音乐,对于单片机而言,产生不同频率有脉冲非常方便,可以利用它的定时/计数器来产生这样的方波频率信号,因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。
利用MCS-51 80C51的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶,例如,频率为523Hz,其周期T,1/523,1912μs,因此只要令计数器计时956μs/1μs,956,每计数956次时将I/O反相,就可得到中音DO(523Hz)。
计数脉冲值与频率的关系式(如式2-1所示)是:
N=fi?2?fr
式中,N是计数值;fi是机器频率(晶体振荡器为12MHz时,其频率
12
单片机课程设计----数字电子琴设计
为1MHz);fr是想要产生的频率。
其计数初值T的求法如下:
T,65536,N,65536,fi?2?fr
例如:设K,65536,fi,1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的计数值。
T,65536,N,65536,fi?2?fr,65536,1000000?2?fr,65536,500000/fr
低音DO的T,65536,500000/262,63627
中音DO的T,65536,500000/523,64580
高音DO的T,65536,500000/1046,65059
在本实验中,单片机工作于12MHZ时钟频率,使用其定时/计数器T0,工作模式为1,改变计数值TH0和TL0可以产生不同频率的脉冲信号,在此情况下,C调的各音符频率与计数值T的对照如下表: 音符 频率计数值(T音符 频率计数值(T
(HZ) 值) (HZ) 值)
262 63628 #4FA# 740 64860 低1DO
#1DO# 277 63737 784 64898 中5SO
294 63835 #5SO# 831 94934 低2RE
#2RE# 311 63928 880 64968 中6LA
330 64021 #6LA# 932 64994 低3MI
349 64103 968 65030 低4FA 中7SI
13
单片机课程设计----数字电子琴设计
#4FA# 370 64185 1046 65058 低1DO
392 64260 #1DO# 1109 65085 低SO
#5SO# 415 64331 1175 65110 高2RE
440 64400 #2RE# 1245 65134 低6LA
#6LA# 466 64463 1318 65157 高3MI
494 64524 1397 65178 低7SI 高4FA
523 64580 #4FA# 1490 65198 中1DO
#1DO# 554 64633 1568 65217 高5SO
587 64633 #5SO# 1661 65235 中2RE
#2RE# 622 64884 1760 65252 高6LA
659 64732 #6LA# 1865 65268 中3MI
698 64820 1967 65283 中4FA 高7SI
表4-2 音符频率与计数值T的对照表 T的值决定了TH0和TL0的值,其关系为:TH0=T/256,TL0=T%256
4.3系统总体功能流程图
该程序设计思路比较清晰既从开始到声明变量与函数再到读取
按钮开关,判断是否按下,然后就是一个一个按钮的动作。其主程序
如下:
定时器初始化 循环检测按键
数码管显示0
图4-1 主程序框图 按键子程序流程图如下:
14
单片机课程设计----数字电子琴设计
数码管显示0,并KEY1键按播放Do的中音 下
数码管显示1,并KEY2键按播放Re的中音 下
数码管显示2,并KEY3键按播放Mi的中音 下
数码管显示3,并KEY4键按播放Fa的中音 下
数码管显示4,并KE51键按播放So的中音 下
数码管显示5,并KEY6键按播放La的中音 下
数码管显示6,并KEY7键按播放Si的中音 下
数码管显示7,并KEY8键按播放Do的高阶中下 音
15
单片机课程设计----数字电子琴设计
数码管显示8并播KEY9键按下 放Do的高音
数码管显示9并播KEY10键按放Re的高音 下
数码管显示10,并KEY11键按播放Mi的高音 下
数码管显示11,并KEY12键按播放Fa的高音 下
数码管显示12,并KEY13键按播放So的高音 下
数码管显示13,并KEY14键按播放La的高音 下
数码管显示14,并KEY15键按播放Si的高音 下
数码管显示15,并KEY16键按播放Do的高阶高音 下
16
单片机课程设计----数字电子琴设计
五、系统调试
电路调试是整个系统功能否实现的关键步骤,整个调试过程分为三大部分:硬件调试、软件调试和综合调试。
5.1硬件调试
硬件调试主要是针对单片机部分进行调试。
在上电前,先确保电路中不在断路或短路情况,这一工作是整个调试工作的第一步,也是非常重要的一个步骤。在这部分调试中主要使用的工具是万用表,用来完成检测电路中是否存在断路或者短路情况等。注意焊点之间,确保焊点没有短接在一起,同时注意焊点的美观,确保没有开路以及短路的现象出现。
在确保硬件电路正常,无异常情况(断路或短路)方可上电调试,上电调试的目的是检验电路是否接错,同时还要检验原理是否正确,在本次设计中,上电调试主要键盘单片机控制部分、数码管点亮部分、和音频转换电路硬件调试。
1、数码管LED电路调试:接通电源,随机按下按钮可以看到数码管显示数字。
2、键盘单片机控制部分调试:上电后,随机按动键盘可以发现各个按键对应的音正确。
5.2 软件调试
通常一个调试程序应该具备至少四种性能:跟踪、断点、查看变
17
单片机课程设计----数字电子琴设计
量、更改数值。整个程序是一个主程序调用各个子程序实现功能的过程,要使主程序和整个程序都能平稳运行,各个模块的子程序的正确与平稳运行必不可少,所以在软件调试的最初阶段就是把各个子程序模块进行分别调试。
六、课程设计总结以及心得体会
通过这次课程设计,我学到了很多课本上没有学到的知识,这其中也锻炼了自己的动手能力,可以将以前学过的零零散散的知识穿串起来。
本次课程设计通过制作简易电子琴,我很好的将自己的理论知识与实践相结合起来,进一步巩固了专业基础知识和相关专业课程知识,同时也培养了自己独立自主、综合分析的思维与创新能力。在设计的过程中遇到各种各样的问题,设计的过程也不是一帆风顺。特别是设计软件时,一些很细小的问题都可能导致功能性的错误。在设计过程中我发现自己对以前所学过的知识理解得不够深刻,掌握得不够牢固,所以也利用图书馆、网络资源查阅了大量文献资料,请教了很多同学。同时在具体的制作过程中我们发现一些书本上的知识与实际的应用存在着一定的差距,书本上的知识很多都是理想化后的结论,忽略了很多实际的因素,或者涉及的不全面,可在实际的应用时这些是不能被忽略的,不得不考虑这方面的问题,这也让我更深刻地体会到在今后的学习工作中也要注重理论联系实际,更重要的是增强了我们的团队合作意识,让我们意识到以后不管到哪个岗位上都离不开自
18
单片机课程设计----数字电子琴设计
己的团队,如果没有小组成员共同努力,不管是在质量上还是在设计时间上都会大大折扣。
首先在课程设计刚开始的调研阶段,我学会了怎么通过各种方式查询相关的资料。通过对这些资料的学习,我大致了解了单片机的发展现状以及未来的发展趋势,认识到目前单片机方面的各种各样的发展。了解了单片机方面的先进技术,这些都为我的未来的学习指明了方向。课程设计主要涉及硬件和软件两方面的内容,通过这些我的硬件和软件开发能力都获得了提高。
最后,感谢王东兴老师的指导。
七、参考文献
【1】谭会生,张昌凡.EDA技术及应用(第二版)[M].西安电子科技大学出版社,2001年9月第1版
【2】徐志军,王金明,伊廷辉等. EDA技术与PLD设计[M].人民邮电出版社, 2006年2月第1版
【3】赵鑫,蒋亮,齐兆群等.数字电路设计[M].北京机械工业出版社,2005年6月第一版.
【4】苏家健、曹柏荣、汪志锋.单片机原理及应用技术[M].高等教育出版社
【5】汪贵平、李登峰、龚贤武、雷旭.新编单片机原理及应用.机械工业出版社
【6】于海生. 微型计算机控制技术选编[M].清华大学出版社,1999.
19
单片机课程设计----数字电子琴设计
【7】李朝青. 单片机原理及接口技术[M]. 北京:北京航天航空大学出版色,2001.
【8】胡汉才. 单片机原理及其接口技术[M]. 北京:清华大学出版社,2004.
【9】 宋浩,田丰,单片机原理及应用,北京:清华大学出版社,北京交通大学大学出版社,2005
附录1:元器件清单
共阳极数码管 一个
扬声器 一个
按键 17个
晶振(11.0592MHZ) 一个
电解电容(10uf) 一 只
电阻 (10K) 一个
发光二极管(LED) 一个
MCS-51 80C51 一个
附录2:主要电路原理图
20
单片机课程设计----数字电子琴设计
21
单片机课程设计----数字电子琴设计
附录3:程序清单
一、汇编程序
KEYBUF EQU 30H ; KEYBUF定义为30H STH0 EQU 31H ; STHO定义为31H STL0 EQU 32H ; STLO定义为32H TEMP EQU 33H ; TEMP定义为33H ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0
START: MOV TMOD,#01H ;设置定时器0的工作方式1
SETB ET0 ;设置定时器中断 SETB EA ;开中断总允许 WAIT:
MOV P3,#0FFH ;设置P3口输入 CLR P3.4 ;清零P3.4,按键第一行扫描
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY1
LCALL DELY10MS ;延时10ms
22
单片机课程设计----数字电子琴设计
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY1
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK1
MOV KEYBUF,#0
LJMP DK1
NK1: CJNE A,#0DH,NK2 ;K1键按下 MOV KEYBUF,#1
LJMP DK1
NK2: CJNE A,#0BH,NK3 ;K2键按下 MOV KEYBUF,#2
LJMP DK1
NK3: CJNE A,#07H,NK4 ;K3键按下 MOV KEYBUF,#3
LJMP DK1
NK4: NOP ;K4键按下 DK1:
MOV A,KEYBUF
MOV DPTR,#TABLE
23
单片机课程设计----数字电子琴设计
MOVC A,@A+DPTR
MOV P0,A
MOV A,KEYBUF
MOV B,#2
MUL AB ;乘以2查表数据 MOV TEMP,A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR ;查表 MOV STH0,A
MOV TH0,A ;将数据高位送到TH0 INC TEMP
MOV A,TEMP
MOVC A,@A+DPTR
MOV STL0,A
MOV TL0,A ;将数据低位送到TL0 SETB TR0 ;启动定时器0
DK1A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK1A
CLR TR0 ;关闭定时器0
24
单片机课程设计----数字电子琴设计
NOKEY1:
MOV P3,#0FFH ;设置P3口输入 CLR P3.5 ;清零P3.5,按键第二行扫描
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
LCALL DELY10MS ;延时10ms MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK5
MOV KEYBUF,#4
LJMP DK2
NK5: CJNE A,#0DH,NK6 ;K5键按下 MOV KEYBUF,#5
LJMP DK2
NK6: CJNE A,#0BH,NK7 ;K6键按下 MOV KEYBUF,#6
25
单片机课程设计----数字电子琴设计
LJMP DK2
NK7: CJNE A,#07H,NK8 ;K7键按下
MOV KEYBUF,#7
LJMP DK2
NK8: NOP ;K8键按下
DK2:
MOV A,KEYBUF
MOV DPTR,#TABLE MOVC A,@A+DPTR ;查表
MOV P0,A
MOV A,KEYBUF
MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1 MOVC A,@A+DPTR
MOV STH0,A
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A+DPTR
MOV STL0,A
26
单片机课程设计----数字电子琴设计
MOV TL0,A
SETB TR0
DK2A: MOV A,P3 ANL A,#0FH
XRL A,#0FH
JNZ DK2A
CLR TR0
NOKEY2:
MOV P3,#0FFH CLR P3.6
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3
LCALL DELY10MS MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3
MOV A,P3
27
单片机课程设计----数字电子琴设计
ANL A,#0FH
CJNE A,#0EH,NK9 MOV KEYBUF,#8
LJMP DK3
NK9: CJNE A,#0DH,NK10 MOV KEYBUF,#9
LJMP DK3
NK10: CJNE A,#0BH,NK11
MOV KEYBUF,#10 LJMP DK3
NK11: CJNE A,#07H,NK12
MOV KEYBUF,#11 LJMP DK3
NK12: NOP
DK3:
MOV A,KEYBUF
MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A
MOV A,KEYBUF
MOV B,#2
MUL AB
28
单片机课程设计----数字电子琴设计
MOV TEMP,A
MOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,A
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A+DPTR MOV STL0,A
MOV TL0,A
SETB TR0
DK3A: MOV A,P3 ANL A,#0FH
XRL A,#0FH
JNZ DK3A
CLR TR0
NOKEY3:
MOV P3,#0FFH CLR P3.7
MOV A,P3
ANL A,#0FH
29
单片机课程设计----数字电子琴设计
XRL A,#0FH
JZ NOKEY4
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY4
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK13 MOV KEYBUF,#12
LJMP DK4
NK13: CJNE A,#0DH,NK14 MOV KEYBUF,#13
LJMP DK4
NK14: CJNE A,#0BH,NK15 MOV KEYBUF,#14
LJMP DK4
NK15: CJNE A,#07H,NK16 MOV KEYBUF,#15
LJMP DK4
NK16: NOP
30
单片机课程设计----数字电子琴设计
DK4:
MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A
MOV A,KEYBUF MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,A
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A+DPTR MOV STL0,A
MOV TL0,A
SETB TR0
DK4A: MOV A,P3 ANL A,#0FH
31
单片机课程设计----数字电子琴设计
XRL A,#0FH
JNZ DK4A
CLR TR0
NOKEY4:
LJMP WAIT
DELY10MS:
MOV R6,#10
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
INT_T0:
MOV TH0,STH0
MOV TL0,STL0
CPL P1.0 ;输出方波 RETI
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
TABLE1:
DW 64021,64103,64260,64400 ;低3,低4,低5,低6, DW 64524,64580,64684,64777 ;低7,中1,中2,中3
32
单片机课程设计----数字电子琴设计
DW 64820,64898,64968,65030 ;中4,中5,中6,中7
DW 65058,65110,65157,65178 ;高1,高2,高3,高4
END
二、C语言程序
#include
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}; unsigned char temp;
unsigned char key;
unsigned char i,j;
unsigned char STH0;
unsigned char STL0;
unsigned int code tab[]={64021,64103,64260,64400,
64524,64580,64684,64777,
64820,64898,64968,65030,
65058,65110,65157,65178}; void DisPlay(void) //显示
{
switch(key)
{
33
单片机课程设计----数字电子琴设计
case 0: P0= 0X3F;break;
case 1: P0= 0X06;break;
case 2: P0= 0X5B;break;
case 3: P0= 0X4F;break;
case 4: P0= 0X66;break;
case 5: P0= 0X6D;break;
case 6: P0= 0X7D;break;
case 7: P0= 0X07;break;
case 8: P0= 0X7F;break;
case 9: P0= 0X6F;break;
case 10:P0= 0X77;break;
case 11:P0= 0X7C;break;
case 12:P0= 0X39;break;
case 13:P0= 0X5E;break;
case 14:P0= 0X79;break;
case 15:P0= 0X71;break;
default: P0=0X00;break;
}
}
void main(void)
{
TMOD=0x01;
34
单片机课程设计----数字电子琴设计
ET0=1;
EA=1;
while(1)
{
P3=0xff;
P3_4=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=0;
35
单片机课程设计----数字电子琴设计
break;
case 0x0d:
key=1;
break;
case 0x0b:
key=2;
break;
case 0x07:
key=3;
break;
}
DisPlay();
temp=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
36
单片机课程设计----数字电子琴设计
temp=temp & 0x0f;
}
TR0=0;
}
}
P3=0xff;
P3_5=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
37
单片机课程设计----数字电子琴设计
key=4;
break;
case 0x0d:
key=5;
break;
case 0x0b:
key=6;
break;
case 0x07:
key=7;
break;
}
DisPlay();
temp=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
38
单片机课程设计----数字电子琴设计
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}
P3=0xff;
P3_6=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
39
单片机课程设计----数字电子琴设计
case 0x0e:
key=8;
break;
case 0x0d:
key=9;
break;
case 0x0b:
key=10;
break;
case 0x07:
key=11;
break;
}
DisPlay();
temp=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
40
单片机课程设计----数字电子琴设计
{
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}
P3=0xff;
P3_7=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
41
单片机课程设计----数字电子琴设计
{
case 0x0e:
key=12;
break;
case 0x0d:
key=13;
break;
case 0x0b:
key=14;
break;
case 0x07:
key=15;
break;
}
DisPlay();
temp=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp & 0x0f;
42
单片机课程设计----数字电子琴设计
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}
}
}
void t0(void) interrupt 1 using 0 {
TH0=STH0;
TL0=STL0;
P1_0=~P1_0;
}
43