您好,欢迎来到好走旅游网。
搜索
您的当前位置:首页毕业设计(论文)-基于mc单片机的简易计算器设计(精品)[管理资料]

毕业设计(论文)-基于mc单片机的简易计算器设计(精品)[管理资料]

来源:好走旅游网


毕业设计(论文)(2011届)

题 目: 基于单片机的简易计算器 专业名称: 电子信息工程技术 姓 名: 学 号: 班 级: 08级通信与信息技术班 指导教师: 2010年 12月 30日

摘要

[摘要] 近几年单片机技术的发展很快,其中电子产品的更新速度迅猛。计算器是日常生活中比较的常见的电子产品之一。如何才能使计算器技术更加的成熟,充分利用已有的软件和硬件条件,设计出更出色的计算器呢。

本设计是以ATS52单片机为核心的计算器模拟系统设计,输入采用4×6矩阵键盘,可以进行加、减、乘、除9位带符号数字运算,并在LCD1602上显示操作过程。

科技的进步告别了以前复杂的模拟电路,一块几厘米平方的单片机可以省去很多繁琐的电路。现在应用较广泛的是科学计算器,与我们日常所用的简单计算器有较大差别,除了能进行加减乘除,科学计算器还可以进行正数的四则运算和乘方、开方运算,具有指数、对数、三角函数、反三角函数及存储等计算功能。计算器的未来是小型化和轻便化,现在市面上出现的使用太阳能电池的计算器,使用ASIC设计的计算器,如使用纯软件实现的计算器等,未来的智能化计算器将是我们的发展方向,更希望成为应用广泛的计算工具。

[关键词] ATS52 LCD1602 计算器 矩阵键盘

目录

第一章 前言 ...................................................................... 1 系统开发背景 .................................................................... 1 系统开发意义 .................................................................... 1 设计目的 ........................................................................ 1 第二章 方案论证 .................................................................. 2 方案构思 ........................................................................ 2 方案比较与选择 ................................................................. 2 第三章 系统硬件设计及说明 ........................................................ 3 ................................................................................. 3 ................................................................................. 3 ATS52特点 ..................................................................... 3 74LS08简要说明 .................................................................. 9 LCD1602液晶显示屏 .............................................................. 12 第四章 设计原理分析 ............................................................. 15 设计方案的确定 ................................................................ 15 ................................................................................ 15 硬件资源分配 ................................................................... 15 系统的硬件设计 ................................................................. 15 键盘电路的设计 ................................................................. 17 显示电路的设计 ................................................................. 17 第五章 计算器的软件设计 ......................................................... 18 ................................................................................ 19 键盘扫描的程序设计 ............................................................. 19 显示模块的程序设计 ............................................................. 19 主程序的设计 ................................................................... 20 软件的可靠性设计 ............................................................... 20 结束语 .......................................................................... 21 致谢 ............................................................................ 22 参考文献 ........................................................................ 23 附录 ............................................................................ 25 附录一:硬件实物图 .............................................................. 25

附录二:系统程序清单 ............................................................ 26

第一章 前言

系统开发背景

随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展,犹如雨后春笋般的变化。电子产品的更新速度快就不足惊奇了。计算器在人们的日常中是比较的常见的电子产品之一。如何使计算器技术更加的成熟,充分利用已有的软件和硬件条件,设计出更出色的计算器,使其更好的为各个行业服务,成了如今电子领域重要的研究课题。

系统开发意义

今天,人们的日常生活中已经离不开计算器了,社会的各个角落都有它的身影,比如商店,办公室,学校……。因此设计一款简单实用的计算器会有很大的实际意义。

设计目的

本设计旨在进一步掌握单片机理论知识,理解嵌入式单片机系统的硬软件设计,加强对实际应用系统设计的能力。通过本设计的学习,使我掌握单片机程序设计和微机接口应用的基本方法,并能综合运用本科阶段所学软、硬件知识分析实际问题,提高解决毕业设计实际问题的能力,为单片机应用和开发打下良好的基础。

1、对字符液晶显示模块的工作原理,如初始化、清屏、显示、调用及外特性有较清楚的认识,并会使用LCD(液晶显示模块)实现计算结果的显示;掌握液晶显示模块的驱动和编程,设计LCD和单片机的接口电路,以及利用单片机对液晶模块的驱动和操作;

