电子科技大学 2016 年“盟升杯”大学生电子设计竞赛作品 – 简易计算器

今天,2016 年 11 月 11 日,一年一度的“剁手节”。奋战了一天,我差不多也把购物车里积攒已久的宝贝给清空了,然后心里就有种负罪感,想找点事做。刚好这周周末也不算太忙,我就打开了尘封已久的博客,打算随便写点东西。讲道理,从上篇文章发布以后,我就一直没做出什么特别有意思的东西。再加上刚来到大学,有各种各样新鲜的事物要去接触,自己又比较懒,于是就停更了接近 4 个月……那么今天,我就来给我到了电子科技大学以后做的几个新生电子设计竞赛做个简单的总结和记录吧!

浏览了下评论区,好像有很多访客关注博主大学考到了哪里……博主在经历了高考的折磨之后,考到了位于中国四川成都电子科技大学微电子与固体电子学院(示范性微电子学院)集成电路设计与集成系统专业。看这校名就知道,我们这的男女比例都不知道高到哪里去了。然后我们这搞电子设计的氛围非常浓厚,对于新生就有各个学院科协的新生赛,还有规模大些的“盟升杯”,“能源成飞NE杯”这些比赛。尤其这盟升杯,好像很厉害的样子,报名参加的人非常非常多。

这个“盟升杯”呢,大致就是把参赛者划分为低年级组和高年级组,然后至多三人组成一队,从所在年级组的赛题中挑选一题并完成。于是我就和与我一起从福州一中考到这里来的两个小伙伴组了队,参加了这比赛。低年级组可选的赛题里面有一个是利用单片机制作一台简易计算器,题目如下:

 

电子科技大学 2016 年盟升杯(第三届)竞赛试题
简易计算器(B 题)【大一组】

任务

设计并制作一个简易计算器,通过按键输入数字和运算符,并在数码管或液晶屏上显示结果。

要求

1. 基础部分
1.1 点亮数码管或液晶屏,并同时显示 4 个不同数字。
1.2 扫描键盘,并显示按键标号。
1.3 实现整数的基本运算功能(规定整数范围:-999~999)。
1.4 超出运算范围或出错后提示,要求可以退出错误状态。

2. 发挥部分
2.1 存储一个数字,掉电不丢失。
2.2 实现小数的基本运算。
2.3 实现 6 位有效数字或更高精度。
2.4 解 aX + ?^X=b 方程。
2.5 其他(如:自制最小系统,更多位数,更多运算等)。

说明

1. 可以使用成品开发板。
2. 基本运算为加减乘除。
3. 解方程精度要求在 0.01,给定方程只有一解,a>0,b>0,0<X<20;a,b 从键盘输入,运算时间最长不超过 1 秒。
4. 计算器需可以连续按键计算,按下新运算符时自动计算出上一次结果,并作为运算的前一个数。不需要考虑优先级。
5. 报告需附上程序所有代码。

 

我和一个队友曾经都耍过 Arduino,以它为平台做出个基础的计算器对我们来说根本不在话下。不过这比赛可不能就这么水过去啊,我们得珍惜这个挑战自我的机会,给自己设些难题:比如学着驱动一些陌生的模块,用 ATMEGA328P 做最小系统,美化显示界面,绘制 PCB,用 SolidWorks 制作外壳等。

总的来说,我们的目标就是要让我们的最终作品能够成为一款有人愿意购买的成熟产品,而不是一个把一堆乱糟糟的东西随意堆砌起来的临时作品。

 

简易计算器  设计报告

摘要

计算器是最常用的便携中低端电子产品之一。即使在手机平板电脑盛行的今天,计算器仍是学生与工程师手上不可或缺的重要工具。

为了得到正确的运算数据和流畅的使用体验,总是需要大量的程序优化和精致的外观设计。本文介绍的,便是我们设计并制作的一款简易计算器。用户通过按键输入数字和运算符,可在屏幕上读取结果。

