单片机简易计算器.docx
《单片机简易计算器.docx》由会员分享,可在线阅读,更多相关《单片机简易计算器.docx(12页珍藏版)》请在冰豆网上搜索。
单片机简易计算器
姓名
学号
指导老师陆晓春
完成时间2013.12.28
一.作品简介········································1
1.1作品名称····································1
1.2作品功能····································1
二.作品整体方案····································2
三.程序设计思路····································3
3.1系统模块图···································3
3.2总体流程图···································3
3.3软件编程·····································4
四.遇到的问题及解决办法····························10
五.小结············································10
单片机课程设计报告
1作品简介
1.1.作品名称:
串口计算器
1.2.功能:
串口计算器实现以下功能:
.串行通信功能:
实验板和PC电脑通过USB线相连,使MCU和PC软件“串口助手”能够进行串行通信。
(1)当实验板上电时默认波特率为9600bps,并发送欢迎词和提示词,“WelcometoCalculatorV1.0.Youcanpresskey1andkey2tochangebaudrate."
(2)当实验板上按键1按下时波特率变更为4800bps,按键2按下时波特率变更为9600bps,并用两个LED灯指示相应的波特率。
.计算器功能
通过串口助手发送框发送需要计算的公式,例如20*4=,MCU收到后解析公式并计算结果,将结果返回给串口,例如“Theresultis80”,同时将计算结果显示在数码管上,具体细节如下:
(1)可以进行加(+)、减(-)、乘(*)、除(\)、取余(%)运算;
(2)整形、浮点型运算;
(3)当计算结果为整形数时,有效的运算结果范围是-999~9999,超过此结果,返回相应的提示符,例如“Theresultisoutofrange.”,数码管上提示“Err”;
(4)当计算结果为浮点数时,有效的运算结果范围是-99.9~999.9,数码管上显示时保留1位小数点,超过此结果,返回相应的提示符,例如“Theresultisoutofrange.”,数码管上提示“Err”。
2作品整体方案
根据功能和指示要求,本系统选用以MCS-51单片机为主控机。
通过USB接口与PC机相连,实现对计算器的设计。
具体设计如下:
.由于要设计的是简单的计算器,可以进行简单的运算,为了得到较好的显示效果,采用数码管动态显示数据和结果。
.另外要用的PC键盘包括数字键(0-9)、运算符(+、-、*、/、%)以及等号键。
.执行程序:
开机显示欢迎词,按键1或2可以改变波特率,等待键入数值,当键入数字,通过LED将结果显示出来,当键入+、-、*、/、%运算符,计算器在内部执行数值转换和存储,并等待再次键入数值后将显示键入的数值,按下等号键就会在LED上输出运算结果。
.错误提示:
当单片机执行程序中有错误时,会在LED上显示相应的提示,如:
当输入的数值或计算器得到的结果大于计算器的显示范围时或当除数为0时,计算器会在LED上提示错误,数码管显示Err。
3程序设计思路
3.1.系统模块图
3.2总体流程图
3.3.软件编程
程序采用模块化思想,将计算器的功能分模块利用不同的函数实现。
主要函数如下:
主函数:
voidmain()
{
initial();
welcome("WelcometocalculatorV1.0\n");
welcome("Presskey1andkey2tochangebaudrate.\n");
while
(1)
{
key();
if(flag==1)
{
flag=0;
negative=0;
fudian=0;
error3=0;
error4=0;
ES=0;
analysize();
calculate();
ES=1;
reset();
}
show();
}
}:
初始化函数:
voidinitial()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x50;
EA=1;
ES=1;
}
计算函数:
voidcalculate()
{
intx1,x2,result1;
floatx3,x4,result2;
charsign1=0;
if(fudian==1)
{
x3=atof(num[0]);
x4=atof(num[1]);
if(store=='+')
{
result2=x3+x4;
}
if(store=='-')
{
result2=x3-x4;
}
if(store=='*')
{
result2=x3*x4;
}
if(store=='/')
{
result2=x3/x4;
if(x4==0)
{
TI=1;
printf("Err\n");
return;
}
}
if(store=='%')
{
TI=1;
printf("Err\n");
error4=1;
}
if((-99.9<=result2)&&(result2<=999.9))
{
sprintf(p,"%.1f",result2);
change((int)(10*result2));
}
else
{
TI=1;
printf("Err\n");
error3=1;
change((int)(10*result2));
return;
}
}
else
{
x1=atoi(num[0]);
x2=atoi(num[1]);
if(store=='+')
{
result1=x1+x2;
}
elseif(store=='-')
{
result1=x1-x2;
if(result1<0)
{
result1=x2-x1;
sign1=1;
negative=1;
}
}
elseif(store=='*')
{
result1=x1*x2;
}
if(store=='/')
{
result1=x1/x2;
if(x2==0)
{
TI=1;
printf("Err\n");
return;
}
}
if(store=='%')
{
result1=x1%x2;
if(x2==0)
{
TI=1;
printf("Err\n");
return;
}
}
if((-999<=result1)&&(result1<=9999))
{
sprintf(p,"%d",result1);
change(result1);
}
else
{
TI=1;
printf("Err\n");
error3=1;
change(result1);
return;
}
}
if(sign1)
{
SBUF='-';
while(!
TI);TI=0;
}
sign1=0;
TI=1;
printf("%s\n",p);
TI=0;
}
4遇到的问题及解决办法
这次单片机课程设计用时三天,期间,我遇到了很多问题。
但是错误类型大致有以下三点:
1.对单片机原理掌握十分清楚,例如,用到数码管动态显示的时候,必须对其合理位选或段选,延时时间也必须设计恰当,否则,数码管显示就会产生互相干扰或不稳定现象。
2.设计思想不够明确,此次设计的是简易计算器,在计算模块要留神的问题很多。
计算数值的范围及符号的取值复位是难点,要想运算结果正确,只能把它们的关系梳理清楚,用if语句筛选。
3.细节问题不注意,程序中有个变量m已经定义为了int型,但是在后面的程序中又出现了这样的语句if(m==‘=’)。
软件没有提示这个错误,结果我就耗费了大量的时间做重复的工作上。
这个给了我深刻的教训,必须编完一段即使检测,不能偷懒。
5小结
做为一个单片机初学者,这次的课设让我学到了很多东西。
单片机设计者的工作是十分辛苦的。
在设计简易计算器的过程中,不仅要逻辑性强,而且编程过程中要十分仔细,还要考虑到实际的电路结构。
这次的经历,不仅让我意识到c语言的强大和单片机的神奇,更激起了我对此类课程的学习兴趣,为以后更深一步的学习打下了基础。
同时,我十分感谢老师和同学在此期间给我的巨大帮助,谢谢你们和我一起解决了那么多的问题。