2、在充分分析内部逻辑的概念,进行软件和调试,学会使用,并能够以其为平台设计出具有四则运算能力简易计算器的硬件电路和软件程序。

第二章 方案论证

方案构思

本设计可以采用两种方案,一种是以FPGA为核心处理芯片,配备相应的外设;另外一种是以ATS52处理器,配备相应的外设。 1、方案一:采用FPGA控制

FPGA是一种高密度的可编程逻辑器件,自从Xilinx公司1985年推出第一片FPGA以来,FPGA的集成密度和性能提高很快,其集成密度最高达500万门/片以上,系统性能可达200MHz。由于FPGA器件集成度高,方便易用,开发和上市周期短,在数字设计和电子生产中得到迅速普及和应用,并一度在高密度的可编程逻辑器件领域中独占鳌头。

但是而基于 SRAM编程的FPGA,其编程信息需存放在外部存储器上 ,需外部存储器芯片 ,且使用方法复杂 ,保密性差,而其对于一个简单的计算器而言,实用FPGA有点大材小用,成本太高。

2、方案二:采用ATS52

单片机是单片微型机的简称,故又称为微控制器MCU(Micro Control Unit)。通常由单块集成电路芯片组成,内部包含有计算机的基本功能部件:处理器CPU,存储器和I/O接口电路等。因此,单片机只要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。单片机广泛用于智能产品,智能仪表,测控技术,智能接口等,具有操作简单,实用方便,价格便宜等优点,而其中ATS52以MCS-51为内核,是单片机中最典型的代表,应用于各种控制领域。

方案比较与选择

通过以上两种方案论证和比较,从设计的实用性,方便性和成本出发,选择了以ATS52单片机作为处理单元进行计算器的设计,这样设计能够实现对六位浮点数的加减和三位浮点数的乘除运算。

第三章 系统硬件设计及说明

系统组成及总体框图

LCD液晶显示屏模块 ATS52 主控制模 与门模块 电源模块 块 编码键盘模块

ATS52特点

单片机ATS52

1、主要性能:

(1) • 8031 CPU与MCS-51 兼容

• 8K字节可编程FLASH存储器(寿命:1000写/擦循环) • 全静态工作:0Hz-33MHz

• 三级加密程序存储器 • 128*8位内部RAM • 32条可编程I/O线 • 三个16位定时器/计数器 • 八个中断源

• 全双工UART串行通道

• 低功耗的闲置和掉电模式 • 掉电后中断可唤醒 • 看门狗定时器 • 双数据指针 • 掉电标识符

• 片内振荡器和时钟电路 (2) 管脚说明: VCC:供电电压。

GND:接地。

2、ATS52的功能特性描述

ATS52 是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非 易失性存储器技术制造,与工业80C51 产品指令和引脚完 全兼容。片上Flash允许程序存储器在系统可编程,亦适于 常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统 可编程Flash,使得ATS52为众多嵌入式控制应用系统提 供高灵活、超有效的解决方案。

ATS52具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口, 片内晶振及时钟电路。

此外, ATS52 可降至0Hz 静态逻 辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工 作。掉电保护方式下,RAM内容被保存,振荡器被冻结, 单片机一切工作停止,直到下一个中断或硬件复位为止。8 位微控制器 8K 字节在系统可编程 Flash。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。

3、ATS52引脚功能

ATS52 单片机为40 。

ATS52引脚图

(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)。 此外,()和定时器/计数器2的触发输入(),具体如下表所示。 在flash编程和校验时,P1口接收低8位地址字节。 引脚号第二功能:

T2(定时器/计数器T2的外部计数输入),时钟输出 T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)

MOSI(在系统编程用) MISO(在系统编程用) SCK(在系统编程用)

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口亦作为ATS52特殊功能(第二功能)使用,。

P3口管脚 备选功能:

端口引脚 第二功能 RXD(串行输入口) TXD(串行输出口) /INT0(外部中断0) /INT1(外部中断1) T0(记时器0外部输入) T1(记时器1外部输入) /WR(外部数据存储器写选通) /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)输出是外部程序存储器的读选通信号,当ATS52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次PSEN信号。

