




已阅读5页,还剩34页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录 1 1前言前言 1 1 1.1 系统开发背景 .1 1.2 系统开发意义 .1 1.3 设计目的 .1 2 2方案方案 2 2 2.1 芯片 .2 2.2 输入模块 .3 2.2.1 方案构思 3 2.2.2 显示模块 4 2.2.3 方案构思 4 2.2.4 方案比较与选择5 3系统硬件设计及说明 5 3.1 系统组成及总体框图 .5 3.1.1 元件简介 5 3.1.2 at89s52 特点.6 3.1.3 74ls08 简要说明.11 3.1.4 lcd1602 液晶显示屏12 4 4设计原理分析设计原理分析 1414 4.1 设计方案的确定 15 4.2 计算器硬件方案及硬件资源分配 15 4.2.1 硬件资源分配.15 4.3 键盘电路的设计 16 4.4 显示电路的设计 17 5 5计算器的软件设计计算器的软件设计 1818 5.1 计算器的软件规划 18 5.2 键盘扫描的程序设计 18 5.3 显示模块的程序设计 20 5.4 主程序的设计 21 5.5 软件的可靠性设计 21 结束语结束语 2222 致谢致谢 2323 附录一附录一 实物图实物图 2 24 4 附录二附录二 软件程序软件程序 2626 0 基于单片机的电子的计算器 摘要:简易计算器是一种非常广泛日常工具,对现代社会越来越流行。它可以进行一些简易的计算。本系统可进行简易的 计算信息,还具有时间校准等功能。该电路采用 at89s52 单片机作为核心,功耗小,能在 3v 的低压工作,电压可选用 35v 电压供电。本系统硬件部分由 at89s52 单片机、lcd1602 液晶屏、键盘、指示灯系统等部分构成。软件部分在 keil 环 境下用 c51 语言编写,包括简易计算显示等。 关键字:at89s52;液晶屏 lcd1602;矩阵键盘 1前言 1.1系统开发背景 随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发 展,犹如雨后春笋般的变化。电子产品的更新速度快就不足惊奇了。计算器在人们的日常中 是比较的常见的电子产品之一。如何使计算器技术更加的成熟,充分利用已有的软件和硬件 条件,设计出更出色的计算器,使其更好的为各个行业服务,成了如今电子领域重要的研究 课题。 1.2系统开发意义 今天,人们的日常生活中已经离不开计算器了,社会的各个角落都有它的身影,比如商 店,办公室,学校。因此设计一款简单实用的计算器会有很大的实际意义。 1.3设计目的 本设计旨在进一步掌握单片机理论知识,理解嵌入式单片机系统的硬软件设计,加强对 实际应用系统设计的能力。通过本设计的学习,使我掌握单片机程序设计和微机接口应用的 基本方法,并能综合运用本科阶段所学软、硬件知识分析实际问题,提高解决毕业设计实际 问题的能力,为单片机应用和开发打下良好的基础。 1 1、对字符液晶显示模块的工作原理,如初始化、清屏、显示、调用及外特性有较清楚的认 识,并会使用 lcd(液晶显示模块)实现计算结果的显示;掌握液晶显示模块的驱动和编程, 设计 lcd 和单片机的接口电路,以及利用单片机对液晶模块的驱动和操作; 2、在充分分析内部逻辑的概念,进行软件和调试,学会使用,并能够以其为平台设计出具 有四则运算能力简易计算器的硬件电路和软件程序。 2方案 2.1芯片 本设计中的芯片可以采用两种方案,一种是以 fpga 为核心处理芯片,配备相应的外设;另一种是以 at89s52 处理器,配备相应的外设。 方案一:采用 fpga 控制 fpga 是一种高密度的可编程逻辑器件,自从 xilinx 公司 1985 年推出第一片 fpga 以来,fpga 的集 成密度和性能提高很快,其集成密度最高达 500 万门/片以上,系统性能可达 200mhz。由于 fpga 器件集 成密度高,方便易用,开发和上市周期短,在数字设计和电子生产中得到迅速普及和应用,并一度在高 密度的可编程逻辑器件领域中独占鳌头。 但是基于 sram 编程的 fpga,其编程信息需存放在外部存储器上,需外部存储器芯片,且使用方法复 杂,保密性差,而其对于一个简单的计算器而言,使用 fpga 有点大材小用,成本太高。 方案二:采用 at89s52 单片机是单片微型机的简称,故又称为微控制器 mcu(micro control unit)。通常由单块集成电路 芯片组成,内部包含有计算机的基本功能部件:中央处理器 cpu,存储器和 i/o 接口电路等。因此,单片 机只要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。单片机广泛应用于智能产品, 智能仪表,测控技术,智能接口等,具有操作简单、实用方便、价格便宜等优点。其中 at89s52 是一种 带 8k 字节闪烁可编程可擦除只读存储器(fperom-flash programable and erasable read only memory)的低电压,高性能 comos8 的微处理器。该器件与工业标准的 mcs-51 指令集和输出管脚相兼容; 且是单片机中最典型的代表,应用于各种控制领域。 方案比较与选择: 通过以上两种方案的论证和比较,从设计的实用性、方便性和成本等诸多方面考虑,最终选择了以 at89s52 单片机作为中央处理单元进行计算器的设计,这样设计能够实现对九位整数加、减、乘、除的四 则运算。 2 2.2输入模块 2.2.1方案构思 方案一:采用独立式按键作为输入模块 独立式按键输入模块,其特点是:直接用 i/o 口构成单个按键电路,接口电路配置灵活、按键识别 和软件结构简单;但是当键数较多时,占用 i/o 口较多,比较浪费资源。其原理图如图 1-2-1 所示。 图 2.2.1 独立的功能按键 方案二:采用矩阵式键盘作为输入模块 矩阵式按键输入模块,其特点是:电路和软件稍复杂,但相比之下,当键数越多时,越节约 i/o 口, 比较节省资源。其原理图如图 2-2-2 所示。 图 2.2.2 矩阵键盘输入 方案比较与选择 本设计中的输入模块使用的是矩阵键盘输入。 键盘输入预置用于计算,按键较多。若是采用独立按键,需频繁按键,为软件设计增加负担,且操 3 作界面不友好;若是采用矩阵式按键,可以方便地输入一个数值,使操作界面更具有人性化,且节约了 宝贵的 i/o 口资源。 通过对比,故采用方案二作为系统输入模块。 2.2.2 显示模块 2.2.3方案构思 方案一:采用 led 数码管静态显示 采用 led 数码管的静态显示,其特点是:其亮度较高;这种显示方式接口,编程容易且管理简单; 不足的是,占用的 i/o 的线资源较多。如果采用单片机或 cpld/fpga 来控制的话,势必存在浪费 i/o 口 资源的问题。如图 1-3-1 所示。 图 2.3.1 4 位数码管静态显示 方案二:采用 led 数码管动态显示 采用 led 数码管的动态显示,其特点是:其亮度比静态显示的亮度要差一些;但其电路比较简单, 适合于显示位数较多的情况。如图 1-3-2 所示。 图 2.3.2 4 位数码管的动态显示 方案三:采用 lcd1602 液晶显示 采用 lcd1602 液晶显示,其特点是:可以调节其背光亮度,这种显示方式接口,编程虽然有些麻烦, 4 但管理较方便,占用的 i/o 口资源线也不多。 2.2.4方案比较与选择 本设计中的显示模块使用的是 lcd1602 液晶显示。 在计算器运算中,需显示的数字、符号较多,按很据个方面的特点,而后可以发现 lcd 液晶显示, 虽然在价格上的确是稍贵于 led 数码管;但数码管在硬件设计电路中,会因线太多、线路复杂而过于繁 琐,则舍弃 led 数码管,选择 lcd 液晶显示。 通过对比,故采用方案三作为系统显示模块。 3系统硬件设计及说明 3.1系统组成及总体框图 at89s52 主控制模块 lcd液晶显示屏模块 电源模块 与门模块 矩阵键盘模块 图 3.1 系统组成及总体框图 3.1.1元件简介 3.1.2 at89s52 特点 图 3.2.1-1 单片机 at89s52 5 1、主要性能: 8031 cpu 与 mcs-51 兼容 8k 字节可编程 flash 存储器(寿命:1000 写/擦循环) 全静态工作: 0hz-33mhz 三级加密程序存储器 128*8 位内部 ram 32 条可编程 i/o 线 三个 16 位定时器/计数器 八个中断源 全双工 uart 串行通道 低功耗的闲置和掉电模式 掉电后中断可唤醒 看门狗定时器 双数据指针 掉电标识符 片内振荡器和时钟电路 管脚说明: vcc:供电电压。 gnd:接地。 2、at89s52 的功能特性 at89s52 是一种低功耗、高性能 cmos8 位微控制器,具有 8k 在系统可编程 flash 存储器。 使用 atmel 公司高密度非 易失性存储器技术制造,与工业80c51 产品指令和引脚完 全兼容。片 上 flash 允许程序存储器在系统可编程,亦适于 常规编程器。在单芯片上,拥有灵巧的8 位 cpu 和在系统 可编程 flash,使得 at89s52 为众多嵌入式控制应用系统提 供高灵活、超有效的解决方 案。 at89s52 具有以下标准功能: 8k 字节 flash,256 字节 ram, 32 位 i/o 口线,看门狗定时 器,2 个数据指针,三个 16 位 定时器/计数器,一个 6 向量 2 级中断结构,全双工串行口, 片 内晶振及时钟电路。 此外, at89s52 可降至 0hz 静态逻 辑操作,支持 2 种软件可选择节电模式。空闲模式下, cpu 停止工作,允许 ram、定时器/计数器、串口、中断继续工 作。掉电保护方式下, ram 内容被 保存,振荡器被冻结, 单片机一切工作停止,直到下一个中断或硬件复位为止。8 位微控制器 8k 字节在系统可编程 flash。同时该芯片还具有 pdip、tqfp 和 plcc 等三种封装形式,以适应不 同产品的需求。 3、at89s52 引脚功能介绍 at89s52 单片机为 40 引脚芯片,见图 3.2.1-2。 6 图 3.2.1-2 at89s52 引脚图 (1)口线:p0、p1、p2、p3 共四个八位口。 p0 口:p0 口是一个 8 位漏极开路的双向 i/o 口。作为输出口,每位能驱动8 个 ttl 逻辑电平。 对 p0 端口写“1”时,引脚用作高阻抗输入。 当访问外部程序和数据存储器时, p0 口也被作为低 8 位地址/数据复用。在这种模式下, p0 不具有内部上拉电阻。 在 flash 编程时,p0 口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需 要外部上拉电阻。 p1 口:p1 口是一个具有内部上拉电阻的8 位双向 i/o 口,p1 输出缓冲器能驱动 4 个 ttl 逻辑电平。对 p1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入 使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(iil)。 此外,p1.0 和 p1.1 分别作定时器 /计数器 2 的外部计数输入( p1.0/t2)和定时器 /计数器 2 的触发输入( p1.1/t2ex),具体如下表所示。 在 flash 编程和校验时, p1 口接收低 8 位地址字节。 引脚号第二功能: p1.0 t2(定时器/计数器 t2 的外部计数输入),时钟输出 p1.1 t2ex(定时器/计数器 t2 的捕捉/重载触发信号和方向控制) p1.5 mosi(在系统编程用) p1.6 miso(在系统编程用) p1.7 sck(在系统编程用) 7 p2 口:p2 口是一个具有内部上拉电阻的8 位双向 i/o 口,p2 输出缓冲器能驱动 4 个 ttl 逻辑电平。对 p2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入 使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(iil)。 在访问外部程序存储器或用 16 位地址读取外部数据存储器(例如执行movx dptr) 时,p2 口送出高八位地址。在这种应用中, p2 口使用很强的内部上拉发送 1。 在使用 8 位地址(如 movx ri)访问外部数据存储器时, p2 口输出 p2 锁存器的内容。 在 flash 编程和校验时, p2 口也接收高 8 位地址字节和一些控制信号。 p3 口:p3 口是一个具有内部上拉电阻的8 位双向 i/o 口,p3 输出缓冲器能驱动 4 个 ttl 逻辑电平。对 p3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入 使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(iil)。 p3 口亦作为 at89s52 特殊功能(第二功能)使用,如表3.2.1 所示。 表 3.2.1 p3 口管脚 备选功能 端口引脚第二功能 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(外部数据存储器读选通) 在 flash 编程和校验时, p3 口也接收一些控制信号。 此外,p3 口还接收一些用于 flash 闪存编程和程序校验的控制信号。 (2)其他引脚说明: rst:复位输入。 晶振工作时,rst 脚持续 2 个机器周期高电平将使单片机复位。看门狗计时完成 后,rst 脚输出 96 个晶振周期的高电平。特殊寄存器 auxr(地址 8eh)上的 disrto 位可以使此功能无效。 disrto 默认状态下,复位高电平有效。 ale/prog当访问外部程序存储器或数据存储器时, ale(地址锁存允许)输出脉冲用于锁存地址的低8 位字节。一般情况下, ale 仍以时钟振荡频率 的 1/6 输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数 据存储器时将跳过一个 ale 脉冲。 对 flash 存储器编程期间,该引脚还用于输入编程脉冲(prog)。 如有必要,可通过对特殊功能寄存器( sfr)区中的 8eh 单元的 d0 位置位,可禁止 ale 操作。 该位置位后,只有一条 movx 和 movc 指令才能将 ale 激活。此外,该引脚会被微弱拉高,单片机执 行外部程序时,应设置 ale 禁止位无效。 psen程序储存允许( psen)输出是外部程序存储器 8 的读选通信号,当 at89s52 由外部程序存储器取指令(或数据)时,每个机器周期两次psen 有效, 即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次psen 信号。 ea/vpp外部 访问允许,欲使 cpu 仅访问外部程序存储器(地址为0000h-ffffh),ea 端必须保持低电平(接地) 。需注意的是:如果加密位 lb1 被编程,复位时内部会锁存 ea 端状态。 如 ea 端为高电平(接 vcc 端),cpu 则执行内部程序存储器的指令。 flash 存储器编程时,该引脚加上 +12v 的编程允许电源 vpp,当然这必须是该器件是使用12v 编程电压 vpp。 xtal1:反向振荡放大器的输入及内部时钟工作电路的输入。 xtal2:来自反向振荡器的输出。 xtal1,xtal2接石英晶体振荡器。如图3.2.1-3所示外接晶体引脚图。 图 3.2.1-3 晶振外接结构引脚图 xtal1 是片内振荡器的反相放大器输入端,xtal2 则是输出端,使用外部振荡器时,外部振荡信号应 直接加到 xtal1,而 xtal2 悬空。内部方式时,时钟发生器对振荡脉冲二分频,如晶振为 12mhz,时钟频 率就为 6mhz。晶振的频率可以在 1mhz-24mhz 内选择,在本设计电路中选用了 12mhz。电容取 20pf 左右。 机器周期12时间周期,如 12mhz 的机器周期为 1 微秒。 控制或复位引脚 reset 此脚为高电平时(约 2 个机器周期)可将单片机复位。 rst/vpd当出现两个机器周期高电平时,单片机复位。复位后,p0p3输出高电平;sp寄存器为 07h;其它寄存器全部清0;不影响ram状态。如图3.2.1-4所示。 9 图 3.2.1-4 按键电平复位 at89sxx 系列单片机实现了 isp 下载功能,故而取代了 89cxx 系列的下载方式,也是因为这样, atmel 公司已经停止生产 89cxx 系列的单片机,现在市面上的at89cxx 多是停产前的库存产品。 (3)at89s52的编程方法 编程前,须按编程模式表设置好地址、数据及控制信号;顺序如下: 在地址线上加上要编程单元的地址信号。 在数据线上加上要写入的数据字节。 激活相应的控制信号。 将ea/vpp端加上+12v编程电压。 每对flash存储阵列写入一个字节或每写入一个程序机密位,加上一个ale/prog编程脉冲。每个 字节写入周期是自身定时的,大多数约为50us。改变编程单元的地址和写入的数据,重复步骤, 直到全部文件编程结束。 单片机的现状及发展方向: 单片机是为了工业控制需要满足而诞生的,是自动控制系统的核心部件,因而也主要用于工业控制、 智能化仪器仪表、家用电器中。它具有体积小,功能多、价格低、使用方便、系统设计灵活等优点,应 用领域不断扩大,除了工业控制,智能化仪表,通讯,家用电器外,在智能化高档电子玩具产品中也大 量采用单片机芯片作为核心控制部件。 由于单片机主要面向工业控制,工作环境比较恶劣,入高温,强电磁干扰,甚至含有腐蚀性气体, 在太空中工作的单片机控制系统,还必须具有抗辐射能力,这决定了单片机 cpu 于通用微机 cpu 具有不 同的技术特征和发展方向: 可靠性高; 控制功能往往很强,数值计算交叉; 指令系统比通用微处理器慢的多; x 系列芯片取代; 抗干扰性强,工作温度范围宽。 10 3.1.374ls08 简要说明 74ls08 为四组 2 输入端与门(正逻辑) ,其主要电特性的典型值如下表 3.2.2 所示: 表 3.2.2 74ls08 主要电特性的典型值 型号 tplhtphlpd 74ls088ns10ns17mw 74ls08 逻辑图如下图 3.2.2: 图 3.2.2 74ls08 逻辑图 引出端符号 1a4a 输入端 1b4b 输入端 1y4y 输出端 74ls08 功能表如下表 3.2.3 所示: 表 3.2.3 74ls08 功能表(y=ab) inputsoutput aby l l h h l h l h l l l h 极限值: 电源电压 7v 输入电压 7v ab 间电压 5.5v 输出截止态电压 7v 11 工作环境温度 070 存储温度 -65150 推荐工作条件如表 2.2.4 所示: 表 2.2.4 推荐工作条件 74ls08 最小额定最大单位 电源电压 vcc 4.7555.25v 输入高电平电压 vih 2v 输入低电平电 压 vil08 v 输出高电平电流 ioh -400a 输出低电平电 流 iol 8ma 静态特性(ta 为工作环境温度范围)如表 2.2.5 所示: 表 2.2.5 静态特性 参 数测 试 条 件【1】最小最大单位 v ik 输入嵌位电压vcc=最小 -1.5v voh 输出高电平电压vcc最小,vih2v, ioh最大 2.7v vol 输出低电平电压vcc= 最小,vil=最大,iol=最大 0.5v ii 最大输入电压时输入电流vcc最大 0.1ma i ih 输入高电平电流vcc最大 20ua i il 输入低电平电流vcc最大 ma i os 输出短路电流vcc最大 -20-100ma icch 输出高电平时电源电流vcc最大 4.8ma iccl 输出低电平时电源电流vcc最大 8.8ma 注1: 测试条件中的“最小”和“最大”用推荐工作条件中的相应值。 动态特性(ta=25) 如表 2.2.6 所示: 表 2.2.6 动态特性 参 数测 试 条 件最大单位 tplh 输出由低到高传输延迟时间 15ns tphl 输出由高到低传输延迟时间 vcc=5v,cl=15pf,rl=2k 20ns 3.1.4 lcd1602 液晶显示屏 1、应用简介 12 模块内部自带字符发生存储器(cgrom),字符有:阿拉伯数字、英文字母的大小写、常用的符号、 和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“a”的代码是(41h),显示时 模块把代码 41h 发给液晶模块,我们就能在液晶上看到字母“a”。 1602 液晶模块内部的控制器共有 11 条控制指令,丰富的指令可以完成液晶的时序控制、工作方式 式设置和数据显示等。 采用的 lcd1602 液晶模块是标准 16 针插座,接口电路如图 3.2.3 所示:关于 lcd1602 的详细资料见表 3.2.3-1 和表 3.2.3-2。 图 3.2.3 lcd 接口电路 表 3.2.3-1 lcd1602 引脚说明 第 1 脚vss 为地电源 第 2 脚vdd 接 5v 正电源 第 3 脚 v0 为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高, 对比度过高时会产生“鬼影”,使用时可以通过一个 10k 的电位器调整对比度。 第 4 脚rs 为寄存器选择,高电平选择数据寄存器、低电平选择指令寄存器。 第 5 脚 rw 为读写信号线,高电平时进行读操作,低电平时进行写操作。 当 rs 和 rw 共同为低电平时 (00)可以写入指令或者显示地址; 当 rs 为低电平 rw 为高电平时(01)可以读入忙信号; 当 rs 为高电平 rw 为低电平时(10)可以写入数据。 第 6 脚e 端为使能端,当 e 端由高电平跳变成低电平时,液晶模块执行命令。 第 714 脚d0d7 为 8 位双向数据线。 第 1516 脚背光阳极和背光阴极。 表 3.2.3-2 lcd1602 指令表 指令 1清显示 指令码 01h, 光标复位到地址 00h 位置; 指令 2光标复位 指令码 02h, 光标返回到地址 00h 位置 ; 指令 3光标和显示模式设置 13 i/d 位 光标移动方向,高电平右移,低电平左移; s 位 屏幕上所有文字是否左移或者右移,高电平有效,低电平无效; 指令 4 显示开关控制 d 位 控制整体显示的开与关,高电平表示开显示,低电平表示关显示; c 位 控制光标的开与关,高电平表示有光标,低电平表示无光标; b 位 控制光标是否闪烁,高电平闪烁,低电平不闪烁 ; 指令 5 光标或显示移位 s/c 位 高电平时移动显示的文字,低电平时移动光标 指令 6 功能命令设置 dl 位-高电平时为 4 位数据总线,低电平时为 8 位总线; n位低电平时为单行显示,高电平时为双行显示; f位低电平时显示 5x7 的点阵字符,高电平时为 5x10 的点阵字符; 指令 7字符发生器 ram 地址设置 指令 8ddram 地址设置 指令 9 读忙信号和光标地址 bf 位 为忙标志位,高电平表示忙,此时模块不能接收命令或者数据 指令 10写数据 指令 11读数据 2、 lcd 的特点: (1)低压微功耗; (2)平板型结构; (3)被动显示型(无眩光,不刺激人眼,不会引起眼睛疲劳); (4)显示信息量大(因为像素可以做得很小); (5)易于彩色化(在色谱上可以非常准确的复现); (6)无电磁辐射(对人体安全,利于信息保密); (7)长寿命(这种器件几乎没有什么劣化问题,因此寿命极长,但是液晶背光寿命有限,不过背光部 分可以更换)。 4设计原理分析 14 4.1 设计方案的确定 本设计需要使用 lcd 液晶显示屏和编码键盘。故选择静态显示和用编码键盘。使用 lcd 液晶显示屏 显示运算结果。 主程序进行初始化,其他的程序选择模块式的方式。首先对每个模块进行调试, 当模块调试成功后, 逐一的加入主程序中,最后完成整个软件部分的设计。 4.2计算器硬件方案及硬件资源分配 4.2.1硬件资源分配 主要用到的硬件:at89s52 lcd液晶显示屏 编码键盘 1、硬件分配: p0、p3口:做为输出口,控制lcd液晶显示屏显示数据的结果。 p1口:做为输入口,与键盘连接,实现数据的输入。 lcd液晶显示屏显示输出。 2、系统的硬件设计 为了更好的实现系统得功能,硬件电路的设计应该遵循以下原则: (1)优化硬件电路 采用软件设计与硬件设计相结合的方法;尽管采用软件来实现硬件系统的功能时,也许响应时间会 比单纯使用硬件时长,而且还要占用微处理器(mcu)的时间;但是,用软件实现硬件的功能可以简化硬件 结构,提高电路的可靠性。所以,在设计本系统得时候,在满足可靠性和实时性的前提下,尽可能的通 过软件来实现硬件功能。 (2)可靠性及抗干扰设计 根据可靠性设计理论,系统所用芯片数量越少,系统的平均无故障时间越长。而且,所用芯片数量 越少,地址和数据总线在电路板上受干扰的可能性也就越小。因此,系统的设计思想是在满足功能的情 况下力争使用较少数量的芯片。 (3)灵活的功能扩展 功能扩展是否灵活是衡量一个系统优劣的重要指标。一次设计往往不能完全考虑到系统的各个方面, 系统需要不断完善以及进行功能升级。进行功能扩展时,应该在原有设计的基础上,通过修改软件程序 和少量硬件完成。对于本系统而言,就是要求在系统硬件不变的情况下,能够通过修改软件程序,完成 功能的升级和扩展。 根据第提出的系统设计方案,结合以上三条原则,确定了系统硬件的设计。计算器主要由以下一些 功能模块构成:非编码键盘模块、lcd液晶显示屏模块等。 该系统的硬件设计采用了模块化的设计方法。at89s52 单片机与lcd液晶显示屏显示电路是整个电路 15 的核心,它们实现系统的功能要求。 简易计算器主要包括:键盘电路,显示电路。 下图为总体硬件结构。 (如图 4.2.1 所示为整个系统的原理图) 图 4.2.1 计算器原理图 前面叙述了该系统的设计说明,系统采用了比较简单的设计方案,所以该系统的硬件设计的总外围 电路不会产生过多的干扰。在下面的阐述中,对系统的外围电路分别予以介绍。键盘部分采用编码键盘, 显示部分采用lcd液晶显示屏完全能够很好的实现显示方面的要求。 4.3键盘电路的设计 16 键盘可分为两类:编码键盘和非编码键盘。编码键盘是较多按键(20个以上)和专用驱动芯片的组 合,当按下某个按键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。 通用计算机使用的标准键盘就是编码键盘。在智能仪器中,使用并行接口芯片8279或串行接口芯片 hd7279均可以组成编码键盘,同时还可以兼顾数码管的显示驱动,其相关的接口电路和接口软件均可在 芯片资料中得到。当系统功能比较复杂,按键数量很多时,采用编码键盘可以简化软件设计。非编码键 盘成本低廉。 从成本角度出发,本设计选用的是非编码键盘。如图4.2.2 图4.2.2 编码键盘电路 4.4显示电路的设计 当系统需要显示少量数据时,采用lcd液晶显示屏进行显示是一种经济实用的方法。p0口作为液晶显 示的数据端口,p3.5-p3.7口作为其控制端口,控制lcd液晶显示屏显示输出数据。 最终电路如图4.2.3所示: 17 图4.2.3 lcd液晶显示屏显示 5计算器的软件设计 5.1计算器的软件规划 简易计算器的程序主要包括以下功能模块: 定时查键模块,分为读键程序、判键程序段、运算操作子程序等部分; 基于lcd液晶显示屏的显示模块; 主模块,为系统的初始化。 5.2键盘扫描的程序设计 键盘扫描子程序,首先读出p1的低四位,然后读出p1口的高四位。然后键值并显示缓存。然后将键 如的值转换为ascii码然后就可以软件来设置硬件按键各个键代表的内容。 读键程序使用的是反转法读键,不管键盘矩阵的规模大小,均进行两次读键。第一次所有行线均输 出低电平,从所有读入键盘信息(列信息) ;第二次所有列线均输出低电平,从所有行线读入键盘信息 (行信息) 。 系统中连接的是4*4行列式按键键盘,其中“0-9”为数字键;“+、-、*、/、=”为符号键; “on/c”为功能键(清屏键) ,在程序中会加入一个记忆功能键,而与其搭配的硬件按键为符号键中的 “=” ,以为求方便。 数字键按下则将相应的数字送入数字缓冲区;符号键按下则将送入符号缓冲区;功能键按下则执行 相应的程序;最终进行运算后,综合结果将送入结果缓冲区,并在lcd液晶显示屏上显示出来。 键盘模块程序也可相当于一个中断服务子程序,如图4-4-1所示。 18 有键输入? 数字键? 符号键? 功能键? 清零?记忆? 数值输入,送数 值缓冲区 符号输入,送符 号缓冲区 综合结果送综合 缓冲区 输入清零键,送 清零缓冲区 输入记忆键,送 记忆缓冲区 返回 y y y n n n n y n n 图 5-2-1 中断服务程序框图 通过以上的中断服务程序框图,来编写其子程序: void keyscan() /键盘扫描程序 uchar temp,uu=0xf7; uint i; for(i=0;i #include #include #include #include #include “lcd1602.h“ uchar k=0; void shortdelay(uchar i)/短延时 for(;i0;i-); /长延时 void longdelay(uint i) uint j; for(;i0;i-) for(j=100;j0;j-) ; /延时程序 void delay(int i) int j; for(;i0;i-) for(j=0;j100;j+); /初试状态 void io_init() p1=0xff; /?-键盘扫描部分-/ unsigned char key_scan() 26 unsigned char key; unsigned char temp; unsigned char flag; io_init(); p1=0xf0; flag=0; loop: temp=p10xf0; while(temp) p1=0xfe; delay(1); if(p1flag=1;break;/读 7 键和值 case 0xde: key=0x12;flag=1;break; case 0xbe: key=0x13;flag=1;break; case 0x7e: key=0x14;flag=1;break;/读除键的值 if(flag) goto exit; else p1=0xfd; delay(1); if(p1flag=1;break; case 0xdd: key=0x22;flag=1;break; case 0xbd: key=0x23;flag=1;break; case 0x7d: key=0x24;flag=1;break; /读 4 到乘的键值 if(flag) goto exit; else 27 p1=0xfb; delay(1); if(p1flag=1;break; case 0xdb: key=0x32;flag=1;break; case 0xbb: key=0x33;flag=1;break; case 0x7b: key=0x34;flag=1;break;/读 1 到减的键值 if(flag) goto exit; else p1=0xf7; delay(1); if(p1flag=1;break;/后退 case 0xd7: key=0x42;flag=1;break;/0 case 0xb7: key=0x43;flag=1;break;/等于 case 0x77: key=0x44;flag=1;break;/加 exit: return key; if(temp=0) goto loop; return 0; /-键盘扫描完-/ /-显示初始化?-/ /p0 口初始化 void initpindata(bit i) if(i=1) pindata=0xff; 28 else pindata=0x00; /寄存器选择信号 void setrs(bit i) if(i=1) pinrs=1; else pinrs=0; /读写操作控制 void setrw(bit i) if(i=1) pinrw=1; else pinrw=0; /使能信号 void sete(bit i) if(i=1) pine=1; else pine=0; /读 bf 以及 ac 的值 uint read_bf_ac() uint temp; initpindata(1); setrs(0); setrw(1); sete(1); shortdelay(1); temp=pindata; shortdelay(10); sete(0); return(temp); /判忙 bit statuscheck() 29 return(bit)(read_bf_ac() /写指令函数 void writeinstruc(uint instruc) while(statuscheck(); initpindata(0); setrs(0); setrw(0); sete(0); pindata=instruc; /short delay(1); sete(1); shortdelay(10); sete(0); /写数据到 ram void writedata(uint data1) initpindata(0); setrs(1); setrw(0); sete(0); pindata=data1; sete(1); shortdelay(10); sete(0); /从 ram 中读数据函数 uint readdata(void) uint temp; initpindata(1); setrs(1); setrw(1); 30 sete(1); shortdelay(1); temp=pindata; shortdelay(10); sete(0); return(temp); /显示程序 x 为行号,y 为列号,date 为要显示的数据 void dispcharacter(uchar x,uchar y,uchar data1) uchar temp; while(statuscheck(); temp=y x if(x) temp|=0x40; setddram_add(temp); writedata(data1); / writedata(data1); /lcd 复位函数 void lcdreset() clearscreen(); cursorreturn(); /lcd 初始化 void initlcd() lcdreset(); inputmode(0x06);/增量方式,不移位 dispcontrol(0x0c);/显示开,光标关,闪烁关 functionset(0x38);/8 位,2 行,5*7 void lcd_clear() while(statuscheck(); 31 clearscreen(); /-准备工作完成-/ /-计算器-/ uchar compute(uchar key1,i) signed char m,n=1; uchar c; /新读取的字符 static char act; /操作符临时存储 long result;/结果 static long num1=0; /被加数 static long num2=0; /加数 char str44=7,8,9,/, 4,5,6,*, 1,2,3,-, c,0,=,+; /数字存储数组 数字 当前读入字符 signed char num11,add2; /- m=(key1 m=m/16; m=m-1; n=key1 n=n-1; c=strmn; /- if(c = +)|(c = -)|(c = *)|(c = /) act=c; /int atoi(const char *buffer) /将字符串转换成整形数返回 num1=atoi(num); /memset 原型 /extern void *memset(void *buffer, int c, int count) /把 buffer 所指向内存区域的前 count 个字节设置成字符 c memset(num,0,11); /读取数字,清除数组 32 memset(add,0,2); /清除 else if(c = =) num2=atoi(num); switch(act) case+: if(k=0) result=num1+num2;k+;break; else result+=num2;k+;break; case-: if(k=0) result=num1-num2;k+;break; else result-=num2;k+;break; case*: if(k=0) result=num1*num2;k+;break; else result*=num2;k+;break; case/: if(k=0) result=num1/num2;k+;break; else result/=num2;k+;break; else if(c = c) act=0; num1=num0; num1=num8; memset(num,0,11); memset(add,0,2); 33 num1=num0; num1=num8; k=0; else add0=c; strcat(num,add); longdelay(350); switch(key1) /显示部分 case 0x11: dispcharacter(0,i,7);i+;break; case 0x12: dispcharacter(0,i,8);i+;break; case 0x13: dispcharacter(0,i,9);i+;break; case 0x14: dispcharacter(0,i,/);i+;break; case 0x21: dispcharacter(0,i,4);i+;break; case 0x22: dispcharacter(0,i,5);i+;break; case 0x23: dispcharacter(0,i,6);i+;break; case 0x24: dispcharacter(0,i,*);i+;break; case 0x31: dispcharacter(0,i,1);i+;break; case 0x32: dispcharacter(0,i,2);i+;break; case 0x33: dispcharacter(0,i,3);i+;break; case 0x34: dispcharacter(0,i,-);i+;break; case 0x41: clearscreen(); break; case 0x42: dispcharacter(0,i,0);i+;break; case 0x44: dispcharacter(0,i,+);i+;break; case 0x43: dispcharacter(0,i,=);i+; /-输出结果-/ m=result/10000; if(m!=0 | result = 0) /5 位 不为 0 或 结果为 0 if(result = 0) n=1; else n=0; 34 dispcharacter(0,i+,m+0); m=result/1000%10; if(m!=0 | n=0) /4 位不为 0 或 存在 5 位 dispcharacter(0,i+,m+0),n=0; m=result/100%10; if(m!=0 | n=0) /3 位不为 0 或 存在 4 位 dispcharacter(0,i+,m+0),n=0; m=result/10%10; if(m!=0 | n=0)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年河北邯郸市口腔医院秋季博硕人才引进12人备考考试题库附答案解析
- 2025贵州省康复医院合同制人员招聘备考考试题库附答案解析
- 2025甘肃天水市事业单位招聘工作人员270人备考练习题库及答案解析
- 2025贵州江口县第六幼儿园招聘备考考试题库附答案解析
- 2025马关县小坝子镇公开储备一批村“两委”后备干部(16人)笔试备考题库及答案解析
- 2025福建漳州市芗江人力资源服务有限公司招聘若干人备考考试题库附答案解析
- 2025年金华市中医医院招聘编外工作人员5人(第二批)备考考试题库附答案解析
- 工厂安全培训标准周期课件
- 2025江西宜春市直事业单位选调22人备考考试题库附答案解析
- 掌握互动教学法
- 燃气高空作业专项施工方案
- 生鲜店加盟合同模板
- 电影刮痧课件教学课件
- 游戏厅转让合同范本样本
- DB34∕T 4253-2022 公路水运工程质量监督规程
- 人教版数学四年级上册第二单元习题
- 预包装食品标签审核表
- 《旅游政策与法律法规》课件-项目一 任务1-4知识点10-关于以标准化促进餐饮节约反对餐饮浪费
- 《中国诗词大会》必背经典古诗词100首
- 第5课《用发展的观点看问题》第1框《世界是永恒发展的》-【中职专用】《哲学与人生》同步课堂课件
- 垃圾渗滤液处理调试方案
评论
0/150
提交评论