通过设计程序,该产品可以实现高精度计算和解方程功能,并有动画显示、多级删除、运算报错、功能菜单、音量设置和 LED 柔光等人性化设计。紧凑的键盘布局、精简的单片机最小系统以及锂电池设计,使得计算器只有手掌般大小,让产品便携耐用成为可能。

本次设计中的简易计算器将在运算性能和用户体验方面显示出它独特的优越性。

关键字:AVR 单片机;OLED;矩阵键盘;锂电池;可充电;紧凑;便携

1系统方案

本系统主要由单片机模块、显示模块、供电模块、输入模块及少量其他元器件组成,下面分别论证这几个模块的选择。

1.1 单片机模块的论证与选择

方案一:选择 STC89C52 作为主控芯片。
STC89C52 周期比较慢,使系统反应比较慢。

方案二:选择 ATMEGA328P-PU 作为主控芯片。
这块单片机运算速度快,运算性能强,组员有使用此平台开发作品的经验。经过分析论证,ATMEGA328P-PU 相对适合开发此题。由于全球使用此块单片机的开发者非常多,相关资料非常丰富,众多厂商都有对其的特别支持。它可以被轻松地自制最小系统,并应用在各种领域。同时,我们使用 ATMEL 公司 ATMEL Studio 7 集成开发环境进行代码编写。此方案从功能到开发环境都完全符合题设要求。

综合以上二种方案,选择方案二。

1.2 显示模块的论证与选择

方案一:使用 1602 液晶屏。
1602 显示屏显示内容少,引脚众多,模块体积较大,不利于产品小型化。

方案二:使用 12864 液晶屏。
12864 液晶屏比 1602 液晶屏能显示更多内容,能实现更丰富的功能,但仍存在占用引脚多、体积大的问题,使用不方便。

方案三:使用 OLED 显示屏。
OLED 显示屏在使用 I2C 接口时只占用 2 个引脚,显示效果好,点阵密集,体积小,价格便宜,优于以上两款显示屏。且使用 Universal 8bit Graphics Library 可以方便地驱动 OLED,使我们有更多的精力进行界面的深度开发。

综合以上两种方案,选择方案三。

1.3 供电模块的论证与选择

本方案整体模块均支持较宽电压输入(3.3~5V)。

方案一:利用 USB 接口外接供电。
利用 USB 接口外接供电,电压稳定,但产品无法脱离外接电源单独使用,违反了计算器可携带的设计需求。

方案二:利用干电池供电。
电池可以方便地更换,不用担心没电。但干电池对环境有一定损害,且电池盒及电池较大较重,同样地,拿出去玩十分不便。

方案三:利用锂电池供电。
锂电池比能量高,使用寿命长,而且锂电池轻薄小巧,能使产品更加美观。机载锂电池可以方便产品的随时使用,而搭配常见于移动电源的锂电充电/保护模块可以大大增强产品的实用性与安全性。

综合以上两种方案,选择方案三。

1.4 输入模块及其他器件的论证与选择

本方案输入模块采用 4*4 矩阵键盘设计,附加一个开关、一个多重功能键和一个多级清除键,其他元件有蜂鸣器、LED 灯。

产品使用双板堆叠,四角利用双通铜柱进行连接、固定,下板承载充电及保护电路和锂电池,并通过排针排座将电源与上层板的主体电路连接。

2理论分析与计算

2.1高精度算法

我们采用的单片机只能分配 4 Byte 的空间来存储 double 变量,也就是说尽管代码中开了 double,它实际也只能实现 float 的精度。在这种情况下,为了提升精度,难免让人想到信息学奥林匹克竞赛中的专门用来处理上百位整型或实型的加减乘除的入门算法 – 高精度算法。

这种算法将整数与小数部分作为字符串读入,利用一个字符串可存储 0~255 个字符的特性,在计算时将字符转换为数字逐位运算,便可极大程度上提升精度。

