《毕业论文基于AT89C51单片机的音乐播放器的设计.doc》由会员分享,可在线阅读,更多相关《毕业论文基于AT89C51单片机的音乐播放器的设计.doc(35页珍藏版)》请在三一办公上搜索。
1、兰州工业学院毕业设计(论文)题目 基于单片机的音乐播放器的设计 学 院 电子信息工程学院 专 业 电子信息工程技术 班 级 嵌入式1 1 姓 名 张文琪 学 号 201110103125 指导教师(职称) 兰聪花(讲师) 日 期 2014年 3月 兰州工业学院毕业设计(论文)任务书电子信息工程 学院 2014 届 电子信息工程 专业毕业设计(论文)任务书毕业设计(论文)题目基于单片机的音乐播放器的设计课题内容性质软、硬件开发课题来源性质教师收集的结合生产实际的课题设计/论文校内(外)指导教师职 称工作单位及部门联系方式兰聪花讲师电子信息工程学院18919080769一、题目说明(目的和意义):
2、本设计希望通过对常见电子产品的设计与制作来培养学生综合运用所学知识,分析和解决实际问题的能力,掌握相关绘图制作软件,会运用电子仪器进行电路检测和调试,强化电子技术应用技能训练,为今后开展产品技术开发、设计和制作打下初步的基础。该系统设计,涉及到电路技术、单片机原理、Protel电路设计原理、程序设计、单片机程序烧录和焊接电路等方面知识,考察了学生对以往学习过的课程的综合应用能力。二、设计(论文)要求(工作量、内容):【设计内容】根据音乐演奏控制器所要实现的显示与选曲及音乐产生功能原理,系统包括演奏扬声器、选曲、播放和显示几部分。通过按键控制,系统具有开启、暂停播放当前曲子的功能;播放前一首、后
3、一首歌曲的功能;控制播放器的播放模式:顺序播放、随机播放、重复单曲、全部重复等功能。未播放时放光二极管产生流水灯,播放音乐时能随着曲调闪烁。所设计的音乐播放器可以播放多首音乐,曲目选择可以由键盘控制,并通过显示器显示歌曲序号。【设计环境】软件:keil 软件,AVR_fighter烧写软件,Protel99se绘图软件,Protues仿真软件。硬件:微机,常用电子元件,实验室常用电子检测仪器。【设计要求】(1)完成系统总体设计,硬件设计和软件设计等。(2)完成各种硬件图的绘制及仿真,完成相应流程图的绘制和程序的编写、调试。(3)论文书写规范、文字通顺、图表清晰、测试数据完整、结论明确。【设计步
4、骤】1、 熟悉开发环境,总体方案设计;2、 系统硬件设计;3、 系统软件设计;4、完成毕业设计报告。三、进度表日 期内 容2013.12.92013.12.152013.12.162013.12.222013.12.232013.12.292013.12.302014.1.122014.1.132014.1.19熟悉设计任务,查阅相关书籍和文献 方案论证及可行性分析 功能电路设计程序设计、实现与调试,系统测试与分析,逐步修改、完善设计对毕业设计的成果进行归纳、整理、总结并撰写毕业设计报告完成日期第21周(本学期)答辩日期第1-2周(下学期) 四、主要参考文献、资料、设备和实习地点及翻译工作量:
5、主要参考文献、资料参考如下(其它资料自己收集):1、微机原理与接口技术赵又新 主编 中国电力出版社2007.2 第1版2、单片机原理及其接口技术胡汉才 主编 清华大学出版社2004.2 第2版3、新概念51单片机C语言教程-入门、提高、开发、拓展全攻略,郭天祥编著,电子工业出版社,2009.1.设备为计算机一台,实验板一块。实习地点为嵌入式系统实验室。翻译工作量为论文概要、关键字。指导教师签字教研室主任签字主管系领导签字 年 月 日 年 月 日 年 月 日注:本任务书要求一式两份,一份系部留存,一份报教务处实践教学科。摘 要 本设计是基于AT89C51系列单片机的音乐播放器的设计,根据单片机的
6、原理,连接了LED显示灯、蜂鸣器、LCD液晶显示屏、按键电路、晶振电路和复位电路。当键盘有键按下时,判断键值,启动计数器T0,产生一定频率的脉冲,驱动蜂鸣器,放出乐曲。同时启动定时器T1,显示乐曲播放的时间,并驱动LCD显示歌曲号及播放时间。AT89C51单片机的内存较小,就用了一个74LS373锁存器和27512外部扩展芯片对该单片机进行了内存的扩充,增大了它的存储空间,让它可以存储足够多的歌曲。关键词:音乐播放器;AT89C51单片机;LCD-LM016L液晶显示屏Abstract This design is the design of the series based on AT89C
7、51 single-chip computer music player, according to the principle of MCU, connect the LED display lights, buzzer, LCD liquid crystal display, buttons, crystal oscillation circuit and reset circuit. When the keyboard has a key press, determine the key value, start the counter T0, produce a certain fre
8、quency of pulse, drive buzzer, let out music. Start the timer T1 at the same time, according to the music playing time, and drive LCD display song number and play time. AT89C51 memory is small, with a 74 ls373 flip-latch and external expansion chip on the single chip microcomputer 27512 memory expan
9、sion, increase its storage space, it can store enough songs. Keywords: Music player; AT89C51 Single chip microcomputer; LCD-LM016L Liquid crystal display 目 录摘 要IAbstractII1 引言11.1设计意义11.2设计内容21.3设计方案22 系统的总体设计32.1音乐播放器的工作原理32.2总体设计框图33 硬件设计53.1晶振复位电路53.1.1晶振电路53.1.2复位电路63.2 LED显示电路73.2.1 二极管73.2.2 发
10、光二极管的性能83.2.3 显示接口电路的设计83.3时钟振荡电路93.4按键电路104 软件设计134.1主程序流程图134.2延时模块144.3函数初始化模块154.4顺序播放模块164.5键盘扫描函数流程图184.6主要程序代码21结束语24致 谢25参考文献26附录一:原理图27附录二:仿真图28 1 引言 基于单片机的音乐播放器可应用于很多方面,并可作为很多系统的辅助功能,作为单片机的重要硬件资源之一,利用定时器可以产生各种固定频率的方波信号,也可以产生包括Do、Re、Me等音阶在内的各种频率声音。将各个音阶连接在一起,便可组成一支曲子或是演奏一段旋律。基于这个思想,我设计了一款特殊
11、的音乐播放器,本播放器可实现播放、暂停、复位等功能。为了体现乐曲播放过程中的动态效果,增加了1只LED,作随机闪烁以指示旋律的节奏。由于时间及条件限制,本设计实现了一种简单的音乐播放器,其核心器件采用AT89C51单片机,本播放器具有电路简单,功能强大,易于拓展等特点。在此基础上,可以添加按键,LED显示屏等模块,实现切换歌曲,歌名显示,动感音乐屏等功能。1.1设计意义 音乐播放器的起源,可追溯至中世纪欧洲文艺复兴时期。当时为使教会的钟塔报时,而将大小的钟表装上机械装置,被称为“可发出声音的组钟”。音乐播放器有着300多年的发展历史,是人类文明发展的历史见证。 传统的音乐播放器多是机械音乐盒,
12、其工作原理是通过齿轮带动一个带有铁钉的铁桶转动,铁桶上的铁钉撞击铁片制成的琴键,从而发出声音。但是,机械式的音乐盒体积比较大,比较笨重,且发音单调。水、灰尘等外在因素,容易使内部金属发音条变形,从而造成发音跑调。本文设计的音乐播放器,是基于单片机设计制作的电子式音乐播放器。与传统的机械式音乐播放器相比更小巧,音质更优美且能演奏和弦音乐。电子式音乐播放器动力来源是电池,制作工艺简单,可进行批量生产,所以价格便宜。基于单片机制作的电子式音乐播放器,控制功能强大,可根据需要选歌,使用方便。根据存储容量的大小,可以尽可能多的存储歌曲。另外,可以设计彩灯外观效果,使音乐播放器的功能更加丰富。1.2设计内
13、容 主要工作过程是通过按下功能键实现上一首和下一首及暂停播放,同时有数码管显示当前播放歌曲的序号,蜂鸣器播放出音乐,当播放最后一首夜曲时还伴有彩灯闪烁。功能键盘采用按键开关,通过单片机P1口控制,按键控制歌曲的顺序播放,循环播放,随机播放,以及上一曲,下一曲,暂停/播放,结束。蜂鸣器由单片机的P3.7口控制,实现歌曲播放。LCD播放当前歌曲时,LCD显示屏上显示当前歌曲的序号和歌曲名,并提示下一曲即将要播放的歌曲。利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演乐曲(内存四首乐曲)。1.3设计方案 设计一个基于AT89C51系列单片机的音乐播放器,利用按键切换演奏出不同的乐曲
14、。蜂鸣器发出某个音调,与之相对应的LED亮起。使用五个按键,分别是设置、上一曲、下一曲、暂停/播放和结束五个按键。2 系统的总体设计2.1音乐播放器的工作原理 通过单片机的定时器产生一定长度的方波,方波脉冲驱动蜂鸣器发声。要产生音频脉冲,只需算出某一音频的周期(1/音频),然后取半周期的时间定时。利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O口反相,就可在I/O脚上得到此频率的脉冲。如中音D0,频率为523HZ,其周期T=1/523=1912微秒,因此只要令计数器定时1912/2=956,在每计数956次时将I/O口反相,就可得到中音D0
15、(523HZ)。 当键盘有键按下时,判断键值,启动计数器T0,产生一定频率的脉冲,驱动蜂鸣器,放出乐曲。同时启动数码显示部分,在LED显示歌曲号,也可使彩灯长亮和闪烁。数码管采用共阳极数码管,通过单片机P2口控制,实现歌曲序号的显示;功能键盘采用按键开关,通过单片机P3口控制,实现歌曲播放顺序的调换和暂停播放功能;蜂鸣器由单片机的P3.7口控制,实现歌曲播放;彩灯是由普通发光二极管代替,能实现单色长亮和闪烁效果,通过单片机的P0口控制。2.2总体设计框图单片机接+5V电源供电,晶振电路产生单片机所需时钟信号,通过功能键产生外部中断,控制音乐盒的上一首和下一首曲目,再由I/O接口输出控制蜂鸣器发
16、声,LED显示,彩灯亮或闪烁。另外,复位电路在于营造一个程序运行的初始状态,在程序出错时,重新启动单片机工作。编程设置好定时时间,通过编程器写入AT89S51单片机系统。由AT89S51单片机的定时器每秒钟通过P2.0-P2.7口控制LED数码显示,复位信号由按钮输入,每按下一次,系统恢复原设定状态。总体设计框图如图2-1所示。 蜂鸣器AT89C51按键输入模块LCD显示屏LED显示灯晶振复位电路 图2-1 总体设计框图编程设置好定时时间,通过编程器写入AT89S51单片机系统。由AT89S51单片机的定时器每秒钟通过P2.0-P2.7口控制LED数码显示,复位信号由按钮输入,每按下一次,系统
17、恢复原设定状态。 3 硬件设计3.1晶振复位电路3.1.1晶振电路在AT89C51单片机内部有一振荡电路,只要在单片机的XTAL1和XTAL2引脚外接晶振,就改成了自激振荡器并在单片机内部产生时钟脉冲信号。如图3-1所示,单片机工作的时间基准是由时钟电路提供的。在单片机的XTAL1和XTAL2两个引脚间,接一个晶振及两只电容就构成了时钟电路。 图3-1 晶振复位电路 电路中的器件可以通过计算和实验确定,也可以参考一些典型电路参数。电路中,电容器C1和C2对晶振器频率有微调作用,通常取值范围30+10pF;石英晶体选择12MHZ都可以。其结果只是机器周期时间不同,影响计算器的计数初值。3.1.2
18、复位电路图3-2 复位电路51单片机的复位是由外部的复位电路来实现的。复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声。单片机需要复位以后才能正常工作,复位的目的就是使单片机处于一个基准点,在这个基准点,程序将会从C51的main()主函数的第一条语句开始执行。复位工作是一个纯硬件的工作,一般是在上电开始几毫秒内执行完毕。 复位的过程很简单,在电源刚刚合上时,电流经过电阻对电解电容器充电,这样在电阻上就形成一个电压,对于单片机来说,这个电压就是复位电压。经过若干毫秒以后,电解电容器被充满电,这时电阻就没有电流流过,电阻两端也就没有电压,单片机的复位脚电压恢复为0,复位
19、工作结束,单片机开始工作。 上电复位:上电复位电路是种简单的复位电路,只要在RST复位引脚接一个电容到VCC,接一个电阻到地就可以了。上电复位是指在给系统上电时,复位电路通过电容加到RST复位引脚一个短暂的高电平信号,这个复位信号随着VCC对电容的充电过程而回落,所以RST引脚复位的高电平维持时间取决于电容的充电时间。为了保证系统安全可靠的复位,RST引脚的高电平信号必须维持足够长的时间。上电自动复位是通过外部复位电路的电容充电来实现的。只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。 3.2 LED显示电路3.2.1 二极管 二极管是半导体设备中的一种最常见的器件,大多数半导体最是
20、由搀杂半导体材料制成(原子和其它物质)发光二极管导体材料通常都是铝砷化稼,在纯铝砷化稼中,所有的原子都完美的与它们的邻居结合,没有留下自由电子连接电流。在搀杂物质中,额外的原子改变电平衡,不是增加自由电子就是创造电子可以通过的空穴。这两样额外的条件都使得材料更具传导性。带额外电子的半导体叫做N型半导体,由于它带有额外负电粒子,所以在N型半导体材料中,自由电子是从负电区域向正电区域流动。带额外“电子空穴”的半导体叫做P型半导体,由于带有正电粒子。电子可以从另一个电子空穴跳向另一个电子空穴,从从负电区域向正电区域流动。因此,电子空穴本身就显示出是从正电区域流向负电区域。二极管是由N型半导体物质与P
21、型半导体物质结合,每端都带电子。这样排列使电流只能从一个方向流动。当没有电压通过二极管时,电子就沿着过渡层之间的汇合处从N型半导体流向P型半导体,从而形成一个损耗区。在损耗区中,半导体物质会回复到它原来的绝缘状态-所有的这些“电子空穴”都会被填满,所有就没有自由电子或电子真空区和电流不能流动。为了除掉损耗区就必须使N型向P型移动和空穴应反向移动。为了达到目的,连接二极管N型一方到电流的负极和P型就连接到电流的正极。这时在N型物质的自由电子会被负极电子排斥和吸引到正极电子。在P型物质中的电子空穴就移向另一方向。当电压在电子之间足够高的时候,在损耗区的电子将会在它的电子空穴中和再次开始自由移动。损
22、耗区消失,电流流通过二极管。3.2.2 发光二极管的性能发光二极管LED(Light-EmittingDiode)是能将电信号转换成光信号的结型电致发光半导体器件。 发光二极管LED主要特点:(1)在低电压(1.52.5V)、小电流(530mA)的条件下工作,即可获得足够高的亮度。(2)发光响应速度快(10-710-9 s),高频特性好,能显示脉冲信息。(3)单色性好,常见颜色有红、绿、黄、橙等。(4)体积小。发光面形状分圆形、长方形、异形(三角形等)。其中圆形管子的外径有1、2、3、4、5、8、10、12、15、20(mm)等规格,直径1mm的属于超微型LED。(5)防震动及抗冲击穿性能好,
23、功耗低,寿命长。由于LED的PN结工作在正向导通状态,本射功耗低,只要加必要的限流措施,即可长期使用,寿命在10万小时以上,甚至可达100万小时。(6)使用灵活,根据需要可制成数码管、字符管、电平显示器、点阵显示器、固体发光板、LED平极型电视屏等。(7)容易与数字集成电路匹配。3.2.3 显示接口电路的设计 在单片机应用系统中,使用的显示器主要有LED显示器(发光二极管显示器)。这种显示器成本低廉,配置灵活,与单片机接口方便。在本系统的设计中采用LED显示器。 LED显示器由8位LED数码管组成,用于显示系统在各种不同条件下的状态。 用单片机驱动LED数码管有很多方法,按显示方式分,有静态显
24、示和动态显示,按译码方式分为硬件译码和软件译码。 静态显示是显示驱动电路具有输出锁存功能,单片机将要显示的数据送出后不再控制LED,直到下次显示时再传送一次新的显示数据。静态显示的数据稳定,占用CPU时间少。 动态显示要CPU时刻对显示器件进行数据刷新,显示数据会有闪烁,占用的CPU时间多。 这两种显示方式各有利弊:静态显示虽然数据显示稳定,占用很少的CPU时间,但每个显示单元都需要单独的显示驱动电路,使用的电路硬件较多;动态显示虽然闪烁,占用的CPU时间多,但使用的硬件少,能节省线路板空间。 在本设计中由于显示部分比较简单,所以选用了静态显示方式,LED显示器由74LS373来驱动,为了扩展
25、外部存储器需一块74LS373(地址锁存器) 。LED发光器件一般常用的有两类:数码管和点阵。常用的数码管一般为8字型数码管,分为A、B、C、D、E、F、G、DP八段,其中DP为小数点。数码管常用的有10根管脚,每一段有一根管脚,另外两根管脚为一个数码管的公共端,两根之间相连通。数码管从电路上来看可分为共阴和共阳两种,在本设计中用了共阳的LED。3.3时钟振荡电路 AT89C51中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。这个放大器与作为反馈元件的片外石英晶体或者陶瓷谐振器一起构成自然振荡器。外接石英晶体及电容C1、C2接在放大器的反
26、馈回路中构成并联振荡电路。对外接电容C1,C2虽然没有什么严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程序及温度稳定性。如果使用石英晶体,我们推荐电容使用30PF10PF,而如果使用陶瓷振荡器建议选择40PF10PF。用户也可以采用外部时钟。采用外部时钟的电路如图示。这种情况下,外部时钟脉冲接到XTAL1端,即内部时钟发生器的输入端,XTAL2则悬空。由于外部时钟信号是通过一个2分频触发器后作为内部时钟信号的,所以对外部时钟信号的占空比没有特殊要求,但最小高电平持续时间和最大的低电平持续时间应符合产品技术条件的要求。振荡器电路如图3-3所示。图3-3 时
27、钟振荡电路3.4按键电路 按键的开关状态通过一定的电路转换为高、低电平状态。按键闭合过程在相应的I/O端口形成一个负脉冲。闭合和释放过程都要经过一定的过程才能达到稳定,这一过程是处于高、低电平之间的一种不稳定状态,称为抖动。抖动持续时间的常长短与开关的机械特性有关,一般在5-10ms之间。为了避免CPU多次处理按键的一次闭合,应采用措施消除抖动。本文采用的是独立式按键,直接用I/O口线构成单个按键电路,每个按键占用一条I/O口线,每个按键的工作状态不会产生互相影响。按键电路如图3-4所示。图3-4 按键电路 键盘是一组按键的集合,它是最常用的单片机输入设备。操作人员可以通过键盘输入数据或命令,
28、可以实现简单的人机通信。键盘可以分为独立连接式和矩阵式两种,每一种按其译码方式都可以分为编码及非编码两种。编码键盘通过硬件的方法产生键码,能自动的识别按下的健并产生相应的键码值,以并行或串行的方式发送给CPU,它的接口简单,响应速度快,但需要专用的硬件电路;非编码键盘通过软件的方法产生键码,它不需要专用硬件电路,结构简单,成本低廉,但响应速度没有编码键盘快。为了减少电路的复杂程度,节省单片机的I/O接口,因此非编码键盘在单片机键盘中使用非常广泛。(1)键盘输入的特点 键盘实质上是一级按键开关的集合。通常,键盘开关利用了机械触点的合、断作用。(2)按键的确认 键的闭合与否,反映在行线输出电压上就
29、呈现高电平或低电平,如果高电平表示键断开,低电平则表示键闭合,通过对行线电平高低状态的检测,便可确认按键按下与否。为了确保CPU对一次按键动作只确认一次按键有效,必须消除抖动的影响。 4 软件设计4.1主程序流程图 开机加电关闭定时器T0、T1YYA键函数B键函数是B键?是A键?有按键输入?读取键盘等待按键按下置定时器T0、T1的工作方式NNNYC键函数是C键?图4-1 主函数程序框图 本设计采用了自定义下的流程图。主要程序流程有:主程序、判断有无按键子程序、键盘扫描子程序、显示键号/歌曲号子程序、开机画面子程序、按键值播放歌曲子程序等。程序中使用了两个定时中断,定时中断0用于产生整个音程的频
30、率,以便驱动扬声器。程序的总体流程是当P1由按键按下时,读键盘,并储存键值,若为F键则通过查表的方式,调用字符串下手键号/曲目子程序,将键号显示出来。主程序流程图如图4-1所示。4.2延时模块 延时程序一般是通过一层或几层循环实现的,整个过程延时的时间是程序执行的指令总次数乘以每条指令所用的时间。由于该系统的晶振选用的是12M,所以执行指令所用的时间是2ms,程序执行流程图如图4-2所示。开始是否x0?x-是否y0?y-结束NYN图4-2 延时程序流程图程序如下:void delay_ms(uint xms) uint x,y; for(x=xms;x0;x-) for(y=110;y0;x-
31、) 4.3函数初始化模块 函数初始化程序即在主函数内对某些参数和标记位赋初值编写成一个函数,这样便是程序更具有条理化,清晰易懂。由于整个程序要用到定时器0和定时器1,所以,初始化程序主要是对定时器相关内容作说明。程序如下:void Initialsound(void) Sound_Temp_TH1=(65536-(1/1200)*SYSTEM_OSC)/256; /计算TL1应装入的初值Sound_Temp_TL1=(65536-(1/1200)*SYSTEM_OSC)%256; /计算TH1应装入的初值TH1=Sound_Temp_TH1;TL1=Sound_Temp_TL1;TMOD=0x
32、11;ET0=1;ET0=0;TR0=0;TR1=0;EA=1;4.4顺序播放模块顺序播放函数设计主要实现的是歌曲从1-4的播放,当播放歌曲时,播放模块(即上一曲、下一曲、暂停/播放和结束播放)可进行相应的操作,实现了音乐播放的切换功能。顺序播放函Order()函数代码如下:void Order() uint i; k=8; init(); for(i=0;i15;i+) WriteData(tabi); /LCD写数据函数写第一行 mydelay(50); mydelay(1000); WriteCMD(0x80+0x40+2);/将指针设到第二行空两字符 for(i=0;i6;i+) Wr
33、iteData(tab1i); mydelay(50); InitialSound();/发音初始化程序 Getch(); /扫描键盘,获取键值 if(k=0) /若键值为0 uint i; init(); for(i=0;i10;i+) WriteData(tab2i); /写第一首歌曲序号 mydelay(50); mydelay(1000); WriteCMD(0x80+0x40); /转到第二行 for(i=0;i9;i+) Play(Music_Girl,0,3,360);/播放第一首歌 mydelay(500); for(i=0;i11;i+) WriteData(tab4i);
34、mydelay(50); mydelay(1000); WriteCMD(0x80+0x40); for(i=0;i11;i+) WriteData(tab5i); mydelay(50); Play(Music_Jingle,0,3,360); mydelay(500); for(i=0;i10;i+) WriteData(tab6i); mydelay(50); mydelay(1000); WriteCMD(0x80+0x40); for(i=0;i6;i+) Play(Music_Two,0,3,360); mydelay(500); for(i=0;i10;i+) mydelay(1
35、000); WriteCMD(0x80+0x40); for(i=0;i6;i+) WriteData(tab9i); mydelay(50); Play(Music_Jingle,0,3,360); mydelay(500); break; 4.5键盘扫描函数流程图按键扫面程序事实上就是去抖动程序。即先判断是否有键按下,若有则判断本次按键值和上次扫描到的的是否相同,如果相同,将扫描计数器加1:;如果不同扫描计数器1;保存按键值以便和下次扫描键值比较。如果没有键按下,则认为按键值已释放。键盘扫描子程序流程如图4-3所示。开始 键盘扫描N有按键按下?去抖动确定按键的物理位置计算键码等待释放返回返
36、回图4-3 键盘扫描子程序流程其源代码如下:uchar GetKey () uchar i, j, k = 0; uchar KeyScanCode = 0xEF, 0xDF, 0xBF, 0x7F; /键盘扫描码 uchar KeyCodeTable =0xEE,0xED,0xEB,0xDE,0xDD,0xDB, 0xBE,0xBD,0xBB,0x7E,0x7D,0x7B; /键盘特征码 P3 = 0x0F;/扫描键盘获取按键序号 if (P3! = 0x0F) for (i = 0; i 4;i+) P3 = KeyScanCodei; for (j = 0;j 3;j+) k = i *
37、 3 + j; if (P3 = KeyCodeTablek) return k; else return 0xFF;AT89C51单片机的P3口用作键盘I/O口,键盘的列线接到P3口的低4位,键盘的行线接到P3口的高4位。列线P3.0-P3.3分别接有4个上拉电阻到正电源+5V,并把列线P3.0-P3.3设置为输入线,行线P3.4-P3.7设置为输出线。4根行线和4根列线形成16个相交点。 (1)检测当前是否有键被按下。检测的方法是P3.4-P3.7输出全“0”,读取P3.0-P3.3的状态,若P3.0-P3.3为全“1”,则无键闭合,否则有键闭合。 (2)去除键抖动。当检测到有键按下后,延
38、时一段时间再做下一步的检测判断。 (3)若有键被按下,应识别出是哪一个键闭合,方法是对键盘的行线进行扫描。P3.4-P3.7按下表所示4种组合依次输出。如表4-1所示。 表4-1键值组合P3.7 P3.6P3.5 P3.41 1101 1011 0110111 (4)在每组行输出时读取P3.0-P3.3,若全为“1”,则表示为“0”这一行没有键闭合,否则有键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值。4.6主要程序代码 void Getch() uchar X,Y,Z; P1=0xFF; P1=0xF3; /先对P0置数,行扫描 if(P1
39、!=0xF3) /判断是否有键按下 delay1(); /延时 if(P1!=0xF3)/确认按键按下X=P3; X=P1; /保存行扫描时有键按下时状态 P1=0xFC; /列扫描 Y=P1; /保存列扫描时有键按下 Z=X|Y; /取出键值 switch(Z) /判断键值 case 0xF9: k=0;break; case 0xF5: k=1;break; case 0xFA: k=2;break; case 0xF6: k=3;break; void Delay() uint uiCount; for(uiCount=0;uiCount250;uiCount+);void WriteC
40、MD(uchar Commond) /写指令函数 Delay(); /先延时 LCDE=1; /然后把LCD改为写入命令状态 LCDRS=0; LCDRW=0; LCDPORT=Commond; /在输出命令 LCDE=0; /最后执行命令void WriteData(uchar dat) /LCD写数据函数 Delay(); /先延时 LCDE=1; /把LCD改为写入数据状态 LCDRS=1; LCDRW=0; LCDPORT=dat; /在输出数据 LCDE=0; /显示数据 void InitialSound(void) BeepIO=0; Sound_Temp_TH1=(65535-(1/1200)*SYSTEM_OSC)/256;/计算TL1应装入的初值 Sound_Temp_TL1=(65535-(1/1200)*SYSTEM_OSC)/256;/计算TH1应装入的初值 TH1=Sound_Temp_TH1; TL1=Sound_Temp_TL1; TMOD=0x11; ET0=1; ET1=0; TR0=0; TR1=0; EA=1;void BeepTimer0(void) interrupt 1/音符发生中断 BeepIO=!BeepIO; TH0=Sound_Temp_TH0; T