EA/VPP——外部访问允许,欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。

如EA端为高电平(接Vcc端),CPU则执行内部程序存储器的指令。

FLASH存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:来自反向振荡器的输出。 XTAL1,XTAL2接石英晶体振荡器。。

C2 XTAL2 悬空 XTAL2

C1 XTAL1 外部振荡信号 XTAL1

GND GND

接地 接地

a.内部方式 b.外部方式

XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。晶振的频率可以在1MHz-24MHz内选择,在本设计电路中选用了12MHz。电容取20PF左右。机器周期=12×时间周期,如12MHz的机器周期为1微秒。

(3)控制或复位引脚

RESET 此脚为高电平时(约2个机器周期)可将单片机复位。

RST/VPD——当出现两个机器周期高电平时,单片机复位。复位后,P0~P3输出高电平;SP寄存器为07H;其它寄存器全部清0;不影响RAM状态。。

按键电平复位

ATSXX系列单片机实现了ISP下载功能,故而取代了CXX系列的下载方式,也是因为这样,ATMEL公司已经停止生产CXX系列的单片机,现在市面上的ATCXX多是停产前的库存产品。

4、ATS52的编程方法

编程前,须按编程模式表设置好地址、数据及控制信号;顺序如下:

① 在地址线上加上要编程单元的地址信号。 ② 在数据线上加上要写入的数据字节。 ③ 激活相应的控制信号。 ④ 将EA/Vpp端加上+12V编程电压。

⑤ 每对Flash存储阵列写入一个字节或每写入一个程序机密位,加上一个ALE/PROG编程脉冲。每个字节写入周期是自身定时的,大多数约为50us。改变编程单元的地址和写入的数据,重复①—⑤步骤,直到全部文件编程结束。

单片机的现状及发展方向:

单片机是为了工业控制需要满足而诞生的,是自动控制系统的核心部件,因而也主要用于工业控制、智能化仪器仪表、家用电器中。它具有体积小,功能多、价格低、使用方便、系统设计灵活等优点,应用领域不断扩大,除了工业控制,智能化仪表,通讯,家用电器外,在智能化高档电子玩具产品中也大量采用单片机芯片作为核心控制部件。

由于单片机主要面向工业控制,工作环境比较恶劣,入高温,强电磁干扰,甚至含有腐蚀性气体,在太空中工作的单片机控制系统,还必须具有抗辐射能力,这决定了单片机CPU于通用微机CPU具有不同的技术特征和发展方向:

(1) 可靠性高;

(2) 控制功能往往很强,数值计算交叉; (3) 指令系统比通用微处理器慢的多; (4) X系列芯片取代;

(5) 抗干扰性强,工作温度范围宽。

74LS08简要说明

74LS08为四组2输入端与门(正逻辑),其主要电特性的典型值如下: 􀩟

型号 74LS08 tPLH 8ns tphl 10ns PD 17mW 74LS08逻辑图:

74LS08逻辑图

引出端符号 1A-4A 输入端 1B-4B 输入端 1Y-4Y 输出端

74LS08功能表:

74LS08功能表(Y=AB)

Inputs A L L H H B L H L H Output Y L L L H 极限值:

电源电压 … …………. 7V 输入电压………………. 7V A-B 间电压…… ….

输出截止态电压………. 7V 工作环境温度………… 0~70℃ 存储温度 …………. -65~150℃

推荐工作条件:

74LS08 电源电压VCC 输入高电平电压ViH 输入低电平电 压ViL 输出高电平电流IOH 输出低电平电 流IOL 最小 2 额定 最大 单位 5 0.8 -400 8 V V V μA mA

静态特性(TA 为工作环境温度范围):

参 数 V IK输入嵌位电压 VOH输出高电平电压 VOL输出低电平电压 II最大输入电压时输入电流 I IH输入高电平电流 I IL输入低电平电流 I OS输出短路电流 ICCH输出高电平时电源电流 ICCL输出低电平时电源电流 测 试 条 件【1】 Vcc=最小 Vcc=最小,VIH=2V, IOH=最大 Vcc= 最小,VIL=最大,IOL=最大 Vcc=最大 Vcc=最大 Vcc=最大 Vcc=最大 Vcc=最大 Vcc=最大 最小 最大 -20 20 -100 单位 V V V mA uA mA mA mA mA [1]: 测试条件中的“最小”和“最大”用推荐工作条件中的相应值。

