迷你计算器2.docx
《迷你计算器2.docx》由会员分享,可在线阅读,更多相关《迷你计算器2.docx(28页珍藏版)》请在冰豆网上搜索。
![迷你计算器2.docx](https://file1.bdocx.com/fileroot1/2023-1/29/3376282a-198c-4eef-8041-16669e24e59e/3376282a-198c-4eef-8041-16669e24e59e1.gif)
迷你计算器2
《嵌入式系统》课程设计说明书
迷你计算器
院
指导教师
学生姓名
课题名称
迷你计算器设计
内容及任务
一、目标
在GEC210开发板上使用QT设计一个迷你计算器。
二、任务
根据控制要求,明确设计任务,拟定设计方案与进度计划,运用所学的理论知识,进行迷你计算器原理设计、程序框架设计、创新设计,提高理论知识、系统调试能力、分析问题与解决问题的能力。
主要内容包括:
1.嵌入式交叉开发环境搭建。
2.Linux操作系统的移植。
3.根据需求确定外围模块设计并完成相应驱动开发。
4.应用程序原理及框架设计。
5.Linux下应用程序编写及移植。
6.系统总体功能调试。
7.编写设计说明书。
三、要求
1.迷你计算器的功能显示界面示例如下:
2.能够完成十进制数的加、减、乘、除等简单计算。
3.对不正确的表达式能指出其错误。
主要参考资料
[1]马忠梅,ARM&Linux嵌入式系统教程(第3版)[M]。
北京:
北京航空航天大学出版社,2014
[2]曹忠明,程姚根。
从实践中学嵌入式Linux操作系统[M]。
北京:
电子工业出版社,2012
[3]宋宝华,Linux设备驱动开发详解(第二版)[M]。
北京:
人民邮电出版社,2010。
[4]韦东山,嵌入式Linux应用开发完全手册[M]。
北京:
人民邮电出版社,2008
[5]陆文周,Qt5开发及实例[M]。
北京:
电子工业出版社,2015
[6]StephenPrata,CPrimerPlus[M]。
北京:
人民邮电出版社,2005
教研室
意见
教研室主任:
(签字)
年月日
摘要
嵌入式操作系统(EmbeddedOperatingSystem)是一种用途广泛的系统软件,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等。
嵌入式操作系统负责嵌入式系统的全部软、硬件资源的分配、任务调度,控制、协调并发活动。
它必须体现其所在系统的特征,能够通过装卸某些模块来达到系统所要求的功能。
目前在嵌入式领域广泛使用的操作系统有:
嵌入式实时操作系统µC/OS-II、嵌入式Linux、WindowsEmbedded、VxWorks等,以及应用在智能手机和平板电脑的Android、iOS等。
Qt是一个跨平台的C++图形用户界面应用程序框架。
它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。
Qt是完全面向对象的很容易扩展并且允许真正地组件编程。
且具备面向对象、丰富的API、强大的类等优点这将为我们提供图形化编程的便利。
本次我们在课程设计中所做的是基于QTGUI的计算器的设计与实现。
计算器(calculator;counter)一般是指“电子计算器”,计算器是能进行数学运算的手持机器,拥有集成电路芯片,其结构简单,比现代电脑结构简单得多,可以说是第一代的电子计算机(电脑)。
计算器这一小小的程序机器实际上是从计算机中割裂出来的衍生品,虽然功能较单一,但因其操作模式的方便快捷和价格的低廉,携带方便等特点,已经被广泛应用于工程、学习、商业贸易等日常生活中,极大的方便了人们对于数字的整合运算,成为人们生活和办公中的必备品之一,计算器的小巧精致的外观和多功能化的发展依旧在当今信息电子化的时代扮演者不可替代的角色.
关键词:
嵌入式操作系统、Linux操作系统、Qt、电子计算器
目录
1设计前提1
1.1Linux下Qt编写的的计算器特点1
1.2Linux下Qt编写的的计算器的功能需求2
本次设计的计算器应具有以下功能:
2
2开发环境的简介于搭建3
2.1开发环境3
2.1.1Linux简介3
2.1.2QT简介3
2.2Qt环境搭建4
3设计流程6
3.1系统流程图6
3.2模块划分6
3.3模块设计7
3.3.1界面显示模块7
3.3.2基本功能模块8
3.3.3记忆存储功能模块12
4运行于结果分析13
4.1运行13
4.2结果分析14
参考文献16
致谢17
附录18
1设计前提
1.1Linux下Qt编写的的计算器特点
本次设计是采用Qt编写的一个计算器程序。
Qt是完全面向对象的很容易扩展并且允许真正地组件编程。
所以这次编写的电子钟采用C++编程中的结构是面向对象的有利于模块化和扩展对于后期功能的添加修改具有很良好的支持Linux操作系统下的图形用户界面工具包Qt通过编写Qt代码结合一些算法机制来达到实现计算器的目的。
我们日常生活的开支,大额数字或是多倍小数的计算都需要计算器的帮助,处理数字的开方、正余弦都离不开计算器。
虽然计算器现在价格比较低廉,但是功能过于简单的不能满足个人需求,功能多的价格昂贵,操作不便不说,很多功能根本用不到。
所以,我们可以运用自己所学的知识设计一款满足日常需求的简易计算器。
在本次课程设计中比较好的把C++与Qt结合起来使用。
Qt作为面向对象的
软件开发工具它使用信号Signal/槽slot机制来进行对象间的通信。
信号/槽机制是Qt的一个中心特征并且也许是Qt与其它工具包的最不相同的部分。
Qt运行速度快、执行效率高再加上它提供了一组更容易理解的GUI类信号与槽易使用它所拥有的插入体系结构使得我们可以将代码加载到一个应用中而无需进行重新编译或重链接等优点为我们本次设计增色不少能使图形界面看起来更加舒服使用起来更加灵活。
1.2Linux下Qt编写的的计算器的功能需求
在程序设计中,通过设计、编制、调试一个模拟计算器的程序,加深对语法及语义分析原理的理解,并实现对命令语句的灵活运用。
在程序设计中,可以用两种放法解决问题:
一是传统的结构化程序设计方法,二是更先进的面向对象程序设计方法。
而在面向对象程序设计中关键是如何将问题域中的实体(即日常所见的概念)抽取出来,作为C++中的类,而属性与行为作为类的两类要素通常是必不可少的,甚至还考虑类必须满足的约束,我们选择的是第二类实现方法,
采用结构化与面向对象两种解决问题的方法。
本次设计的计算器应具有以下功能:
(1)能够实现常用的加减乘除功能;
(2)能够实现开方,乘方,返回的功能;
(3)定能够实现数值的记忆存储功能
(4)当输入错误时,输出错误;
(5)可以一键回复计算器到初始状态.
2开发环境的简介于搭建
2.1开发环境
2.1.1Linux简介
Linux是一个多用户、多任务的类UINX操作系统,以系统的稳定性和强大的网络功能而著称。
目前,Linux系统主要被应用到:
桌面应用、服务器、软件开发和嵌入式领域。
在安装系统时,可以自行定制相关的开发工具。
Linux发展到今天,已经拥有了很完善的开发环境。
例如:
gcc、gdb、make等。
Linux的发行版本有RadHat、Debian、Ubuntu。
RadHat是目前世界上最资深的Linux和开放源代码提供商,同是也是最获得认可的Linux品牌之一。
支持多硬件平台,拥有优秀的安装界面,独特的RPM升级方式。
Debian最早由IanMurdock于1993年创建。
它的开发模式与Linux及其它开放性源代码操作系统精神一样,都是由超过800位志愿者通过互联网合作开发而成的。
一直以来,Debian被认为是最正宗的Linux发行版本,而且它是完全免费的、高质量的与Unix兼用的操作系统。
Ubuntu是相对较新的发行版。
但是,它的出现改变了许多潜在用户对Linux安装和使用困难的看法,因为Ubuntu安装方便,简单易用。
Ubuntu被称为对硬件支持最好、最全面的Linux发行版之一,许多在其它发行版上无法使用或者默认配置时无法使用的硬件在Ubuntu上都可以使用。
在Linux桌面系统的发行版当中,我们选择了Ubuntu12.04LTS,因为它安装傻瓜化,而且桌面环境简单友好,易用性强,为Linux入门者降低了不少门槛。
但是为了不让电脑主机系统因意外或人为操作不慎导致其崩溃、破环原有系统,我们的建议是在虚拟主机环境下玩耍Ubuntu。
2.1.2QT简介
由于本次设计的程序是用QT Creator所设计的,先介绍下QT开发工具的背景。
Qt是一个1991年由奇趣科技开发的跨平台C++图形界面应用程序开发框架。
它既可以开发GUI程式,也可用于开发非GUI程式,比如控制台工具和服务器。
Qt是面向对象语言,易于扩展,并且允许组件编程。
QT所具有的优势是:
优良的跨平台特性,Qt支持下列操作系统:
MicrosoftWindows95/98,MicrosoftWindowsNT,Linux,Solaris,SunOS,HP-UX,Digital UNIX (OSF/1,Tru64),Irix,FreeBSD,BSD/OS,SCO,AIX,OS390,QNX等等。
面向对象:
Qt的良好封装机制使得Qt的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的。
Qt提供了一种称为signals/slots的安全类型来替代callback,这使得各个元件之间的协同工作变得十分简单。
丰富的API:
Qt包括多达250个以上的C++类,还提供基于模板的collections,serialization,file,I/O device,directory management,date/time类。
甚至还包括正则表达式的处理功能。
支持2D/3D 图形渲染,支持OpenGL大量的开发文档。
2.2Qt环境搭建
本次报告所编写的拼图小游戏是在LINUX环境下使用QT4.6编写完成的而
LINUX操作系统我选择的是redhat9.0这就涉及到怎样在redhat下安装QT
和使用QT实现计算器的功能。
在redhat下搭建QT的编译环境如下:
1:
下载Qt4.5.2forX11OpenSource版。
2:
下载过来的是qt-x11-opensource-src-4.5.2.tar.gz文件用tar命令
解压一下。
tarzxvfqt-x11-opensource-src-4.5.2.tar.gz
3:
把这个目录移到/usr/local目录下改名为qt。
4:
修改可以使用vi编辑器或者gedit自己目录下的.bash_profile或
者.profile或者是/etc/profile这个文件加入下面的代码
QTDIR=/usr/local/qt
PATH=$QTDIR/bin:
$PATH
MANPATH=$QTDIR/man:
$MANPATH
LD_LIBRARY_PATH=$QTDIR/lib:
$LD_LIBRARY_PATH
exportQTDIRPATHMANPATHLD_LIBRARY_PATH
5:
注销一下用户或者source.bash_profile一下使配置文件生效。
6:
进入QT的目录开始编译
./configure
输入yes同意GPL/QPL协议。
7:
开始make这步要一两个小时
make
8:
开始install
makeinstall
9:
进入QT的目录进入bin目录然后运行./designer就可以看到图形界面了.
QtDesigner界面如图5所示:
图5:
Qt界面
3设计流程
3.1系统流程图
系统流程图如下所示:
图1:
系统流程图
3.2模块划分
程序主要有分为两大部分:
一是界面显示模块;二是逻辑功能实现模块.其中功能模块又分为两部分.一是基本功能模块,即加减乘除,清除退格功能;另一部分是额功能模块,包括求开方,乘方,倒数,负数功能和数据存储记忆功能.本人负责的是数据存储记忆功能,另一组员负责剩余额外功能模块.
模块结构图2如下所示:
图2:
模块结构图
3.3模块设计
3.3.1界面显示模块
计算器界面如图3所示:
图3:
计算器界面
计算器界面主要有一个widgets窗口和一个LineEdit部件及若干个Button部件组成.界面设计中最重要的是界面的布局.由于大部分窗口部件为按钮.固定义了一个button类,专为生成统一风格的按钮所用.
程序中创建的Button类继承自QToolButton类.类中方法主要功能为定义按钮的类型,大小策略及按钮的文本显示方式.构造函数中的setSizePolicy()是按钮可以水平扩展的方式去填补界面的空缺.如果没有这个方法,创建不同的按钮将会显示不同的宽度.在sizeHint()方法中.我们把height设置为在默认QToolButton大小的基础上增加了20,设置width至少和height一样大.这样就保证了按钮可以按照表格布局一样整齐分布在Dialog中.如果没有sizeHint(),界面布局将如图4所示:
图4:
界面布局
3.3.2基本功能模块
1)当用户单击"+"或"-"按钮时,系统将会调用additiveOperatorClicked()
槽,additiveOperatorClicked()实现代码如下:
voidWidget:
:
additiveOperatorClicked()
{
QPushButton*clickedButton=qobject_cast(sender());
QStringclickedOperator=clickedButton->text();
doubleoperand=ui->display->text().toDouble();
if(!
pendingMultiplicativeOperator.isEmpty())
{
if(!
calculate(operand,pendingMultiplicativeOperator))
{
abortOperation();
return;
}
ui->display->setText(QString:
:
number(factorSoFar));
operand=factorSoFar;
factorSoFar=0.0;
pendingMultiplicativeOperator.clear();
}
if(!
pendingAdditiveOperator.isEmpty())
{
if(!
calculate(operand,pendingAdditiveOperator))
{
abortOperation();
return;
}
ui->display->setText(QString:
:
number(sumSoFar));
}else{
sumSoFar=operand;
}
pendingAdditiveOperator=clickedOperator;
waitingForOperand=true;
}
进入这个函数后,会根据
QPushButton*clickedButton=qobject_cast(sender());
这句代码实现区分+还是-,并且判断存储前运算符变量中是否有值,如果有则将前面的值先算出。
如果没有,则将第一个值存入,并将运算符存入。
并且继续等待接下来的按钮,或者等号。
2)当我们单击"×"或"÷"按钮时,系统将调用
voidWidget:
:
multiplicativeOperatorClicked()
{
QPushButton*clickedButton=qobject_cast(sender());
QStringclickedOperator=clickedButton->text();
doubleoperand=ui->display->text().toDouble();
if(!
pendingMultiplicativeOperator.isEmpty())
{
if(!
calculate(operand,pendingMultiplicativeOperator))
{
abortOperation();
return;
}
ui->display->setText(QString:
:
number(factorSoFar));
}else
{
factorSoFar=operand;
}
pendingMultiplicativeOperator=clickedOperator;
waitingForOperand=true;
}
由于乘除的优先级比加减高,当我们进行混合运算,前面是加减法,再进行乘或除时,比如1+2*3,这是会计算2*3=6,将6存入。
此时计算公式相当于1+6
3)程序中backspaceClicked()用来实现退格功能.它会移除显示的数值的最后一位.如果显示屏中为空字符串,按下退格键将会显示0.waitingForOperand被设置为0.退格功能实现代码如下:
voidCalculator:
:
backspaceClicked()
{
if(waitingForOperand)
return;
QStringtext=display->text();
text.chop
(1);
if(text.isEmpty()){
text="0";
waitingForOperand=true;
}
display->setText(text);
}
Clear()函数槽的功能相当于若干次backspaceClicked()的功能,它会一次清除显示屏中的数值.功能实现代码如下:
voidCalculator:
:
clear()
{
if(waitingForOperand)
return;
display->setText("0");
waitingForOperand=true;
}
clearAll()函数会实现计算器的初始化状态,代码如下:
voidCalculator:
:
clearAll()
{
sumSoFar=0.0;
factorSoFar=0.0;
pendingAdditiveOperator.clear();
pendingMultiplicativeOperator.clear();
display->setText("0");
waitingForOperand=true;
}
4)界面中sqrt和x^2是通过直接对界面设置值的方式实现,其代码如下所示
voidWidget:
:
sqrClicked()
{
doublesqr=ui->display->text().toDouble();
ui->display->setText(QString:
:
number(sqrt(sqr)));
waitingForOperand=true;
}
voidWidget:
:
squareClicked()
{
doublesqr=ui->display->text().toDouble();
ui->display->setText(QString:
:
number(sqr*sqr));
waitingForOperand=true;
}
3.3.3记忆存储功能模块
功能实现代码如下:
voidCalculator:
:
clearMemory()
{
sumInMemory=0.0;
}
voidCalculator:
:
readMemory()
{
display->setText(QString:
:
number(sumInMemory));
waitingForOperand=true;
}
voidCalculator:
:
setMemory()
{
equalClicked();
sumInMemory=display->text().toDouble();
}
voidCalculator:
:
addToMemory()
{
equalClicked();
sumInMemory+=display->text().toDouble();
}
clearMemory()函数可以清除存储的数值,readMemory()函数为显示存储的数
值.setMemory()函数可以用当前显示的数值代替存储的数值,即设置数值功
能,addToMemory(0函数可以把已经存储的数值加上当前显示的值并存储.
4运行于结果分析
4.1运行
在虚拟机中编译工程,生成可执行文件cal,将其复制到虚拟机与CP机共享目录中。
打开串口终端,通过rz命令下载到开发板中。
具体步骤如下:
1)打开串口终端,如图所示:
图6:
串口终端图6:
串口连接
图8:
设置串口图9:
打开终端
在图6所示双击串口终端程序,弹出图7界面,点击快速连接,然后再图8中设置串口连接。
协议为serial,串口连接。
端口可在我的电脑中设备管理器中查到,这里为开发板与cp机连接的端口号,我们设置为端口三。
数据位8位,无奇偶校验位,停止位为1。
设置完后点击连接,将会弹出图9。
等待系统初始化完,即可。
然后再命令行输入cd/home,进入到home目录下载可执行程序cal
2)下载程序:
图9:
rz下载程序
如图9所示,输入rz命令后将会弹出文件选择栏。
选择pc机与虚拟机共享文件夹中的可执行文件cal。
点击确定即可下载文件。
3)加载QT运行所需要的库文件以及其他配置
图10:
配置运行环境
如图10所示,在命令行中输入sourceqtconf.sh。
运行这个脚本后,系统会配置qt程序运行的各种环境
4)运行程序在命令行输入./cal。
将会在开发板中运行计算器的程序
4.2结果分析
如图11中在板子上面按下5后在按x^2,界面显示为图12所示25。
计算正确
在图13中输入1+2*3,结果为7.计算正确
在图14中输入1/0,结果显示为###,报错。
图11图12
图13图14
根据上述的运行结果可以得知本次设计的计算器功能可以实现,设计成功
参考文献
[1]马忠梅,ARM&Linux嵌入式系统教程(第3版)[M]。
北京:
北京航空航天大学出版社,2014
[2]曹忠明,程姚根。
从实践中学嵌入式Linux操作系统[M]。
北京:
电子工业出版社,2012
[3]宋宝华,Linux设备驱动开发详解(第二版)[M]。
北京:
人民邮电出版社,2010。
[4]韦东山,嵌入式Linux应用开发完全手册[M]。
北京:
人民邮电出版社,2008
[5]陆文周,Qt5开发及实例[M]。
北京:
电子工业出版社,2015
[6]StephenPrata,CPrimerPlus[M]。
北京:
人民邮电出版社,2005