ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:111.04KB ,
资源ID:6475227      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6475227.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(课程设计模拟计算器设计.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

课程设计模拟计算器设计.docx

1、课程设计模拟计算器设计嵌入式课程设计 课题: 基于uCOS/uCGUI的模拟计算器实现 报告: 张昌世 自动化091 109031027小组成员:刘锋 自动化091 109031023陈奇英 自动化091 109031001彭桂贤 自动化091 109031002指导老师:陈才摘要:计算器这一小小的程序机器实际上是从计算机中割裂出来的衍生品,但因其方便快捷的操作模式,已经被广泛应用于工程、学习、商业等日常生活中,极大的方便了人们对于数字的整合运算。 现今的计算器已经不仅仅停留在传统的硬件上,而是越来越软件化,它可以在手机里,在电脑上,在许许多的的电子产品上。所以有必要在自己平时学习的开发板上做

2、个带界面显示的计算器来证明下自己的能力。引言:简单的计算器包括09的数字输入键,小数点输入键,+、-*、/、=运算键等,还可以加入其他运算:如三角运算(sin,cos,tan,cot等),一些当木运算(平方,开方,阶乘等)。由于条件和能力有限,所以就做个能实现四则运算的简易计算器。计算器的程序设计实际上富有一定的难度,虽然乍一想很简单,只要实现下加减乘除运算,然后显示出来就可以了,但实际上运算结果跟图像界面的数据交换,还有浮点数的处理等都很折腾人。通过本次设计,体会到了学习的不易,还有自己能力上的不足!1、课题描述:在STM32开发板上实现简易的计算器。计算器界面显示在TFT彩屏上,采用触摸屏

3、上模拟按钮来实现数据及运算符的输入。最后把运算的结果显示在彩屏。最基本要求:有加减乘除运算,有带小数点的运算。2、课题分析a)、硬件要求:处理器选择:STM32F103ZE,这款处理器具有512K的flash,64K的RAM,足够大的空间,可以让程序员的可以有更大的发挥空间,而不用为节省空间而上脑筋。TFT彩屏:带触摸的TFT彩屏,3.2寸,分辨为240*320的真彩彩屏。JLink仿真器:使用JLink v8仿真器,仿真器能够下载程序、在线仿真,便于程序编写与错误检查。b)、软件要求:操作系统:使用uC/OS嵌入式实时操作系统。由于触屏要实时响应,所以需要使用操作系统,并给触屏专门建立一个任

4、务。CPU其他的操作组成一个任务。程序在两个任务中相互切换。图形软件:使用uCGUI嵌入式图形界面软件。uCGUI是个小型的图形软件,包括有基本的图形显示,还有许多图形控件,如:按钮,编辑框,窗口,滚动条等等,而我们的计算器的制作就要用到其中的按钮、编辑框和窗口3个控件。固件库:STM32编程,可以使用固件库,ST公司提供STM32处理器的固件库,以方便程序员编程,缩短了项目的编程周期。c)、设计方案:界面布局:1个编辑框:位于彩屏左上角,占整屏的1/5左右,用于数据输入显示,运算符的输入显示。编辑框内最大输入和显示的长度为10,这就限制了数据的范围。11个数子按钮:位于左下角开始向上向右的按

5、钮队列,分别为:1,2,3,4,5,6,7,8,9,0,.。可以输入操作者任意想要的数据,进行运算。6个运算符按钮:位于屏幕偏右的数来第一列和第二列的位子上。实现加减乘除倒数平方6个运算,对应的按钮分别为:+,-,*,/,1/X,X2。2个操作按钮:位于屏幕右侧数来第一列的位子上。功能分别为等号和清楚。对应着=和clear两个按钮。等号得到计算得到的结果,清除键清楚编辑框上的数字和取消当前运算操作的功能1个说明按钮:位于屏幕的右上角。对应About按钮,点击该按钮,就会跳出一个对话框,上面显示本课程设计的小组成员们名字。1个对话框:当点击About按钮时,就会跳出来,对话框上显示四个课程设计小

6、组成员的姓名,还有一个“OK“按钮,点击“OK”按钮就会结束当前的对话框,关闭对话框。 功能说明:1、 数字键被按下去时,在编辑框内显示输入的数,这里需要注意的是,编辑框内的内容时字符串的形式,例如按下12时,并不是表示数字12,而是字符串“12”,先是按下1键,再按下2键,按下第二个键的时候不能将编辑框的第一个数覆盖掉,而是要接到第一个数后面。2、当运算符按钮被按下时,把按下去之前的编辑框的字符串转化成负浮点数形式保存在var中,然后将编辑框显示+,如果运算符被按下了两次,表示之前已经有两个变量要进行了计算,直接显示结算结果。3、当按下1/X,和X2时,并不增加变量的个数,只是将原先变量运算