动态特性(TA=25℃):

参 数 tPLH输出由低到高传输延迟时间 Vcc=5V,CL=15Pf,RL=2KΩ tPHL输出由高到低传输延迟时间 20 ns 测 试 条 件 最大 单位 15 ns

LCD1602液晶显示屏

1、应用简介

模块内部自带字符发生存储器(CGROM),字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是(41H),显示时模块把代码41H发给液晶模块,我们就能在液晶上看到字母“A”。

1602液晶模块内部的控制器共有11条控制指令,丰富的指令可以完成液晶的时序控制、工作方式式设置和数据显示等。

采用的LCD1602液晶模块是标准16针插座,:。

LCD接口电路

LCD1602引脚说明

第1脚 VSS为地电源 第2脚 第3脚 第4脚 VDD接5V正电源 V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。 RS为寄存器选择,高电平选择数据寄存器、低电平选择指令寄存器。 RW为读写信号线,高电平时进行读操作,低电平时进行写操作。 当RS和RW共同为低电平时 (00)可以写入指令或者显示地址; 当RS为低电平RW为高电平时(01)可以读入忙信号; 当RS为高电平RW为低电平时(10)可以写入数据。 E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 D0~D7为8位双向数据线。 第5脚 第6脚 第7~14脚 第15~16脚 背光阳极和背光阴极。

LCD1602指令表

指令1 指令2 指令3 清显示 指令码01H, 光标复位到地址00H位置; 光标复位 指令码02H, 光标返回到地址00H位置 ; 光标和显示模式设置 I/D位 → 光标移动方向,高电平右移,低电平左移; S 位 → 屏幕上所有文字是否左移或者右移,高电平有效,低电平无效; 显示开关控制 D 位 → 控制整体显示的开与关,高电平表示开显示,低电平表示关显示; C 位 → 控制光标的开与关,高电平表示有光标,低电平表示无光标; B 位 → 控制光标是否闪烁,高电平闪烁,低电平不闪烁 ; 光标或显示移位 S/C位 → 高电平时移动显示的文字,低电平时移动光标 功能命令设置 DL位---高电平时为4位数据总线,低电平时为8位总线; N—位低电平时为单行显示,高电平时为双行显示; F—位低电平时显示5x7的点阵字符,高电平时为5x10的点阵字符; 字符发生器RAM地址设置 DDRAM地址设置 读忙信号和光标地址 BF位 → 为忙标志位,高电平表示忙,此时模块不能接收命令或者数据 写数据 读数据 指令4 指令5 指令6 指令7 指令8 指令9 指令10 指令11

2 、LCD的特点: (1)低压微功耗;

(2)平板型结构;

(3)被动显示型(无眩光,不刺激人眼,不会引起眼睛疲劳); (4)显示信息量大(因为像素可以做得很小); (5)易于彩色化(在色谱上可以非常准确的复现); (6)无电磁辐射(对人体安全,利于信息保密);

(7)长寿命(这种器件几乎没有什么劣化问题,因此寿命极长,但是液晶背光寿命有限,不过背光部分可以更换)。

第四章 设计原理分析

设计方案的确定

本设计需要使用LCD液晶显示屏和编码键盘。故选择静态显示和用编码键盘。使用LCD液晶显示屏显示运算结果。

主程序进行初始化,其他的程序选择模块式的方式。首先对每个模块进行调试, 当模块调试成功后,逐一的加入主程序中,最后完成整个软件部分的设计。

硬件资源分配

主要用到的硬件:ATS52 LCD液晶显示屏 编码键盘 硬件分配:

1、P0、P3口:做为输出口,控制LCD液晶显示屏显示数据的结果。 2、P1口:做为输入口,与键盘连接,实现数据的输入。 3、LCD液晶显示屏显示输出。

系统的硬件设计

为了更好的实现系统得功能,硬件电路的设计应该遵循以下原则: 1、优化硬件电路

