版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、二0一三年 单片机课程设计报告姓 名 王志超 学 号 1162910228 指导老师 陆晓春 完成时间 2013.12.27 河 海 大 学2013年12月 2013年电科专业单片机课程设计报告 Dec.20131、 作品简介本作品的名称是串口计算器,其功能是计算机将数据或者字符串发送给单片机,单片机根据要求可以把用户的相应指令进行整合运算,并把这个数据的结果显示到串口助手和数码管上,完成计算的功能。其中还涉及到了浮点数的运算,我们将浮点数精确到了一位,在这个计算其中还可以对负数进行运算,并将负数显示到数码管和串口助手。1、串行通信功能:实验板和PC电脑通过USB线相连,使MCU和PC软件“串
2、口助手”能够进行串行通信。 (1)当实验板上电时默认波特率为9600bps,并发送欢迎词和提示词,例如“Welcome to Calculator V1.0”,You can press key1 and key2to change baud rate. (2)当实验板上按键1按下时波特率变更为4800bps,按键2按下时波特率变更为9600bps,并用两个LED灯指示相应的波特率。2、计算器功能通过串口助手发送框发送需要计算的公式,例如20*4=,MCU收到后解析公式并计算结果,将结果返回给串口,例如“The result is 80”,同时将计算结果显示在数码管上,具体细节如下:(1)可以
3、进行加(+)、减(-)、乘(*)、除()、取余(%)运算;(2)整形、浮点型运算;(3)当计算结果为整形数时,有效的运算结果范围是-9999999,超过此结果,返回相应的提示符,例如“The result is out of range.”,数码管上提示“Err”;(4)当计算结果为浮点数时,有效的运算结果范围是-99.9999.9,数码管上显示时保留1位小数点,超过此结果,返回相应的提示符,例如“The result is out of range.”,数码管上提示“Err”。期间,本人编写了串口助手程序,方便本人在调试过程中发现错误,改正错误。这是一个副产品。2、作品整体方案 本作品主要是
4、,实现串口计算功能。整体思路如下所示:串口助手字符显示Stc89C52单片机数码管波特率显示按键波特率选择数码管结果显示3、 程序设计思路对于这个作品,我们总共分了几个模块:主函数、计算函数、串口函数、数码管函数、按键函数四部分组成。下面就是对具体函数思路的解析:字符串的读取和识别算式的分解字符串的输入运算符的提取判定算式结束数的提取串口助手显示结果的输出数码管显示(1)对于主函数,我最初的思路是在主函数里调用各个函数,加上函数声明即可。后来在程序出错的情况下,我无法对程序做出高效准确地修改,故我采用了头文件的方法,这也是老师上课提到过的。为此我还特意到网上学习了头文件的撰写。主函数就是定义了
5、各个变量,对整体做了一个大概的构思,编写了主要思路和各个中断函数程序如下所示:主函数:uchar block12; 暂存数组uchar i=0,a,b=0;uchar flag=0;uchar code prompt1 = welcome to use the uart calculator based on the 51n;uchar code prompt2 = Now you are entering a new world. tn;uchar code prompt3 = Please choose your own bps, k1:9600bps(默认), k2:4800bps. t
6、n;uchar code prompt8 = Err;float result; extern uchar sym; 这是一个外部变量void main()Serialport();sendstring(prompt1);sendstring(prompt2);sendstring(prompt3);keyfirst();while(1) if(flag=1) flag=0;result=trans(block); 转换为字符并发送到串口助手显示b=0;a=0;sym=0; 符号位for(i=0;i12;i+) 数组清零,以防干扰下次接收blocki=0; keycheck(); 键盘检测 s
7、howdigitron(); 在数码管上显示 对于串口和按键的问题,我也采用了中断处理的方法,在中断中,我对按键做了处理,即选择对应的波特率,这里这样做不会对主程序的结构造成影响,串口也是采用中断传输的,这样就可以使数据可以在需要的时候传输,程序如下:/*串行口中断函数*/void Serial() interrupt 4 if(RI)RI=0;a=SBUF;blockb+=SBUF;if(a=61) /检测到等号flag=1; ES=0;SBUF=a;while(!TI);TI=0;ES=1; 对于按键我们使用的是外部中断1,为的是出错是可以有高一点的中断将其打断,程序如下:void Key
8、() interrupt 2char aa;key_flag=1;p36=1;if(p33=1)key_mem=2;elsekey_mem=1;aa=p33;while(!aa)/松手检测aa=p33;delay(); /目的去抖动p36=0; /接口置零才可以,勿忘(2)对于计算函数的解决,我分别采用数组和指针的方法对数字进行分离,由于算式是以字符串的形式输入的,故我们对于数字只要识别0-9即可,当我们识别了运算符的时候前一位就是第一个数的字符串长度,运算符后面的就是第二个字符串的开始,当检测到“=”的时候就是第二个字符串的长度,这样就可以把两个字符串给提取出来。当我检测到运算符的时候,我会
9、进行分类,例如我检测到了“+”,则使用case(+)来进行分类,满足运算需求。字符串的提取程序如下:for(m=0;(*p!=+)&(*p!=-)&(*p!=*)&(*p!=/)&(*p!=%);m+) /m记录第一个运算数的位数num11m=*p; /提取第一个操作数p+; sign=*p+; /将运算符赋给变量sign n=z-m-2; /n记录第二个操作数的位数for(i=0;i=num2)num3=num1-num2;elsenum3=num2-num1;sym=1;break;case *:num3=num1*num2;break;case /:if(num2=0) /除数是0的情况
10、SBUF=n;while(!TI);TI=0;sendstring(prompt6);false=1;/transdigitron(int)num3); /由于下一句返回,必须在此处改变数码管的值return 0;elsenum3=num1/num2;break;case %:if(num2=0)/除数是0的情况SBUF=n;while(!TI);TI=0;sendstring(prompt6);false=1;/出错标志transdigitron(int)num3); /由于下一句返回,必须在此处改变数码管的值return 0;elsenum3=(int)num1%(int)num2;/只有
11、整形数才能进行取余运算break; default:break;数码管的点亮,我把输出的结果保存成数组,然后再通过数码管输出:数码管的检测:void transdigitron(uint number)int a=1;if(sym=0)&(number9999) /若大于9999b0=12;b1=12;b2=11;b3=0;/显示“Err”l=3;return;/返回主函数,不执行后面的程序false=1;if(sym=1)&(number999)b0=12;b1=12;b2=11;b3=0;l=3;return;/返回主函数,不执行后面的程序 false=1;if(false=1) /fal
12、se=0; /清零出错标志c0=12;c1=12;c2=11;c3=0;l=3;return;/返回主函数,不执行后面的程序l=0;/l是全局变量,每一次计算前将l清零,防止下次干扰!while(a!=0) /分解各位,存入数组b中a=number/10;cl+=number%10;number=number/10; if(l=1)&(f1|f1) cl+=0;if(sym)cl+=13; /将负号放入数组中对于数码管的显示:void showdigitron()char j;for(j=0;jl;j+) P1=block1cj;P0=block2j;if(j=1)&(false=0)if(f
13、1|f2) /浮点数P1&=0x7f;delaydigitron(); /数码管的延时显示 对于波特率的选择我使用的是按键,采用选择语句,可以使之有不同的选择:void keycheck()if(key_flag=1)key_flag=0;switch(key_val)case 1:TH1=0xfa;TL1=0xfa;sym=0;transdigitron(4800);break; case 2:TH1=0xfd;TL1=0xfd;sym=0;transdigitron(9600);break; default:break;这就是我程序的大体思路,通过编写头文件,实现了各个函数间的相互调用,头
14、文件的编写框架:#ifndef _Key_press_H #define _Key_press_Hsbit p33=P33;sbit p35=P35;sbit p36=P36;extern char key_flag,key_val;void keyfirst();void keycheck();void delay();#endif使用的时候将头文件包含到要调用的函数即可。4、 遇到的问题及解决办法在此次课程设计中,我遇到了问题,有问题是正常的,关键是看如何解决,故我将遇到的问题和解决方法列下:(1) 程序过长,造成修改程序不便。 解决:通过网上学习头文件的写法,利用头文件来实现各个函数间的
15、相互调用,利用各个函数的联系来实现功能,这样子更加明了,结构更加条理。(2) 数码管显示0的问题。开始的时候,我采用的是填充的方法来进行数码管显示的,即负号放在最前,数字放在最后,中间使用0填充,这样子数码管上就有很多0,造成阅读的障碍。解决:采用数组和指针的方法,使字符串可以按顺序进入数组中,对数组的循环扫描,从而可以是数码管正常显示。(3) 浮点数的问题。浮点数的问题开始的时候我们不知道如何让小数点后的数显示,这样子就造成了困倦。解决:通过小数乘以“10”便可将小数变成整数,然后对应数码管显示即可。(4) 整数的显示。 开始时,认为整数可以一下显示的,后来发现不可以。解决:采用数值除以十然
16、后取余数,循环执行,便可实现。5、小结 在这次课程设计中,个人收获颇多。首先,我是从头把c语言看了一遍,是自己在c语言方面又学到了一些新的东西。其次,在做课程设计期间,我又把头文件学习了一下,这样我在编写一些比较长的程序的时候就可以采用这种方法,是程序变得调理清晰,易于解读,对于程序中出现的错误就更可以修改了,方便快捷。第三,在这次课程设计中,我也找到了自己的薄弱项,就是对程序的整体把握不够,虽然可以条理清晰,但是却无法对细节进行好的优化。通过这次课程设计设我也明白了优化的重要性。第四,在课程设计中,我也体会到了帮助别人的快乐,自己是一个小组长,在帮助组员的过程中,我积极主动,在帮助他人的时候,也学习到了他人的对程序的一种能
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年雷替曲塞项目可行性研究报告
- 护士个人工作计划范文5篇
- 公司与个人租房合同
- 北京邮电大学《视频后期剪辑》2023-2024学年第一学期期末试卷
- 北京邮电大学《计调操作实务》2023-2024学年第一学期期末试卷
- 建设工程监理合同范本
- 《老人与海》读书笔记(集锦15篇)
- 2025版进户门行业创新发展与技术合作合同
- 2025年度新能源汽车充电桩安装服务合同范本3篇
- 二零二五年分享69家政服务员工培训成果评估合同3篇
- 《新编MPA英语阅读教程教学参考书》正文(第一-第十五单元)第二稿
- “青蓝工程”师徒结对体育青年教师总结反思
- 设备维护检查修理三级保养记录表
- 施工安全风险分析及应对措施表
- 《针灸推拿》题库
- 2023年上海市初中物理竞赛复赛试题银光杯
- GB/T 20475.2-2006煤中有害元素含量分级第2部分:氯
- GB 18218-2000重大危险源辨识
- 油田视频监控综合应用平台解决方案
- 福建省泉州市各县区乡镇行政村村庄村名明细及行政区划代码
- 酒精性脑病的护理查房实用版课件
评论
0/150
提交评论