但考虑到我们做的只是简易计算器,也无需处理如此精确的数字,用 float 来存储完全可以胜任这项工作,我们便抛弃了这个想法。

2.2解方程算法

由于我们的方案采用的芯片运算能力拔群,直接利用二分法即可在远不及 1 秒的情况下快速解出赛题要求的方程,并可达到足够高的精度,故不考虑使用牛顿迭代法等更加复杂的算法。

所以,我们用二分法解 aX+e^X= b 方程(精度为 1E-6,a>0,b>0)!

3电路与程序设计

3.1系统组成

3.1.1系统总体框图

单片机使用 ATMEL 的 ATMEGA328P-PU,显示采用了 0.96 寸的 OLED 屏,键盘使用矩阵键盘搭配两颗独立按键,蜂鸣器为有源型。其中,单片机与屏幕以 I2C 方式通讯。

3.2电路原理图

3.2.1 单片机及外围电路电路原理图

单片机采用 ATMEL 的ATMEGA328P-PU。通过添加一枚 16MHz 晶振和两枚 22pF 瓷片电容,构成可供ATMEGA328P-PU 正常运行的最小系统。

4×4 键盘阵列采用经典的矩阵键盘设计,共占用 8 个引脚。在电路板上,此种设计能在达到紧凑目的的条件下不使用飞线。两枚独立按键与单片机数字引脚相连,直接读取电平值。

OLED 模块采用的是 I2C 设计。两线式串行总线通过 A4、A5 两个模拟引脚与单片机通信。

3.2.2 锂电池充电电路

我们最终采用了市面上常见的 TP4056 电源管理芯片的典型应用方案。在板上焊上 Micro USB 接口,向 VCC 脚灌入 5V 电压,即可使用手机充电器对计算器进行充电。充电时板载 LED 亮红灯,充电完毕后亮绿灯。

3.2.3 电路板设计

电路板设计中,我们尽可能采用板上锡线,同时减少飞线堆叠,保证美观。我们同时设计了相同布局的 PCB 图样和飞线走向图样,方便您理解产品的电路布局,也为后续开发和 PCB 印制提供便利。

3.3程序的设计

3.3.1程序功能描述与设计思路

可视化方面:
1)产品所加载的程序,能够驱动 128*64 的单色 OLED 显示屏,能显示基础字符(ASCII)、汉字、点阵图像,能即时绘制多种几何图形;
2)能够呈现具有现代设计感的用户友好型界面(User-friendly Interface);
3)能播放动画;
4)能同屏同时显示大量数字;
5)绘制了方便用户进入的引导界面。

外围功能方面:
1)程序通过单片机控制有源蜂鸣器和 LED 状态指示灯,实现按键提示音、呼吸灯以及按下按键时 LED 闪烁一次等效果;
2)通过 PWM 控制 LED 的亮度,防止灯光过于刺眼;
3)通过程序实现按键防抖;
4)赋予退格键双重功能,即一键多用:短按退格,长按清空整个屏幕;
5)清除过程伴随动作提示音以防止误操作;
6)在相关菜单中,用户可方便地设置蜂鸣器的开关,防止计算器在使用中打扰他人;
7)可以设置运算结果保留的有效数字位数;
8)所有设置内容均支持自动保存,且断电后设置不会丢失。

计算性能与输入习惯方面:
1)屏幕布局整洁,可分行显示上一次运算结果与当前输入数字,具有独立的运算符号位;
2)不允许输入的数以一个或更多的 0 开头,键入数字时自动覆盖已有的首位 0;
3)实现小数的基本运算;
4)通过程序智能识别是否存在小数点,只允许输入一个小数点;
5)可控制输入数字长度,以防止超出运算精度范围;
6)重复输入不同运算符时以最后一次输入为准;
7)上一轮运算结束后按下数字即可开始新的运算过程;
8)高级运算菜单中可实现以下功能:相反数、绝对值、平方、立方、开方、开立方、以 e 为底的指数运算、以 e 为底的对数运算;
9)具有错误处理功能,超出运算范围或出错后能够给出对应提示,并可在不复位单片机的情况下通过按键退出错误状态;
10)扫描键盘,并显示按键标号;
11)实现总共 7 位有效数字的运算精度;
12)掉电存储一个三位数(数字范围:0~999);
13)解 aX+e^X= b 方程(精度为 0.00001,a>0,b>0);
14)菜单可逐级返回。

