51单片机课设-串口计算器

上传人:m**** 文档编号:501464088 上传时间:2023-07-18 格式:DOCX 页数:8 大小:213.27KB
返回 下载 相关 举报
51单片机课设-串口计算器_第1页
第1页 / 共8页
51单片机课设-串口计算器_第2页
第2页 / 共8页
51单片机课设-串口计算器_第3页
第3页 / 共8页
51单片机课设-串口计算器_第4页
第4页 / 共8页
51单片机课设-串口计算器_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《51单片机课设-串口计算器》由会员分享,可在线阅读,更多相关《51单片机课设-串口计算器(8页珍藏版)》请在金锄头文库上搜索。

1、二0一三年 单片机课程设计报告姓 名 学 号 指导老师 完成时间 2013/12/26 河 海 大 学2013年12月 2013年电科专业单片机课程设计报告 Dec.20131 作品简介本作品为带有串口通信功能的计算器,PC可通过串口助手软件将算式发送至单片机,单片机立即将计算结果发送回PC,并且在液晶上显示结果。串口通信波特率为两档可调,分别为9600bps和4800bps,可通过两个按键调整,同时在液晶上会显示当前的波特率。计算器可自动识别输入的字符串,并自动判断输入的算式是否正确;可自动识别算式中包含错误字符、除数为零、浮点数做取余运算等错误。当计算结果超出设定范围时在液晶上出现“超出范

2、围”提示,同时向PC发送“The result is out of range! ”。2 作品整体方案2.1 串行通信功能:实验板和PC电脑通过USB线相连,使MCU和PC软件“串口助手”能够进行串行通信。 (1)当实验板上电时默认波特率为9600bps,并发送欢迎词和提示词,例如“Welcome to Calculator V1.0”,You can press key1 and key2 to change baud rate. (2)当实验板上按键1按下时波特率变更为4800bps,按键2按下时波特率变更为9600bps,并用两个LED灯指示相应的波特率。2.2 计算器功能通过串口助手发

3、送框发送需要计算的公式,例如20*4=,MCU收到后解析公式并计算结果,将结果返回给串口,例如“The result is 80”,同时将计算结果显示在数码管上,具体细节如下:(1)可以进行加(+)、减(-)、乘(*)、除()、取余(%)运算;(2)整形、浮点型运算;(3)当计算结果为整形数时,有效的运算结果范围是-9999999,超过此结果,返回相应的提示符,例如“The result is out of range.”,液晶上显示“超出范围”;(4)当计算结果为浮点数时,有效的运算结果范围是-99.9999.9,液晶上保留3位有效数字,超过此结果,返回相应的提示符,例如“The resul

4、t is out of range.”,液晶上显示“超出范围”。串口调试助手液晶显示结果及波特率AT89S52单片机波特率调整3 程序设计思路本程序分为四部分:串口接收、字符串识别、算数运算、结果显示。(1)串口接收:PC通过串口向单片机发送的算式是以字符串的形式发送的,故单片机程序可使用数组存放接收到的字符串。由于每次发送的算式均以“=”结尾,所以在程序中可对每次接收到的字符进行检测,若检测到“=”则接收结束,程序开始执行下一步操作。void init_serial() /初始化串口设置TMOD=0x20;TH1=0xfd;TL1=0xfd;SCON=0x50;EA=1;ES=1;TR1=1

