介绍近期的一项微机原理课程设计——电子计算器。
[TOC]
1 功能简介
本系统为电子计算器,非计算时可以显示时间且时间可以调整,还可以滚动显示随机的乘法表算式。系统功能概括为4种模式,模式间可以相互切换。
1 1 计算器模式
支持加、减、乘、除、开方运算;
支持带括号的混合运算;
支持小数、复数运算;
实时显示运算结果或者异常信息;
输出精度到0.001,大小不超过31位(二进制);
支持计算溢出、表达式错误、除以零等异常提醒;
支持运算结果的存储与查看;
支持负数不加括号、括号前不加乘号等输入习惯。
1 2 其他附加模式
显示时间模式
显示日期与时间,支持月份末自动调整、闰年校正。
调整时间模式
支持设置年、月、日、时、分、秒的每一位;
保存上次时间设置。
滚动显示随机乘法表算式模式
滚动显示随机的乘法表算式。
2 电路设计
基于proteus单片机单片机仿真软件,电路原理图如下,
下表简单介绍一下元器件,
| 模块 | 元器件 | 备注 |
|---|---|---|
| MCU | AT89C51 | 含有片内振荡器,没有特殊要求时可以不接外部晶振 |
| 8位排阻 | 用于51单片机P0端口的上拉 | |
| LCD模块 | LM016L | 基于液晶内置的HD44780芯片控制 |
| 按键模块 | 4×4矩阵按键 | |
| 独立按键 | ||
| 时钟模块 | DS1302 | 一般需要32.768KHz标准时钟晶振 |
| 晶振 | 32.768KHz | |
| 存储模块 | 6264 | 8KB的RAM |
| 74LS373 | 用于地址线低八位的锁存 | |
| LED模块 | LED灯 | 红色 |
| 电阻 | 330Ω,用于限流 |
注:实际电路中,考虑电源波动的影响一般需要在元器件电源处并联电容。
3 主要程序详解
3 1 程序框架
系统初始化包括液晶lm016(等同于lcd1602)、时钟芯片ds1302、单片机定时器等的初始化.
system control相关程序负责管理系统的模式状态、进行输入输出的处理.
lm016、ds1302、key、calculator代表不同模块,分别是显示、读取时钟、输入、计算的实现或者说驱动.
3 2 system control
3 2 1 系统模式管理
|
定义枚举类型enum来表示不同的系统状态,而模式切换通过条件判断语句if即可实现(省略部分代码在后面介绍),
|
3 2 2 输入输出处理
通过条件判断语句switch实现不同状态下的输入输出的管理.
上一块代码的switch语句中的key_lcd_calc_connect key_lcd_ds_connect ds_lcd_connect multab_lcd_connect就是对输入输出的中间处理,它们把多个模块间进行连接(有的”connect”中融入了模式切换).
以key_lcd_calc_connect 为例,它的输入输出处理框图如下,
从key输入的”数据”分两条路径到达输出侧lm016l,一条是输入经过system control调用calculator的数据格式整理后到输出,一条是输入与过去输入累积经过system control调用calculator的求解算法后到输出;
从key输入的”命令”经过system control调用calculator执行命令.
相关代码如下:
|
3 3 calculator
下面介绍calculator模块的实现.
(未完待续)
3 n 细节处理
4 想法与总结
状态切换
system control中状态切换


