文档下载,初学作品,仅供参考:
基于单片机的LCD显示电话拨号键盘按键.doc
(645 KB, 下载次数: 54)
摘要 电话在人们的日常生活中是比较的常见的电子产品之一,它已进入我们的每一个家庭。本文设计了一款基于单片机的LCD显示电话拨号键盘按键系统。 系统采用AT89C51单片机作为电话键盘拨号按键显示的核心部件,行列式键盘作为输入电路,1602LCD作为显示电路。软件部分主要采用简单且通用性强的C语言编写实现。该设计具有电路简单、读取方便、显示直观、操作简单、编程容易和成本廉价等优点,可用于一般的生活和工作,也可通过改装,提高其性能,增加功能,从而给人们的生活带来更多的方便。 关键词:单片机;键盘;LCD;Proteus仿真。
Abstract Telephone in People's Daily life is more of a common electronic products, it has entered one of each of our family. This paper designed a microcontroller based LCD display system phone dialpad keys. System uses AT89C51 as phone keyboard dial-up buttons show core parts, determinants as input circuit, 1602LCD keyboard as display circuit. Software mainly uses the simple and practical written in C language realization. This design has circuit is simple, convenient, direct display reads, simple operation and programming easy and cost advantages, and can be used for cheap general life and work, also can through the modification, improve the performance, increase function, so as to bring to the life of people more convenient. Keywords: microcontroller;Keyboard;LCD; Proteus simulation. 朗读 显示对应的拉丁字符的拼音
字典 朗读 显示对应的拉丁字符的拼音
字典 朗读 显示对应的拉丁字符的拼音
字典
目 录 1引言 1 1.1 目的和意义 1 1.2 本系统主要研究内容 1 2 系统分析 2 2.1系统基本方案与论证file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC55C.tmp.png 2 2.1.1控制部分的选择方案与论证 2 2.1.2 输出显示电路模块的选择方案与论证 2 2.1.3键盘输入电路模块的选择方案与论证 3 2.1.4电路设计最终方案 3 2.2 系统组成 3 2.3系统工作原理 4 3 系统硬件设计 4 3.1 系统硬件总电路图 4 3.2 主芯片模块(AT89C51单片机) 5 3.2.1 主要特性 6 3.2.2 管脚说明 6 3.2.3 振荡器特性 8 3.2.4 芯片擦除 8 3.3 晶振和复位电路模块 9 3.3.1 复位电路 9 3.3.2 晶振电路 9 3.4 显示电路模块(1602LCD) 10 3.4.1 1602LCD简介 10 3.4.2 1602LCD的RAM地址映射及标准字库表 13 3.4.3 1602LCD的一般初始化(复位)过程 14 3.5 行列键盘输入电路 14 3.5.1 行列式键盘的基本结构 14 3.5.2 行列式键盘的按键识别方法 15 4 系统软件设计 16 4.1 程序设计整体思路 16 4.2 程序流程图 17 4.2.1 主程序流程图 17 4.2.2 键盘扫描子程序流程图 18 4.2.3 LCD显示子程序 20 5系统使用说明 20 5.1 系统运行环境 20 5.2 系统操作说明 21 5.2.1 KEIL调试 21 5.2.2 Proteus调试 21 5.2.3 Proteus与Keil连调实现电路仿真 21 6结论 22 参考文献 24 致谢 25 附件1 26 附件2 32
1引言 随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展,犹如雨后春笋般的变化。各种数字显示仪器中的显示、广告牌、数码产品等,传统的数码管显示已经远远不能满足各行各业的需求。单片机的应用已经越来越贴近生活,用单片机来实现一些电子设计也变得容易起来。基于单片机的LCD显示是一种用单片机来控制的一种显示系统,它不仅能显示种各数字、字母、还能显示各种字体的汉字以及一些简单的图象,使用起来极为方便,只要通过对单片机写入一定的程序来控制LCD的显示即可完成,根据程序的不同而产生不同不效果。随着单片机产品以及LCD产品的不断涌现,这一领域已经得到了飞速的发展。 1.1 目的和意义计算机最初的设计目的是为了提高计算数据的速度和完成海量数据的计算。随着技术的发展,人们发现计算机在逻辑处理以及工业控制等方面也具有非凡的能力。在控制领域,人们更多的关心计算机的低成本,小体积,运行的可靠性和控制灵活性.单片机体积小,价格低,可靠性高,其非凡的嵌入式应用形态对于满足嵌入式应用需求具有独特的优势。目前,单片机应用技术已经成为电子应用系统设计最为常用的手段。在微电子技术基础上发展起来的单片机及其外围器件,使仪表技术进入了一个崭新的智能化时代。 在电话出现之前人们通信的方式有信鸽、人工送信等,不仅消息不能及时得到,而且浪费了大量的时间。自从电话出现以后,人与人之间的通信在瞬间即可完成,以便我们及时去处理突发事件,因此它给我们的生活带来了极大的方便。 电话发展的短短几十年,从无号码显示到有号码显示,再到可视电话,在每一个转变过程中都有重大的突破。可是它还在发展之中,以后必将出现功能更加强大的电话,基于这样的理念,本次设计是用单片机来设计的电话拨号键盘按键的显示。 1.2 本系统主要研究内容本系统的主要研究内容是:
(1)实现电话键盘拨号按键显示基本功能。 (2)根据选用的电话芯片设计外围电路和单片机的接口电路。 (3)在硬件设计时,结构要尽量简单实用,易于实现。 (4)用1602液晶进行显示,显示输出的字符和数字。 (5)根据硬件电路,编写单片机AT89C51芯片的程序,通过编程、编译、调试,把程序下载到单片机上运行,并实现本设计的功能。 2 系统分析2.1系统基本方案与论证file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC56D.tmp.png2.1.1控制部分的选择方案与论证方案一:用可编程逻辑器件设计 可采用PLD器件,设计起来结构清晰,各个模块从硬件上设计起来相对简单,控制与显示的模块间连接也会比较方便。但是考虑到本设计的特点,EDA在能够扩展上比较受局限,占用的资源也多。从成本上讲,可编程逻辑器件价格比较高。 方案二:用单片机设计 用单片机芯片作为控制部分,单片机有丰富的中断源,它的准确度相当高,并且C语言的灵活运用,给编程带来了方便。单片机I/O功能也比较强大,容易对其进行扩展,使设计更加完善,此外单片机的成本也比较低。 综上所述,单片机资源丰富,程序编写也灵活简单,可移植性强,性价比也高,所以选择单片机作为主控芯片。 2.1.2 输出显示电路模块的选择方案与论证方案一:用数码管进行显示 数码管由于显示速度快,使用简单,显示效果简洁明了而得到了广泛应用。但是由于我们计划显示英语字母和数字,内容多。用数码管无法显示如此丰富的内容,因此我们放弃了此方案。 方案二:用LCD液晶进行显示 LCD由于其显示清晰,显示内容丰富,显示信息量大,使用方便,显示快速而得到了广泛的应用。 对于此系统我们选用的LCD液晶能够显示英语字母和数字,能够很好的满足显示要求,因此我们选择了此方案。 2.1.3键盘输入电路模块的选择方案与论证键盘用于实现单片机应用系统中的数据和控制命令的输入, 键盘输入也是单片机应用系统中使用最广泛的一种输入方式。键盘输入的主要对象是各种按键或开关。这些按健或者开关可以独立使用, 也可以组合成键阵使用。单片机中常用的按键式键盘可以分为两类: 独立连接式和行列式。每类按译码方式的不同又分为编码式和非编码式两种。单片机中一般使用的都是用软件来识别和产生键代码的非编码键盘。行列式键盘的编码方式有静态和动态两种。静态接口主要由一个行编码器和一个列编码器构成;动态接口可采用计数器,译码器和数据选择器构成。这两种键盘由硬件完成键的辨码任务。一般在小型仪器仪表和控制系统中,使用较多的是行列式和独立式的非编码键盘;如果系统要求实现多键同时按下的处理,则用非编码独立方式较为合适。 方案一:采用独立式按键电路 独立式按键电路每个按键单独占有一根I/O接口线, 每个I/O口的工作状态互不影响,此类键盘采用端口直接扫描方式。缺点为当按键较多时占用单片机的I/O口数目较多,优点为电路设计简单,且编程相对比较容易。 方案二:采用行列式键盘电路 行列式键盘为4*3矩阵式行列扫描,虽然软件较为复杂,但是当按键较多时可降低占用单片机的I/O口数目。 对于此系统,由于按键数目多,故采用方案二。 2.1.4电路设计最终方案本系统包括主芯片模块、显示电路模块、键盘输入模块、晶振和复位电路模块。综上各方案所述,确定最终设计方案为:采用单片机作为主控制系统,LCD液晶作为显示部分,行列式按键作为键盘输入模块。 2.2 系统组成整个硬件电路由单片机及单片机的复位和晶振电路、单片机中断、液晶显示器和4*3矩阵键盘组成。其整体结构如图1所示。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC56E.tmp.png 图1 系统整体硬件组成 2.3系统工作原理总的来说,此系统的工作原理就是由单片机通过扫描键盘上所按下的键,然后显示在1602 LED显示屏上,键盘接在单片机的P3端口,LCD显示屏接在单片机的P0端口,P0端没有上拉电阻,所以外接RP1。在这一系统中单片机为核心部件,通过对单片机编写程序,采用行扫描法对键盘进行识别。判断有无按键按下的方法:将全部行线置低电平,全部列线置高电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下。判断按键所在位置的方法是:依次将行线置为低电平,即在置某根行线为低电平时,其他根行线为高电平。在确定某根行线为低电平后,再逐行检测各列线的电平状态。若某根列线为低电平,则该列线与置为低电平的行线交叉处的按键就是所按下的按键。获取按键后,由单片机控制LCD显示。1602LCD液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,LCD内带字符发生器的控制器,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的ASCII码即可显示。 3 系统硬件设计3.1 系统硬件总电路图将电话拨号键盘上所拨号码显示在1602液晶屏上的电路如图2: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC57F.tmp.jpg 图2 系统总硬件图 3.2主芯片模块(AT89C51单片机)AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片 机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。其截图如图3: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC58F.tmp.jpg 图3 AT89C51芯片 3.2.1主要特性·与MCS-51 兼容
·4K字节可编程闪烁存储器 ·寿命:1000写/擦循环 ·数据保留时间:10年
·全静态工作:0Hz-24Hz
·三级程序存储器锁定
·128*8位内部RAM
·32可编程I/O线
·两个16位定时器/计数器
·5个中断源
·可编程串行通道
·低功耗的闲置和掉电模式
·片内振荡器和时钟电路 3.2.2 管脚说明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.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /INT0(外部中断0) P3.3 /INT1(外部中断1) P3.4 T0(记时器0外部输入) P3.5 T1(记时器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.3振荡器特性XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。 3.2.4芯片擦除整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保 持ALE管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。
AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种 软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。 3.3晶振和复位电路模块晶振和复位电路模块是系统中很重要的一部分。其截图如图4: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC590.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC5A1.tmp.jpg 图4 晶振和复位电路 3.3.1 复位电路单片机需要复位以后才能正常工作,复位的目的就是使单片机处于一个基准点,在这个基准点,程序将会从C51的main()主函数的第一条语句开始执行。复位工作是一个纯硬件的工作,一般是在上电开始几毫秒内执行完毕。 复位的过程很简单,在电源刚刚合上时,电流经过电阻对电解电容器充电,这样在电阻上就形成一个电压,对于单片机来说,这个电压就是复位电压。经过若干毫秒以后,电解电容器被充满电,这时电阻就没有电流流过,电阻两端也就没有电压,单片机的复位脚电压恢复为0,复位工作结束,单片机开始工作。 3.3.2晶振电路在AT89C51单片机内部有一振荡电路,只要在单片机的XTAL1和XTAL2引脚外接晶振,就改成了自激振荡器并在单片机内部产生时钟脉冲信号。 如图4所示,单片机工作的时间基准是由时钟电路提供的。在单片机的XTAL1和XTAL2两个引脚间,接一个晶振及两只电容就构成了时钟电路。 电路中的器件可以通过计算和实验确定,也可以参考一些典型电路参数。电路中,电容器C1和C2对晶振器频率有微调作用,通常取值范围30+10pF;石英晶体选择6MHZ或12MHZ都可以。其结果只是机器周期时间不同,影响计算器的计数初值。 3.4显示电路模块(1602LCD)本设计中重点部分是基于单片机系统的液晶显示部分。液晶显示模块是一种将液晶显示器件、连接件、集成电路、PCB线路板、背光源、结构件装配在一起的组件,英文名叫“LCD Module”, 简称“LCM”,中文一般为“液晶显示模块”。在单片机系统中使用液晶显示模块作为输出有以下优点:显示资料高、数字式接口、功率消耗小、电路中的应用。 3.4.1 1602LCD简介工业字符型液晶能够同时显示16*02即32个字符。(16列2行),1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的两条是背光电源线。 一般1602字符型液晶显示器实物如图5: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC5C1.tmp.png 图5 1602LCD的实物图 1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,应用中并无差别。 1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表1所示:
表1:引脚接口说明表 第1脚:VSS为地电源。 第2脚:VDD接5V正电源。 第3脚:VEE为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。 第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。 第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第7~14脚:D0~D7为8位双向数据线。 第15脚:背光源正极。 第16脚:背光源负极。
表2:控制命令表 1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平) 指令1:清显示,指令码01H, 光标复位到地址00H位置。 指令2:光标复位,光标返回到地址00H。 指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S: 屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。 指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。 指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。 指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。 指令7:字符发生器RAM地址设置。 指令8:DDRAM地址设置。 指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。 指令10:写数据。 指令11:读数据。 3.4.2 1602LCD的RAM地址映射及标准字库表液晶显示模块是一个慢显示器件,所以在执行每条指令前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,图6是1602的内部显示地址。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC5E1.tmp.png 图6 1602LCD内部显示地址 例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B (80H) =11000000B (C0H) 。 在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。其中字符代码与字符图形对应关系如图7所示: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC5E2.tmp.jpg 图7字符代码与字符图形对应关系 3.4.3 1602LCD的一般初始化(复位)过程延时15mS 写指令38H(不检测忙信号) 延时5mS 写指令38H(不检测忙信号) 延时5mS 写指令38H(不检测忙信号) 以后每次写指令、读/写数据操作均需要检测忙信号 写指令38H:显示模式设置 写指令08H:显示关闭 写指令01H:显示清屏 写指令06H:显示光标移动设置 写指令0CH:显示开及光标设置 3.5行列键盘输入电路3.5.1行列式键盘的基本结构行列式键盘中的键实际上就是一个机械开关,位于行线和列线的交点处,图8所示为本设计中使用的4行×3列的12键行列式键盘,当键被按下时,其交点的行线和列线接通,使相应行线或列线上的电平发生变化,根据电平变化情况确定被按下的键。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC5F3.tmp.jpgfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC604.tmp.jpg 图8键盘外观 图9键盘内部链接电路 3.5.2行列式键盘的按键识别方法常用的键盘识别方法有:行扫描法,线翻转法和利用8279键盘接口的中断法。前两种方法相当于查询法,需要反复查询按键的状态,会占用大量的CPU时间。后一种方法在有键按下时向CPU申请中断,平时并不需要占用CPU时间。在本系统中,完全可以不使用中断法完成键盘接口, 这是由系统的特殊性决定的。首先,对于本系统而言,要实现便携式的设计,硬件电路使用的器件越少越好。其次,被测信号由外中断引脚输入,未占用单片机4个并行I/O口中的任何一个,系统有足够的资源利用自身I/O 口完成接口。最后,只有当传感器输出信号频率为空载频率,系统处于空闲待测的状态下,才允许键盘输入,因此键盘识别占用的CPU时间不会对系统正常工作造成影响。因此直接利用单片机并行接口完成键盘的接口,采用行扫描法进行键盘识别。 行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,如图9所示键盘,介绍过程如下: 1、判断键盘上是否有键闭合 将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。 2、去除键的机械抖动 为保证键的正确识别, 需要进行去抖动处理。其方法是得知键盘上有键闭合后延迟一段时间, 再判别键盘的状态,若仍有键闭合,则认为键盘上有一个键处于稳定的闭合期, 否则认为是键的抖动或者是干扰。 3、确定闭合键的物理位置 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。 4、得到闭合键的编号 在得到闭合键的物理位置的基础上,根据给定的按键编号规律,计算得出闭合键的编号。 5、确保CPU对键的一次闭合仅做一次处理 为实现这一功能, 可以采用等待闭合键释放以后在处理的方法。 4 系统软件设计C51单片机可以应用汇编语言和C语言进行编程。汇编语言与机器指令一一对应,所以用汇编语言编写的程序在单片机里运行起来效率较高,但可移植性差。C语言程序可读性高,也便于移植到其它系统中,故本次设计使用C语言编程。 4.1 程序设计整体思路此设计是由单片机控制的LCD显示系统,另外键盘来控制显示的方式。 用P3口作为键盘的输入端,对于按键的识别方式可以是中断也可以是查询,在此设计中所选用的是行扫描法进行键盘识别。 用P0口作为LCD的显示控制端,由于此LCD的显示屏被分为了两部分,所以应该对LCD显示位置进行设置。由此LCD的显示时序可知,在显示过程中还需要一定的延时并且在显示前需将一些特定的控制端置相应的电平,所以还需要一个适当的延时子程序以及输入数据前的准备程序。除了这些外,还应写一个初始化程序,用来对LCD进行初始化设置。 最后就是主函数,它的主要功能就是判断键盘上是否有按键闭合,若有按键闭合,然后根据按下的是哪一个键来执行相应的程序,选择相应的显示方式。其总体设计框图如图10所示。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC614.tmp.jpg 图10 设计框图 划分模块时应遵循下述原则: (1) 每个模块应具有独立的功能,能产生一个明确的结果。 (2) 模块之间的控制参数应尽量简单,数据参数应尽量少。 (3) 模块长度适中。 (4) 根据模块的划分原则,将该程序划分成5个模块。 4.2 程序流程图4.2.1主程序流程图系统第一次上电后,先进行初始化,初始化LCD模块,设置LCD中各个部分的显示内容,然后进行键盘扫描,获取按键,以及根据各按键的不同执行相应的操作,最后等待释放,释放之后再进行键盘扫描,循环以上操作。 系统主程序流程图如图11,其源代码见附件1。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC615.tmp.png 图11 主程序流程图 4.2.2 键盘扫描子程序流程图键盘上有很多键,每一个键对应一个键码,以便根据键码转到相应的键处理子程序,进一步实现数据输入和命令处理的功能。 键盘扫描子程序流程如图12所示,其源代码见附件1。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC626.tmp.png 图12键盘扫描方式子程序流程图 下面给出一个具体的例子解释图12: 如图3所示,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)去除键抖动。当检测到有键按下后,延时一段时间再做下一步的检测判断。 (3)若有键被按下,应识别出是哪一个键闭合。方法是对键盘的行线进行扫描。P3.4-P3.7按下述4种组合依次输出: P3.7 1 1 1 0 P3.6 1 1 0 1 P3.5 1 0 1 1 P3.4 0 1 1 1 (4)在每组行输出时读取P3.0-P3.3,若全为“1”,则表示为“0”这一行没有键闭合,否则有键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值。 4.2.3 LCD显示子程序LCD LM016L的显示函数很简单,只要严格按照其时序图操作,并结合其相关指令集,写好LCD的初始化程序,清屏程序,写指令程序,写数据程序,读数据程序等一系列驱动程序,即可完成LCD的所有显示需要。在本设计中,由于需要显示的内容比较多,且有些需要重复显示,有些只要显示一次,故只画出液晶显示的基本流程。 LCD显示流程图如图13所示,其源代码见附件1。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC627.tmp.png 图13 LCD显示子程序流程图 5系统使用说明5.1系统运行环境1、本系统的硬件电路是在Proteus电路仿真软件上运行的。 2、本系统的软件是在 Keil uVision3 上编译运行的。 3、通过Proteus与Keil连调实现电路仿真。 5.2 系统操作说明5.2.1 KEIL调试打开Keil新建工程文件,然后添加源程序文件,保存时把文件后缀名改成“.c”,再直接导入新建的工程中。 把源程序全部录入后,先粗略的检查一遍,主要改正明显的各种错误,这样可以减少之后的修改工作量。接着Options for Target “Target 1” ,点击Output ,勾选Create Hex 那个选项,一边生成可执行的文件。然后点击Project菜单下的Built Target命令然后再进行编译、连接,形成目标文件。编译、连接用Project菜单下的Built Target命令(或快捷键F7),也可以直接点击工具栏中相对应的图标。. 编译、连接时,如果程序存在语法有错,则不会通过编译,并在下面的信息窗口给出相应的出错提示信息,其中错误是一定得改正的,警告可以忽略。双击下面显示错误信息的那一行,可以直接定位错误所在的行,用户可以方便的对程序进行修改。修改后再编译、连接,继续进行调试,这个过程可能会重复多次。如果没有任何语法上的错误,则编译、连接成功,并且信息窗口给出提示信息。 5.2.2 Proteus调试在Proteus软件中先从元件库中加载要使用的那些元件,然后把元件放在图纸上一个一个的接线,尽量不让线交错,便于查看、分析,有必要时,使用接线标号法,完成所有元器件的接线。 5.2.3 Proteus与Keil连调实现电路仿真在Proteus中双击AT89C51,在弹出的窗口中Program File后面选择在Keil中生成的以“.hex”为后缀名的文件,为单片机添加可执行文件。然后点击左下角的相关图标,开始进行仿真。 仿真运行结果如下图14所示。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsC637.tmp.jpg 图14 仿真图 6结论随着电子技术的不断进步,普通的电话已渐渐不能满足人们日常的需求,取而代之的是功能更强大的电话。本系统就是基于这样一个背景下开始设计的。系统以AT89C51芯片作为主控模块,键盘作为输入电路模块,1602LCD作为显示电路模块,实现了以下功能如下: (1)系统运行时将所按下的键盘显示在液晶屏上; (2)电话号码键盘上的“*”键能够实现退格功能; (3)电话号码键盘上的“#”键能够实现清除功能; (4)每按下一个键盘能够发出声音; 通过此次设计本人在各方面有了一定的提高。 首先,通过这次毕业设计,我不仅对理论有了更深一步的认识,增强了和外界技术的沟通,还培养了自学能力和分析解决问题的能力,更重要的是,培养了克服困难的勇气和信心。 其次,培养了自己的市场观念。一个商品是否能够抢占市场,除了必须的功能和质量要求外,其价格是最大的竞争优势。如何在保证质量和完成同等功能的情况下,把产品的成本降到最低。是每个设计人员在作出方案时首要考虑的因素。 由于本人能力有限,系统仍然存在着一些问题。 (1)本系统只显示了所按下的键,系统可以再集成一些其它模块,将所按下的键通过声音发出来。 (2)作为家用电话,本系统还不能显示时间和日期,这有待于在以后的学习中进一步探讨。 总之,毕业设计完成了,但又面临着工作。我相信我会把自己的热情和所学奉献到自己的工作中,不断努力,不断进取。
参考文献[1] 侯玉宝等.基于proteus的51系列单片机设计与仿真.北京:电子工业出版社,2008. [2] 李朝青.单片机原理及接口技术.北京:北京航空航天大学出版社,2006. [3] 朱清慧等.Proteus——电子线路设计、制版与仿真.北京:清华大学出版社,2008. [4] Http://www.Sunman.cn/lcm/product/SMG12864A.him [5] 张毅刚.单片机原理极其应用.哈尔滨:哈尔滨工业大学出版社,2004 [6] 赵建领编著,51系列单片机开发宝典,电子工业出版社,2007 [7] 潘永雄编著,新编单片机原理与应用,西安电子科技大学出版社,2003 [8] 李国兴、李伟编著,单片机开发应用技术,北京大学出版社,2007 [9] 刘瑞新编著,单片机原理及应用教程,机械工业出版社,2003 [10] 李光飞,楼然苗 ,单片机课程设计实例指导,第一版,北京航空航天大学出版社,2004 [11] 谭浩强. C程序设计(第二版) [M]. 北京: 清华大学出版社, 1999.12. [12] 付军. Visual Basic 实用编程100例 [M]. 北京: 中国铁道出版社, 2003.5. [13] 李长林. Visual Basic串口通信技术与典型实例 [M]. 北京: 清华大学出版社, 2004.1
致谢本次设计是在高老师的悉心关怀和精心指导下完成的,她严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我。我从课题的开始到最后完成,我不仅学到了扎实、宽广的专业知识,也学到了许多做人的道理。 在我的课题开展过程中倾注着高老师辛勤的汗水和心血。老师的为人师表、渊博的知识、宽广的胸怀让我倍受教益,在此谨向老师们致以诚挚的谢意和崇高的敬意! 我能顺利地完成学业,与父母多年一如既往的支持和关怀是分不开的,在此,向任劳任怨、含辛茹苦的父母致以衷心的感谢! 衷心感谢在我成长的路上指点和帮助我的前辈和朋友们! 衷心感谢在百忙之中评阅论文的各位老师!
|