作文一:《计算器12》21200字
《单片机技术》课程设计说明书 计 算 器
院 、 部:
学生姓名:
指导教师:职称
专 业:
班 级:
完成时间:
课程设计任务书
课 程:单片机技术
课程设计题目:
适 用 班 级:自动化卓越 1201 电子 1201-1203
时 间:2014~2015学年第一学期 指 导 教 师:凌 云
《单片机技术》课程设计任务书
一、设计题目:数字电子钟、数字频率计、数字电压表、交通灯、抢答器、密码 锁、波形发生器、数字温度计、计算器、数字式秒表。
二、适用班级:自动化卓越 1201、电子 1201-1203、通信 1201-1202
三、指导教师:凌云
四、设计目的与任务:
学生通过理论设计和实物制作解决相应的实际问题, 巩固和运用在 《单片机 技术》 中所学的理论知识和实验技能, 掌握单片机应用系统的一般设计方法, 提 高设计能力和实践动手能力, 为以后从事电子电路设计、 研发电子产品打下良好 的基础。
五、设计内容与要求
设计内容
1、数字电子钟
设计一个具有特定功能的电子钟。 该电子钟上电或按键复位后能自动显示系 统提示符 “P.” , 进入时钟准备状态;第一次按电子钟启动 /调整键,电子钟从 0时 0分 0秒开始运行,进入时钟运行状态;再次按电子钟启动 /调整键,则电子 钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按启动 /调 整键再次进入时钟运行状态。
2、数字频率计
设计一个能够测量周期性矩形波信号的频率、 周期、 脉宽、 占空比的频率计。 该频率计上电或按键复位后能自动显示系统提示符 “P.” , 进入测量准备状态。 按 频率测量键则测量频率;按周期测量键则测量周期;按脉宽测量键则测量脉宽; 按占空比测量键则测量占空比。
3、数字电压表
设计一个能够测量直流电压的数字电压表。 测量电压范围 0~5V , 测量精度 小数点后两位。 该电压表上电或按键复位后能自动显示系统提示符 “P.” , 进入测 量准备状态, 按测量开始键则开始测量, 并将测量值显示在显示器上, 按测量结 束键则自动返回 “P.” 状态。
4、交通灯
设计一个具有特定功能的十字路口交通灯。 该交通灯上电或按键复位后能自 动显示系统提示符 “P.” , 进入准备工作状态。 按开始键则开始工作, 按结束键则 返回 “P.” 状态。要求甲车道和乙车道两条交叉道路上的车辆交替运行,甲车道为 主车道,每次通车时间为 60秒,乙车道为次车道,每次通车时间为 30秒,要求
黄灯亮 3秒,并且 1秒闪烁一次。有应急车辆出现时,红灯全亮,应急车辆 通车时间 10秒,同时禁止其他车辆通过。
5、抢答器
设计一个具有特定功能的抢答器。 该抢答器上电或按键复位后能自动显示系 统提示符 “P.” , 进入准备工作状态。 主持人按下开始按钮后, 抢答开始并限定时 间 30S ; 10S 内无人抢答,蜂鸣器发出音响;主持人按下开始按钮之前有人按下 抢答器,抢答违规,显示器显示违规台号,违规指示灯亮,其它按钮不起作用; 正常抢答, 显示器显示台号, 蜂鸣器发出音响, 其它抢答按钮无效; 正常抢答下, 从按下抢答按钮开始 30S 内,答完按钮没按下,则作超时处理,超时处理时,违 规指示灯亮,显示器显示违规台号。蜂鸣器发出音响;各台数字显示的消除,蜂 鸣器音响及违规指示灯的关断,都要通过主持人按复位按钮。
6、密码锁
设计一个具有特定功能的密码锁。 该密码锁上电或按键复位后能自动显示系 统提示符 “P.” , 进入准备工作状态。该密码锁具有系统原始密码 888888,用户 可以设定并存储用户密码, 密码输入时应处于保密显示状态, 密码输入正确时应 显示密码输入正确提示信息,否则,显示密码输入错误提示信息。
7、波形发生器
设计一个具有特定功能的波形发生器。 该波形发生器上电或按键复位后能自 动显示系统提示符 “P.” , 进入准备工作状态。该波形发生器可以分别产生幅值 0~5V 、频率 100Hz ~100KHz 范围内的三角波、锯齿波、方波、梯形波和正弦 波。
8、数字温度计
设计一个具有特定功能的数字温度计。 该数字温度计上电或按键复位后能自 动显示系统提示符 “P.” ,进入准备工作状态。测量温度范围 0℃ ~99℃ ,测量精度 小数点后两位,可以通过开始和结束键控制数字温度计的工作状态。
9、计算器
设计一个具有特定功能的计算器。 该计算器上电或按键复位后能自动显示系 统提示符 “P.” ,进入准备工作状态。能实现(1)基本的加、减、乘、除、平方、 开方;(2)三角函数运算;(3)十进制、十六进制转换运算;(4)其他功能。 10、数字式秒表
设计一个具有特定功能的数字式秒表。 该数字式秒表上电或按键复位后能自 动显示系统提示符 “P.” ,进入准备工作状态。该数字式秒表应具有开始、暂停、 连续、清零和停止功能。
设计要求
1、以上课题可以任选其一或多选,学生也可以自拟课题;
2、编程语言:汇编或 C51;
3、计算机打印《单片机技术》课程设计说明书一份;
4、设计时间:一周;
5、实物制作;
6、人员分组:一人一组一实物。
六、《单片机技术》课程设计说明书正文主要内容
参照 “ 《单片机技术》课程设计说明书正文主要内容 ” 文件。
七、《单片机技术》课程设计说明书书写规范格式
参照 “ 《单片机技术》课程设计说明书书写规范格式 ” 文件。
八、参考资料
1、马忠梅,单片机的 C 语言 Windows 环境编程宝典 [M], 北京:北京航空航 天大学出版社, 2003.6;
2、李光飞 , 单片机 C 程序设计指导 [M],北京 :北京航空航天大学出版社,
2003.01 ;
3、李光飞 , 单片机课程设计实例指导 [M],北京 :北京航空航天大学出版社, 2004.9。
电气自动化教研室 2014年 9月 10日
摘 要
本设计是基于 52系列的单片机进行的十进制计算器系统设计,可以完成计 算器的键盘输入,进行加、减、乘、除 3位无符号数字的简单四则运算,并在 LED 上相应的显示结果。
设计过程在硬件与软件方面进行同步设计。 硬件方面从功能考虑, 首先选择 内部存储资源丰富的 AT89S52单片机, 输入采用 4×4矩阵键盘。 显示采用 4位 8段共阴极 LED 动态显示。软件方面从分析计算器功能、流程图设计,再到程序 的编写进行系统设计。首先,利用 Microsoft Visio软件画出系统流程图;然后编 程语言方面从程序总体设计以及高效性和功能性对 C 语言和汇编语言进行比较 分析, 针对计算器四则运算算法特别是乘法和除法运算的实现, 最终选用全球编 译效率最高的 KEIL 公司的 μVision4软件,采用汇编语言进行编程;最后利用 proteus 软件进行仿真、测试。当仿真结果正确以后,再利用 AD 软件画图,制 板。
关键字:单片机;计算器;加减乘除; 4*4矩阵键盘; LED
ABSTRACT
This design is based on 51 series microcontroller for decimal calculator system design, can plete the calculator keyboard input, add, subtract, multiply and divide three unsigned Numbers of simple arithmetic, and the corresponding on the LED display results.
In the aspect of hardware and software design process synchronization design. From a functional hardware, first select the internal storage resources rich AT89C51, the 4 * 4 matrix keyboard input. According to the four 8 segments mon cathode LED dynamic display. Software based on an analysis of the calculator function, the flow chart of design to the writing of the program for system design. First, use the Microsoft Visio software draw a flow chart of system; Then programming language from the application and efficiency of the overall design and function of C language and assembly language parative analysis, in view of the calculator arithmetic algorithm especially the realization of the multiplication and division, finally chooses the pilation of the most efficient KEIL pany of mu Vision4 software, using assembly language programming; The last is the use of proteus software for simulation and testing. When simulation results right recycling AD software drawing, plate.
Key words: single chip microputer; The calculator; Subtracting ; 4 * 4 matrix keyboard ; The LED
目 录
1 绪论 .......................................................................................................................... 1
2 系统硬件设计 .......................................................................................................... 2 2.1 芯片 AT89S52的介绍 .................................................................................. 2 2.1.1 AT89S52引脚图 ............................................................................. 2 2.1.2 AT89S52的引脚说明和功能 ......................................................... 2 2.2 芯片 74HC573的介绍 .................................................................................. 3 2.3 单片机最小系统 ............................................................................................ 4 2.3.1 复位电路 .......................................................................................... 4 2.3.2 晶振电路 .......................................................................................... 4 2.3.3 电源电路 .......................................................................................... 5 2.4 八段共阳极数码管 ........................................................................................ 5
2.5 矩阵键盘的设计 ........................................................................................... 6
3 软件系统设计 .......................................................................................................... 7 3.1 系统模块 ........................................................................................................ 7 3.2 系统流程框图 ................................................................................................ 7 3.2.1 主程序 .............................................................................................. 7
3.2.2 算术运算流程图 .............................................................................. 8
4 Proteus 仿真 ........................................................................................................... 10 4.1 Proteus 简介 ................................................................................................. 10 4.2 电路仿真图 .................................................................................................. 11 4.3 仿真结果 ...................................................................................................... 11 结束语 .......................................................................................................................... 13 致 谢 .......................................................................................................................... 14 参考文献 ...................................................................................................................... 15 附 录 .......................................................................................................................... 17 附 录 A :程序 . .................................................................................................. 17 附 录 B :原理图 . .............................................................................................. 23 附 录 C :PCB 版图 .......................................................................................... 24 附 录 D :元器件清单 . ...................................................................................... 25
附 录 E :实物图 ............................................................................................... 26
1 绪论
随着社会的发展, 科学的进步, 人们的生活水平在逐步的提高, 尤其是微电 子技术的发展, 犹如雨后春笋般的变化。 电子产品的更新速度快就不足惊奇了 , 单 片机的应用已经越来越贴近生活,用单片机来实现一些电子设计也变得容易起 来。
近年来,单片机以其体积小、价格廉、面向控制等独特优点,在各种工业控 制、 仪器仪表、 设备、 产品的自动化、 智能化方面获得了广泛的应用。 与此同时, 单片机应用系统的可靠性成为人们越来越关注的重要课题. 影响可靠性的因素是 多方面的, 如构成系统的元器件本身的可靠性、 系统本身各部分之间的相互耦合 因素等。其中系统的抗干扰性能是系统可靠性的重要指标。
本设计采用 80S52芯片, 实现了利用单片机进行了一个简单计算器设计。 允 许对输入数据进行加减乘除运算及 LCD (Liquid Crystal Display)显示。如果设 计对象是更为复杂的计算器系统,其实际原理与方法与本设计基本相同。 LCD 液晶显示器是 Liquid Crystal Display的简称, LCD 的构造是在两片平行的玻璃基 板当中放置液晶盒,下基板玻璃上设置 TFT (薄膜晶体管),上基板玻璃上设置 彩色滤光片,通过 TFT 上的信号与电压改变来控制液晶分子的转动方向,从而 达到控制每个像素点偏振光出射与否而达到显示目的。现在 LCD 已经替代 CRT 成为主流,价格也已经下降了很多,并已充分的普及。故采用 LCD 。设计的关 键所在, 必须非常熟悉单片机的原理与结构, 同时还要对整个设计流程有很好的 把握,将单片机和其他模块完整的衔接。本设计是基于 51系列单片机来进行的 数字计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除基本四 则运算, 并在 LCD 上显示相应的结果; 设计电路采用 AT89C51单片机为主要控 制电路, 显示采用字符 LCD 静态显示; 软件方面使用汇编语言编程, 并用 Proteus 仿真 。
2 系统硬件设计
2.1 芯片 AT89S52的介绍
2.1.1 AT89S52引脚图
图 1 AT89S52引脚图
AT89S52 是一种低功耗、高性能 CMOS8 位微控制器,具有 8K 在系统可 编程 Flash 存储器。使用 Atmel 公司高密度非易失性存储器技术制造,与工业 80C51 产品指令和引 脚完全兼容。 片上 Flash 允许程序存储器在系统可编程, 亦适于常 规编程器。在单芯片上,拥有灵巧的 8位 CPU(Central Processing Unit)和在系统 可编程 Flash , 使得 AT89S52为众多嵌入式控制应用系统提供高灵活、 超有效的 解决方案。 AT89S52具有以下标准功能:8k 字节 Flash , 256字节 RAM , 32 位 I/O 口线,看门狗定时器, 2 个数据指针,三个 16位定时器 /计数器,一个 6向量 2级中断结构, 全双工串行口, 片内晶振及时钟电路。 另外, AT89S52 可降至 0Hz 静态逻辑操作,支持 2种软件可选择节电模式。空闲模式下, CPU 停止工作, 允许 RAM 、定时器 /计数器、串口、中断继续工作。掉电保护方式下, RAM 内 容被保存, 振荡器被冻结, 单片机一切工作停止, 直到下一个中断或硬件复位为 止。
2.1.2 AT89S52的引脚说明和功能
XTAL1:接外部晶振的一个引脚。 在单片机内部, 它是一反相放大器输入端, 这个放大器构成了片内振荡器。它采用外部振荡器时,些引脚应接地。
XTAL2:接外部晶振的一个引脚。 在片内接至振荡器的反相放大器输出端和 内部时钟发生器输入端。当采用外部振荡器时,则此引脚接外部振荡信号的输
入。
RST :STC90C52AD 的复位信号输入引脚,高电位工作,当要对芯片又时, 只要将此引脚电位提升到高电位,并持续两个机器周期以上的时间, AT89C51便能完成系统复位的各项工作, 使得内部特殊功能寄存器的内容均被设成已知状 态。
P0口:(P0.0~P0.7)是一个 8位漏极开路双向输入输出端口,当访问外部数 据时,它是地址总线(低 8位)和数据总线复用。外部不扩展而单片应用时,则 作一般双向 I /O 口用。 P0口每一个引脚可以推动 8个 LSTTL 负载。
P2口:(P2.0~P2.7)口是具有内部提升电路的双向 I/0端口 (准双向并行 I/O口 ) ,当访问外部程序存储器时,它是高 8位地址。外部不扩展而单片应用时, 则作一般双向 I /O 口用。每一个引脚可以推动 4个 LSTL 负载。
P1口:(P1.0~P1.7)口是具有内部提升电路的双向 I/0端口 (准双向并行 I/O口 ) ,其输出可以推动 4个 LSTTL 负载。仅供用户作为输入输出用的端口。 P3口:(P3.0~P3.7)口是具有内部提升电路的双向 I/0端口 (准双向并行 I/O口 ) ,它还提供特殊功能,包括串行通信、外部中断控制、计时计数控制及外部 随机存储器内容的读取或写入控制等功能。
2.2 芯片 74HC573的介绍
芯片 74HC573有 20个引脚, D0-D7为输入, Q0-Q7为输出。 74HC573是一 款高速 CMOS 器件, 74HC573引脚兼容低功耗肖特基 TTL (LSTTL )系列。 74HC573包含八路 D 型透明锁存器,每个锁存器具有独立的 D 型输出,以 及适应于面向总线的应用的三态输出。所有锁存器共用一个锁存使能(LE )端 和一个输出使能(OE )端。
当 LE 为高时,数据从 Dn 输入到锁存器,在此条件下,锁存器进入透明模 式,也就是说,锁存器的输出状态将会随着对应的 D 输入每次的变化而变化。 当 LE 为低时,锁存器将存储 D 输入上的信息一段就绪时间,直到 LE 的下降沿 来临。
当 OE 为低时, 8个锁存器的内容可被正常输出;当 OE 为高时,输出进入 高阻态。 OE 端的操作不会影响锁存器的状态。
图 2 74HC573引脚图
2.3 单片机最小系统
单片机最小系统就是支持主芯片正常工作的最小部分, 包括电源电路、 复位 电路和晶振电路。
2.3.1 复位电路
图 3 复位电路
本设计采用上电与手动复位电路,
电阻分别选取 100和 10K , 电容选取 10uF , 系统一上电,芯片就复位,或者中途按按键也可以进行复位。
2.3.2
晶振电路
图 4 晶振电路
晶振电路是单片机的心脏, 它用于产生单片机工作所需要的时钟信号。 单片
机的晶振选取 11.0592MHz ,晶振旁电容选取 30pF 。
2.3.3 电源电路
图 5电源电路
电源电路靠下载口供电, 然后通过 V+、 KG6进入到电路当中。 当 KG6闭合时, LED 亮,当 KG6断开时, LED 灭。
2.4 八段共阳极数码管
LED 显示器由 8段发光二极管组成,排列成 8字形状,称为 8段 LED 显示器, 器件内部接线图如图所示:
图 6 4位数码管外形结构和引脚分布图
为了显示数字或符号,要为 LED 显示器提供代码,即字形代码。七段发光二 极管,再加上一个小数点位,共计 8段,因此提供的字形代码的长度正好是一个 字节。简易计算器用到的数字 0~9的共阴极字形代码如下表 1所示:
表 1 共阴极数码管字形代码
显示字符 0 1 2 3 4 5 + - * / 段码 3FH 06H 5BH 4FH 66H 6DH 70H 40H 76H 49H
2.5 矩阵键盘的设计
键盘可分为两类:编码键盘和非编码键盘。编码键盘是较多按键(20个以 上)和专用驱动芯片的组合,当按下某个按键时,它能够处理按键抖动、连击等 问题, 直接输出按键的编码, 无需系统软件干预。 通用计算机使用的标准键盘就 是编码键盘。 当系统功能比较复杂, 按键数量很多时, 采用编码键盘可以简化软 件设计。但大多数智能仪器和电子产品的按键数目都不太多(20个以内),为 了降低成本和简化电路通常采用非编码键盘。 非编码键盘的接口电路有设计者根 据需要自行决定,按键信息通过接口软件来获取。本课题需要的是 16个按键, 故选择用非编码键盘。
计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方 式,在这种情况下,编程会很简单,但是会占用大量的 I/O 口资源,因此在很多 情况下都不采用这种方式, 而是采用矩阵键盘的方案。 矩阵键盘采用四条 I/O 线 作为行线, 四条 I/O 线作为列线组成键盘, 在行线和列线的每个交叉点上设置一 个按键。 这样键盘上按键的个数就为 4×4个。 这种行列式键盘结构能有效地提高 单片机系统中 I/O 口的利用率。
矩阵键盘的工作原理:计算器的键盘布局如图五所示:一般有 16个键组成, 在单片机中正好可以用一个 P 口实现 16个按键功能,这种形式在单片机系统中 也最常用。
图 7 4*4键盘接口电路
3 软件系统设计
3.1 系统模块
系统模块图如图 8所示, 首先利用按键作为输入模块, 当有按键按下时, 就 控制单片机运行,然后使数码管显示。
图 8 计算器系统模块
3.2 系统流程框图
3.2.1 主程序
当程序开始后,首先要使各参数初始化, LED 显示初始化。然后判断是否 有键按下。当无按键按下时,延时再判断按键;当有键按下时,先读取键码,再 判断是数字键、 清零键还是功能键。 当是按下数字键时, 然后进行键入数值处理, 再把数值送显示缓冲,最后送 LED 显示;当时按下清零键时,然后使所有状态 清零,在把数值送显示缓冲,最后送 LED 显示;当时按下功能键时,再根据上 次功能键和输入的数据计算结果, 再送显示缓冲并且等待数值键入, 并且把此次 的数值送给数码管显示。其系统总流程图如图 9所示:
图 9 主程序流程图
3.2.2 算术运算流程图
当程序开始运行后, 首先就要判断是数字键还是运算符。 当判断是运算符时, 然后要进一步判断是加减乘除的哪一种。 当是作加法运算时, 然后要判断两个数 之和是否超出 255,即判断 CY 位,当 CY 为 0时,则此时的数有效且在数码管 上显示出来;当 CY 为 1时,此时的数大于 255,算出来的结果错误,在数码管 显示为 ?000? 。同理,在作减法运算时,也要判断 CY 位, CY 为 0时,值有效; CY 为 1时,此时数小于 0, 数码管显示为 ?000? 。当是作乘法运算时,判断它们乘 积是否大于 255,即判断 OV 位,当 OV 为 0时,值有效;当 OV 为 1时,此时
乘积大于 255,数码管显示为 ?000? 。同理,在作除法运算时,也要判断 OV 位, 当 OV 为 0时,此时除数不为 0,算出的值有效;当 OV 为 1时,此时除数为 0, 表示除法无意义,数码管显示 ?000? 。其算术运算程序流程图如图 10所示:
图 10 算术运算流程图
4 Proteus 仿真
4.1 Proteus 简介
Proteus 软件是英国 Labcenter electronics公司出版的 EDA 工具软件 (该软件 中国总代理为广州风标电子技术有限公司)。它不仅具有其它 EDA 工具软件的 仿真功能, 还能仿真单片机及外围器件。 它是目前最好的仿真单片机及外围器件 的工具。 虽然目前国内推广刚起步, 但已受到单片机爱好者、 从事单片机教学的 教师、 致力于单片机开发应用的科技工作者的青睐。 Proteus 是世界上著名的 EDA 工具 (仿真软件 ) ,从原理图布图、代码调试到单片机与外围电路协同仿真,一键 切换到 PCB 设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将 电路仿真软件、 PCB 设计软件和虚拟模型仿真软件三合一的设计平台,其处理 器模型支持 8051、 HC11、 PIC10/12/16/18/24/30/DsPIC33、 A VR 、 ARM 、 8086和 MSP430等, 2010年即将增加 Cortex 和 DSP 系列处理器,并持续增加其他系 列处理器模型。在编译方面,它也支持 IAR 、 Keil 和 MPLAB 等多种编译器。 Proteus 软件是英国 Labcenter electronics公司出版的 EDA 工具软件 (该软件中国 总代理为广州风标电子技术有限公司)。它不仅具有其它 EDA 工具软件的仿真 功能, 还能仿真单片机及外围器件。 它是目前最好的仿真单片机及外围器件的工 具。 虽然目前国内推广刚起步, 但已受到单片机爱好者、 从事单片机教学的教师、 致力于单片机开发应用的科技工作者的青睐。 Proteus 是世界上著名的 EDA 工具 (仿真软件 ) ,从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换 到 PCB 设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路 仿真软件、 PCB 设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模 型支持 8051、 HC11、 PIC10/12/16/18/24/30/DsPIC33、 A VR 、 ARM 、 8086和 MSP430等, 2010年即将增加 Cortex 和 DSP 系列处理器,并持续增加其他系列处理器模 型。在编译方面,它也支持 IAR 、 Keil 和 MPLAB 等多种编译器。其功能特点如 下:
(1)原理布图
(2) PCB 自动或人工布线
(3) SPICE 电路仿真
Keil uVision3是美国 Keil Software公司出品的 51系列兼容单片机 C 语言软 件开发系统,使用接近于传统 c 语言的语法来开发,与汇编相比, C 语言在功能 上、结构性、可读性、可维护性上有明显的优势,因而易学易用 , 而且大大的提 高了工作效率和项目开发周期 , 他还能嵌入汇编,您可以在关键的位置嵌入,使
程序达到接近于汇编的工作效率。 KEILC51标准 C 编译器为 8051微控制器的软 件开发提供了 C 语言环境 , 同时保留了汇编代码高效 , 快速的特点。 C51编译器的 功能不断增强, 使你可以更加贴近 CPU 本身,及其它的衍生产品。 C51已被完 全集成到 uVision2的集成开发环境中, 这个集成开发环境包含:编译器, 汇编器, 实时操作系统,项目管理器,调试器。
系统功能:
Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全 Windows 界面, 使您能在很短的时间内就能学会使用 keil c51来开发您的单片机 应用程序 。
另外重要的一点, 只要看一下编译后生成的汇编代码, 就能体会到 Keil C51生成的目标代码效率非常之高, 多数语句生成的汇编代码很紧凑, 容易理解。 在 开发大型软件时更能体现高级语言的优势。
4.2 电路仿真图
图 11 仿真电路图
4.3 仿真结果
在 Proteus 中将硬件电路全部接好以后,将 Keil 中生成的 .hex 文件导入到单 片机中,点击开始仿真按钮,电路开始仿真。
(1)上电以后,可以观察到数码管显示 “000” ,如图 12所示:
图
(2)分别依次按下按键 “12” 、 “10” 和 “*” ,可以看到数码管显示 “120” ;如图 12
所示:
图 13 乘法实现结果 (3)按下 .... 键实现加法
图
(4)减法
图
(5)开方
图
(6)除
图
(7)三角函数
图
(8)十进制、十六进制转换
图
结束语
这次设计进一步端了我的学习态度, 学会了实事求是, 严谨的作风, 对自己 要严格要求,不能够一知半解,要力求明明白白。急于求成是不好的,我有所感 受。如果省略了那些必要的步骤,急于求成,不仅会浪费时间,还会适得其反。 我觉得动手之前,头脑里必须清楚该怎么做,这一点是很重要的。就目前来说, 我的动手能力虽然差一点,但我想,通过我的不懈努力,在这方面,我总会得到 提高。这一点,我坚信。
在此次的课程设计中我最大的体会就是进一步认识到了理论联系实践的重 要性。一份耕耘,一份收获。通过这段时间的设计,让我明白科学的思维方法和 学习方法是多么重要, 只有这样才能够有很高的效率, 才能够让自己的工作更完 美。 总而言之, 此次课程设计让我学到了好多平时在课堂上学不到的东西, 增加 了我的知识运用能力, 增强我的实际操作能力。 谢谢老师给我们提供这么好的机 会,为我们之后走向社会奠定了一个好的基础。
本次课程设计让我学到了很多, 也学会到了要怎么样去面对困难, 不要对知 识一知半截, 要有的求实的能力, 通过老师的帮助我学到了很多在平时的没有注 意到的动东西及知识, 更美没有深入的的去理解, 通过这次我要更加的明确自己。 更要注重自己在各方面的锻炼能力,把握机会。
致 谢
经过这段时间的努力, 基本上是完成了本次的课程设计。 刚开始, 我头绪不 是很清楚, 不知道从哪里入手, 但通过凌云老师的耐心指导, 和平时老师严格要 求, 使我积累了且学到很多有用的东西。 当然还有同学平时提供的帮助和本次实 验时提供的建议,我由衷的感谢你们。
总而言之,此次课程设计的完成,我的道了好多帮助,再次感谢你们。
参考文献
[1] 李朝青 . 单片机原理及接口技术 [M]. 北京:北京航空航天大学出版社, 1998. 15~17
Li chaoqing.SCM principles and interface technology [M]. Beijing: Beijing Univ- ersity of Aeronautics and Astronautics Press,1998. 15~17
[2] 李勋 . 单片机实用教程 [M]. 北京:北京航空航天大学出版社, 2000.20~27 Li xun. SCM Pratical Guide[M]. BeijiNg:Beijing University of Aeronautics and Astronautics Press,2000.20~27
[3] 王幸之 . 单片机应用系统抗干扰技术 [M]. 北京:北京航空航天大学出版社, 1999.34~38
Wang xingzhi.SCM application system jamming technology[M]. Beijing: Beijing University of Aeronautics and Astronautics Press,1999.34~38
[4] 李全利 . 单片机原理及接口技术 [M]. 第二版 . 北京:高等教育出版社, 2009. 20~29
Li quanli. SCM principles and interface technology [M]. Second Edition. Beijing: Higher Education Press,2009.20~29
[5] 张毅刚 . 单片机原理及应用 [M].第二版 . 北京:高等教育出版社, 2010.145~150 Zhang yigang.SCM Priciples and Applications[M].Second Edition.Beijing: Higher Education Press,2010.145~150
[6] 邹大挺 . 频率计的设计 [J]. 电子产品世界学报, 2006, 193(3):4~7. Zou dating. The design of frequency meter[J].Electronic Engineering & Product World Journal,2006, 193(3):4~7
[7] 雷玉堂 . 光电检测技术 [M]. 杭州:中国计量出版社, 1995.45~49
Lei yutang. Photoelectric detection technology[M]. Hang zhou: China Metrology Publishing House, 1995.45~49
[8] 季建华 . 智能仪表原理 [M]. 山东:山东教育出版社, 2004.201~205
Ji jinhua. Smart Meter principle[M]. Shandong: Shandong Education Press,2004. 201~205
[9] 王永生 . 电子测量学 [M]. 西安:西北工业大学出版社 . 2003.179~182
Wang yongsheng. Electronic surveying[M]. Xi?an: Northwestern University Press, 2003.179~182
[10] 赫建国 . 单片机在电子电路设计中的应用 [M].北京:清华大学出版社, 2005. 30~35
Hao jianguo. SCM application in electronic circuit design[M]. Beijing:Tsinghua University Press,2005.30~35
[11] 刘竹琴 , 白泽生 . 一种基于单片机的数字频率计设计 [ J] . 现代电子技术 , 2010, 20(1):90~96
Liu zhuqin, Bai zesheng. A meter design based on SCM digital frequency [J] modern electronic technology,2010,20(1):90~96
[12] 朱雪枝 , 王学伟 . 自动分频法宽量程频率测量技术及实现 [ J] .北京化工大 大学学报, 2004, 31(1):91~93
Zhu xuezhi,Wang xuewei.Wide range automatic crossover frequency measure- ment technology law and implementation[J].Beijing Chemical large University, 2004, 31(1): 91~93
[13] 梁文海 , 麦文 , 张健 . 一种高精度频率测量的研究与实现 [ J] . 四川师范大 学学报 (自然科学版), 2008,31(3):376~378.
Liang hai, Mai , Zhangjian. Research and realization of high-precision Frequency measurement[J]. Sichuan Normal Large Science University(Natural Science), 2008,31(3):376~378
[14] A. G. Rinzler, J. H. Hafner, P. Nikolaev, P. Nordlander, D.T. Colbert, R. E.Smally L . Lou, S. G. Kim, and D.Tomá nek. Unraveling nanotubes: field emission from anatomic wire[ J] .Science, 1995, 269: 1550-1553.
[15] J. Kong, N. R. Franklin, C. W. Zhou, M . G . Chapline, S.Peng, K. J. Cho , H. J. Dai. Nanotube Molecular Wires as Chemical Sensors[ J] . Science, 2000, 287: 622~625
附 录
附 录 A :程序
/*项目名称 :计算器 */
/*设 计 者 :段灵福
/*时 间 :2015年 1月 */
/*项目功能 : 设计一个具有特定功能的计算器。该计算器上电或按键复位后能自 动显示系统提示符 “ 0” ,进入准备工作状态。能实现:
基本的加、减、乘、除、平方、。 */
YJ EQU 50H ; 结果存放
YJ1 EQU 51H ; 中间结果存放
GONG EQU 52H ; 功能键存放
ORG 0100H
START: MOV R3,#0 ; 初始化显示为空
MOV GONG,#0
MOV 32H,#00H
MOV 33H,#00H
MOV 34H,#00H
MLOOP: CALL DISP ; 调显示子程序
WAIT: CALL TESTKEY ; 判断有无按键
JZ WAIT
CALL GETKEY ; 读键
INC R3 ; 按键个数
CJNE A,#0,NEXT1 ; 判断是否数字键
LJMP E1 ; 转数字键处理
NEXT1: CJNE A,#1,NEXT2
LJMP E1
NEXT2: CJNE A,#2,NEXT3
LJMP E1
NEXT3: CJNE A,#3,NEXT4
LJMP E1
NEXT4: CJNE A,#4,NEXT5
LJMP E1
NEXT5: CJNE A,#5,NEXT6
LJMP E1
NEXT6: CJNE A,#6,NEXT7
LJMP E1
NEXT7: CJNE A,#7,NEXT8
LJMP E1
NEXT8: CJNE A,#8,NEXT9
LJMP E1
NEXT9: CJNE A,#9,NEXT10
LJMP E1
NEXT10: CJNE A,#10,NEXT11 ; 判断是否功能键 LJMP E2 ; 转功能键处理 NEXT11: CJNE A,#11,NEXT12
LJMP E2
NEXT12: CJNE A,#12, NEXT13
LJMP E2
NEXT13: CJNE A,#13,NEXT14
LJMP E2
NEXT14: CJNE A,#14,NEXT15
LJMP E2
NEXT15: LJMP E3 ; 判断是否清除键 E1: CJNE R3,#1,N1 ; 判断第几次按键 LJMP E11 ; 为第一个数字 N1: CJNE R3,#2,N2
LJMP E12 ; 为第二个数字 N2: CJNE R3,#3,N3
LJMP E13 ; 为第三个数字 N3: LJMP E3 ; 第四个数字转溢出 E11: MOV R4,A ; 输入值暂存 R4 MOV 34H,A ; 输入值送显示缓存 MOV 33H,#00H
MOV 32H,#00H
LJMP M LOOP ; 等待再次输入 E12: MOV R7,A ; 个位数暂存 R7 MOV B,#10
MOV A,R4
MUL AB ; 十位数
ADD A,R7
MOV R4,A ; 输入值存 R4 MOV 32H,#00H ; 输入值送显示缓存 MOV 33H,34H
MOV 34H,R7
LJMP MLOOP
E13: MOV R7,A
MOV B,#10
MOV A,R4
MUL AB
JB OV,E3 ; 输入溢出
ADD A,R7
JB CY,E3 ; 输入溢出
MOV R4,A
MOV 32H,33H ; 输入值送显示缓存 MOV 33H,34H
MOV 34H,R7
LJMP MLOOP
E3: MOV R3,#0 ; 按键次数清零 MOV R4,#0 ; 输入值清零 MOV YJ,#0 ; 计算结果清零 MOV GONG,#0 ; 功能键设为零 MOV 32H,#00H ; 显示清空
MOV 33H,#00H
MOV 34H,#00H
LJMP MLOOP
E2: MOV 34H,#00H
MOV 33H,#00H
MOV 32H,#00H
MOV R0,GONG ; 与上次功能键交换 MOV GONG,A
MOV A,R0
CJNE A,#10,N21 ; 判断功能键
LJMP JIA ;
N21: CJNE A,#11,N22
LJMP JIAN ;
N22: CJNE A,#12,N23
LJMP C HENG ;
N23: CJNE A,#13,N24
LJMP CHU ;
N24: CJNE A,#0,N25
LJMP FIRST ; 首次按功能键 N25: LJMP DEN ;
N4: LJMP E3
FIRST: MOV YJ,R4 ; 输入值送结果 MOV R3,#0 ; 按键次数清零 LJMP DISP1 ; 结果处理
JIA: MOV A,YJ ; 上次结果送累加器 ADD A,R4 ; 上次结果加输入值 JB CY,N4 ; 溢出
MOV YJ,A ; 存本次结果
MOV R3,#0 ; 按键次数清零 LJMP DISP1
JIAN: MOV A,YJ
SUBB A,R4 ; 上次结果减输入值 JB CY,N4 ; 负数溢出
MOV YJ,A
MOV R3,#0
LJMP DISP1
CHENG: MOV A,YJ
MOV B,A
MOV A,R4
MUL AB ; 上次结果乘输入值 JB OV,N4 ; 溢出
MOV YJ,A
LJMP DISP1
CHU: MOV A,R4
MOV B,A
MOV A,YJ
DIV AB ; 上次结果除输入值 MOV YJ,A
MOV R3,#0
LJMP DISP1
DEN: MOV R3,#0
LJMP DISP1
DISP1: MOV B,#10
MOV A,YJ ; 结果送累加器 DIV AB ; 结果除 10
MOV YJ1,A ; 暂存
MOV A,B ; 取个位数
MOV 34H,A ; 个位数送显示缓存 MOV A,YJ1
JZ DISP11 ; 结果是否为一位数 MOV B,#10
MOV A,YJ1
DIV AB
MOV YJ1,A
MOV A,B
MOV 33H,A ; 十位送显示缓存 MOV A,YJ1
JZ DISP11 ; 结果是否为二位数 MOV 32H,A ; 百位数送显示缓存 DISP11: LJMP MLOOP
DISP: CLR P2.3
MOV R0,#34H
DIR1: MOV DPTR,#SEGTAB
MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A
CJNE R0,#34H,DIR2
SETB P2.0
CALL D1MS
CLR P2.0
DEC R0
SJMP DIR1
DIR2: CJNE R0,#33H,DIR3
SETB P2.1
CALL D1MS
CLR P2.1
DEC R0
SJMP DIR1
DIR3: SETB P2.2
CALL D1MS
CLR P2.2
RET
D1MS: MOV R7,#02H
DMS: MOV R6,#0F0H
DJNZ R6,$
DJNZ R7,DMS
RET
SEGTAB:
DB 0C0H, 0F9H, 0A4H, 0B0H
DB 99H, 92H, 82H, 0F8H
DB 80H, 90H, 88H, 83H
DB 0C6H, 0A1H, 86H, 8EH
TESTKEY:ACALL DISP
MOV P1,#0FH ; 读入键状态 MOV A,P1
CPL A
ANL A,#0FH ; 高四位不用 RET
KEYTABLE:
DB 0EEH,0EDH,0DDH,0BDH ; 键码定义 DB 0EBH,0DBH,0BBH,0E7H
DB 0D7H,0B7H,0DEH,0BEH
DB 07EH,07DH,07BH,077H
GETKEY: MOV R6,#10 ; 读键子程序 ACALL DELAY
MOV P1,#0FH
MOV A,P1
CJNE A,0FH,K12
LJMP MLOOP
K12: MOV B,A
MOV P1,#0EFH
MOV A,P1
CJNE A,#0EFH,K13
MOV P1,#0DFH
MOV A,P1
CJNE A,#0DFH,K13
MOV P1,#0BFH
MOV A,P1
CJNE A,#0BFH,K13
MOV P1,#07FH
MOV A,P1
CJNE A,#07FH,K13
LJMP MLOOP
K13: ANL A,#0F0H
ORL A,B
MOV B,A
MOV R1,#16
MOV R2,#0
MOV DPTR,#KEYTABLE
K14: MOV A,R2
MOVC A,@A+DPTR
CJNE A,B,K16
MOV P1,#0FH
K15: MOV A,P1
CJNE A,#0FH,K15
MOV R6,#10
ACALL DELAY
MOV A,R2
RET
K16: INC R2
DJNZ R1,K14
AJMP MLOOP
DELAY: MOV R7,#10 ;10ms 延时子程序 TS1: MOV R6,#0FFH
TS2: NOP
NOP
DJNZ R6,TS2
DJNZ R7,TS1
RET
END
附 录 B:原理图
附 录 C:PCB版图
附 录 D :元器件清单
元器件名称 规 格 数 目 AT89S52单片机 40P 1 AT89S52单片机芯片锁紧座 40P 1 四位一体共阳数码管 2 四位一体共阳数码管插座 40P 1 74HC573 20P 1 74HC573芯片插座 20P 1 晶振 12MHz 1 发光二极管 9 单排插针 40P 3 三极管 9012 1 蜂鸣器 1 小按键 10 下载口座子 1 六脚按键电源开关 1 USB 电源线 1 USB 电源线插座 1 电阻 200 1 电阻 470 8 电阻 1K 4 电解电容 22uf 2 瓷片电容 33pf 2 排阻 10k 4 排阻 470 1 短路冒 3 杜邦线 8P 1 PCB 板子 1 固定螺钉螺帽 3mm 4 USB 下载线 无需安装驱动程序 1
附 录 E :实物图
作文二:《简易计算器》11600字
齐鲁理工学院
课程设计说明书
题 目 简易计算器设计
课 程 名 称 单片机原理及应用 二 级 学 院 机电工程学院 专 业 电气工程及其自动化 班 级 2014级 学 生 姓 名 王军可 学 号 201410530042 指 导 教 师 王艳玲
设计起止时间:2014 年12月5日至 2014年12月16日
目 录
摘要 .................................................................... 3 1 设计思路 ............................................................. 4 2 原件功能 ............................................................. 4
2.1 运算模块AT89C51 ................................................ 4 2.2 AT89S51的引脚功能 .............................................. 5 2.3 AT89C51的基本操作 .............................................. 6 3 键盘输入 ............................................................. 7 4 液晶模块简介 ......................................................... 8
4.1 LCD1602简介及引脚功能 ........................................... 8 5 程序流程图与总原理图 ................................................. 9
5.1 流程图 ......................................................... 9 5.2 仿真原理图 .................................................... 10 6 结论 ................................................................ 11 参考文献: ............................................................. 11 致谢 ................................................................... 12 附录A 程序编写 ........................................................ 13 附录B 仿真图与原件清单 ................................................ 20
简易计算器设计
摘要:近年来,单片机以其体积小、价格廉、面向控制等独特优点,在各种工业控制、仪器仪表、设备、产品的自动化、智能化方面获得了广泛的应用。与此同时,单片机应用系统的可靠性成为人们越来越关注的重要课题。影响可靠性的因素是多方面的,如构成系统的元器件本身的可靠性、系统本身各部分之间的相互耦合因素等。其中系统的抗干扰性能是系统可靠性的重要指标。
本设计采用AT89C51芯片,实现了利用单片机进行了一个简单计算器设计。允许对输入数据进行加减乘除运算及LCD 显示。实例所设计的计算器是用LCD1602显示的,当然也可以用其他的器件显示,如LED 显示屏,这样就可以显示出更多的字符。科技的进步告别了以前复杂的模拟电路,一块几厘米平方的单片机可以省去很多繁琐的电路。现在应用较广泛的是科学计算器,但在市场还是需要简易计算器,因为其价格低廉,设计简单,使用方便被广泛的运用于我们的日常生活之中。 关键词:AT89C51 LCD1602 单片机 LED
1 设计思路
本次课程设计的最终目的是要实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。比如,十进制数的加减乘除四则运算。我们曾经学习过两个具体数字进行加减法运算,但是对于简单计算器用汇编语言实现难点在于寄存器所存的数据较少,很难实现多位数的四则运算,C 语言确有着解决汇编语言的优点,所以选用C 语言完成该程序的制作,首先运用单片机AT89C51扫描4*4矩阵键盘,从而实现按键的输入功能,键盘的输入是按照每行的电平扫描,并判断按下数字键之后是否有符号键,如果没有则在原数之后添加数字,如果按下符号接收符号后数据,并判断是否有等号键按下,如果按下,则调用运算函数和输出结果。
2 原件功能
2.1 运算模块AT89C51
AT89C51单片机是在一块芯片中集成了CPU 、RAM 、ROM 、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。如果按功能划分,它由如下功能部件组成,即微处理器(CPU )、数据存储器(RAM )、程序存储器(ROM/EPROM)、并行I/O 口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR )。单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以进行很快地实现运算功能,如图所示:
2.2 AT89S51的引脚功能 VCC :供电电压 GND :接地
P0口:P0口为一个8位漏级开路双向I/O口,每个管脚可
吸收8TTL 门电流。当P1口的管脚写“1”时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FLASH 编程时,P0口作为原码输入口,当FLASH 进行校验时,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,P3.1串行输出口, P3.2、P3.3 外部中断,P3.4记时器0外部输入,P3.5记时器1外部输入,P3.6外部数据存储器写选通,P3.7外部数据存储器读选通,P3口同时为闪烁编程和编程校验接收一些控制信号。
RST :复位输入。当振荡器复位器件时,要保持RST 脚两个机器周期的高电平时间。 PSEN 29 :该引是外部程序存储器的选通信号输出端。当AT89C51由外部程序存储器取指令或常数时,每个机器周期输出2个脉冲即两次有效。但访问外部数据存储器时,将不会有脉冲输出。
EA/Vpp 31 :外部访问允许端。当该引脚访问外部程序存储器时,应输入低电平。要使AT89S51只访问外部程序存储器(地址为0000H-FFFFH ), 这时该引脚必须保持低电平。对Flash 存储器编程时,用于施加Vpp 编程电压。 2.3 AT89C51的基本操作
AT89C51复位引脚RST/VP通过片内一个施密特触发器(抑制噪声作用) 与片内复位电路相连,施密特触发器的输出在每一个机器周期由复位电路采样一次。当振荡电路工作,并且在RST 引脚上加一个至少保持2个机器周期的高电平时,就能使AT89C51完成一次复位。
复位不影响RAM 的内容。复位后,PC 指向0000H 单元,使单片机从起始地址0000H 单元开始重新执行程序。所以,当单片机运行出错或进入死循环时,可按复位键重新启动。
3 键盘输入
当无按键闭合时,P10~P13 与P14~P17 之间开路;当有键闭合时,与闭合键相连的两条I/O 口线之间短路。判断有无按键按下的方法是:第一步,置列线P14~P17 为输入状态,从行线P10~P13 输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。第二步,行线轮流输出低电平,从列线P14~P17 读入数据,若有某一列为低电平,则对应行线上有键按下。综合一二两步的结果,可确定按键编号。但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式。为此,我们引入了矩阵键盘的应用,采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘。在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4×4个。这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率,如图所示:
每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU 通信。键盘的一端(列线)通过电阻接VCC ,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。两个并
行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
4 液晶模块简介
4.1 LCD1602简介及引脚功能
字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD ,目前常用16*1,16*2,20*2和40*2行等的模块。
主要技术参数:显示容量:16×2个字符芯片,工作电压:4.5—5.5V ,工作电流:2.0mA(5.0V),模块最佳工作电压:5.0V,字符尺寸:2.95×4.35(W×H)mm 第1脚:VSS 为地电源。 第2脚:VDD 接5V 正电源。
第3脚:VL 为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个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脚:背光源负极。
5.2 仿真原理图
6 结论
经过近两个周的努力,我终于顺利完成了简易计算器的制作。刚开始,我们头绪不是很清楚,不知道从哪里入手,但通过老师前两天的4*4键盘和液晶显示屏使用的讲解,渐渐的有了一些头绪,上网查资料、确定基本设计方案、对AT89C51芯片功能进行查找、调试、仿真等,经历了一次次的困难,却积累了很多宝贵的经验。在整个设计的过程中遇到的问题主要有以下三点,第一:基础知识掌握的不牢固,主要表现在一些常用的电路的形式和功能不清楚,对书本上的内容理解不够透彻。第二:对一些常用的应用软件缺少应用,体现在画电路图和系统的仿真的时候,对这些软件的操作不熟练,浪费了很多时间。第三:相关知识掌握的不够全面,缺少系统设计的经验, 不论的程序图片还是程序都出错了很多次,走了许多弯路。
这次的实训让我学到了很多,也学会到了要怎么样去面对困难,不要对知识一知半截,要有的求实的能力,在现在信息爆炸的时代,只要你愿意去探索,去寻找有什么是理解不了的呢,用心才是最主要的,通过这次我要更加的明确自己。更要注重自己在各方面的锻炼能力,把握机会。这次的课程设计非常感谢对我严厉的辅导老师,是她让我成长,也感谢帮助我走出困惑的同学,在日后的学习中,我会勤思考,打好扎实的理论知识。
参考文献:
[1] 郑燕. 陈小艳. 朱成彪.C 语言程序设计[J]. 东北大学出版社,2014,7(1) [2] 张毅刚. 单片机原理及应用[J] . 高等教育出版社,2015,9(5)
致谢:
这次课程设计中我最大的体会就是进一步认识到了理论联系实践的重要性,一份耕耘,一份收获。通过短短两周时间的设计,让我明白科学的思维方法和学习方法是多么重要,只有这样才能够有很高的效率,才能够让自己的工作更完美,设计图中经历了许多困难,感谢老师与小组同学的帮助,使得这次设计得以进行并完成,再次十分感谢老师与小组同学。
附录A 程序编写
#include #include #include #include #include #include "LCD1602.h"
void shortdelay(uchar i)//短延时 {
for(;i>0;i--); }
//长延时
void longdelay(uint i) {
uint j;
for(;i>0;i--)
{for(j=100;j>0;j--);} }
//延时程序 void delay(int i) {int j;
for(;i>0;i--)
for(j=0;jmessage,pMsg->wParam,pMsg->lParam);
return CDialog::PreTranslateMessage(pMsg);
}
5 程序运行结果
6 课程设计总结
通过这次课程设计 , 我又收获到很多 , 平时的在做作业时 , 因为题
4
1
形与结构都是很简单的 , 并且每一章的内容都是有相应的例题可以参 考 , 所以在做题时没有遇到过很麻烦的问题 , 而这次不同了 , 一个课题 拿到手时 , 给我的感觉是无从下手 , 而且要求很多 , 使得题目要求更大 了。
我将整个程序分块完成的 . 将整个大的程序的实现分 8个功能 , 每 个功能都通过一个相应的函数来实现 . 在调试时分别进行调试 , 使得 调试更方便些 . 在编写各个函数只是按着题目要求的去完成 , 后来经 指导老师指导后 , 发现了很多自己欠缺的地方 , 又一次将程序整体进 行调试 . 最后把程序完善了许多。
本次 MFC 计算器的制作, 学习到了 MFC 基本的编程方法。 对 OOP 编程 的理解进一步加深。 但是程序仍然存在一定的问题, 比如除数不能为 0的 Exception handle ,符号键多次点击结果混乱。通过这次课程设 计,以后 Windows 应用程序势必会轻车熟路。
参考书目:
[1]谭浩强, 《 C++程序设计》 ,北京,清华大学出版社, 2006年。 [2]孙鑫《深入浅出 MFC 》 ,视频教程 。
[3]《 Visual_C++MFC入门教程》 ,电子版。
作文八:《简单计算器》6600字
学院
课程设计
设计课程: 信息系统分析与设计
题 目 简单计算器
姓 名 姓 名
学 院
专 业
指导教师
二O一五 年 6月 20 日
目录
一、概述?????????????????????4
1.1 设计名称?????????????????4
1.2
编写目的?????????????????4
1.3 参考资料?????????????????4 二、需求概述???????????????????4
2.1 功能需求?????????????????5
2.2
响应需求?????????????????5
2.3 精度需求?????????????????5 2.4 故障处理?????????????????5 三、环境?????????????????????5 3.1 运行环境?????????????????5
3.2
开发环境?????????????????5
四、可行性分析??????????????????5 五、总体设计???????????????????6 5.1 第一层??????????????????6 5.2 第二层??????????????????6 5.3 第三层??????????????????6 六、详细设计???????????????????6 6.1 逻辑设计?????????????????7 6.2 总体流程图????????????????7 七、用户界面设计?????????????????9
7.1 界面设计?????????????????9 7.2 操作方式????????????????10 八、调试与测试??????????????????10 九、源程序清单??????????????????14 十、小结?????????????????????17
一、概述
1.1 设计名称
简单计算器 1.2 编写目的
设计一个计算器,具有以下功能: 1.2.1 用图形界面设计一个计算器;
1.2.2 系统界面上面一行是数字输入对话框和运算符号的下拉列表; 数字输入框用来编辑并显示所输入的数字,运算符号下拉列表 里面有运算符号+ — * / =,用来实现运算的进行和结束; 1.2.3 系统界面下面是一个文本框,用来显示输入的操作数和参与运 算的运算符号,直到运算符号为等号,输出等号和运算结果。 1.2.4 对操作数与运算符号的逻辑输入和循环输入进行处理,实现四 则运算的连续运算,并且能对各个操作数和运算符号进行有效 的输出;
1.2.5 当运算符号选择为“=”时,算法结束,输出最后一个操作数、 “=”和最终的运算结果。 1.3 参考资料 1.3.1 项目来源
市场上出现的各种计算器虽然具有强大的功能,但是使用操作上也增加了技术性,并且价格较贵,所以有必要用自己学习的知识来开发一个实用的计算器,使之能在界面和功能上尽量模拟windows 操作系统。应用所学的有关知识,将书面知识和实际需求和应用结合起来,以达到学以致用的目的。
1.3.2 引用资料
1.3.2.1 简单计算器的需求分析,百度文库 1.3.2.2 教程
二、需求概述
计算器是日常生活中十分便捷有效的计算工具,能实现加、减、乘、除等功能,可以用Java 编程来解决该问题。
2.1 功能需求
该计算器降低了数字计算的难度,提高了计算的准确度和精确度。该计算器的使用非常简单和方便,对广大用户来说能发挥一定的帮助作用。 2.2 响应需求
用户提交数据录入时,得到返回的结果延时不超过3秒钟。 2.3 精度需求
在合适输入范围内,输出精度保留一位小数点,并且对有效输入数据和输出数据能进行相应的精度转换。 2.4 故障处理
2.4.1 软件故障
若与使用电脑的操作系统不兼容,则不能使用此系统,应参考推荐运行系统 2.4.2 病毒故障
若由于电脑感染病毒而导致该系统不能使用,解决方案是重新安装。
三、环境
3.1 运行环境
Microsoft Windows XP等Windows 系统,不与网络连接。 3.2 开发环境
Eclipse 软件
四、可行性分析
可行性分析是在系统调查的基础上,针对新系统的开发是否具备必要性和可能性,对新系统的开发从技术、经济、社会的方面进行分析和研究,以避免投资失误,保证新系统的开发成功。可行性研究的目的就是用最小的代价在尽可能短的时间内确定问题是否能够解决。该系统的可行性分析包括以下几个方面的内容。
技术可行性:硬件和软件的要求都不是很高,目前市场上的一般计算机都可以满足系统开发的要求,维护工作也很方便,有一定经验的操作人员可以在短时间内掌握维护工作。
经济可行性:系统开发的成本:开发成本非常低廉,界面友好,操作简单,不需要投入大系统运行维护费用:系统将开发得十分完整,维护费用低。
管理可行性:只需要使用者根据需求使用并进行基本的管理。 社会可行性:随着计算机网络和信息技术,电子商务的发展壮大,计算工作的运算的算法需求多样,有必要根据基本的需求开发一个简单的计算器,使之在Windows 系统界面进行运行。
五、总体设计
简单计算器设计思路 5.1 第一层
5.1.1 创建一个窗口的子类,并且实现ActionListener 接口; 5.1.2 对该类中声明所需要的窗口控件,并进行一定的初始化; 5.1.3 编辑该类的构造方法,设置窗口在屏幕上的基本属性,对窗口
实现的布局、下拉列表等进行具体的创建;将控件添加到窗口 中,对于不同的控件注册监视器。 5.2 第二层
5.2.1 重写ActionListener 接口的方法,对操作数和运算符号进行处 理;
5.2.2 用一个辅助变量来控制操作数和运算符号的先后循环操作,实 现先后一对一的逻辑输入;
5.2.3 对首次操作进行特殊处理处理,使之输入操作数时才有效。对 不同运算符号的处理分别进行编辑,对除号进行特殊处理,即 当除数为0时,结果错误。
5.2.4 对每一个操作数和参与运算的运算符号进行输出,当运算符号 为“=”时,算法结束,输出等号和最终运算结果。 5.3 第三层
5.3.1 写主类,并创建一个计算器。
六、详细设计
6.1 逻辑设计 6.1.1 第一层
6.1.1.1 Calculator 类为JFrame 的子类,并且实现与ActionListener 接口的事件监听器;
6.1.1.2 声明控件choiceFuhao ,声明并创建控件inputNumber 及 textShow;
6.1.1.3 重写Calculator ()构造方法,初始化一个容器,将容器的 布局设置为FlowLayout 布局; 6.1.1.4 声明创建符号数组choice[],用该数组实现下拉列表的创建; 6.1.1.5 在容器内添加控件choiceFuhao 、inputNumber 及textShow , 并且inputNumber 和choiceFuhao 都将this 注册为自己的监 视器;
6.1.1.6 对窗口的大小进行适当的设定,并设置窗口可见。 6.1.2 第二层
6.1.2.1 重写actionPerformed 方法,声明并初始化number 和esult , 添加辅助数flag ,对其进行负值初始化;
6.1.2.2 对flag 进行判断,若其为负值则读取数字操作数number ,保 证第一次输入为操作数,同时将flag 赋值为0;
6.1.2.3 操作数读取之后,开始读取运算符号,即flag 为0时,对运 算符号进行判断;
6.1.2.4 对运算符号的运算分别进行对应的运算操作,将运算结果存 储到result 中,运算后并对操作数和对应的运算符号进行输 出;把inputNumber 清空,将flag 赋值为负值,为下次操作 数的循环读入做准备;
6.1.2.5 对除号和等号进行特殊处理:当运算符号为除号的时候,判 断除数是否为0,若为0,则输出结果错误;当运算符号为等 号的时候,输出操作数、等号和最终结果,算法结束。 6.1.3 第三层
6.1.3.1 写主类,在主类中声明创建一个Calculator 对象,实现上述 操作。 6.2 总体流程图
在程序执行主界面,各执行步骤及其功能如下图: 6.2.1 Calculator类的各主体步骤
图1 Calculator类主体步骤流程图
6.2.2 actionPerformed方法的实现流程
图2 actionPerformed方法流程图
七、用户界面设计
7.1 界面设计
系统用户界面应做到美观性、可靠性、简单性,易于学习使用。
7.2 操作方式
键盘输入
八、调试与测试
8.1 输完程序后运行得主页面
图3 计算器主页面图
8.2 输入第一个操作数
图4 计算器第一个操作数输入图
8.3 选择运算符号
图5 计算器第一个运算符输入图
8.4 输入第二个操作数
图6 计算器第二个操作数输入图
8.5 选择运算符号
图7 计算器第二个运算符输入图
8.6 输入第三个操作数
图8 计算器第三个操作数输入图
8.7 选择运算符号“=”
图9 计算器等号选择图
8.8 当含有除法,并且除数为0时
图10 除数为0结果图
8.9 一个没有异常的运算式子
图11 没有异常式子运算结果图
8.10 当式子里出现除法异常时
图12 异常式子结果图
8.11 实现连续加法
图13 连续加法结果图
8.12 实现连续减法
图14 连续减法结果图
8.13 实现连续乘法
图15 连续乘法结果图
8.14 实现连续除法
图16 连续除法结果图
九、源程序清单
package newText;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Box;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Calculator extends JFrame implements ActionListener {
Font font;
JTextField inputNumber=new JTextField(10);
JComboBox choiceFuhao;
JTextArea textShow=new JTextArea(9,30);
public Calculator(){
super("Calculator");
java.awt.Container cp = getContentPane();
cp.setLayout(new FlowLayout());
Box bBox=Box.createHorizontalBox();
String choice[] ={"+","-","*","/","="};
choiceFuhao=new JComboBox(choice);
cp.add(bBox);
add(inputNumber);
add(choiceFuhao);
add(textShow);
inputNumber.addActionListener(this);
choiceFuhao.addActionListener(this);
//textShow.addComponentListener((ComponentListener) this);
setBounds(100,100,390,360);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
double number=0;
double result=0;
int flag=-1;
int ipress;
if(flag 0)
s1 = (s1.substring(0, s1.length() - 1));
tf.setText(s1);
tf.setHorizontalAlignment(JTextField.RIGHT);
} else {
if (s2.length() > 0)
s2 = (s2.substring(0, s2.length() - 1));
tf.setText(s2);
tf.setHo }
} else if ("?à".equals(co)) {
fh = !fh;
if (flag == 0) {
if (fh)
s1 = "-" + s1;
else
s1 = (s1.substring(1, s1.length()));
tf.setText(s1);
tf.setHorizontalAlignment(JTextField.RIGHT);
} else {
try {
if (fh)
s2 = "-" + s2;
else
s2 = (s2.substring(1, s2.length()));
tf.setText(s2);
tf.setHorizontalAlignment(JTextField.RIGHT);
} catch (Exception ex) {
tf.setText("ê?è??í?ó");
}
}
} else if ("CE".equals(co)) {
s1 = "";
s2 = "";
tf.setText("0");
tf.setHorizontalAlignment(JTextField.RIGHT);
} else if ("C".equals(co)) {
if (flag == 0)
s1 = "";
else
s2 = "";
tf.setText("0");
tf.setHorizontalAlignment(JTextField.RIGHT);
} else if ("?ì".equals(co)) {
try {
a = Double.parseDouble(s1);
if (a < 0)
throw new Exception("ê?è?óD?ó");
sum = Math.sqrt(a);
String temp = "" + sum;
tf.setText(temp);
tf.setHorizontalAlignment(JTextField.RIGHT);
} catch (Exception ex) {
tf.setText(ex.getLocalizedMessage());
tf.setHorizontalAlignment(JTextField.RIGHT);
}
s1 = "";
sum = 0;
} else if ("ln".equals(co)) {
try {
a = Double.parseDouble(s1);
sum = Math.log1p(1 - a);
String temp = "" + sum;
tf.setText(temp);
tf.setHorizontalAlignment(JTextField.RIGHT);
} catch (Exception ex) {
tf.setText("ê?è??í?ó");
}
s1 = "";
sum = 0;
} else if ("Int".equals(co)) {
try {
a = Double.parseDouble(s1);
sum = (int) (a);
String temp = "" + sum;
tf.setText(temp);
tf.setHorizontalAlignment(JTextField.RIGHT);
} catch (Exception ex) {
tf.setText("ê?è??í?ó");
}
s1 = "";
sum = 0;
} else if ("sinh".equals(co)) {
try {
a = Double.parseDouble(s1);
sum = Math.sinh(a);
String temp = "" + sum;
tf.setText(temp);
tf.setHorizontalAlignment(JTextField.RIGHT);
} catch (Exception ex) {
tf.setText("ê?è??í?ó");
}
s1 = "";
sum = 0;
} else if ("sin".equals(co)) {
try {
a = Double.parseDouble(s1);
sum = Math.sin(a);
String temp = "" + sum;
tf.setText(temp);
tf.setHorizontalAlignment(JTextField.RIGHT);
} catch (Exception ex) {
tf.setText("ê?è??í?ó");
}
s1 = "";
sum = 0;
} else if ("cosh".equals(co)) {
try {
a = Double.parseDouble(s1);
sum = Math.cosh(a);
String temp = "" + sum;
tf.setText(temp);
tf.setHorizontalAlignment(JTextField.RIGHT);
} catch (Exception ex) {
tf.setText("ê?è??í?ó");
}
s1 = "";
sum = 0;
} else if ("cos".equals(co)) {
try {
a = Double.parseDouble(s1);
sum = Math.cos(a);
String temp = "" + sum;
tf.setText(temp);
tf.setHorizontalAlignment(JTextField.RIGHT);
} catch (Exception ex) {
tf.setText("ê?è??í?ó");
s1 = "";
sum = 0;
} else if ("tan".equals(co)) {
try {
a = Double.parseDouble(s1);
sum = Math.tan(a);
String temp = "" + sum;
tf.setText(temp);
tf.setHorizontalAlignment(JTextField.RIGHT);
} catch (Exception ex) {
tf.setText("ê?è??í?ó");
}
s1 = "";
sum = 0;
} else if ("tanh".equals(co)) {
try {
a = Double.parseDouble(s1);
sum = Math.tanh(a);
String temp = "" + sum;
tf.setText(temp);
tf.setHorizontalAlignment(JTextField.RIGHT);
} catch (Exception ex) {
tf.setText("ê?è??í?ó");
}
s1 = "";
sum = 0;
} else if ("x2".equals(co)) {
try {
a = Double.parseDouble(s1);
sum = a * a;
String temp = "" + sum;
tf.setText(temp);
tf.setHorizontalAlignment(JTextField.RIGHT);
} catch (Exception ex) {
tf.setText("ê?è??í?ó");
}
s1 = "";
sum = 0;
} else if ("x3".equals(co)) {
try {
a = Double.parseDouble(s1);
sum = a * a * a;
String temp = "" + sum;
tf.setText(temp);
tf.setHorizontalAlignment(JTextField.RIGHT);
} catch (Exception ex) {
tf.setText("ê?è??í?ó");
}
s1 = "";
sum = 0;
}
else if ("n!".equals(co)) {
try {
a = Double.parseDouble(s1);
sum = 1;
for (int j = 1; j <= a; j++)
sum = sum * j;
String temp = "" + sum;
tf.setText(temp);
tf.setHorizontalAlignment(JTextField.RIGHT);
} catch (Exception ex) {
tf.setText("ê?è??í?ó");
}
s1 = "";
sum = 0;
} else if ("3?ìx".equals(co)) {
try {
a = Double.parseDouble(s1);
sum = Math.pow(a, 1 / 3);
String temp = "" + sum;
tf.setText(temp);
tf.setHorizontalAlignment(JTextField.RIGHT);
} catch (Exception ex) {
tf.setText("ê?è??í?ó");
}
s1 = "";
sum = 0;
} else if ("10^x".equals(co)) {
try {
a = Double.parseDouble(s1);
sum = Math.pow(10, a);
String temp = "" + sum;
tf.setText(temp);
tf.setHorizontalAlignment(JTextField.RIGHT);
} catch (Exception ex) {
tf.setText("ê?è??í?ó");
}
s1 = "";
sum = 0;
} else if ("log".equals(co)) {
try {
a = Double.parseDouble(s1);
sum = Math.log(a);
String temp = "" + sum;
tf.setText(temp);
tf.setHorizontalAlignment(JTextField.RIGHT);
} catch (Exception ex) {
tf.setText("ê?è??í?ó");
}
s1 = "";
sum = 0;
} else if ("??".equals(co)) {
try {
a = Double.parseDouble(s1);
sum = a / 100;
String temp = "" + sum;
tf.setText(temp);
tf.setHorizontalAlignment(JTextField.RIGHT);
} catch (Exception ex) {
tf.setText("ê?è??í?ó");
}
s1 = "";
sum = 0;
} else if ("1/X".equals(co)) {
try {
a = Double.parseDouble(s1);
sum = 1 / a;
String temp = "" + sum;
tf.setText(temp);
tf.setHorizontalAlignment(JTextField.RIGHT);
} catch (Exception ex) {
tf.setText(" }
s1 = "";
sum = 0;
} else if ("+-*/y?ìx^yModExp".indexOf(co) != -1) {
try {
tf.setText(s1);
tf.setHorizontalAlignment(JTextField.RIGHT);
op = co;
} catch (Exception ex) {
tf.setText("ê?è??í?ó");
}
flag = 1;
fh = false;
} else if ("=".indexOf(co) != -1) {
try {
tf.setText(s2);
tf.setHorizontalAlignment(JTextField.RIGHT);
fh = false;
if (flag == 0) {
tf.setText(s1);
tf.setHorizontalAlignment(JTextField.RIGHT);
} else {
tf.setText(s2);
tf.setHorizontalAlignment(JTextField.RIGHT);
a = Double.parseDouble(s1);
b = Double.parseDouble(s2);
if ("+".equals(op)) {
sum = a + b;
tf.setText(sum + "");
} else if ("-".equals(op)) {
sum = a - b;
tf.setText(sum + "");
} else if ("*".equals(op)) {
sum = a * b;
tf.setText(sum + "");
} else if ("x^y".equals(op)) {
sum = Math.pow(a, b);
tf.setText(sum + "");
} else if ("y?ìx".equals(op)) {
sum = Math.pow(a, 1.0 / b);
tf.setText(sum + "");
} else if ("Mod".equals(op)) {
sum = a % b;
tf.setText(sum + "");
} else if ("Exp".equals(op)) {
sum = a * Math.pow(10, b);
tf.setText(sum + "");
} else if ("/".equals(op)) {
try {
sum = a / b;
if (b == 0)
throw new Exception("?yêy???ü?aá?");
tf.setText(sum + "");
tf.setHorizontalAlignment(JTextField.RIGHT);
} catch (Exception ex) {
tf.setText(ex.getLocalizedMessage());
tf.setHorizontalAlignment(JTextField.RIGHT);
}
}
}
} catch (Exception ex) {
tf.setText("ê?è??í?ó");
}
flag = 0;
s1 = "";
s2 = "";
sum = 0;
} else if (e.getActionCommand() == "????????") {
if (!kg)
this.reW();
ps.setVisible(false);
p.setVisible(true);
tf.setVisible(true);
p2p.setVisible(true);
kg = true;
} else if (e.getActionCommand() == "?ê×?????") {
p2p.removeAll();
ps.setVisible(false);
p2p.setVisible(false);
p.setVisible(true);
tf.setVisible(true);
frame.setSize(310, 300);
kg = false;
} else if (e.getActionCommand() == "??óú??????") {
p.setVisible(false);
tf.setVisible(false);
p2p.setVisible(false);
ps.setVisible(true);
if (!about) {
ps.setLayout(new GridLayout(0, 1));
ps.add(text);
text.setText(" ");
text = new JTextArea();
ps.add(text);
text.setText(" ??ó,ê?ó??òμ?????????");
text = new JTextArea();
ps.add(text);
text.setText("
????????óDí??????ì10-01?à???×?àí???íê?é");
text = new JTextArea();
ps.add(text);
text.setText(" ????o? ?o V 1.0.00");
text = new JTextArea();
ps.add(text);
text.setText(" ??è??ùóD ?,??????");
frame.getContentPane().add(ps);
about = true;
}
frame kg = false;
}
else {
text = new JTextArea();
bugf.add(text, "Center");
text.setText(" oü?????????????ü?y?úíêé??D" + "\n" + "
?Yê??T??ê?ó??????ü??");
bugf.setLocation(550, 200);
bugf.setSize(300, 100);
if (co == "è???")
bugf.setVisible(false);
else
bugf.setVisible(true);
}
}
public void windowClosing(WindowEvent e) {
System.exit(0);
}
public void itemStateChanged(ItemEvent arg0) {
}
}