51单片机计算器

更新时间:2024-05-26 19:01:02 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

课程设计报告

设计题目: 基于AT89C51单片机的计算器

课程名称: 学生姓名: 学 号: 所在院系: 专 业: 班 级: 起止日期: 指导教师:

单片机与接口设计

何宇 2013112020425 物理与电子科学学院 电子信息科学与技术

1304班

2015年06月11日~2015年06月17日

潘言全

成绩评定 项 目 权重 成绩 韩学志 0.2 1、设计过程中出勤、学习态度等方面 2、课程设计质量与答辩 3、设计报告书写及图纸规范程度 总 成 绩 指导教师评语: 0.5 0.3 指导教师签名: 年 月 日 教研室审核意见: 教研室主任签字: 年 月 日

湖北师范学院物理与电子科学学院13级单片机课程设计

基于AT89C51单片机的计算器

何宇(指导教师,潘言全) (湖北师范学院物理与电子科学学院)

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

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

[关键词] AT89C51、LCD1602、计算器、矩阵键盘等

1

湖北师范学院物理与电子科学学院13级单片机课程设计

目 录

第一章 前言 .............................................................................................................................. 2 1.1 系统开发背景 ............................................................................................................... 2 1.2 设计目的 ....................................................................................................................... 2 第二章 设计要求及任务 .................................................... 2 2.1 方案构思 ....................................................................................................................... 2 第三章 系统硬件设计及说明 ................................................ 3 3.1 系统组成 ....................................................................................................................... 3 3.2 元件简介 ....................................................................................................................... 3 第四章 设计原理分析 ............................................................................................................ 11 4.1 设计方案的确定 ......................................................................................................... 11 4.2 计算器硬件方案及硬件资源分配 ............................................................................. 12 第五章 计算器的软件设计 .................................................................................................... 14 5.1 计算器的软件规划 ..................................................................................................... 14 5.2 键盘扫描的程序设计 ................................................................................................. 14 5.3 显示模块的程序设计 ................................................................................................. 14 第六章 课程设计总结 ............................................................................................................ 15 附录 .................................................................................................................................... 16

1

湖北师范学院物理与电子科学学院13级单片机课程设计

基于AT89C51单片机的计算器

第一章 前言

1.1 系统开发背景

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

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

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

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

第二章 设计要求及任务

2.1 方案构思

采用AT89C51单片机是单片微型机的简称,故又称为微控制器MCU(Micro Control Unit)。通常由单块集成电路芯片组成,内部包含有计算机的基本功能部件:中央处理器CPU,存储器和I/O接口电路等。因此,单片机只要和适当的软件及外部

2

湖北师范学院物理与电子科学学院13级单片机课程设计

设备相结合,便可成为一个单片机控制系统。单片机广泛用于智能产品,智能仪表,测控技术,智能接口等,具有操作简单,实用方便,价格便宜等优点,而其中AT89C51以MCS-51为内核,是单片机中最典型的代表,应用于各种控制领域。

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

3.1系统组成

图3.1 系统组成

3.2元件简介

3

湖北师范学院物理与电子科学学院13级单片机课程设计

图3.2 单片机AT89C51

1、主要性能:

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

? 8K字节可编程FLASH存储器(寿命:1000写/擦循环) ? 全静态工作:0Hz-33MHz ? 128*8位内部RAM ? 32条可编程I/O线 ? 三个16位定时器/计数器 ? 八个中断源

? 全双工UART串行通道 ? 低功耗的闲置和掉电模式 ? 掉电后中断可唤醒 ? 片内振荡器和时钟电路 (2) 管脚说明: VCC:供电电压。 GND:接地。

2、AT89C51的功能特性描述

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

此外, AT89C51 可降至0Hz 静态逻 辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工 作。掉电保护方式下,RAM内容被保存,振荡器被冻结, 单片机一切工作停止,直到下

4

湖北师范学院物理与电子科学学院13级单片机课程设计

一个中断或硬件复位为止。8 位微控制器 8K 字节在系统可编程 Flash。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。

3、AT89C51引脚功能

AT89C51 单片机为40 引脚芯片见图3.3。

图3.3 AT89C51引脚图

(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),具体如下表所示。

5

湖北师范学院物理与电子科学学院13级单片机课程设计

在flash编程和校验时,P1口接收低8位地址字节。 引脚号第二功能:

P1.0 T2(定时器/计数器T2的外部计数输入),时钟输出 P1.1 T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制) P1.5 MOSI(在系统编程用) P1.6 MISO(在系统编程用) P1.7 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口亦作为AT89C51特殊功能(第二功能)使用,如表3.1所示。

表3.1 P3口管脚 备选功能:

端口引脚 第二功能 P3.0 P3.1 P3.2 P3.3

RXD(串行输入口) TXD(串行输出口) /INT0(外部中断0) /INT1(外部中断1) 6

湖北师范学院物理与电子科学学院13级单片机课程设计

P3.4 P3.5 P3.6 P3.7 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)输出是外部程序存储器的读选通信号,当AT89S52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次PSEN信号。

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

如EA端为高电平(接Vcc端),CPU则执行内部程序存储器的指令。 FLASH存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。

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

7

湖北师范学院物理与电子科学学院13级单片机课程设计

XTAL1,XTAL2接石英晶体振荡器。

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

(3)控制或复位引脚

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

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

图3.5 按键电平复位

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

4、AT89C51的编程方法

编程前,须按编程模式表设置好地址、数据及控制信号;顺序如下: ① 在地址线上加上要编程单元的地址信号。 ② 在数据线上加上要写入的数据字节。 ③ 激活相应的控制信号。

8

湖北师范学院物理与电子科学学院13级单片机课程设计

④ 将EA/Vpp端加上+12V编程电压。

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

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

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

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

(1) 可靠性高;

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

(5) 抗干扰性强,工作温度范围宽。 LCD1602液晶显示屏: 1、应用简介

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

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

采用的LCD1602液晶模块是标准16针插座,接口电路如图3.6所示:关于LCD1602的详细资料见表3.2和表3.3。

9

湖北师范学院物理与电子科学学院13级单片机课程设计

图3.6 LCD接口电路 表3.2 LCD1602引脚说明

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

第15~16脚 背光阳极和背光阴极。 表3.3LCD1602指令表

指令1 清显示 指令码01H, 光标复位到地址00H位置; 指令2 光标复位 指令码02H, 光标返回到地址00H位置 ; 光标和显示模式设置 指令3 I/D→光标移动方向,高电平右移,低电平左移; S位→屏幕上所有文字是否左移或者右移,高电平有效,低电平无效;

10

湖北师范学院物理与电子科学学院13级单片机课程设计

显示开关控制 D位→控制整体显示的开与关,高平表示关显示; 指令4 C位→控制光标的开与关,高电平表示有光标,低电平表示无光标 B位→控制光标是否闪烁,高电平闪烁,低电平不闪烁 ; 指令5 光标或显示移位 S/C位 → 高电平时移动显示的文字,低电平时移动光标 功能命令设置 DL位---高电平时为4位数据总线,低电平时为8位总线; 指令6 N—位低电平时为单行显示,高电平时为双行显示; F—位低电平时显示5x7的点阵字符,高电平时为5x10的点阵字符; 指令7 字符发生器RAM地址设置 指令8 DDRAM地址设置 读忙信号和光标地址 指令9 BF位 → 为忙标志位,高电平表示忙,此时模块不能接收命令或者数据 指令10 写数据 指令11 读数据

2 、LCD的特点: (1)低压微功耗; (2)平板型结构;

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

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

第四章 设计原理分析

4.1 设计方案的确定

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

11

湖北师范学院物理与电子科学学院13级单片机课程设计

用LCD液晶显示屏显示运算结果。

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

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

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

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

采用软件设计与硬件设计相结合的方法;尽管采用软件来实现硬件系统的功能时,也许响应时间会比单纯使用硬件时长,而且还要占用微处理器(MCU)的时间;但是,用软件实现硬件的功能可以简化硬件结构,提高电路的可靠性。所以,在设计本系统得时候,在满足可靠性和实时性的前提下,尽可能的通过软件来实现硬件功能。

2、可靠性及抗干扰设计

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

3、灵活的功能扩展

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

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

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

12

湖北师范学院物理与电子科学学院13级单片机课程设计

简易计算器主要包括:键盘电路,显示电路。

下图为总体硬件结构。(如图4.1 所示为整个系统的原理图)

图4.1 计算器原理图

前面叙述了该系统的设计说明,系统采用了比较简单的设计方案,所以该系统的硬件设计的总外围电路不会产生过多的干扰。在下面的阐述中,对系统的外围电路分别予以介绍。键盘部分采用编码键盘,显示部分采用LCD液晶显示屏完全能够很好的实现显示方面的要求。