采用软件设计与硬件设计相结合的方法;尽管采用软件来实现硬件系统的功能时,也许响应时间会比单纯使用硬件时长,而且还要占用微处理器(MCU)的时间;但是,用软件实现硬件的

功能可以简化硬件结构,提高电路的可靠性。所以,在设计本系统得时候,在满足可靠性和实时性的前提下,尽可能的通过软件来实现硬件功能。 2、可靠性及抗干扰设计

根据可靠性设计理论,系统所用芯片数量越少,系统的平均无故障时间越长。而且,所用芯片数量越少,地址和数据总线在电路板上受干扰的可能性也就越小。因此,系统的设计思想是在满足功能的情况下力争使用较少数量的芯片。 3、灵活的功能扩展

功能扩展是否灵活是衡量一个系统优劣的重要指标。一次设计往往不能完全考虑到系统的各个方面,系统需要不断完善以及进行功能升级。进行功能扩展时,应该在原有设计的基础上,通过修改软件程序和少量硬件完成。对于本系统而言,就是要求在系统硬件不变的情况下,能够通过修改软件程序,完成功能的升级和扩展。

根据第提出的系统设计方案,结合以上三条原则,确定了系统硬件的设计。计算器主要由以下一些功能模块构成:非编码键盘模块、LCD液晶显示屏模块等。

该系统的硬件设计采用了模块化的设计方法。ATS52 单片机与LCD液晶显示屏显示电路是整个电路的核心,它们实现系统的功能要求。

简易计算器主要包括:键盘电路,显示电路。 下图为总体硬件结构。( 所示为整个系统的原理图)

计算器原理图

前面叙述了该系统的设计说明,系统采用了比较简单的设计方案,所以该系统的硬件设计的总外围电路不会产生过多的干扰。在下面的阐述中,对系统的外围电路分别予以介绍。键盘

部分采用编码键盘,显示部分采用LCD液晶显示屏完全能够很好的实现显示方面的要求。

键盘电路的设计

键盘可分为两类:编码键盘和非编码键盘。编码键盘是较多按键(20个以上)和专用驱动芯片的组合,当按下某个按键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。通用计算机使用的标准键盘就是编码键盘。在智能仪器中,使用并行接口芯片8279或串行接口芯片HD7279均可以组成编码键盘,同时还可以兼顾数码管的显示驱动,其相关的接口电路和接口软件均可在芯片资料中得到。当系统功能比较复杂,按键数量很多时,采用编码键盘可以简化软件设计。非编码键盘成本低廉。 从成本角度出发,本设计选用的是非编码键盘。

编码键盘电路

显示电路的设计

当系统需要显示少量数据时,采用LCD液晶显示屏进行显示是一种经济实用的方法。P0口作

为液晶显示的数据端口,,控制LCD液晶显示屏显示输出数据。 :

LCD液晶显示屏显示

第五章 计算器的软件设计

简易计算器的程序主要包括以下功能模块:

1、定时查键模块,分为读键程序、判键程序段、运算操作子程序等部分; 2、基于LCD液晶显示屏的显示模块; 3、主模块,为系统的初始化。

键盘扫描的程序设计

键盘扫描子程序,首先读出P1的低四位,然后读出P1口的高四位。然后键值并显示缓存。然后将键如的值转换为ASCII码然后就可以软件来设置硬件按键各个键代表的内容。

读键程序使用的是反转法读键,不管键盘矩阵的规模大小,均进行两次读键。第一次所有行线均输出低电平,从所有读入键盘信息(列信息);第二次所有列线均输出低电平,从所有行线读入键盘信息(行信息)。

数字键按下则将相应的数字送入缓存区,功能键按下则执行相应的程序。

显示模块的程序设计

显示模块程序首先要对显示模块进行初始化;然后控制光标的位置;定义液晶显示的控制端口,用SBIT指令完成;然后设置清屏、关闭显示、归位、开显示、显示位置的首地址等等。

开始

延时程序 检测LED是否在忙 Y 扫描键盘 加减乘除运算子程序 液晶显示 结束

主程序的设计

主程序主要是用来对LCD液晶显示屏进行初始化的。

软件的可靠性设计

