内容正文:
本任务的内容是实现一个简易计算器。具体要求为:
1.使用16只键的矩阵键盘作为系统输入,8只数码管为系统显示器。
2.实现整数的加减乘除按输入顺序计算。
3.当运算结果超过显示范围时,出现错误提示。
任务提出
任务三 简易计算器
根据任务目标,使用8只数码管动态显示电路作为系统输出。数码管的动态显示需要段码的锁存驱动电路和位码的锁存驱动电路。
使用16只键的矩阵键盘作为系统输入,将矩阵键盘连接到单片机的输入端口。整个系统的框图如图所示。
任务分析
简易计算器系统电路框图
在C51中,除了采用if语句实现多个分支的结构外,还可以使用开关语句switch实现。
switch语句格式说明如下:
1.首先计算表达式的值,逐个与case后的常量表达式的值进行比较,如果相等则执行之后的语句,如果不等则继续比较下一个case后的值。
2.执行后需用break语句跳出switch语句,如果没有break语句,则顺序执行下一个case之后的语句,直到执行break语句或结束整个switch语句。
相关知识
3.如果与所有case后的常量表达式的值都不相等,则执行default之后的语句。
4.case后的常量表达式的值均为整型数据,且相互不能相等。
5.case后可有多个语句,可不用{}。
6.default如果是空,则表示不作任何处理,可以省略default语句。
一、硬件设计
根据任务分析,本任务的硬件由单片机最小系统、数码管动态显示电路和矩阵键盘三大部分组成。
本任务中要实现16只按键的输入,因此选择使用4行4列的键盘连接到单片机的P3口。
任务实施
动态显示采用共阴极数码管,段码直接采用P0驱动,用1 kΩ的电阻提供上拉。位驱动信号采用NPN三极管(如9014、8050等型号)反相驱动,每只三极管的基极与单片机P2口的各个引脚之间采用10 kΩ的电阻限流,确保输出高电平使三极管饱和,输出低电平时使三极管截止。
简易计算器的硬件电路如图所示。
简易计算器的电路原理图
二、软件设计
1.程序框架
简易计算器,从显示的数据上看,在没有按下按键时,显示器上显示的数据不会发生变化;当按下数字键或运算符按键时,显示器上显示的数据可能发生改变。因此,对如上图所示电路来说,要求单片机在保证动态显示的基础上,检测键盘并对按键消抖,在确认按键按下时执行相应的按键功能。与任务二相比,程序框架非常类似,主要在具体的键盘处理程序上有较大的不同。所以,计算器程序编写的关键在于具体的键盘执行程序及其调用的相关函数。
从计算器显示的数据和按键时的数据变化来看,可以得到如下两个基本规律:
(1)在按下运算键时,如果之前的按键是数字键,则将上次运算结果和当前显示的数据按上次运算键进行运算,并将运算结果送显示;否则不进行任何运行。不管是否进行运算,都要将当前运算按键存储,供下次运算使用。
(2)在按下数字键时,如果之前的按键是数字键,则将所有显示数字左移一位并把当前数字放在末位;如果之前的按键是运算按键,则表示输入一个新的计算数据,将显示数据清0并把当前数字放在显示的末位。
2.显示
为了能够显示负数,在显示函数中定义的7段码数组中,不仅定义0~9的7段码,还需要定义负号的7段码。
3.数据转换
为了将存储的结果与显示数据进行计算,需要将显示数组中的元素转换为其对应的数值,比较简单的方式是按权相加。
4.数据范围检查
在输入时,程序中未处理负数的输入,所以仅需要判断显示数组中第一个元素的值是否为0即可。
三、Proteus仿真
参照前面任务介绍的方法和步骤进行Proteus仿真。图所示是单片机简易计算器电路仿真效果图。
单片机简易计算器仿真效果图
$