7、后的结果覆盖原先变量,参加后续的计算。4、按下About键是,会跳出一个对话框,该对话框支持移动,故可以将其拖到屏幕任意位子,点下对话框上的OK键,就会关闭对话框。之后再点下About键后对话框优惠弹出来。3、相关介绍说明a)、STM32F103ZT6E介绍:ARM 32位Cortex-M3 微处理器,72MHz频率, 512kB Flash, 64kB SRAM,灵活的静态 存储器控制器存储器:SRAM, PSRAM, NOR 和NAND Flash,PLL, 内置的RC正当频 率为8MHz 和32kHz, 实时时钟,嵌套中断控制器, 节电模式, JTAG 和SWD两种模 式,4个同步16位

8、计时器与输入捕获, 输出比较和PWM波,2个16位的高级定时器, 2 个16位的基本定时器, 2 个16位的看门狗定时器,系统时钟定时器, 3个SPI/I2S模块, 2 个I2C模块, 5个USART模块, 一个USB 2.0 全速接口,一个CAN 2.0B Active, 3个112 位16通道A/D 控制器, 2个12位的D/A 控制器, 1个SDIO接口, 快速的I/O 口。b)、uCOS介绍:C/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操 作系统内核。它被广泛应用于微处理器、微控制器和数字信号处理器。C/OS-II的前身是C/OS,最早出自于1992 年

9、美国嵌入式系统专家Jean J.Labrosse 在嵌入式系统编程杂志的5 月和6 月刊上刊登的文章连载,并把C/OS的源码发布在该杂志的B B S 上。C/OS 和C/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将C/OS-II嵌入到开发的产品中。C/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点, 最小内核可编译至 2KB 。C/OS-

10、II 已经移植到了几乎所有知名的CPU 上。严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的 可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。 uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提 供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。 uC/OS-II以源代码的形式发布,但并不意味着它是开源软件。你可以将其用于教学和 私下研究(peaceful re

11、search);但是如果你将其用于商业用途,那么你必须通过Micrium获得商用许可。 c)、uCGUI简介UCGUI是一种嵌入式应用中的图形支持系统。它设计用于为任何使用LCD图形显示 的应用提供高效的独立于处理器及LCD控制器的图形用户接口,它适用单任务或是多任务系统环境, 并适用于任意LCD控制器和CPU下任何尺寸的真实显示或虚拟显 示。它的设计架构是模块化的,由不同的模块中的不同层组成,由一个LCD驱动层来包含所有对LCD的具体图形操作。 UCGUI可以在任何的CPU上运行,因为它是 100%的标准C代码编写的。UCGUI能够适应大多数的使用黑白或彩色LCD的应 用,它提供非常好的允许

12、处理灰度的颜色管理。还提供一个可扩展的2D图形库及占 用极少RAM的窗口管理体系。 UCGUI的设计目标是为使用LCD作为图形显示装置的应用提供高效的/与LCD控制器独立及处理器独立的图形用户接口。它适合于单任务环境及多任务环境,如私用的操作系统或是商业的RTOS(实时操做系统。UCGUI以C源码形式提供, 并适用于任意LCD控制器和CPU下任何尺寸的真实显示或虚拟显示。它包含以下特性:1 适用任何8/16/32位CPU, 只要有相对应的标准C编译器.2 任何的控制器的LCD显示器(单色,灰度,颜色), 只要有适合的LCD驱动可 用.3 在小模式显示时无须LCD控制器.4 所有接口支持使用宏进

13、行配制.5 显示尺寸 可定制.6 字符和位图可在LCD显示器上的任意起点显示,并不仅局限于偶数对齐 的地址起点.7 程序在大小和速度上都进行了优化.8 编译时允许进行不同的优化.、9 对于缓慢一些的LCD控制器, LCD显存可以映射到内存当中, 从而减 少访问次数到最小并达到更高的显示速度.10清晰的设计架构.11支持虚拟 显示, 虚拟显示可以比实际尺寸大(即放大). 四、代码分析a)、uCOS部分代码建立两个任务/*OS两个任务堆栈区*/OS_STK MainTask1StkMAXSTKSIZE;OS_STK Task1StkMAXSTKSIZE;/*两个任务函数*/void MainTas

14、k1(void *pdata);void Task1(void *pdata);/*主函数,建立两个任务*/int main() OSInit(); /OS初始化 OSTaskCreate(MainTask1,(void *)0,&MainTask1StkMAXSTKSIZE-1,1); /建立任务 OSTaskCreate(Task1,(void *)0,&Task1StkMAXSTKSIZE-1,2); OSStart();/*任务一:初始化板子,初始化液晶,建立计算器图像界面*/void MainTask1(void *pdata) pdata=pdata; BSP_Init(); /硬