提高本仪器其可靠性措施主要有: 1、为防止程序跑飞,软件中设置了软件陷阱。 2、为防止程序死循环,软件中使用了看门狗技术。

结束语

在硬件的制作过程中我走了好多的弯路,主要是在系统还没有设计很有把握就开始动手制作了。后来发现与设计的要求还有偏差,反复的改过了几次,浪费了大量的时间和体力。感受到设计人员要有耐心,要认真的从要求开始研究。软件的编写过程中费了很大的力气,因为软

件的编写要求很高,要很细心,一不小心就会调用错误,很深刻的体会到作为软件编程人员是绝不能粗心大意的。一个程序的完成的速度和质量高低与细心与否有着很大联系。编程时,我充分使用了结构化的思想。这样因为语句较少,程序调试比较方便,功能模块可以逐一的调试,充分体现了结构化编程的优势。当每个模块都完成时,将其功能加到一起就完成了整体的设计。

致谢

本次毕业设计得到导师陈应华老师的热心指导,在这里对陈老师表示最衷心的感谢。陈老师平易近人,对学生的设计进度和学习很关心。在毕业设计的前期,首先给我们介绍了不少有用的资料和书籍;在硬件设计等方面给予悉心的指导;在调试的过程中陈老师给每个出现的问

题给予及时的指导。在写毕业设计论文的阶段,陈老师让我们提前给他评审,不论内容字体,还是格式上的问题都一一指出。待人平和、工作认真、治学严谨他的给我留下很深刻的印象。更重要的是,他善于与学生沟通,不仅在毕业设计上给我及时的指导,更为我大学最后阶段的学习提出了许多宝贵的意见。这一切都在潜移默化地影响着我,为我以后进入工作岗位树立了良好的榜样。

同时还要感谢梁芳芳老师,她关心同学们的进程,了解同学们在撰写过程中的麻烦,给我们提供很多帮助。

最后向所有帮助和关心过我的人表示衷心感谢!

参考文献

【1】张靖武,[M].北京:北京电子工业出版社 【2】[M].:人民邮电出版社,2006

【3】刘守义. 单片机应用技术[M].:西安电子科技大学出版社,2001 【4】[M].北京:北京航空航天大学出版社,2006

【5】,1996

【6】[M].北京:机械工业出版社,2007.

【7】肖洪兵. 跟我学用单片机. 北京:北京航空航天大学出版社,

【8】夏继强. 单片机实验与实践教程. 北京:北京航空航天大学出版社, 2001 【9】谭浩强. C语言程序设计[M].北京:清华大学出版社,2000.

【10】刘福基. C语言程序设计与实训教程[M].北京:科学出版社,2004. 【11】张磊. C语言程序设计[M].北京:高等教育出版社,2005. 【12】严桂兰. C语言程序设计[M].厦门:厦门大学出版社,2006

附录

附录一:硬件实物图

硬件实物图(正面)

硬件实物图(背面)

附录二:系统程序清单

;主程序 // Header: // File Name: // Author: // Date: #include <> #include \"\" #include \"\"

void Header_printf(unsigned char *str) //规避WARNING L15 { }

void Header() { }

