基于STM32的简易电子计算器设计与实现Word文档下载推荐.doc
《基于STM32的简易电子计算器设计与实现Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《基于STM32的简易电子计算器设计与实现Word文档下载推荐.doc(26页珍藏版)》请在冰点文库上搜索。
4系统设计方案 2
4.1系统总体设计 2
4.2简要阐述系统工作原理 3
5系统硬件设计 4
5.1系统整体设计 4
5.2各单元电路设计 4
5.2.1电源电路 4
5.2.2LCD液晶显示电路 4
5.2.3简易电子计算器电路 5
5.2.4按键电路 5
5.2.5蜂鸣器电路 5
5.2.6复位电路 6
5.2.7串口电路 6
6系统软件设计 6
6.1主程序设计 6
6.2子程序设计 7
6.2.1显示模块 7
6.2.2按键处理模块 8
6.2.3实时简易电子计算器万年历模块 8
7仿真调试分析 9
8设计中的问题及解决方法 10
9学习心得 10
附录 12
附录1:
主程序代码 12
附录2:
系统总体结构电路原理图 19
参考文献 20
前言
最早的计算工具诞生在中国。
中国古代最早采用的一种计算工具叫筹策,又被叫做算筹。
这种算筹多用竹子制成,也有用木头、兽骨充当材料的,约二百七十枚一束,放在布袋里可随身携带。
直到今天仍在使用的珠算盘,是中国古代计算工具领域中的另一项发明,明代时的珠算盘已经与现代的珠算盘几乎相同。
17世纪初,西方国家的计算工具有了较大的发展。
英国数学家纳皮尔发明了“纳皮尔算筹”,英国牧师奥却德发明了圆柱形对数计算尺,这种计算尺不仅能做加减乘除、乘方、开方运算,甚至可以计算三角函数、指数函数和对数函数。
这些计算工具为现代计算器的发展奠定了良好的基础。
1642年,年仅19岁的法国伟大科学家帕斯卡引用算盘的原理,发明了第一部机械式计算器。
在他的计算器中有一些互相联锁的齿轮,一个转过十位的齿轮会使另一个齿轮转过一位,人们可以像拨电话号码盘那样,把数字拨进去,计算结果就会出现在另一个窗口中,但是只能做加减计算。
1694年,莱布尼兹在德国将其改进成可以进行乘除的计算。
此后,到了20世纪50年代末,电子计算器问世。
而现在我们所说的计算器一般是指“电子计算器”,该名词由日文传入中国。
计算器是能进行数学运算的手持机器,拥有集成电路芯片,结构简单,功能较弱,但由于它使用方便、操作简单、价格低廉,因而广泛运用于商业交易中,也是必备的办公用品之一。
随着电子技术的飞速发展,为了进行大量的运算,电子计算器应用于各个领域,从而使电子计算器的应用更为广泛,不仅改变传统意义的手持计算器功能,使计算器支持彩屏的显示,界面更友好,可扩展性能更强,为生活和工作带来了便捷。
本设计的简易电子计算器以STM32微控制器芯片作为核心控制器,由于其基于ARMCortex-M3处理器,可用于满足大部分通用型应用的需求,故选用STM32。
具体需要硬件的调试以及软件程序的编写和实现来完成。
1设计要求
l具有通过四个按键来选择的功能;
l具有彩屏显示以及界面功能;
l具有显示输入的第一位数字和第二位数字的功能;
l具有除法保留小数位数的功能;
l具有基本的加减乘除功能;
2设计目的与作用
设计目的:
简易电子计算器设计首要的工作是结合以往所学C语言的编写理论和编写规则来编写简易电子计算器的软件部分,编写时要结合STM32开发板的管脚功能和其他硬件电路,如输入模块和TFT-LCD液晶显示屏。
利用开发板硬件电路实现软硬件结合,能够掌握简易电子计算器的设计、组装与调试方法。
设计作用:
通过对简易电子计算器的设计与实现,巩固和加深嵌入式系统应用的知识面,更近一步了解STM32的具体使用,并能够掌握简易电子计算器的设计思路,提高及灵活运用所学知识。
在设计与实现的过程中,熟悉软硬件设计的方法、内容及步骤,提高动手实践能力、提高科学的思维能力,对于论文的编写,培养书写综合实验报告的能力。
3所用设备及软件
本次设计采用的设备为STM32开发板,以及keilMDK软件和C语言的编写。
4系统设计方案
4.1系统总体设计
本设计采用意法半导体基于Cortex-M3的STM32F103,意法半导体的板子具有良好的性价比、低功耗、易开发等特点,而且其体系和架构资料丰富,用它能够快速的开发出整个系统。
显示屏的选择,现有的液晶显示屏的种类很多,本设计选用的是2.8寸带触摸的彩屏,分辨率为320x240,支持16位色,这个就足够本设计使用了。
可把数据利用软件来进行处理,从而把数据传输到LCD液晶显示模块,实现简易电子计算器用户操作界面的显示,在开发板上可使用四个独立按键进行光标上下左右的移动,根据软件程序的设置,开发板加减乘数的计算功能。
系统整体框图如图4.1所示:
S
T
M
32
电源
简易电子计算器电路
复位电路
蜂鸣器电路
串口电路
LCD液晶显示模块
独立按键处理模块
图4.1系统整体框图
4.2简要阐述系统工作原理
整个系统用STM32单片机作为中央控制器,由单片机执行采集内部RTC值,简易电子计算器信号通过单片机I/O传给LCD显示屏,单片机模块控制驱动模块驱动显示模块,通过显示模块来实现信号的输出、LCD显示屏的显示及相关的控制功能。
系统设有按键模块用于对数字进行调整。
系统流程图如图4.2所示:
图4.2系统流程图
5系统硬件设计
5.1系统整体设计
本数字简易电子计算器设计计时采用开发板自带RTC模块,使用4个独立按键实现对时间的调整,1个按键进行复位操作,蜂鸣器对于整点报时及闹铃进行响应。
系统总体结构电路原理图见附录2。
5.2各单元电路设计
该多功能数字简易电子计算器电路原理设计是基于最小系统包括电源电路、复位电路、按键电路、计算电路、LCD液晶显示电路、蜂鸣器电路、串口电路。
5.2.1电源电路
本数字简易电子计算器设计使用开发板配置的数据线与电脑USB接口直接连接进行通电,作为硬件电路电源。
电源电路图如图5.2.1所示:
图5.2.1电源电路图
5.2.2LCD液晶显示电路
本数字简易电子计算器设计所需显示屏为TFT-LCD液晶显示屏,通过软硬件的结合,可实现计算及数字的显示。
LCD液晶显示电路图如图5.2.2所示:
图5.2.2LCD液晶显示电路图
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蜂鸣器电路
本数字简易电子计算器设计可进行整点报时与闹铃的功能,经过软硬件的结合,由软件指使芯片控制蜂鸣器的响应。
电路图如图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-LCD液晶屏和RTC实时简易电子计算器分别集成一体,使程序模块化,结构层次分明。
本设计的软件系统分为五个部分:
TFT-LCD显示子程序、整点闹铃子程序、电子计算器子程序和按键处理子程序。
6.1主程序设计
本文所设计的简易电子计算器的在系统最初开始主程序扫描,由最初的显示子程序初始化,在使用计算器计算时,需要判断当前是采用加减乘除哪种运算,在程序中通过当手指触摸到其中一个运算符号(如“+”),使用一个标识位来进行标识,然后在进行运算时候,通过这个标识位来判断是进行哪种运算。
最后在运算完成之后,清除相应的标志位,以免影响下一次判断。
,蜂鸣器进行相应操作,之后进入按键扫描,判断按键是否有变动,并进行实现相应的功能,最后返回主程序重新一次扫描,主程序流程图如下图6.1所示:
实时简易电子计算器
数据处理模块
开始
显示模块
初始化
按键处理模块
图6.1主程序流程图
在通电后将初始化后的时分秒和年月日调入显示子程序中,依次开始调用实时简易电子计算器万年历子程序、整点闹铃子程序和按键处理子程序,在所有子程序调用完成后,返回程序开始循环运行。
6.2子程序设计
在主程序的调用下根据不同的子程序模块功能进行编写,其中包括显示模块,按键处理模块,实时简易电子计算器万年历模块,整点闹铃模块等。
6.2.1显示模块
使用TFT-LCD显示屏显示,编程实现功能简洁,将RTC实时简易电子计算器的数据送入LCD中进行显示,显示内容包含背景界面,以及加减乘除等选项。
显示子程序流程图如下图6.2.1所示:
显示背景
显示界面
显示当前选项
图6.2.1显示子程序流程图
6.2.2按键处理模块
该子程序进行按键处理的功能判断分别对加减乘除等运算法则等进行调整,在正常情况下S1和S2分别是控制界面选择的上下左右选项,而S3键位是确认当前的所选择的操作,为了方面用户使用和理解,并没有使用S4键位,该流程图如图6.2.2所示:
N
按下S4键?
按下S3键?
按下S2键?
按下S1键?
退出
上下移动操作
Y
左右移动操作
执行相应功能
不用
图6.2.2按键处理模块流程图
6.2.3实时简易电子计算器万年历模块
该子程序需要对加减乘除等运算过程的读写操作,在串口通信时对时序要求比较高,需保证传输的连续性,不允许出现中断,利用RTC计算两次数据的走针。
该流程图如图6.2.3所示:
图6.2.3实时简易电子计算模块流程图
7仿真调试分析
该论文是用STM32开发板实现软硬件的结合,分别对软件与硬件进行调试,其中硬件主要通过在开发板上进行显示电路与按键电路的调试,软件通过keilMDK进行调试。
硬件调试:
使用STM32开发板,为其通电,查看电源电路是否正常;
成功开机后,查看显示电路是否正常;
连接USB口,查看串口电路是否正常;
根据时间走针判断简易电子计算器电路是否正常;
通过独立按键的相应操作,查看功能是否正确,由此判断独立按键处理电路是否正常;
操作复位键,查看复位电路是否正常。
经过所有测试,电路均正常。
软件调试:
因在硬件调试中,结合软硬件,已完成显示子程序、实时简易电子计算器万年历子程序和按键处理子程序的调试,只需完成余下整点闹铃子程序的调试,通过实时简易电子计算器万年历子程序调整时间为整点前一分钟,设置成功后,等待一分钟后,判断蜂鸣器是否相应,由此判断整点闹铃子程序能否正常运行。
最终经过测试,该子程序能正常运行。
8设计中的问题及解决方法
在本次设计中出现过几次小Bug,具体如下:
l第一个问题:
同时按下S1与S2按键时,无法正常使用按键
解决办法:
在Keil软件中的调试工具,发现在main函数中无法调用选择数字的子程序,通过函数外部调用,问题成功解决。
l第二个问题:
从编辑框获取文本存储失败。
这个问题产生的原因,是在我从编辑框内读取数据之前,有个if()语句,如满足条件,清除编辑框的内容,从而当我再次读取编辑框的内容就为空了,当然什么数据也存储不了了。
l第三个问题:
字符串转化成浮点数和浮点数转化成字符串的问题。
这两个功能都有相对的库函数<
stdlib>
中的相干函数可以实现,但是奇怪的是,我调用这些函数,单独直接用的时候都OK的,但是如果多几个传递参数,就完全失效了。
找了N久的转化函数,统统没有用,到最后,只能自己写算法来实现,花了很多时间来写、验证、完善。
l第四个问题:
碰到浮点数减整数,得到的小数点与原先的小数点不相等。
当然如:
4.2-4=0.2,但是我们定义floata=4,2,则小数为a-(int)a,得到的小数部位0.2,而是为0.1999998之列的,这里就涉及到个类型之间的转化存在丢失部分数据的问题。
这是我超级郁闷的地方。
想了很多种办法多没有解决。
最后只能选择效果最好的一种:
就是小数点=(a*100000-(int)a*100000)/100000,这种方法虽然没有本质上解决问题,但是效果好多了。
9学习心得
本次课程设计是用STM32单片机及接口电路设计一个简易电子计算器,经过两个星期的调试,结果满足设计要求,验证无误通过单片机硬件电路的调试,实现了预先设定的功能。
设计主要用到了多种芯片,程序也比较长比较麻烦,同时也遇到了不少困难,尤其是关于按键处理模块分配的设计实现。
关于显示模块,在以前的实验中做过,所以问题很容易解决。
在调试电路的过程中也积累了一些宝贵的经验。
将理论与实践相结合从而提高自己的实际动手能力和独立思考的能力。
这次的课程设计还让我学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。
更重要的是,我在这一设计与调试过程中,遇见过乱码,开发板无法显示等问题,一点点去了解,一点点去解决。
我在这其中学会了坚持不懈,不轻言放弃。
同时还要感谢在我遇见困难时给予我帮助和指导的老师与同学。
附录
主程序代码
while
(1)
{
KEY_task();
//按键修改时间
Update_Date();
//获取时间
Adjust_RX_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,"
GUI_CNCH16_string(j,k,(u8*)Buff,Black,White);
}
for(i=10,j=120,k=127;
16;
i++)//5037
{
if(i==12)
{
j=20;
k+=37;
printf("
}
switch(i)
case10:
sprintf(Buff,"
%c"
'
+'
break;
//在屏幕上输出字符
case11:
-'
case12:
*'
case13:
/'
case14:
='
case15:
c'
if(get_zb==i)
GUI_CNCH16_string(j,k,(u8*)Buff,Red,White);
//打印换行
j+=50;
else
GUI_CNCH16_string(j,k,(u8*)Buff,Black,White);
}
核心算法部分:
intzy=0;
//左右选择
intsx=0;
//上下选择
intch;
//确认按键
intnum;
//通过按键得到命令
intn1=0;
intn2=0;
doublen3=0;
charBuff[128];
intflag=0;
intfk=0;
intsum=0;
voidKEY_task(void)
{
if(S4==0)//不按下s4时,s1,s2,s3
if(S1==0)//按下s1两个按键,分别是选择上下和左右
Delay_nms(10);
if(S1==0)
{
while(S1==0);
if(zy>
=0&
zy<
3)
{
zy++;
}
else
zy=0;
}
if(!
S2)//按下S2
if(!
S2)
{
while(!
S2);
if(sx>
sx<
sx++;
sx=0;
}
S3)//按键选择
Delay_nms(10);
if(!
S3)
while(!
S3);
switch((zy+sx*4))
{
case0:
num=0;
case1:
num=1;
case2:
num=2;
break;
case3:
num=3;
break;
case4:
num=4;
case5:
num=5;
case6:
num=6;