键盘电路的设计:

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

13

湖北师范学院物理与电子科学学院13级单片机课程设计

从成本角度出发,本设计选用的是非编码键盘。如图4.2

图4.2 编码键盘电路

显示电路的设计:

当系统需要显示少量数据时,采用LCD液晶显示屏进行显示是一种经济实用的方法。P0口作为液晶显示的数据端口,P3.5-P3.7口作为其控制端口,控制LCD液晶显示屏显示输出数据。

最终电路如图4.3所示:

4.3 LCD液晶显示屏显示

14

湖北师范学院物理与电子科学学院13级单片机课程设计

第五章 计算器的软件设计

5.1计算器的软件规划

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

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

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

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

数字键按下则将相应的数字送入缓存区,功能键按下则执行相应的程序。 5.3 显示模块的程序设计

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

第六章 课程设计总结

在硬件的制作过程中我走了好多的弯路,主要是在系统还没有设计很有把握就开始动手制作了。后来发现与设计的要求还有偏差,反复的改过了几次,浪费了大量的时间和体力。感受到设计人员要有耐心,要认真的从要求开始研究。软件的编写过程中费了很大的力气,因为软件的编写要求很高,要很细心,一不小心就会调用错误,很深刻的体会到作为软件编程人员是绝不能粗心大意的。一个程序的完成的速度和质量高低与细心与否有着很大联系。编程时,我充分使用了结构化的思想。这样因为语句较少,程序调试比较方便,功能模块可以逐一的调试,充分体现了结构化编程的优

15

湖北师范学院物理与电子科学学院13级单片机课程设计

势。当每个模块都完成时,将其功能加到一起就完成了整体的设计。

附录 程序: /*

接盘按键说明:

-------------------------------------------------- | 1 | 2 | 3 | + | - - - - - - - - - - - - - | 4 | 5 | 6 | - | - - - - - - - - - - - - - | 7 | 8 | 9 | * | - - - - - - - - - - - - -

| C | 0 | = | / |

--------------------------------------------------*/ //操作简介

// 按第一个数,再按'+-*/',再按'='显示出结果,然后按C清屏 // 加最大9999+9999=19998 // 减最大9999-0 =9999 // 乘最大9999*9999=99980001 // 除 1/9=0.1111 保留小数点后4位 #include #define uint unsigned int #define uchar unsigned char

//--------LCD1602------------------- //P00-07==== D0-7

sbit rs=P2^7; //指令or数据 sbit wela=P2^6; //读or写 sbit lcden=P2^5; //使能信号

16

湖北师范学院物理与电子科学学院13级单片机课程设计

//--------LCD1602------------------- //--------KEY----------------------- //P1口

//--------KEY----------------------- uchar code table[]= \

long int data_a,data_b; //第一个数和第二个数 long int data_c;

uchar dispaly[10]; //显示缓冲

//************************************************************************/

// 描述: 延时t us函数

//************************************************************************/

void LCD_Delay_us(unsigned int t) { }

//************************************************************************/

// 描述: 延时t ms函数

//************************************************************************/

void LCD_Delay_ms(unsigned int t) {

//计算结果

while(t--); //t=0,退出

unsigned int i,j; for(i=0;i

//执行t次循环

17

湖北师范学院物理与电子科学学院13级单片机课程设计

}

//************************************************************************/

// 描述: 1602液晶写指令

//************************************************************************/

void write_com(uchar com) //1602液晶写指令 { }

//************************************************************************/

// 描述:1602液晶写数据

//************************************************************************/

void write_date(uchar date) //1602液晶写数据 {

for(j=0;j<113;j++) ;

//执行113次循环

rs=0; //写指令 lcden=0; //使能1602 P0=com; //写入指令com LCD_Delay_ms(1); //延时1ms lcden=1; //使能1602 LCD_Delay_ms(2); //延时2ms lcden=0; //使能1602

rs=1; //写数据 lcden=0; //使能1602 P0=date; //写入数据date LCD_Delay_ms(1); //延时1ms

18

湖北师范学院物理与电子科学学院13级单片机课程设计

}

//************************************************************************/

// 描述:指定x,y写入字符函数

//************************************************************************/

void W_lcd(unsigned char x,unsigned char y,unsigned char Data) { }

//指定x,y写入字符串函数

void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {

if (y == 0){write_com(0x80 + x);} else{write_com(0xC0 + x);} while (*s) {write_date( *s); s++;} }