3.3.2程序流程图

4测试方案与测试结果

4.1测试方案

1、硬件测试
我们在某款 AVR 开发板上进行相关模块的实验,将电路临时搭建面包板上进行开发。焊接到洞洞板上后利用万用表检测电路,准确地发现了一颗按键存在虚焊问题并修复,并发现了某处由于飞线绝缘皮的脱落导致的短路问题。在未安装电池模块时使用数字可调电源对作品的电压输入范围进行核对。组装完毕后,经测试,我们的锂电池、电池充电兼保护模块、单片机及其余 I/O 设备工作正常。

2、软件仿真测试
我们选择使用计算机上的 Matlab R2014b 和 Dev-C++ 5.11 对解方程算法进行优选,利用 Atmel Studio 7.0 的串口通信功能进行软件调试。

3、硬件软件联调
烧录程序后我们在搭好的最小系统上对各种可能的输入情况进行测试,同步优化代码,取得最佳平衡。

4.2 测试条件与仪器

符合 USB 电压标准(5V)的充电器
数字可调电源
数字万用表

4.3 测试结果及分析

经过测试,系统各部分均工作正常。在测试中我们发现,当运算超出精度范围时,运算结果存在一定误差,但降低输入数字位数后恢复精度。

4.3.1测试结果(数据)

“电脑出解”:在电脑上利用 Dev-C++ 5.11 开双精度(double)进行运算所得结果;
“计算器出解(5 位)”:在计算器中烧录 5 位小数解方程程序后(即计算器目前烧录的程序),得到的结果;
“计算器出解(6 位)”:修改程序,提升计算器解方程精度后,烧录新的程序,得到的结果;

将结果与计算器上的 5 位及 6 位小数两种模式下的输出结果进行记录与对比,得到以上表格。

可以看出,在大部分情况下,我们的单片机 ATMEGA328P 以单精度(float)输出 5 位小数点时能在大部分情况下不损失精度稳定输出,6 位小数则在第 6 组中产生问题,无法出解。

理论分析,float 的精度能保证在 6 位有效数字。由于给定结果整数部分最大为两位,故让计算器输出 4 位小数是能够100% 保证精度的。

4.3.2测试分析与结论

根据上述测试数据,系统能完美地实现赛题要求,计算精度领先同行,计算速度可超大多竞争对手;界面简明美观,布局清晰简洁;作品板载电池,可用智能手机充电线(Micro USB)充电,而且易于携带,差不多和校园卡一样大,最重要的是:比一元硬币还薄!

综上所述,本设计达到设计要求。我们重视工业设计细节,注重程序代码优化,时刻将用户体验放在第一位。讲道理,这是件不可多得的好作品啊!

5参考资料

5.1在线文档

1. Universal 8bit Graphics Library For OLED  https://github.com/olikraus/u8glib
2. atof – C++ Function  http://www.cplusplus.com/reference/cstdlib/atof/
3. Matlab to C or C++  http://stackoverflow.com/questions/4166755/matlab-to-c-or-c

5.2书籍

《C程序设计(第四版)》 谭浩强 著 清华大学出版社

6开发工具

6.1代码编写

Atmel Studio 7.0
Dev-C++ 5.11
Matlab R2014b

6.2电路设计

Fritzing 0.9.3b

6.3外壳设计

SolidWorks Premium 2014

6.4图形处理

PC to LCD 2002
Photoshop CS6
MSPaint

附件1 使用说明书

附件2 程序代码

Arduino Code

8 条评论

发表评论

*