付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、信息工程课程设计报告书课程名称单片微机原理与接口技术课程设计题目串口通信的计算器学生姓名、学号学生专业班级指导教师姓名课程设计起止日期2017年6月19日-6月30日一、课程设计项目名称串口通信的计算器二、项目设计目的及技术要求2.1项目设计目的通过单片微型计算机与接口技术课程设计,使学生能够掌握单片机的开发过程、设计方法和单片机应用电路的特点,使学生能够综合应用单片机原理及应用、模拟电子技术基础、数字电子技术基础等课程的知识。要求学生经过课程设计的教学环节进一步理解智能电子系统的结构和组成原理,掌握智能电子系统的基本设计方法,完成系统电路和应用程序的实践,从而使学生的电子线路设计能力、单片机
2、机应用能力有较大提高。1)学会单片机的应用方法,开发环境;2)结合任务要求,完成系统设计和调试,功能扩展和创新;3)熟悉汇编或C51语言,用C51完成系统的软件编程;2.2项目的主要任务1)上位机用口助手发送字符串,单片机接受到后,进行字符的分解,计算出结果,显示在数码管上,并将结果发送到串口助手上显示。2)计算的+,-,X,/都可以。在除法运算中,如果除数为0,则在数码管显示0H,表示不能运算。计算出来的结果不能超过999超过,则在数码管上显示0A3)矩阵按键的0-4四个按键分别代表+,-,X,/运算。按下按键编号为运算的键,则表示确定开始计算结果,并把结果显示在数码管上面,通过串口发送到上
3、位机显示。同样的在第2步的要求也能实现。三、项目设计方案论证3.1 实现出口通信的计算器的整体方案PC可通过用口助手软件将数据发送至单片机,单片机接收数据,通过按键立进行相应的运算,将计算结果在数码管上显示,并且将计算结果发送回PC上位机,口助手串口助手图3-1用口通信的计算器的整体思路3.2 硬件原理图串口通信计算器主要涉及到按键、数码管、单片机的电路图MCU一总iIF-rr->KPI”I用CLVTi8HP2bD>5l/i.C'lTTJiT-Film:3-IO4FlCTUI:(皿F2P11:>1;o1dpi>.0iIt-F31ZPIjJIfuuIfrijPl.
4、2PS.lIKr(>i|Trij4PI3P9.1pt>jr4|Airi«JPIjJOrwjsIF1413Q*iAPdi4-F3rm显"一丁一PI.6P4.5pl>371Jrij1Fl.7P0.4jjf!>bE12KU1TRSnVPDP4.73工窄LL1110FJ.I.I.rRxlM:Vpp上1r.I>>K.MJ1期JUIj9rfjisr-B.znhnoF5ENMV12Bfj-jjtmjKTiP2.7K,JfU.LUUI1T1M*rs.j/ro”门门P26fr曰qr%!?|4JSPl4PJ3JWH.I4£PTBIEPJ4J5K23
5、4WfJi丁XTAJ2P3I上4,J1iIJA1J13PJI上JKJ上|tz、1i-STALE闭口P21rjifi1qjJIf储tiJ1K-U-J11Mjd数码管矩阵键,F卜IkMICIWi.j-bfciMdILhIJGMLGttlUh金6小,喜、切1"QQOQQQQO3.3 程序设计思路主函数,串口函数、拆分函数、按键函数、计算函数、数码管函数等五部分组成。下面就是对具体函数思路的解析:图3-3程序中函数的思路图(1)串口函数:PC通过串口向单片机发送的算式是以字符串的形式发送的,故单片机程序可使用数组存放接收到的字符串。由于每次发送的算式均以“#"结尾,所以在程序中可对
6、每次接收到的字符进行检测,若检测到“#”则接收结束,程序开始执行下一步操作。/*串口数据写入,即串口发送函数,buf-待发送数据的指针,len-指定的发送长度*/voidUartWrite(unsignedchar*buf,unsignedcharlen)(while(len-)/循环发送所有字节flagTxd=0;/清零发送标志SBUF=*buf+;/发送一个字节数据while(!flagTxd);/等待该字节发送完成)/*串口中断服务函数*/voidInterruptUART()interrupt4if(RI)/接收到新字节RI=0;/清零接收中断标志位if(SBUF!='#
7、9;)if(cntRxd<sizeof(bufRxd)/接收缓冲区尚未用完时,/保存接收字节,并递增计数器bufRxdcntRxd+=SBUF;if(bufRxd0='1')LED1=0;if(bufRxd2='2')LED2=0;elsecntRxd=0;restopflag=1;if(TI)/字节发送完毕TI=0;/清零发送中断标志位flagTxd=1;/设置字节发送完成标志2 .拆分函数:单片机将接收到的bufRxd口数组用strtok()函数拆分成两个字符串,再通过atoi()函数将字符串转化为整型赋值给num1num2/分离所接收到字符串,赋值给
8、num«num2voidApartUart(char*strin,int*num1,int*num2)(char*ps3;char*t=NULL;inti=0;t=strtok(strin,"");while(t!=NULL)(psi+=t;t=strtok(NULL,"");*num1=atoi(ps0);*num2=atoi(ps1);3 .按键函数:矩阵按键的驱动、1ms扫描一次矩阵按键。循环检测按键的动作。for(i=0;i<4;i+)/(循环检测4*4的矩阵按键检测按键动作按键按下时执行动作调用按键动作函数刷新前一次的备份值fo
9、r(j=0;j<4;j+)(if(backupij!=KeyStaij)/(if(backupij!=0)/(/KeyAction(KeyCodeMapij);/GetResult();backupij=KeyStaij;/4 .计算函数:按下按键编号为运算的键,计算的+,-,X,/都可以。在除法运算中,如果除数为0;在减法运算中,num1<num将情况无法显示计算结果。将计算结果在数码管上显示,无法显示计算的显示“0H'并将计算结果发送发到串口助手上显示。voidGetResult()(if(KeySta00=0)result=numl+num2;SBUF=result;
10、elseif(KeySta01=0)if(num1>num2)result=num1-num2;SBUF=result;elseLedBuff0=0x76;LedBuff1=0x3f;LedBuff2=0x00;elseif(KeySta02=0)result=num1*num2;SBUF=result;elseif(KeySta03=0)if(num2!=0)result=num1/num2;SBUF=result;elseLedBuff0=0x76;LedBuff1=0x3f;LedBuff2=0x00;elseif(KeySta10=0)result=0;elseif(KeySta
11、11=0)result=num1*num1;elseif(KeySta12=0)result=num2*num2;5 .数码管函数:1ms中刷新一次数码管,将计算结果处理结果按十进制从高到低依次提取并转为数码管显示字符。当计算结果大于999时,无法显示计算结果,数码管显示“01。if(flag1s=1)flag1s=0;if(result<999)LedBuff0=LedCharresult%10;LedBuff1=LedCharresult/10%10;LedBuff2=LedCharresult/100%10;elseLedBuff0=0x76;LedBuff1=0x3f;LedBu
12、ff2=0x00;扩展应用:增加清零,num1的平方运算、num2的平方运算的操作elseif(KeySta10=0)result=0;elseif(KeySta11=0)result=num1*num1;elseif(KeySta12=0)result=num2*num2;3.4软件程序#include<reg52.h>#include<stdio.h>#include<string.h>#include<stdlib.h>bitflagTxd=0;/单字节发送完成标志,用来替代TXD中断标志位unsignedcharcntRxd=0;/接收字
13、节计数器unsignedcharpdatabufRxd20;/接收字节缓冲区sbitKEY_IN_1=P1A7;sbitKEY_IN_2=Pi6;sbitKEY_IN_3=PgsbitKEY_IN_4=Pi4;sbitKEY_OUT_1=Pi3;sbitKEY_OUT_2=Pi2;sbitKEY_OUT_3=Pil;sbitKEY_OUT_4=P1A0;/sbitLED1=P2A0;/sbitLED2=P2A1;unsignedcharpdataKeySta44=/全部矩阵按键的当前状态(1,1,1,1,1,1,1,1),1,1,1,1,1,1,1,1);signedintnum1=0;sig
14、nedintnum2=0;signedintresult=0;sbitADDR0=P2A2;sbitADDR1=P2A3;sbitADDR2=P2A4;unsignedcharLedChar=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f);unsignedcharLedBuff=0x00,0x00,0x00,0x00,0x00,0x00);unsignedcharflag1s=0;unsignedlongsec=0;unsignedcharrestopflag=0;voidConfigTimer0();voidConfigUART(unsi
15、gnedintbaud);voidUartWrite();voidApartUart(char*strin,int*num1,int*num2);voidKeyDriver();voidKeyScan();voidGetResult();voidmain()(TMOD=0x01;TH0=0xFC;TL0=0x67;TR0=1;EA=1;ET0=1;ConfigUART(2400);while(1)(if(restopflag=1)(ApartUart(bufRxd,&num1,&num2);/*if(num1=1)&(num2=2)(result=num1+num2;L
16、ED1=0;LED2=0;*/KeyDriver();/调用按键驱动/*GetResult();if(result>999)LcdShowStr(0,0,result);elseLcdShowStr(0,1,"0H")*/if(flag1s=1)flag1s=0;if(result<999)LedBuff0=LedCharresult%10;LedBuff1=LedCharresult/10%10;LedBuff2=LedCharresult/100%10;elseLedBuff0=0x76;LedBuff1=0x3f;LedBuff2=0x00;/分离所接收到
17、字符串,赋值给num!num2voidApartUart(char*strin,int*num1,int*num2)char*ps3;char*t=NULL;inti=0;t=strtok(strin,"");while(t!=NULL)psi+=t;t=strtok(NULL,"");*num1=atoi(ps0);*num2=atoi(ps1);/*串口配置函数,baud-通信波特率*/voidConfigUART(unsignedintbaud)SCON=0x50;/配置串口为模式1TMOD&=0x0F;/清零T1的控制位TMOD|=0x2
18、0;/配置T1为模式2TH1=256-(12000000/12/32)/baud;/计算T1重载值TL1=TH1;/初值等于重载值ET1=0;/禁止T1中断ES=1;/使能串口中断TR1=1;/启动T1)/*串口数据写入,即串口发送函数,buf-待发送数据的指针,len-指定的发送长度*/voidUartWrite(unsignedchar*buf,unsignedcharlen)while(len-)/循环发送所有字节flagTxd=0;/SBUF=*buf+;/while(用agTxd);/)清零发送标志发送一个字节数据等待该字节发送完成)/*串口中断服务函数*/voidInterrupt
19、UART()interrupt4if(RI)/接收到新字节RI=0;/清零接收中断标志位if(SBUF!='#')if(cntRxd<sizeof(bufRxd)/接收缓冲区尚未用完时,/保存接收字节,并递增计数器bufRxdcntRxd+=SBUF;if(bufRxd0='1')LED1=0;if(bufRxd2='2')LED2=0;elsecntRxd=0;restopflag=1;if(TI)/字节发送完毕TI=0;/清零发送中断标志位flagTxd=1;/设置字节发送完成标志/*按键驱动函数,检测按键动作,调度相应动作函数,需在主
20、循环中调用*/voidKeyDriver()unsignedchari,j;staticunsignedcharpdatabackup44=/按键值备份,保存前一次的值1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;for(i=0;i<4;i+)/循环检测4*4的矩阵按键(for(j=0;j<4;j+)检测按键动作按键按下时执行动作调用按键动作函数刷新前一次的备份值(if(backupij!=KeyStaij)/(if(backupij!=0)/(/KeyAction(KeyCodeMapij);/GetResult();backupij=KeyStaij;/*按键
21、扫描函数,需在定时中断中调用,推荐调用间隔1ms*/voidKeyScan()(unsignedchari;staticunsignedcharkeyout=0;/矩阵按键扫描输出索引staticunsignedcharkeybuf44=/矩阵按键扫描缓冲区0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF;/将一行的4个按键值移入缓冲区keybufkeyout0=(keybufkeyout0<<1)|KEY_IN_1;keybufkeyout1=(keybufkeyout1
22、<<1)|KEY_IN_2;keybufkeyout2=(keybufkeyout2<<1)|KEY_IN_3;keybufkeyout3=(keybufkeyout3<<1)|KEY_IN_4;/消抖后更新按键状态for(i=0;i<4;i+)/每行4个按键,所以循环4次if(keybufkeyouti&0x0F)=0x00)/连续4次扫描值为0,即4*4ms内都是按下状态时,可认为按键已稳定的按下KeyStakeyouti=0;elseif(keybufkeyouti&0x0F)=0x0F)/连续4次扫描值为1,即4*4ms内都是弹
23、起状态时,可认为按键已稳定的弹起KeyStakeyouti=1;/执行下一次的扫描输出keyout+;/输出索引递增keyout&=0x03;/索引值加到4即归零switch(keyout)/根据索引,释放当前输出弓脚,拉低下次的输出引脚case0:KEY_OUT_4=1;KEY_OUT_1=0;break;case 1: KEY_OUT_1=1;KEY_OUT_2=0;break;case 2: KEY_OUT_2=1;KEY_OUT_3=0;break;case 3: KEY_OUT_3=1;KEY_OUT_4=0;break;default:break;voidGetResult
24、()(if(KeySta00=0)result=numl+num2;SBUF=result;elseif(KeySta01=0)if(num1>num2)result=num1-num2;SBUF=result;elseLedBuff0=0x76;LedBuff1=0x3f;LedBuff2=0x00;elseif(KeySta02=0)result=num1*num2;SBUF=result;elseif(KeySta03=0)if(num2!=0)result=num1/num2;SBUF=result;elseLedBuff0=0x76;LedBuff1=0x3f;LedBuff2
25、=0x00;elseif(KeySta10=0)result=0;elseif(KeySta11=0)result=num1*num1;elseif(KeySta12=0)result=num2*num2;voidInterruptTime0()interrupt1staticunsignedchari=0;staticunsignedintcnt=0;TH0=0xFC;TL0=0x67;KeyScan();/按键扫描cnt+;if(cnt>=1000)cnt=0;flag1s=1;P0=0x00;switch(i)case0:ADDR2=0;ADDR1=0;ADDR0=0;i+;P0=
26、LedBuff0;break;case 1: ADDR2=0;ADDR1=0;ADDR0=1;i+;P0=LedBuff1;break;case 2: ADDR2=0;ADDR1=1;ADDR0=0;i=0;P0=LedBuff2;break;default:break;四、项目设计结果分析4.1 实验结果(1)通过用口发送字符串4;2;#,按下第一行第一列的按钮,进行加法操作,数码管上显示“6”,用口助手上显示“6”;按下第一行第二列按钮,进行清零操作,数码管上显示“00”;按下第二行第二列按钮,进行numl的平方操作,数码管上显示“16”实验结果及现象如图所示:塔逑至亲区r音菌超理_”重,
27、广俄淖.辛粉式管送g方主固*|i金二=9:日功七任打山下航后摘用口粥卿口|事除收计加,君院计料B'漕交讦ST|.启*口jsnx:曜杪蛇心|m三般惠仁五iisit心臼曲啮苗-ttaH程序文件率口助手|工程文件精地力就盘发送裕军区06-800ST-*_*«ffwM*十六进制是示广学存格式显示单字苻电宜送医青揄也续q区目幼也环发注(2)通过用口发送字符串4;7;#,按下第一行第二列的按钮,进行减法操作,数码管上显示“0H'。实验结果及现象如图所示:I"T:春r十六进制发送各庄送小用区I董法字存感!姻演字符格式发送自动期睡川LDM亮秒阻型打开/关闭吊口r下载后打开串
28、口关闭串口I».收计散:谢懒耐肥彩F空计哥二|C叫丽丁,波杼虱氯而一校照立吊二.甄据回8丁匣止位|7,股卸主需-I使用明I4.2 遇到的问题及解决方法(1)串口发送数据、单片机接收数据时,拆分数组的问题。解决:通过网上查找学习拆分函数strtok()、头文件的写法,通过调试找到数据处理出现问题的地方,例如用口发送字符串“1;2;#”,单片机接收字符串后点亮第一个小灯,判断数据接收是否出现问题;拆分数组时,当num1=1num2=2寸进行加法操作时,点亮第二个小灯,判断数组拆分是否正确。(2)数码管显示0H'的问题。开始的时候,没考虑到数组运算中遇到除数为0且大于999时的问题
29、。解决:查看书本经过一番思索后,在按键操作和数码管显示时,根据计算情况将其异常处理,显示在数码管上。(3)按键驱动、扫描的问题解决:查看书上的关于独立按键、矩阵按键的代码,与同学讨论了下后解决了这个问题。先将行置零,处理列,再将列置零,处理行五、参考文摘1惠仇:手把手教你学51单片机,电子工业出版社,2009年。内容摘要:本书概括地论述了单片机的基础知识,包括单片机的基本结构和工作原理;并就实际单片机项目开发中会遇到的各种问题进行了阐述,列举了单片机开发的流程和必须遵守的一些规范,说明了仿真器和编程器在开发中的作用以及基本的使用方法。具体内容如下。首先论述了单片机的基础知识,包括单片机的基本结构和工作原理,阐述了目前单片机的发展情况,列举了最新流行的单片机种类,总结了单片机的选择方法。2张毅刚等,MCS-51单片机应用设计,哈工大出版社,2004年第2版内容摘要:本书从应用的角度,详细地介绍了MCS-51单片机的硬件结构、指令系统、各种硬件接口设计、各种常用的数据运算和处理程序及接口驱动程序的设计以及MCS-51单片机应用系统的设计,并对MCS-5俾片机应用系统设计中的抗干扰技术以及各种新器件也作了详细的介绍。本书突出了选取内容的实用性
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GA 2326-2025警用服饰移民管理警察国旗臂章及辅章
- 提升养老院安宁护理服务质量
- 妊娠巨吐的孕期护理论坛
- 牵引患者的护理伦理
- 婴儿早期音乐启蒙与培养
- 环保行业环境监测与治理技术集成方案
- 2026年软件代码辅助编写高效能新型研发设计模式
- 护理呼吸系统疾病护理
- 2026年全超导托卡马克EAST装置1亿摄氏度1066秒稳态运行刷新世界纪录技术解析
- 发电行业2025年度排放报告报送(3月31日前)指南
- 2025年中级社会工作师考试真题+答案
- 钇-90经动脉放射栓塞微球等核药研发与产业化项目(中试研发平台一期)报告书
- 酒吧股东合作协议范本
- 8 池子与河流【新课标版 教学课件】
- 六年级心理健康-尊重好朋友
- DB31∕T 1598-2025 城市轨道交通车辆寿命评估通 用要求
- 埋石混凝土挡墙监理实施细则
- 耕地保护和粮食安全责任工作总结
- 2025年新版新疆事业单位考试真题及答案
- 2025年广东省高职院校三二分段转段考试文化课测试(语文)
- 2026年西安医学高等专科学校单招职业倾向性测试题库必考题
评论
0/150
提交评论