迷你计算器设计-《嵌入式系统》课程设计说明书.docx_第1页
迷你计算器设计-《嵌入式系统》课程设计说明书.docx_第2页
迷你计算器设计-《嵌入式系统》课程设计说明书.docx_第3页
迷你计算器设计-《嵌入式系统》课程设计说明书.docx_第4页
迷你计算器设计-《嵌入式系统》课程设计说明书.docx_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统课程设计说明书 迷你计算器设计院 、 部: 学生姓名: 指导教师: 专 业: 班 级: 完成时间: 湖南工学院嵌入式系统课程设计课题任务书学院:电气与课题名称迷你计算器设计内容及任务一、目标 在GEC210开发板上使用QT设计一个迷你计算器。二、任务根据控制要求,明确设计任务,拟定设计方案与进度计划,运用所学的理论知识,进行迷你计算器原理设计、程序框架设计、创新设计,提高理论知识、系统调试能力、分析问题与解决问题的能力。主要内容包括:1 嵌入式交叉开发环境搭建。2 Linux操作系统的移植。3 根据需求确定外围模块设计并完成相应驱动开发。4 应用程序原理及框架设计。5 Linux下应用程序编写及移植。6 系统总体功能调试。7 编写设计说明书。三、要求1迷你计算器的功能显示界面示例如下:2能够完成十进制数的加、减、乘、除等简单计算。3对不正确的表达式能指出其错误。主要参考资料1马忠梅,ARM & Linux嵌入式系统教程(第3版)M。北京:北京航空航天大学出版社,20142曹忠明,程姚根。从实践中学嵌入式Linux操作系统M。北京:电子工业出版社,20123宋宝华,Linux设备驱动开发详解(第二版)M。北京:人民邮电出版社,2010。4韦东山,嵌入式Linux应用开发完全手册M。北京:人民邮电出版社,20085 陆文周,Qt5开发及实例M。北京:电子工业出版社,20156 Stephen Prata,C Primer PlusM。北京:人民邮电出版社,2005教研室意见 教研室主任:(签字)年 月 日摘 要 计算器(calculator;counter)一般是指“电子计算器”,计算器是能进行数学运算的手持机器,拥有集成电路芯片,其结构简单,比现代电脑结构简单得多,可以说是第一代的电子计算机(电脑)。计算器这一小小的程序机器实际上是从计算机中割裂出来的衍生品,虽然功能较单一,但因其操作模式的方便快捷和价格的低廉,携带方便等特点,已经被广泛应用于工程、学习、商业贸易等日常生活中,极大的方便了人们对于数字的整合运算,成为人们生活和办公中的必备品之一,深得使用者的青睐。 本次我们在课程设计中所做的是基于QTGUI的计算器的设计与实现。嵌Linux操作系统下有一个强大的图形用户界面工具包 Qt是一个跨平台的C+图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的很容易扩展并且允许真正地组件编程。且具备面向对象、丰富的 API、强大的类等优点这将为我们提供图形化编程的便利。 关键词 : Linux、Qt、电子计算器、C+II 目 录1 绪论11.1 项目背景11.2 项目内容和要求11.2.1 题目介绍11.2.2 题目要求11.3 项目意义及特点12 需求分析32.1 需求分析一32.2 可行性分析33 系统设计53.1 系统流程图53.2 模块设计53.2.1 基本功能模块53.2.2 附加功能模块74 系统运行和测试104.1 搭建开发环境104.2 运行及测试11参考文献14致 谢15附 录16IV1 绪论1.1 项目背景 随着计算机的飞速发展,人类已经进入信息化时代。信息技术发展日新月异, 计算已经进入人们生活的各个领域, 在现代生活中不可或缺,大型复杂的计算是人脑所不能胜任的,而且较易出错。以前的计算器只能进行简单的加减乘除四则运算,而且只能进行单步运算,如果遇到较长的算式时就得让用户一步一步输入,浪费很多时间,还会可能遗漏数据内容,让用户得多次输入算式验证,如果一次错误就得验证多遍,浪费时间效率低下。随着科技的发展,人们所学习的内容越来越多,需求越来越广泛。本文设计的计算器扩大了用户的运算领域。并且考虑到用户有时常用一些算式,提高了用户的效率,方便了用户的操作,本文设计中主要采用的技术为 Qt ,Qt 为设计可视化界面,通过软件的设计可以快速设计出自己需要的界面,然后再到编写各个按键的槽函数与算法。1.2 项目内容和要求1.2.1 题目介绍设计一个简单功能的 QT 迷你计算器,具有普通计算窗口,满足生活中简单的需求,并设置算数优先级。1.2.2 题目要求 本次设计的计算器应具有以下功能: (1) 能够实现常用的加减乘除功能; (2) 能够实现开方,乘方,返回的功能; (3) 定能够实现数值的记忆存储功能 (4) 当输入错误时,输出错误; (5) 可以一键回复计算器到初始状态.1.3 项目意义及特点我们日常生活的开支,大额数字或是多倍小数的计算都需要计算器的帮助,处理数字的开方、正余弦都离不开计算器。虽然计算器现在价格比较低廉,但是功能过于简单的不能满足个人需求,功能多的价格昂贵,操作不便不说,很多功能根本用不到。所以,我们可以运用自己所学的知识设计一款满足日常需求的简易计算器。 在本次课程设计中比较好的把C+与Qt结合起来使用。Qt作为面向对象的软件开发工具它使用信号Signal/槽slot机制来进行对象间的通信。信号/槽机制是Qt的一个中心特征并且也许是Qt与其它工具包的最不相同的部分。这样便解决了我们在用户界面上的操作如单击某个按钮与内部对象之间的信号传输。Qt运行速度快、执行效率高再加上它提供了一组更容易理解的GUI类信号与槽易使用它所拥有的插入体系结构使得我们可以将代码加载到一个应用中而无需进行重新编译或重链接等优点为我们本次设计增色不少能使图形界面看起来更加舒服使用起来更加灵活。 2 需求分析2.1 需求分析一在程序设计中,通过设计、编制、调试一个模拟计算器的程序,加深对语法及语义分析原理的理解,并实现对命令语句的灵活应用 在程序设计中,可以用两种方法解决问题: 一是传统的结构化程序设计方法,二是更先进的面向对象程序设计方法。而在面向对象程序设计中关键是如何将问题域中的实体 (即日常所见的概念) 抽取出来,作为 C+程序中的类,而属性与行为作为类的两类要素通常是必不可少的,甚至还应考虑类必须满足的约束。我们日常生活的开支,大额数字或是多倍小数的计算都需要计算器的帮助,处理数字的开方、正余弦都离不开计算器。虽然现在的计算器价格比较低廉,但是功能过于简单的不能满足个人需求,功能多的价格较贵,操作不便不说,很多功能根本用不到。所以,我们想到可不可以用自己的所学为自己设计开发一个属于自己的简单计算器来完成日常生活的需求。计算器是日常生活中十分便捷有效的工具,能实现加、减、乘、除、 开方、求倒数等简单运算的工具。要实现计算功能,可以用 C+和 Qt 的知识编写程序来解决此问题。该计算器大大的降低了数字计算的难度及提高了计算的准确度和精确度。该计算器使用非常简单和方便,对广大中小学生的学习有巨大帮助作用,也对在职人员的工作有点帮助作用。本文的程序设计设计工作环境为 Linux +QT Creator,在程序设计中,采用了结构化与面向对象两种解决问题的方法。2.2 可行性分析 可行性分析计算器是日常生活中非常便捷有效的工具,它具有普通计算和科学计算, 能实现加减乘除等普通功能,还可以实现算是运算,并且可以进行进制装换,不再局限于十进制,他大大的提高了我们的效率,节省了时间,可促进科技的发展,还可以用来存储算式,可以方便下次使用,采用 Qt 编写, Qt designer设计的界面美观,还可以用拖拽功能进行设计控件的位置、大小、属性、结构等功能,这样在编写代码时就不用浪费时间对控件进行声明等代码了。这降低了 程序员的难度,提高了程序员的效率,并且上手快,具有一定的可行性。技术经济分析是研究技术领域的经济问题和经济规律的科学,是研究一定技术条件下如何提高经济效果的科学,是技术与经济的交叉。在技术上,主要是采用 linux, 可以进行复杂的数据库操作,进行算是的增、 删、 改、 查等功能。用 Qt 编写, 有些类似 C+,但大多数都是 Qt 封装好的函数。 在 linux 中安装 Qt 软件, 配置环境变量,并安装 Qt 插件。从而用 Qt 进行制作界面,做出的效果既美观又快捷方便。使用 Qt 具有良好美观的界面,必要的信息存储和和较好的健壮性,使用人员能够快捷简单的进行操作,可以快捷的获得计算结果 给人们带来方便,对人们的生活有很大的帮助。3 系统设计3.1 系统流程图系统流程图如下所示: 图1: 系统流程图3.2 模块设计3.2.1 基本功能模块1)当用户单击+或-按钮时,系统将会调用additiveOperatorClicked()槽,additiveOperatorClicked()实现代码如下:void Widget:additiveOperatorClicked() QPushButton *clickedButton = qobject_cast(sender(); QString clickedOperator = clickedButton-text(); double operand = 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)当我们单击或按钮时,系统将调用void Widget:multiplicativeOperatorClicked() QPushButton *clickedButton = qobject_cast(sender(); QString clickedOperator = clickedButton-text(); double operand = 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.2.2 附加功能模块1)程序中backspaceClicked()用来实现退格功能.它会移除显示的数值的最后一位.如果显示屏中为空字符串,按下退格键将会显示0.waitingForOperand被设置为0. 退格功能实现代码如下: void Calculator:backspaceClicked() if (waitingForOperand) return; QString text = display-text(); text.chop(1); if (text.isEmpty() text = 0; waitingForOperand = true; display-setText(text); Clear()函数槽的功能相当于若干次backspaceClicked()的功能,它会一次清除显示屏中的数值.功能实现代码如下: void Calculator:clear() if (waitingForOperand) return; display-setText(0); waitingForOperand = true; clearAll()函数会实现计算器的初始化状态,代码如下:void Calculator:clearAll() sumSoFar = 0.0; factorSoFar = 0.0; pendingAdditiveOperator.clear(); pendingMultiplicativeOperator.clear(); display-setText(0); waitingForOperand = true; 2)界面中sqrt和x2是通过直接对界面设置值的方式实现,其代码如下所示void Widget:sqrClicked() double sqr = ui-display-text().toDouble(); ui-display-setText(QString:number(sqrt(sqr); waitingForOperand = true;void Widget:squareClicked() double sqr = ui-display-text().toDouble(); ui-display-setText(QString:number(sqr*sqr); waitingForOperand = true;3)记忆存储功能功能实现代码如下:void Calculator:clearMemory() sumInMemory = 0.0; void Calculator:readMemory() display-setText(QString:number(sumInMemory); waitingForOperand = true; void Calculator:setMemory() equalClicked(); sumInMemory = display-text().toDouble(); void Calculator:addToMemory() equalClicked(); sumInMemory += display-text().toDouble(); clearMemory()函数可以清除存储的数值,readMemory()函数为显示存储的数值.setMemory()函数可以用当前显示的数值代替存储的数值,即设置数值功能,addToMemory(0函数可以把已经存储的数值加上当前显示的值并存储.4 系统运行和测试4.1 搭建开发环境 1、准备安装软件包: 启动RedHat 9.0的图形界面,以root身份登陆在文本模式下,输入命令startx启动图形界面。进入RedHat 9.0图形界面后,打开一个终端窗口(Terminal),点击【红帽System ToolsTerminal】启动终端窗口。输入以下5条命令: cd /pxa270_linux/Qt cp qt-embedded-3.3.0.tar.gz tmake-1.11.tar.gz export.sh /home -arf cd /home tar zvxf qt-embedded-3.3.0.tar.gz tar zvxf tmake-1.11.tar.gz 2、建立QTE开发环境: 在上面打开的同一个终端(Terminal)中,输入以下4条命令来搭建整个QTE开发环境: source export.sh cd qt-embedded-3.3.0 ./configure xplatform linuxarmg+ -depths 4,8,16,32 在configure过程中,会出现如下打印的信息,请您进行如下对话选择: This is the QT/Embedded Free Edition.You are licensed to use this software under the terms of the GNU General Public License (GPL).Type G to view the GNU General Public License.Type yes to accept this license offer.Type no to decline this license offer.Do you accept the terms of the license?输入: yes 回车回车之后,系统就会开始配置,并生成相应的Makefile文件。当出现下列信息是,则表示配置系统完成。Qt is now configured for building. Just run /usr/bin/gmake.To reconfigure, run /usr/bin/gmake confclean and configure.当生成Makefile之后,在上面同一个终端窗口下输入第4条命令make对qt-embedded-3.3.0的源码开始进行编译。 make 若编译过程中没有出现任何error,则会有如下提示:The Qt library is now built in ./libThe Qt examples are built in the directories in ./examplesThe Qt tutorials are built in the directories in ./tutorialNote: be sure to set $QTDIR to point to here or to wherever you move these directories.Enjoy! - the Trolltech team 这样便搭建好了QT编译环境了,Qt Designer界面如图5所示: 图5: Qt界面4.2 运行及测试在arm板下,/home目录中先执行source qtconf.sh运行这个脚本后,在arm上配置qt,加载qt运行的各类库文件。 如图6所示: 图6加载完QT运行所需要的库文件后即可运行qt文件。在命令行输入./cal,运行结果如图7所示. 图7 运行可执行文件cal后,在arm板上显示如图8所示: 图8输入1+2*3,计算器显示如图9所示: 图9因为*的优先级大于+所以先计算2*3,然后计算1+6,结果为7当输入1/0的时候界面显示如图10所示: 图10输入1/0,此时0为分母,公式错误,此时计算器输出#,报错。继续执行多次运算,计算器显示皆无误.关闭计算器,重启再执行运算,运算也无误,故此可断定程序设计正确.参考文献1张石,ARM嵌入式系统教程M 。北京:机械工业出版社,20122曹忠明,程姚根。从实践中学嵌入式Linux操作系统M。北京:电子工业出版社,20123宋宝华,Linux设备驱动开发详解(第二版)M。北京:人民邮电出版社,2010。4韦东山,嵌入式Linux应用开发完全手册M。北京:人民邮电出版社,20085陆文周,Qt5开发及实例M。北京:电子工业出版社,20156Stephen Prata,C Primer PlusM。北京:人民邮电出版社,20057皱思铁,嵌入式Linux设计与应用 M 。北京:清华大学出版社,20028闫放莺,基于嵌入式Linux软件平台技术的研究D 。西安:西北大学,2006致 谢 经过两周的努力,在组员的互相协助下我们完成了该课程设计.虽然这次课程设计,充分利用了各种资源.有从网上下载的Qt教程,也有视频教程.还有从图书馆借来的相应参考书与光盘.以及研究生师兄师姐的帮忙.虽然是首次接触Linux系统下的开发以及Qt.其所独有的信号与槽机制也是第一次接触刚开始理解的确很吃力。但这次设计总的来说对我自己很有意义因为是刚接触嵌入式编程对于这次设计自己把它视做一次挑战自己查阅资料自己解决问题这样的过程中给了自己很大的成就感与信心。当然这次课程设计也锻炼了自己分析实现方面的能力。在学习理论知识的同时也能够自己动手去实现加深了自己对嵌入式的理解。 这次的简易计算机的编写,能实现基本的加减乘除算法。通过此次的QT学习以及上学期的C+学习,深刻的了解到设计程序并不是一件简单的事情。而且这些学习只是让我了解到编程中的皮毛中的皮毛。并且通过网上了解到QT的强大功能;更使我对编程有了极大的兴趣;虽然现在本人的技术及知识还很贫乏,但是相信通过现在及日后的学习一定可以达到自己想要达到的水平;就这次的课程设计报告来说,从最初的相当陌生到现在的可以理解使用是一个学习的过程,激发了自己的学习兴趣。再次感谢给予我们帮助的同学和老师。 附 录附 录:程序清单Widget.h:#ifndef WIDGET_H#define WIDGET_H#include #include #include #include #include namespace Ui class Widget;class Widget : public QWidget Q_OBJECTpublic: explicit Widget(QWidget *parent = 0); Widget();private: Ui:Widget *ui; double sumInMemory; double sumSoFar; double factorSoFar; bool waitingForOperand; QString pendingAdditiveOperator; QString pendingMultiplicativeOperator; public slots: void digitClicked(); void clearall(); void point(); void additiveOperatorClicked(); void multiplicativeOperatorClicked(); void abortOperation(); void equalClicked(); void sqrClicked(); void squareClicked(); void backspaceClicked(); bool calculate(double rightOperand, const QString &pendingOperator);#endif / WIDGET_HWidget.cpp:#include widget.h#include ui_widget.hWidget:Widget(QWidget *parent) :QWidget(parent),ui(new Ui:Widget) this-move(190,60); ui-setupUi(this); sumInMemory = 0.0; sumSoFar = 0.0; factorSoFar = 0.0; waitingForOperand = true; pendingAdditiveOperator.clear(); pendingMultiplicativeOperator.clear(); ui-display-setText(0); connect(ui-bnt_0,SIGNAL(clicked(),this,SLOT(digitClicked(); connect(ui-bnt_1,SIGNAL(clicked(),this,SLOT(digitClicked(); connect(ui-bnt_2,SIGNAL(clicked(),this,SLOT(digitClicked(); connect(ui-bnt_3,SIGNAL(clicked(),this,SLOT(digitClicked(); connect(ui-bnt_4,SIGNAL(clicked(),this,SLOT(digitClicked(); connect(ui-bnt_5,SIGNAL(clicked(),this,SLOT(digitClicked(); connect(ui-bnt_6,SIGNAL(clicked(),this,SLOT(digitClicked(); connect(ui-bnt_7,SIGNAL(clicked(),this,SLOT(digitClicked(); connect(ui-bnt_8,SIGNAL(clicked(),this,SLOT(digitClicked(); connect(ui-bnt_9,SIGNAL(clicked(),this,SLOT(digitClicked(); connect(ui-bnt_c,SIGNAL(clicked(),this,SLOT(clearall(); connect(ui-bnt_op,SIGNAL(clicked(),this,SLOT(point(); connect(ui-bnt_ad,SIGNAL(clicked(),this,SLOT(additiveOperatorClicked(); connect(ui-bnt_su,SIGNAL(clicked(),this,SLOT(additiveOperatorClicked(); connect(ui-bnt_mu,SIGNAL(clicked(),this,SLOT(multiplicativeOperatorClicked(); connect(ui-bnt_di,SIGNAL(clicked(),this,SLOT(multiplicativeOperatorClicked(); connect(ui-bnt_eq,SIGNAL(clicked(),this,SLOT(equalClicked(); connect(ui-bnt_sqr,SIGNAL(clicked(),this,SLOT(sqrClicked(); connect(ui-bnt_squ,SIGNAL(clicked(),this,SLOT(squareClicked(); connect(ui-bnt_back,SIGNAL(clicked(),this,SLOT(backspaceClicked();Widget:Widget() delete ui;void Widget:digitClicked() QPushButton *clickedButton = qobject_cast(sender(); int digitValue = clickedButton-text().toInt(); if (ui-display-text() = 0 & digitValue = 0.0) return; if (waitingForOperand) ui-display-clear(); waitingForOperand = false; ui-display-setText(ui-display-text() + QString:number(digitValue);void Widget:clearall() sumInMemory = 0.0; sumSoFar = 0.0; factorSoFar = 0.0; waitingForOperand = true; pendingAdditiveOperator.clear(); pendingMultiplicativeOperator.clear(); ui-display-setText(0);void Widget:point() if (waitingForOperand) ui-display-setText(0); if (!ui-display-text().contains(.) ui-display-setText(ui-display-text() + tr(.); waitingForOperand = false;void Widget:additiveOperatorClicked() QPushButton *clickedButton = qobject_cast(sender(); QString clickedOperator = clickedButton-text(); double operand = 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;bool Widget:calculate(double rightOperand, const QString &pendingOperator) if (pendingOperator = tr(+) sumSoFar += rightOperand; else if (pendingOperator = tr(-) sumSoFar -= rightOperand; else if (pendingOperator = tr(*) factorSoFar *= rightOperand; else if (pendingOperator = tr(/) if (rightOperand = 0.0) pendingAdditiveOperator.clear(); pendingMultiplicativeOperator.clear(); sumSoFar = 0; factorSoFar = 0; sumInMemory = 0; return false; factorSoFar /= rightOperand; return true;void Widget:multiplicativeOperatorClicked() QPushButton *clickedButton = qobject_cast(sender(); QString clickedOperator = clickedButton-text(); double operand = ui-display-text().toDouble(); i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论