15、件初始化 GUI_Init(); /GUI初始化 GUI_SetBkColor(GUI_BLACK); /设置彩屏背景颜色为黑色 GUI_Clear(); GUI_TOUCH_Calibrate(0,0,320,296,3854); GUI_TOUCH_Calibrate(1,0,240,249,3906); /屏幕校准/ GUI_CURSOR_Show(); /显示光标 WidgetCreate(); /建立控件 GUI_Exec(); /显示控件 for(;) KeyCallback(edit); /响应控件 /*任务二:专门为触屏和控件的更新而建立的任务*/void Task1(void

16、 *pdata) pdata=pdata; for(;) WM_Exec(); /更新窗口 GUI_TOUCH_Exec(); /更新触屏 OSTimeDly(10); b)、计算器图形界面的相关代码/*GUI相关变量*/EDIT_Handle edit;BUTTON_Handle num0,num1,num2,num3,num4,num5,num6,num7,num8,num9;/数字09,BUTTON_Handle numPoint,numPlus,numSub,numMul,numDiv;/小数点,加号,减号,除号,乘号BUTTON_Handle clear,inverse,square

17、,equal,about; /清除,倒数,平方,等于/*图形界面函数*/void WidgetCreate(void) /*画计算器边框*/ GUI_SetPenSize(3); /设置之前宽度为3个像素 GUI_SetColor(GUI_RED); /设置边框颜色为红色 GUI_DrawLine(7,0,7,239); /画边框 GUI_DrawLine(311,0,311,239); GUI_DrawLine(7,238,311,238); GUI_DrawLine(7,1,311,1); edit=EDIT_Create(15,5,225,50,e,10,WM_CF_SHOW);/创建编

18、辑框 EDIT_SetFont(edit,&GUI_Font32B_ASCII); /设置编辑框内容字体大小 num7=BUTTON_Create(15,60,50,35,7,WM_CF_SHOW);/创建数字7的按钮 BUTTON_SetFont(num7,&GUI_Font24_ASCII); /设置字体24号 BUTTON_SetText(num7,7); /按钮上显示7 BUTTON_SetTextColor(num7,0,GUI_WHITE); /设置字体颜色 BUTTON_SetBkColor(num7,0,GUI_DARKBLUE); /设置按钮背景颜色 num4=BUTTON_

19、Create(15,105,50,35,4,WM_CF_SHOW);/创建数字4的按钮 BUTTON_SetFont(num4,&GUI_Font24_ASCII); BUTTON_SetText(num4,4); BUTTON_SetTextColor(num4,0,GUI_WHITE); BUTTON_SetBkColor(num4,0,GUI_DARKBLUE); num1=BUTTON_Create(15,150,50,35,1,WM_CF_SHOW); /创建数字1的按钮 BUTTON_SetFont(num1,&GUI_Font24_ASCII); BUTTON_SetText(n

20、um1,1); BUTTON_SetTextColor(num1,0,GUI_WHITE); BUTTON_SetBkColor(num1,0,GUI_DARKBLUE); num0=BUTTON_Create(15,195,110,35,0,WM_CF_SHOW);/创建数字0的按钮 BUTTON_SetFont(num0,&GUI_Font24_ASCII); BUTTON_SetText(num0,0); BUTTON_SetTextColor(num0,0,GUI_WHITE); BUTTON_SetBkColor(num0,0,GUI_DARKBLUE); num8=BUTTON_C

21、reate(74,60,50,35,8,WM_CF_SHOW); /创建数字8的按钮 BUTTON_SetFont(num8,&GUI_Font24_ASCII); BUTTON_SetText(num8,8); BUTTON_SetTextColor(num8,0,GUI_WHITE); BUTTON_SetBkColor(num8,0,GUI_DARKBLUE); num5=BUTTON_Create(74,105,50,35,5,WM_CF_SHOW); /创建数字5的按钮 BUTTON_SetFont(num5,&GUI_Font24_ASCII); BUTTON_SetText(nu

22、m5,5); BUTTON_SetTextColor(num5,0,GUI_WHITE); BUTTON_SetBkColor(num5,0,GUI_DARKBLUE); num2=BUTTON_Create(74,150,50,35,2,WM_CF_SHOW); /创建数字2的按钮 BUTTON_SetFont(num2,&GUI_Font24_ASCII); BUTTON_SetText(num2,2); BUTTON_SetTextColor(num2,0,GUI_WHITE); BUTTON_SetBkColor(num2,0,GUI_DARKBLUE); num9=BUTTON_Cr