5、;void serial_receive() interrupt 4if(RI=1) rec_strrec_count=SBUF; /将接收到的字符串保存在数组rec_str中if(rec_strrec_count=) flag=1;str_length=rec_count;rec_count+; RI=0;(2)字符串的识别:由于接收到的算式是以字符串的形式保存在数组中,不能直接进行算术运算,需对字符串进行识别转换,得到相应的运算数和运算符。并且自动识别出不正确的表达式。while(rec_stri)if(rec_stri=)break; if(rec_stri=48 & rec_stri=

6、57) | rec_stri=.)if(rec_stri=.)sign_point=1;numji-k=rec_stri;i+;elseoperator=rec_stri;i+;k=i;j+;(3)算数运算:将转换得到的运算数根据运算符进行相应的运算操作,同时对违反算术运算规则的运算进行错误提示,如除数为零、浮点数取余等运算。若是浮点数的运算还需要对结果进行小数位数的控制(含四舍五入)。if(sign_point)num1=atof(num0);num2=atof(num1);if(num1=0.001 | num2=0.001) return N;/if(operator=/ & abs(n

7、um2)0.001)/return N;switch(operator) case +: result_f=num1+num2; break;case -: if(num1-num299.999)return R;elseresult_f=num1-num2;break;case *: result_f=num1*num2; break;case /:result_f=num1/num2; break;/case %:result_f=(int)num1%(int)num2; break;default: break;if(result_f999.999)return R;result_str

8、_len=sprintf(result_str,%.3f,result_f);/将浮点数转换成字符串 存储在result_str中elsenum3=atoi(num0);num4=atoi(num1);if(num3=0 | num4=0)return N;/if(num4=0 & operator=/)/return N;switch(operator) case +: result_i=num3+num4; break;case -: if(num3-num4999)return R;elseresult_i=num3-num4;break;case *: result_i=num3*nu

9、m4; break;case /:result_i=num3/num4; break;case %:result_i=num3%num4; break;default: break;if(result_i9999)return R;result_str_len=sprintf(result_str,%d,result_i);(4)结果显示:将计算得到的结果通过串口发送至PC并且显示在液晶上,由于串口发送和液晶显示必须以字符的方式,所以须将计算结果转换成字符串。void display_result()uchar i,st=0;PCD_write_chinese_string_space(0,0

10、,8,9,0,0); /清除显示PCD_write_chinese_string_space(0,1,8,9,0,0);if(sign_bit)st=1;PCD_write_chinese_ch(0,0,8,1,18,0);for(i=0;iresult_str_len;i+)if(result_stri=.)PCD_write_chinese_ch(st*8,0,8,1,19,0);else PCD_write_chinese_ch(st*8,0,8,1,result_stri-48,0);st+; 4 遇到的问题及解决办法全局变量定义多了之后编译无法通过:经过资料查询,发现是软件默认的变量

11、存储模式为Small,将其改为Large模式后问题得到很好的解决。计算一次之后,第二次的结果会出现问题,受到第一次计算的影响:经过排查发现是由于没有将第一次存储的数据清空,在接收到第二次的字符时受到第一次存储的数据的影响。对于浮点数保留若干位小数之后需要进行四舍五入的问题:在帮助组员进行数码管显示时,由于只保留一位小数,就需要考虑四舍五入的问题。5 小结此次单片机课设题目的难点在于对接收到的字符串的识别处理,且需要考虑多种特殊情况。经过此次课设,对字符串的识别处理能力有了进一步的提高。作为小组长,需要及时关组组员的进度,并帮助组员解决一些遇到的问题。在这当中,需要按照别人程序的思路来对程序进行调试,这是挺有挑战的。当然,通过与不同人的交流,也对自己的思路有了一定的积极影响,通过互相取长补短,让自己得到了很大的进步。由于程序比较长,所以逻辑性和编程的规范就显得尤为重要。在程序的编写过程中,需要分若干子函数,以实现不同的功能,当然在主函数中调用这些子函数的时候就需要注意顺序以及方式。在变量的设置方面,由于设置了很多个全局变量,在函数调用时就不能随意调用。在调试程序的过程中,多与别人交流交流,在解决某些问题时,不同的人会有不同的方法,互相交流可以使自己得到很大的进步,在解决问题时能够有更好的方法。这对于自己编程思维的提高也有很大的提高,多写多调试,才能有大的进步。2

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 幼儿/小学教育 > 小学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号