//************************************************************************/

// 描述:初始化液晶,及画面初始化

//************************************************************************/

void init_lcd(void) //初始化液晶,及画面初始化

19

lcden=1; //使能1602 LCD_Delay_ms(2); //延时2ms lcden=0; //使能1602

if (y == 0){write_com(0x80 + x);} //第一行 else{write_com(0xc0 + x);} //第二行 write_date( Data); //写入数据

//第一行 //第二行 //

//写入数据

湖北师范学院物理与电子科学学院13级单片机课程设计

{ }

//************************************************************************/

// 描述: 反转法键盘扫描

//************************************************************************/

short keycheckdown() {

wela=0; //写液晶 lcden=0; //使能1602

write_com(0x38); //8 位总线,双行显示,5X7 的点阵字符 LCD_Delay_us(100); //延时100us

write_com(0x0c); //开显示,无光标,光标不闪烁 write_com(0x06); //光标右移动 write_com(0x01); //清屏

write_com(0x80); //DDRAM 地址归0

/* 反转法键盘扫描 */

short temp1,temp2,temp,a=0xff; P1=0xf0;

/* 输入行值(或列值) */ /* 延时 */

/* 读列值(或行值) */

LCD_Delay_ms(20); temp1=P1; P1=0xff;

LCD_Delay_ms(20); P1=0x0f;

/* 延时 */

/* 输入列值(或行值) */ /* 延时 */

/* 读行值(或列值) */

LCD_Delay_ms(20); temp2=P1; P1=0xff;

temp=(temp1&0xf0)|(temp2&0xf); /* 将两次读入数据组合 */

20

湖北师范学院物理与电子科学学院13级单片机课程设计

}

void display_a() //显示数据a

21

switch(temp) {

/* 通过读入数据组合判断按键位置 */

case 0x77 :a=0x0d;break;// 按键/ case 0x7b :a=0x0e; break;// 按键= case 0x7d :a=0; break;// 按键0 case 0x7e :a=0x0f; break;// 按键CE

case 0xb7 :a=0x0c;break;// 按键* case 0xbb :a=0x9;break; // 按键9 case 0xbd :a=0x8;break; // 按键8 case 0xbe :a=0x7;break; // 按键7

case 0xd7 :a=0x0b;break;// 按键- case 0xdb :a=0x6;break; // 按键6 case 0xdd :a=0x5;break; // 按键5 case 0xde :a=0x4;break; // 按键4

case 0xe7 :a=0x0a; break;// 按键+ case 0xeb :a=3;break; case 0xed :a=2;break; case 0xee :a=1;break;

// 按键3 // 按键2 // 按键1

}

default :a=0xff;

return a; /* 返回按键值 */

湖北师范学院物理与电子科学学院13级单片机课程设计

{ }

void display_b() //显示数据b {

if(data_b>999){ write_date('0'+dispaly[3]); } //显示千位 if(data_b>99) { write_date('0'+dispaly[2]); } //显示百位 if(data_b>9) { write_date('0'+dispaly[1]); } //显示十位 }

//计算结果 void display_c(x)

22

dispaly[3]=data_a000/1000; //千 dispaly[2]=data_a00/100; //百 dispaly[1]=data_a0/10; //十 dispaly[0]=data_a; //个

write_com(0x80+0); //显示数据a

if(data_a>999){ write_date('0'+dispaly[3]);} //显示千位 if(data_a>99){

write_date('0'+dispaly[2]);}

//显示百位

if(data_a>9){ write_date('0'+dispaly[1]);} //显示十位 write_date('0'+dispaly[0]); //显示个位

write_com(0x80+7); //第一行

dispaly[3]=data_b000/1000; //千 dispaly[2]=data_b00/100; //百 dispaly[1]=data_b0/10; //十 dispaly[0]=data_b; //个

write_date('0'+dispaly[0]); //显示个位

湖北师范学院物理与电子科学学院13级单片机课程设计