23、eate(133,60,50,35,9,WM_CF_SHOW); /创建数字9的按钮 BUTTON_SetFont(num9,&GUI_Font24_ASCII); BUTTON_SetText(num9,9); BUTTON_SetTextColor(num9,0,GUI_WHITE); BUTTON_SetBkColor(num9,0,GUI_DARKBLUE); num6=BUTTON_Create(133,105,50,35,6,WM_CF_SHOW);/创建数字6的按钮 BUTTON_SetFont(num6,&GUI_Font24_ASCII); BUTTON_SetText(nu

24、m6,6); BUTTON_SetTextColor(num6,0,GUI_WHITE); BUTTON_SetBkColor(num6,0,GUI_DARKBLUE); num3=BUTTON_Create(133,150,50,35,3,WM_CF_SHOW); /创建数字3的按钮 BUTTON_SetFont(num3,&GUI_Font24_ASCII); BUTTON_SetText(num3,3); BUTTON_SetTextColor(num3,0,GUI_WHITE); BUTTON_SetBkColor(num3,0,GUI_DARKBLUE); numPoint=BUTT

25、ON_Create(133,195,50,35,.,WM_CF_SHOW);/创建小数点.的按钮 BUTTON_SetFont(numPoint,&GUI_Font24_ASCII); BUTTON_SetText(numPoint,.); BUTTON_SetTextColor(numPoint,0,GUI_WHITE); BUTTON_SetBkColor(numPoint,0,GUI_DARKBLUE); numDiv=BUTTON_Create(192,60,50,35,/,WM_CF_SHOW);/创建除号/的按钮 BUTTON_SetFont(numDiv,&GUI_Font24_

26、ASCII); BUTTON_SetText(numDiv,/); numMul=BUTTON_Create(192,105,50,35,*,WM_CF_SHOW);/创建乘号*的按钮 BUTTON_SetFont(numMul,&GUI_Font24_ASCII); BUTTON_SetText(numMul,*); numSub=BUTTON_Create(192,150,50,35,-,WM_CF_SHOW);/创建减号-的按钮 BUTTON_SetFont(numSub,&GUI_Font24_ASCII); BUTTON_SetText(numSub,-); numPlus=BUTT

27、ON_Create(192,195,50,35,+,WM_CF_SHOW); /创建加好+的按钮 BUTTON_SetFont(numPlus,&GUI_Font24_ASCII); BUTTON_SetText(numPlus,+); clear=BUTTON_Create(251,60,50,35,c,WM_CF_SHOW); /创建清除键clear的按钮 BUTTON_SetFont(clear,&GUI_Font24_ASCII); BUTTON_SetText(clear,clear); BUTTON_SetBkColor(clear,0,GUI_YELLOW); inverse=B

28、UTTON_Create(251,105,50,35,i,WM_CF_SHOW); /创建倒数1/X的按钮 BUTTON_SetFont(inverse,&GUI_Font24_ASCII); BUTTON_SetText(inverse,1/X); square=BUTTON_Create(251,150,50,35,s,WM_CF_SHOW);/创建平方X2的按钮 BUTTON_SetFont(square,&GUI_Font24_ASCII); BUTTON_SetText(square,X2); equal=BUTTON_Create(251,195,50,35,=,WM_CF_SHO

29、W);/创建等号=的按钮 BUTTON_SetFont(equal,&GUI_Font24_ASCII); BUTTON_SetText(equal,=); BUTTON_SetBkColor(equal,0,GUI_YELLOW); about=BUTTON_Create(249,20,57,30,a,WM_CF_SHOW); /创建说明信息about的按钮 BUTTON_SetFont(about,&GUI_Font24_ASCII); BUTTON_SetText(about,About); BUTTON_SetBkColor(about,0,GUI_LIGHTGRAY);c)、按键响应

30、代码/*按钮响应函数*/void KeyCallback(EDIT_Handle obj) /*重画边框,因为控件在最上层,会把下层的图案覆盖掉*/ GUI_SetPenSize(3); GUI_SetColor(GUI_RED); GUI_DrawLine(7,0,7,239); GUI_DrawLine(311,0,311,239); GUI_DrawLine(7,238,311,238); GUI_DrawLine(7,1,311,1); switch (GUI_WaitKey() case 0: if(operaFlag=1) /如果是刚操作完运算符号后的数,先把编辑框清掉 EDIT_SetText(obj,NULL); operaFlag=0; EDIT_GetText(obj,editBuf,10); if(*editBuf!=0) /保证不会出现001这样的情况

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1