《基于STM32的简易电子计算器设计与实现(共26页).doc》由会员分享,可在线阅读,更多相关《基于STM32的简易电子计算器设计与实现(共26页).doc(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上四川师范大学成都学院通信工程学院基于STM32的简易电子计算器设计与实现-实验综合设计报告 学生姓名陶龑学 号所在学院通信工程学院专业名称嵌入式系统课程设计班 级2014级软件班指导教师刘强成 绩 四川师范大学成都学院二一六年十一月专心-专注-专业基于STM32的简易电子计算器设计与实现内容摘要:电子计算器即将传统意义上的计算器进行电子化和数字化,为其减少时间误差和体积,并提供更多的扩展实用功能,从而使电子计算器的应用更加广泛。在经过资料的查找与收集后,本论文以该理念设计了一款基于STM32芯片作为核心控制器,使用Keil5平台,以C语言为基础进行软件编程的简易电子计
2、算器,其内在TFT-LCD液晶屏进行输出,以四个按键进行输入,从而实现显示输入数据以及加减乘除运算的基本功能。通过软件程序的编写、硬件电路原理的实现、电子计算器正常工作的流程、原理图仿真实现、硬件实物的安装制作与硬件实物的调试过程,该简易电子计算器现可用于日常生活和工作中。关键词:简易电子计算器 STM32 C语言 Keil5Design and implementation of Multi Function Electronic Clock based on STM32Abstract: The traditional electronic calculator calculator fo
3、r electronic and digital, to reduce the time error and volume, and provide more extended utility function, so that the more extensive application of electronic calculators. After searching and collecting data, in this paper, the concept of a design based on STM32 chip as the core controller, using K
4、eil5 platform, simple electronic calculator based on C language software programming, the TFT-LCD LCD screen for input and output, with four keys, so as to realize the display of input data and the basic the function of add, subtract, multiply and divide operations.Through the software program, hard
5、ware circuit principle of the electronic calculator realization, normal work process and the principle of graph simulation, hardware installation and hardware debugging process, the simple electronic calculator is used in daily life and work.Key words: Simple electronic calculator STM32 language C K
6、eil5 目 录基于STM32的简易电子计算器设计与实现前 言最早的计算工具诞生在中国。中国古代最早采用的一种计算工具叫筹策,又被叫做算筹。这种算筹多用竹子制成,也有用木头、兽骨充当材料的,约二百七十枚一束,放在布袋里可随身携带。直到今天仍在使用的珠算盘,是中国古代计算工具领域中的另一项发明,明代时的珠算盘已经与现代的珠算盘几乎相同。17世纪初,西方国家的计算工具有了较大的发展。英国数学家纳皮尔发明了“纳皮尔算筹”,英国牧师奥却德发明了圆柱形对数计算尺,这种计算尺不仅能做加减乘除、乘方、开方运算,甚至可以计算三角函数、指数函数和对数函数。这些计算工具为现代计算器的发展奠定了良好的基础。1642
7、年,年仅19岁的法国伟大科学家帕斯卡引用算盘的原理,发明了第一部机械式计算器。在他的计算器中有一些互相联锁的齿轮,一个转过十位的齿轮会使另一个齿轮转过一位,人们可以像拨电话号码盘那样,把数字拨进去,计算结果就会出现在另一个窗口中,但是只能做加减计算。1694年,莱布尼兹在德国将其改进成可以进行乘除的计算。此后,到了20世纪50年代末,电子计算器问世。而现在我们所说的计算器一般是指“电子计算器”,该名词由日文传入中国。计算器是能进行数学运算的手持机器,拥有集成电路芯片,结构简单,功能较弱,但由于它使用方便、操作简单、价格低廉,因而广泛运用于商业交易中,也是必备的办公用品之一。随着电子技术的飞速发
8、展,为了进行大量的运算,电子计算器应用于各个领域,从而使电子计算器的应用更为广泛,不仅改变传统意义的手持计算器功能,使计算器支持彩屏的显示,界面更友好,可扩展性能更强,为生活和工作带来了便捷。本设计的简易电子计算器以STM32微控制器芯片作为核心控制器,由于其基于ARM Cortex-M3处理器,可用于满足大部分通用型应用的需求,故选用STM32。具体需要硬件的调试以及软件程序的编写和实现来完成。1 设计要求l 具有通过四个按键来选择的功能; l 具有彩屏显示以及界面功能;l 具有显示输入的第一位数字和第二位数字的功能; l 具有除法保留小数位数的功能;l 具有基本的加减乘除功能;2 设计目的
9、与作用设计目的:简易电子计算器设计首要的工作是结合以往所学C语言的编写理论和编写规则来编写简易电子计算器的软件部分,编写时要结合STM32开发板的管脚功能和其他硬件电路,如输入模块和TFT-LCD液晶显示屏。利用开发板硬件电路实现软硬件结合,能够掌握简易电子计算器的设计、组装与调试方法。设计作用:通过对简易电子计算器的设计与实现,巩固和加深嵌入式系统应用的知识面,更近一步了解STM32的具体使用,并能够掌握简易电子计算器的设计思路,提高及灵活运用所学知识。在设计与实现的过程中,熟悉软硬件设计的方法、内容及步骤,提高动手实践能力、提高科学的思维能力,对于论文的编写,培养书写综合实验报告的能力。3
10、 所用设备及软件本次设计采用的设备为STM32开发板,以及keil MDK软件和C语言的编写。4 系统设计方案4.1 系统总体设计本设计采用意法半导体基于Cortex-M3的STM32F103,意法半导体的板子具有良好的性价比、低功耗、易开发等特点,而且其体系和架构资料丰富,用它能够快速的开发出整个系统。显示屏的选择,现有的液晶显示屏的种类很多,本设计选用的是2.8寸带触摸的彩屏,分辨率为320x240,支持16位色,这个就足够本设计使用了。可把数据利用软件来进行处理,从而把数据传输到LCD液晶显示模块,实现简易电子计算器用户操作界面的显示,在开发板上可使用四个独立按键进行光标上下左右的移动,
11、根据软件程序的设置,开发板加减乘数的计算功能。系统整体框图如图4.1所示: STM32电源简易电子计算器电路复位电路蜂鸣器电路串口电路LCD液晶显示模块独立按键处理模块图4.1 系统整体框图4.2 简要阐述系统工作原理整个系统用STM32单片机作为中央控制器,由单片机执行采集内部RTC值,简易电子计算器信号通过单片机I/O传给LCD显示屏,单片机模块控制驱动模块驱动显示模块,通过显示模块来实现信号的输出、LCD显示屏的显示及相关的控制功能。系统设有按键模块用于对数字进行调整。系统流程图如图4.2所示:图4.2 系统流程图5 系统硬件设计5.1 系统整体设计本数字简易电子计算器设计计时采用开发板
12、自带RTC模块,使用4个独立按键实现对时间的调整,1个按键进行复位操作,蜂鸣器对于整点报时及闹铃进行响应。系统总体结构电路原理图见附录2。5.2 各单元电路设计该多功能数字简易电子计算器电路原理设计是基于最小系统包括电源电路、复位电路、按键电路、计算电路、LCD液晶显示电路、蜂鸣器电路、串口电路。5.2.1 电源电路本数字简易电子计算器设计使用开发板配置的数据线与电脑USB接口直接连接进行通电,作为硬件电路电源。电源电路图如图5.2.1所示:图5.2.1 电源电路图5.2.2 LCD液晶显示电路本数字简易电子计算器设计所需显示屏为TFT-LCD液晶显示屏,通过软硬件的结合,可实现计算及数字的显
13、示。LCD液晶显示电路图如图5.2.2所示:图5.2.2 LCD液晶显示电路图5.2.3 简易电子计算器电路本数字简易电子计算器显示采用STM32自带RTC模块,RTC模块拥有一组连续计数的计数器,通过软件的编写,可实现简易电子计算器的功能,在系统复位或待机唤醒后,简易电子计算器电路图如图5.2.3所示:图5.2.3 简易电子计算器电路图5.2.4 按键电路本数字简易电子计算器设计四个按键用于进行显示时间的调整,芯片的4个I/O口与开发板的独立按键直接相连,通过软件编写,芯片可控制按键的开关,以达到时间调整的要求。按键电路图如图5.2.4所示:图5.2.4 按键电路图5.2.5 蜂鸣器电路本数
14、字简易电子计算器设计可进行整点报时与闹铃的功能,经过软硬件的结合,由软件指使芯片控制蜂鸣器的响应。电路图如图5.2.5所示:图5.2.5 蜂鸣器电路图5.2.6 复位电路本数字简易电子计算器设计一个按键用于对整个程序及硬件进行重新复位的功能,以芯片与按键和其他部件组成的复位电路直接相连。复位电路图如图5.2.6所示:图5.2.6 复位电路图5.2.7 串口电路本数字简易电子计算器所用STM32开发板支持USB下载,由USB转串口TTL电路进行自动下载控制,由此可将程序下载于开发板上。串口电路图如图5.2.7所示:图5.2.7 串口电路图6 系统软件设计整个软件系统采用模块化思想,将TFT-LC
15、D液晶屏和RTC实时简易电子计算器分别集成一体,使程序模块化,结构层次分明。本设计的软件系统分为五个部分:TFT-LCD显示子程序、整点闹铃子程序、电子计算器子程序和按键处理子程序。6.1 主程序设计本文所设计的简易电子计算器的在系统最初开始主程序扫描,由最初的显示子程序初始化,在使用计算器计算时,需要判断当前是采用加减乘除哪种运算,在程序中通过当手指触摸到其中一个运算符号(如“+”),使用一个标识位来进行标识,然后在进行运算时候,通过这个标识位来判断是进行哪种运算。最后在运算完成之后,清除相应的标志位,以免影响下一次判断。,蜂鸣器进行相应操作,之后进入按键扫描,判断按键是否有变动,并进行实现
16、相应的功能,最后返回主程序重新一次扫描,主程序流程图如下图6.1所示:实时简易电子计算器数据处理模块开始显示模块初始化按键处理模块图6.1 主程序流程图在通电后将初始化后的时分秒和年月日调入显示子程序中,依次开始调用实时简易电子计算器万年历子程序、整点闹铃子程序和按键处理子程序,在所有子程序调用完成后,返回程序开始循环运行。6.2 子程序设计在主程序的调用下根据不同的子程序模块功能进行编写,其中包括显示模块,按键处理模块,实时简易电子计算器万年历模块,整点闹铃模块等。6.2.1 显示模块使用TFT-LCD显示屏显示,编程实现功能简洁,将RTC实时简易电子计算器的数据送入LCD中进行显示,显示内
17、容包含背景界面,以及加减乘除等选项。显示子程序流程图如下图6.2.1所示:初始化显示背景显示界面显示当前选项开始图6.2.1 显示子程序流程图6.2.2 按键处理模块该子程序进行按键处理的功能判断分别对加减乘除等运算法则等进行调整,在正常情况下S1和S2分别是控制界面选择的上下左右选项,而S3键位是确认当前的所选择的操作,为了方面用户使用和理解,并没有使用S4键位,该流程图如图6.2.2所示:NNN按下S4键?按下S3键?按下S2键?按下S1键?开始退出N上下移动操作Y左右移动操作Y执行相应功能Y不用Y图6.2.2 按键处理模块流程图6.2.3 实时简易电子计算器万年历模块该子程序需要对加减乘
18、除等运算过程的读写操作,在串口通信时对时序要求比较高,需保证传输的连续性,不允许出现中断,利用RTC计算两次数据的走针。该流程图如图6.2.3所示:图6.2.3 实时简易电子计算模块流程图7 仿真调试分析该论文是用STM32开发板实现软硬件的结合,分别对软件与硬件进行调试,其中硬件主要通过在开发板上进行显示电路与按键电路的调试,软件通过keil MDK进行调试。硬件调试:使用STM32开发板,为其通电,查看电源电路是否正常;成功开机后,查看显示电路是否正常;连接USB口,查看串口电路是否正常;根据时间走针判断简易电子计算器电路是否正常;通过独立按键的相应操作,查看功能是否正确,由此判断独立按键
19、处理电路是否正常;操作复位键,查看复位电路是否正常。经过所有测试,电路均正常。软件调试:因在硬件调试中,结合软硬件,已完成显示子程序、实时简易电子计算器万年历子程序和按键处理子程序的调试,只需完成余下整点闹铃子程序的调试,通过实时简易电子计算器万年历子程序调整时间为整点前一分钟,设置成功后,等待一分钟后,判断蜂鸣器是否相应,由此判断整点闹铃子程序能否正常运行。最终经过测试,该子程序能正常运行。8 设计中的问题及解决方法在本次设计中出现过几次小Bug,具体如下:l 第一个问题:同时按下S1与S2按键时,无法正常使用按键解决办法:在Keil软件中的调试工具,发现在main函数中无法调用选择数字的子
20、程序,通过函数外部调用,问题成功解决。l 第二个问题:从编辑框获取文本存储失败。这个问题产生的原因,是在我从编辑框内读取数据之前,有个if()语句,如满足条件,清除编辑框的内容,从而当我再次读取编辑框的内容就为空了,当然什么数据也存储不了了。l 第三个问题:字符串转化成浮点数和浮点数转化成字符串的问题。这两个功能都有相对的库函数中的相干函数可以实现,但是奇怪的是,我调用这些函数,单独直接用的时候都OK的,但是如果多几个传递参数,就完全失效了。找了N久的转化函数,统统没有用,到最后,只能自己写算法来实现,花了很多时间来写、验证、完善。l 第四个问题:碰到浮点数减整数,得到的小数点与原先的小数点不
21、相等。当然如:4.2-4=0.2,但是我们定义float a=4,2,则小数为a-(int)a,得到的小数部位0.2,而是为0.之列的,这里就涉及到个类型之间的转化存在丢失部分数据的问题。这是我超级郁闷的地方。想了很多种办法多没有解决。最后只能选择效果最好的一种:就是小数点=(a*-(int)a*)/,这种方法虽然没有本质上解决问题,但是效果好多了。9 学习心得本次课程设计是用STM32单片机及接口电路设计一个简易电子计算器,经过两个星期的调试,结果满足设计要求,验证无误通过单片机硬件电路的调试,实现了预先设定的功能。设计主要用到了多种芯片,程序也比较长比较麻烦,同时也遇到了不少困难,尤其是关
22、于按键处理模块分配的设计实现。关于显示模块,在以前的实验中做过,所以问题很容易解决。在调试电路的过程中也积累了一些宝贵的经验。将理论与实践相结合从而提高自己的实际动手能力和独立思考的能力。这次的课程设计还让我学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。更重要的是,我在这一设计与调试过程中,遇见过乱码,开发板无法显示等问题,一点点去了解,一点点去解决。我在这其中学会了坚持不懈,不轻言放弃。同时还要感谢在我遇见困难时给予我帮助和指导的老师与同学。附 录附录1:主程序代码while(1)KEY_task(); /按键修改时间 Update_Date(); /获取时间Adjust_R
23、X_Buffer(); /处理来自串口的数据get_zb = zuobiao(); get_num = getnum(); for(i = 0, j = 20, k = 53; i 10; i+) /如果i的值等于坐标的值,则显示红色 if(i % 4 = 0 & i != 0) j = 20; k += 37; printf(n); if(get_zb = i) sprintf(Buff,%d,i); GUI_CNCH16_string(j,k,(u8 *)Buff,Red,White); j+=50; else sprintf(Buff,%d,i); GUI_CNCH16_string(j
24、,k,(u8 *)Buff,Black,White); j+=50; for(i = 10, j = 120, k = 127; i = 0 & zy = 0 & sx 3) sx +; else sx = 0; if(!S3) /按键选择Delay_nms(10);if(!S3)while(!S3);switch(zy + sx * 4) case 0:num = 0; break; case 1:num = 1; break; case 2:num = 2;break; case 3:num = 3; break; case 4:num = 4; break; case 5:num = 5
25、; break; case 6:num = 6; break; case 7:num = 7; break; case 8:num = 8; break; case 9:num = 9; break; case 10: num = 10; break; case 11: num = 11; break; case 12: num = 12; break; case 13: num = 13; break; case 14: num = 14; break; case 15: num = 15; break; if(fk = 0)flag = 1;else flag = 3;else /按下s4
26、时 if(num = 10 & num 14) /选择运算功能 switch(num) case 10:sum = num;fk = 1;sprintf(Buff,%d,cal(n1, n2, sum) ;break; case 11:sum = num;fk = 1;sprintf(Buff,%d,cal(n1, n2, sum) ;break; case 12:sum = num;fk = 1;sprintf(Buff,%d,cal(n1, n2, sum) ;break; case 13:sum = num;fk = 1;sprintf(Buff,%d,cal(n1, n2, sum)
27、;break;if(num 10 & flag = 3) /输入第一个数字和第二个数字 if(n2 = 0) n2 = num;else n2 = n2 * 10 + num; sprintf(Buff,%d,n2); GUI_CNCH16_string(215,145,(u8 *)Buff,Black,White);flag = 0;if(num = 14) n3 = cal(n1, n2, sum); sprintf(Buff,%.2f,n3); GUI_CNCH16_string(215,200,(u8 *)Buff,Black,White);if(num = 15) /数据清零 n1
28、= 0;n2 = 0;n3 = 0;fk = 0;sprintf(Buff,%s, ); GUI_CNCH16_string(215,80,(u8 *)Buff,Black,White);sprintf(Buff,%s, );GUI_CNCH16_string(215,145,(u8 *)Buff,Black,White);sprintf(Buff,%s, ); GUI_CNCH16_string(215,200,(u8 *)Buff,Black,White); /通过外部函数拿到选择的值,从而得到坐标值double cal(int a, int b, int c) switch(c) cas
29、e 10:return (a + b);case 11:return (a - b);case 12:return (a * b);case 13:return (double)a / b);int zuobiao() /拿到应该显示红色的图案的坐标 return (zy + sx * 4);int choose()/按键选择状态 return ch;int getnum()return num; 附录2:系统总体结构电路原理图参考文献1 向继文:基于AT89C51的电子钟系统设计,机电产片开发与创新,2007.2,P122 黄智伟,王彦:FPGA系统设计与实践,电子工业出版社,2005.1,
30、P53-653 彭小军:用单片机实现简易电子计算器,新余高专学报,2004.9,P54 康华光:电子技术基础模拟部分第四版,高等教育出版社,1999.65 周立功:ARM嵌入式系统基础教程,北京航空航天大学出版社,2005.16 罗浩:一种新的基于ARM的数据采集系统设计,信阳师范学院学报,2006.47 秦伟:基于ARM 处理器的数据采集系统的设计,自动化技术与应用,2006.108 杜春雷:ARM体系结构与编程.清华大学出版社,2003, P76-989 川师成都学院嵌入式系统教学团队:嵌入式系统实验及资料,201610 刘黎明:单片机与嵌入式系统应用,MICROCON TROLLER&EMBEDDED SYSTEM. 2002(7)11 李宁:ARM开发工具ReaIView MDK使用入门,北京航空航天大学出版社,200812 屈召贵,刘强,孙活:嵌入式系统原理及应用,电子科技大学出版社,P40-60成绩评定表学生姓名学生学号学生专业学生班级指导教师职 称设计题目评语评定成绩等级分数指导教师签字: 年 月 日说明:分数采用百分制,相应的等级为:优:90100:良:8089;中:7079;及格:6069;不及格:60分以下。