{ 万万

if(data_c<100000000&&data_c>-1)//溢出时显示错误 {

dispaly[8]=data_c00000000/100000000; //万万 dispaly[7]=data_c0000000/10000000; //千万 dispaly[6]=data_c000000/1000000; dispaly[5]=data_c00000/100000; dispaly[4]=data_c0000/10000; dispaly[3]=data_c000/1000; dispaly[2]=data_c00/100; dispaly[1]=data_c0/10; dispaly[0]=data_c; write_com(0x80+6+0x40); //第一行 if(x==4) {

if(data_c>99999999) { write_date('0'+dispaly[8]);} //显示

//百万

//十万

//万

//千 //百 //十 //个

if(data_c>9999999) { write_date('0'+dispaly[7]);} //千万

if(data_c>999999) { write_date('0'+dispaly[6]);} //百万 if(data_c>99999) { write_date('0'+dispaly[5]);} //十万 }

23

write_date('0'+dispaly[4]); //万 write_date('.');

write_date('0'+dispaly[3]); //千 write_date('0'+dispaly[2]); //百 write_date('0'+dispaly[1]); //十 write_date('0'+dispaly[0]); //个

湖北师范学院物理与电子科学学院13级单片机课程设计

万万

}

void eql(uchar x)//加减乘除运算 {

else{

if(data_c>99999999) { write_date('0'+dispaly[8]);} //显示

}

if(data_c>9999999) { write_date('0'+dispaly[7]);} //千万

if(data_c>999999) { write_date('0'+dispaly[6]);} //百万 if(data_c>99999) { write_date('0'+dispaly[5]);} //十万 if(data_c>9999) if(data_c>999) if(data_c>99) if(data_c>9) }

{ write_date('0'+dispaly[4]);} //万 { write_date('0'+dispaly[3]);} //千

{ write_date('0'+dispaly[2]);} //百 { write_date('0'+dispaly[1]);} //十

write_date('0'+dispaly[0]); //个

else //溢出时显示错误 { }

write_com(0x80+11+0x40); //第一行 write_date('E'); //显示 E write_date('r'); //显示R write_date('r'); write_date('o'); write_date('r');

//显示R //显示O //显示E

switch(x)

{

/*功能键选择*/

case 1:data_c=data_a+data_b;break;

24

//加 /* +

湖北师范学院物理与电子科学学院13级单片机课程设计

S=1 */ /* 数值转换函数 */

*///减

else{data_c=data_b-data_a;W_lcd(5,1,'-');} //负数符号

case

break;

/* * S=3 *///

case 2:if(data_a>=data_b){data_c=data_a-data_b;} /* - S=2

case 3:data_c=(data_a*data_b);break;

4:if(data_b==0){LCD_Write_String(0,1,\)/data_b;}break;

}

void main() {

uchar key=0xff; //键值初始化 uchar n=0; uchar m=5; uchar x=0;

data_a=0; //前一个数 data_b=0; //后一个数 data_c=0; //结果 init_lcd(); display_a();

//1602液晶初始化

//第1个数可以按1-4次 //第2个数可以按1-4次

/* / S=4 *///除//溢出时显示错误

case 0:break;

}

while(1)

{

25

湖北师范学院物理与电子科学学院13级单片机课程设计

key=keycheckdown();

/*动态扫描键盘,返回按键对应值,赋给

j key=0到f */

if(0xff!=key) {

if(key<10) {

/*若返回值有效,进入内部处理程序*/

if(n<4){data_a=data_a*10+key;m=5;display_a();}n++; //首先

输入第一个数

if(m<4){data_b=data_b*10+key;n=5;display_b();}m++; //必须

按了+-*/才能输入第二个数

}

else

{ switch(key)

{

case 0xa:n=5;m=0;x=1;W_lcd(5,0,'+');break; //加

/*功能键选择*/

/* + S=1 */ /* 数值转换函数 */

case 0xb:n=5;m=0;x=2;W_lcd(5,0,'-');break;

/* - S=2 *///减

case 0xc:n=5;m=0;x=3;W_lcd(5,0,'*');break;

/* * S=3 *///乘

case 0xd:n=5;m=0;x=4;W_lcd(5,0,'/');break;

/* / S=4 *///除

case

0xe:n=5;m=5;eql(x);W_lcd(12,0,'=');display_c(x);break; /* = */

case

0xf:n=0;x=0;m=5;

data_a=0;data_b=0;data_c=0;LCD_Write_String(0,0,table);LCD_Write_String(0,1,table);W_lcd(0,0,'0');break; /* C*/

}

}

26

湖北师范学院物理与电子科学学院13级单片机课程设计

do{P1=0xf0;}while(P1!=0xf0);

/*等待按键松开*/

}//(0xff!=key) }//while

}//main

实物图

27

本文来源:https://www.bwwdw.com/article/h0p7.html

Top