void Main() {

LCD_init(); LCD_moveto(0,0);

Header_printf(\"ZhangFeng \"); LCD_moveto(1,3);

Header_printf(\"XH:0810416016\"); while(*str!='\\0') { }

BWR_data(*str); str++;

}

Header(); P2=P2|0x0F; P1=P1&0xC0;

/*开外部中断*/

IT0=1; //下降沿触发 EX0=1; EA = 1; while(1);

void mINT0 (void) interrupt 0 { }

;按键处理程序 #include <> #include \"\" #include \"\"

if(INT0==0) {

char i; EA=0;

for(i=5;i>0;i--) { }

if(INT0==1) break;

Key_press(); } EA=1;

#include \"\" void Key_press() {

char a[16];

//第一次输入数字存在b[16]里,按下中间计算符后,循环a[len]=b[len];

清空b[len] char b[16]; //再次输入数字仍存在b[16]里,按下等号后,计算a,b,结果存在b[len];

char key; char i;

char arc; //运算符 char len; //数字长度 bit sign; //正负号 bit point; //小数点

key=Key_get(); //数字键处理

if(key==12) key='7'; else if(key==13) key='8'; else if(key==14) key='9'; else if(key==22) key='4'; else if(key==23) key='5'; else if(key==24) key='6'; else if(key==32) key='1'; else if(key==33) key='2'; else if(key==34) key='3'; else if(key==42) key='0';

else if(key==11) key='C'; else if(key==21) key='S'; else if(key==31) key='%';

else if(key==41) key=' '; // else if(key==43) key='.'; else if(key==44) key='=';

else if(key==45) key='+';

//清空 //正负号 空格

else if(key==25) key='-'; else if(key==15) key='*'; else if(key==16) key='/'; else if(key==26) key='M'; else if(key==36) key='D'; else if(key==46) key='A'; else key='E'; //错误

if(len<15) //前15个数字输入有效 {

//MRC //M- //M+

if(len==0) {

LCD_init();

for(len=15;len>0;len--) }

if(key>0x2F&&key<0x3A) {

if(len==0&&key=='0') { }

else if(point==0) {

b[len]=key; b[len+1]='.'; LCD_moveto(1,14); LCD_printf(\"0.\"); //第一位输入'0'不响应

{ }

b[0]='0'; b[1]='.';

b[len]=' ';

LCD_moveto(1,14); LCD_printf(\"0.\");

}

}

len++;

else { }

b[len+1]=key; len++;

//小数点处理 else if(key=='.')

{ //point==1,已存在小数点 }

//len==15,最后一位按下小数点 if(point==0) { }

if(len<14) { }

if(len==0) { } else {

b[len+1]='.'; }

point=1; b[len]='0'; b[len+1]='.'; point=1; len++;

}

//负号处理

if(key=='S') { if(len>0) { if(sign==0&&len<15) { len++;

for(i=len;i>0;i--) {

b[i]=b[i-1]; }

b[0]='-'; sign=1;

}

else if(sign==1) { for(i=0;ib[i]=b[i+1]; } sign=0; len--;

LCD_moveto(1,14-len); LCD_printf(\" \"); }

}

}

else if(key=='%') { }

else if(key=='+'||key=='-'||key=='*'||key=='/') {

//运算符

if(arc==0) { } else {

if(arc=='/'&&point==len) { } else {

Operation(a,b,arc); for(i=0;i<16;i++) //清空b {

b[i]=' ';

key='E';

for(i=0;i<16;i++) //把第一个数存入a { } b[0]='0'; b[1]='.'; len=0; sign=0; point=0; arc=key;

a[i]=b[i]; b[i]=' ';

}

b[0]='0'; b[1]='.'; len=0; sign=0; point=0; arc=key;

}

}

}

else if(key=='=') //等号 { }

if(arc=='/'&&point==len) { }

else if(arc!=0) { }

Operation(a,b,arc); for(i=0;i<16;i++) //清空b {

b[i]=' ';

key='E';

}

b[0]='0'; b[1]='.'; len=0; sign=0; point=0;

arc=0; //清除计算标志

while(P3_2==0) { }

if(key=='C') //清零 {

LCD_moveto(0,0);

LCD_printf(\" \");

}

LCD_moveto(1,0);

LCD_printf(\" 0.\"); for(i=0;i<16;i++) { } b[0]='0'; b[1]='.'; len=0; sign=0; point=0; arc=0;

a[i]=' '; b[i]=' ';

else if(key=='E') //意料外的按键 { } else {

LCD_init();

LCD_printf(\"Error!!!\");

for(i=0;i<16;i++) { } b[0]='0'; b[1]='.'; len=0; sign=0; point=0; arc=0;

a[i]=' '; b[i]=' ';

}

LCD_moveto(0,13); LCD_printf(\" \"); LCD_moveto(0,0); LCD_printf(a); if(len==0) { } else {

LCD_moveto(1,15-len); LCD_printf(b); LCD_moveto(1,0);

LCD_printf(\" 0.\");

}

}

; LCD液晶显示屏模块程序 #include <>

/*【端口设置宏定义】*/ #define LCDPORT P0 #define LCDBF P0_7 #define LCDRS P3_5 #define LCDRW P3_6 #define LCDE P3_7

/*【N ms延时】*/ void LCD_delay(int n) {

int i; for(;n>0;n--) {

//LCD数据接口。

//读写操作使能:1--禁止;0--允许.

//寄存器选择信号:0--数据寄存器;1--指令寄存器。 //读写信号:1--读LCD;0--写LCD。

//片选信号,当输入下降沿信号时,执行指令或传送数据。

}

for(i=0;i<122;i++) { }

//1ms延时

}

/*【忙检测】*/ void detect() {

LCDE=0;

LCDPORT=0xFF; LCDRS=0; LCDRW=1; LCDE=1; LCD_delay(1); while(LCDBF) { LCDE=0;

}

LCD_delay(1); LCDE=1; LCD_delay(1); } LCDE=0;

/*【不检测忙的指令写入】*/ void NWR_cmd(char cmd) {

LCD_delay(1); LCDE=0;

LCDRS=0; LCDRW=0; LCDPORT=cmd; LCDE=1;

}

/*【不检测忙的数据写入】*/ /*void NWR_data(char dat) {

LCD_delay(1); LCDE=0;

LCDRS=1; LCDRW=0; LCDPORT=dat; LCDE=1;

这个貌似没用,凑数的~

}*/

/*【带忙检测的指令写入】*/ void BWR_cmd(char cmd) { }

/*【带忙检测的数据写入】*/ void BWR_data(char dat) {

detect(); LCDRS=1; LCDRW=0; LCDPORT=dat; LCDE=1;

detect(); LCDRS=0; LCDRW=0; LCDPORT=cmd; LCDE=1;

LCD_delay(1); LCDE=0;

LCD_delay(1); LCDE=0;

}

/*【行列坐标设定】*/

void LCD_moveto(unsigned char x, unsigned char y) {if(x==0)

BWR_cmd(0x80|y);

if(x==1) }

/*【字符串输出】*/

BWR_cmd(0xc0|y);

void LCD_printf(unsigned char *str) { }

/*【初始化】*/ void LCD_init(void) { }

BWR_cmd(0x38); BWR_cmd(0x08); BWR_cmd(0x01); BWR_cmd(0x06); BWR_cmd(0x0C);

//显示模式设置 //显示关闭 //显示清屏

//显示光标移动设置,指针减一 //显示开及光标设置,不显示光标

LCD_delay(10); NWR_cmd(0x38); LCD_delay(5); NWR_cmd(0x38); LCD_delay(5); NWR_cmd(0x38);

while(*str!='\\0') {BWR_data(*str);

str++; }

; 编码键盘模块程序 #include <> /*【N ms延时】*/ /*void Key_delay(int n) {

int i; for(;n>0;n--) {

for(i=0;i<122;i++) { }

//1ms延时

}

}*/

/*【键码处理】*/ char Key_get() {

P2=P2|0x0F; P1=P1&0xC0; if(RN==0x0E) {key=10; } else if(RN==0x0D) {key=20; }

P1=P1|0x3F; P2=P2&0xF0; LN=P1&0x3F;

//扫描列

P2=P2|0x0F; P1=P1&0xC0; RN=P2&0x0F;

//扫描行

char key,RN,LN;

}

else if(RN==0x0B) {key=30; } else if(RN==0x07) {key=40; } if(LN==0x3E) {key=key+1;

}

else if(LN==0x3D) {key=key+2;

}

else if(LN==0x3B) {key=key+3;

}

else if(LN==0x37) {key=key+4;

}

else if(LN==0x2F) {key=key+5;

}

else if(LN==0x1F) {key=key+6; return key;

}

; 运行程序 #include <>

void Operation(char first[16],char second[16],char opn) {

float a,b; //数组转换成浮点数 sscanf(first,\"%f\sscanf(second,\"%f\if(opn=='+') {a=a+b;

}

else if(opn=='-') {a=a-b;

}

else if(opn=='*') {a=a*b;

}

}

else if(opn=='/') {a=a/b;

}//浮点数转化成数组

if(a<||a>1000000)

{sprintf(first,\"%e \

else

{sprintf(first,\"%f\}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- haog.cn 版权所有 赣ICP备2024042798号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务