南京邮电大学本科生毕业设计论文(B11011322侯文元)_第1页
南京邮电大学本科生毕业设计论文(B11011322侯文元)_第2页
南京邮电大学本科生毕业设计论文(B11011322侯文元)_第3页
南京邮电大学本科生毕业设计论文(B11011322侯文元)_第4页
南京邮电大学本科生毕业设计论文(B11011322侯文元)_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

⑤串行口工作在中断方式时,要进行中断设置(编程IE,IP寄存器)。下面介绍串行口方式1的具体运用方法和操作流程:4.1单片机与PC机间发送单个字符试验内容:在上位机上用串口调试助手发送一个字符X,单片机收到字符后返回给上位机“IgetX”,串口波特率设为9600bps。程序代码如下:#include<reg52.h> #defineucharunsignedchar#defineuintunsignedintunsignedcharflag,a,i;ucharcodetable[]="Iget";//定义了一个字符类型的编码数组voidinit(){ TMOD=0x20;//设定T1定时器工作方式2 TH1=0xfd;//T1定时器装初值 TL1=0xfd;//T1定时器装初值 TR1=1;//启动T1定时器 REN=1;//允许串口接收 SM0=0;//设定串口工作方式1 SM1=1; //同上 EA=1;//开总中断 ES=1; //开串口中断}voidmain(){init();while(1)//进入大循环while()语句后,始终在检测标记位flag是{否为1,当检测到为1时,说明程序已经执行过串口中if(flag==1)断服务程序,即收到了数据,否则始终检测flag的状态。{当检测到flag置1后,先是将ES清0,缘由是接下来要ES=0;发送数据,若不关闭串口中断,当发送完数据后,单片for(i=0;i<6;i++)机同样会申请串口中断,便再次进入中断服务程序,{flag又被置1,主程序检测到flag为1,又回到这里再次发送,如此重复下去,程序便成了死循环,造成错误的SBUF=table[i]; 现象,因此我们在发送数据前把串口中断关闭,等发送完 数据后再打开串口中断,这样便可以平安地发送数据了。while(!TI); TI=0;//在发送数据时,当发送前面6个固定的字符时,运用//了一个for循环语句,将前面数组中的字符依次发送//出去,后面再接着发送从中断服务程序中读回来的//SBUF中的数据时,当向SBUF中写入一个数据后,运用//“while(!TI);”等待是否发送完毕,因为当发送完毕//后TI会由硬件置1,然后才退出“while(!TI);”}//接下来我们再将TI手动清0。SBUF=a;while(!TI);TI=0;ES=1;flag=0;}}}voidser()interrupt4{ RI=0;a=SBUF;}//“voidser()interrupt”为串口中断服务程序,在本程序中完成三件事:RI清0,因为程序既然产生了串口中断,则确定是收到或发送了数据,在开始时没有发送任何数据,那必定是收到了数据,此时RI会被硬件置1,进入串口中断服务程序后必需由软件清0,这样才能产生下一次中断;将SBUF中的数据读走给a,这才是进入中断服务程序中最重要的目的;将标记位flag置1,以便利在主程序中查询推断是否已经收到数据。试验结果如图4.4所示图4.4试验结果4.2串行口打印在调试程序中的应用串行口打印功能通常用在程序调试中,举个例子说明它的用途:我们正在用单片机调试一个A/D芯片,单片机的外围只接了A/D芯片和串行口,当我们写好单片机程序下载后让其运行,可是我们根本不知道这个A/D芯片工作了没有?更不知道A/D芯片采集回来的数值对不对?这时假如我们运用串口打印功能,将单片机采集回来的A/D值经过处理后,发送到上位机上,在上位机上用一个简单的串口工具就可看见数据,这样我们在调试程序时便会便利很多。其次我们在调试其他程序时,在整个程序的不同地方,或是关键地方运用串口打印功能输出给上位机一个关键数据,我们就可知道程序中某些变量的实时数值,进一步得知程序运行的状况。试验内容:单片机上电后等待从上位机串口发送来的命令,同时在数码管的前三位以十进制方式显示A/D采集的数值,在未收到上位机发送来的启动A/D转换命令之前数码管始终显示000。当收到上位机以十六进制发送来的01后,向上位机发送字符串“Turnonad”,同时间隔一秒读取一次A/D的值,然后把A/D采集回来的8位二进制数转换成十进制数表示的实际电压浮点数,并且从串口发送给上位机,形式如“Thevoltageis3.398438V”,发送周期也是一秒一次,同时在数码管上也要每秒刷新显示的数值。当收到上位机以十六进制发送来的02后,向上位机发送字符串“Turnoffad!”,然后停止发送电压值,数码管上显示上次结束时保持的值。当收到上位机发来的其他任何数时,向上位机发送字符串“Error!”。程序代码如下:#include<reg52.h>#include<intrins.h>#include<stdio.h> #defineucharunsignedchar#defineuintunsignedintsbitdula=P2^6; //申明U1锁存器的锁存端sbitwela=P2^7; //申明U2锁存器的锁存端sbitadwr=P3^6; //定义AD的WR端口sbitadrd=P3^7; //定义AD的RD端口ucharflag,a;unsignedcharflag_uart,flag_time,flag_on,a,i,t0_num,ad_val;floatad_vo;ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelayms(uintxms) { uinti,j; for(i=xms;i>0;i--) //i=xms即延时约xms毫秒 for(j=110;j>0;j--);}voidinit(){ TMOD=0x21;// SCON=0x50; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TH1=0xfd; TL1=0xfd; TR1=1; ET0=1; SM0=0; SM1=1; REN=1; EA=1; ES=1;}voiddisplay(ucharvalue)//显示子函数{ ucharbai,shi,ge; bai=value/100; //分出百,十,和个位 shi=value%100/10; ge=value%10; dula=1; P0=table[bai];//送段选数据 dula=0; P0=0xff; //送位选数据前关闭全部显示,防止打开位选锁存时 wela=1; //原来段选数据通过位选锁存器造成混乱 P0=0x7e; //送位选数据 wela=0; delayms(5); //延时 dula=1; P0=table[shi]; dula=0; P0=0xff; wela=1; P0=0x7d; wela=0; delayms(5); dula=1; P0=table[ge]; dula=0; P0=0xff; wela=1; P0=0x7b; wela=0; delayms(5);}ucharget_ad() { ucharadval; adwr=1; _nop_(); adwr=0; //启动AD转换 _nop_(); adwr=1; P1=0xff;//读取P1口之前先给其写全1 adrd=1; _nop_(); adrd=0;//AD读使能 _nop_(); adval=P1; //AD数据读取 adrd=1; returnadval;}voidmain(){ init(); wela=1; P0=0x7f;//置CSAD为0,选通ADCS以后不必再管ADCS wela=0; while(1) { if(flag_uart==1) { flag_uart=0; ES=0; TI=1; switch(flag_on) { case0:puts("Turnonad!\n"); TR0=1; break; case1:printf("Turnoffad!\n"); TR0=0; break; case2:puts("Error!\n"); break; } while(!TI);//必须要加 TI=0; ES=1; } if(flag_time==1) { flag_time=0; ad_val=get_ad(); ad_vo=(float)ad_val*5.0/256.0; ES=0; TI=1; printf("Thevoltageis%fV\n",ad_vo); while(!TI); TI=0; ES=1; } display(ad_val); }}voidtimer0()interrupt1{ TH0=(65536-50000)/256; TL0=(65536-50000)%256; t0_num++; if(t0_num==20) { t0_num=0; flag_time=1; }}voidser()interrupt4{ RI=0; a=SBUF; flag_uart=1; if(a==1) flag_on=0; elseif(a==2) flag_on=1; else flag_on=2;}试验结果如图4.5所示图4.5试验结果第五章VC(MSCOMM控件)与单片机通信实现温度显示[试验要求]用单片机限制开发板上的DS18B20数字温度传感器,读取当前环境温度,精度达0.1度,温度范围0-99度,并用数码管的前三位显示出来。同时开发板上的单片机还能把温度值通过串口发送到计算机,在计算机上可看到温度值。留意:DS18B20数字温度传感器是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,在一根通信线,可以挂很多这样的数字温度计。DS18B20产品的特点:只要求一个I/O口即可实现通信。在DS18B20中的每个器件上都有独一无二的序列号。实际应用中不须要外部任何元器件即可实现测温。测量温度范围在-55到+125摄氏度之间。数字温度计的辨别率用户可以从9位到12位选择。(6)内部有温度上,下限告警设置。DS18B20具体引脚功能描述GND地信号;DQ数据输入出引脚。开漏单总线接口引脚。当被用在寄生电源下,也可以向器件供应电源;VDD可选择的VDD引脚。当工作于寄生电源时,此引脚必需接地。DS18B20的运用方法:由于DS18B20采纳的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S52单片机来说,我们必需采纳软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序,读时序,写时序。全部时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,假如要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。要想完成此任务,须要两段代码,一段是单片机的代码,它须要将采集到的温度数据处理后,通过串行口发送出去。另一段是PC机的代码,须要用MSCOMM控件接收数据,处理数据和显示数据。单片机检测温度及发送数据的代码见附录A。电脑VC程序:第一步,打开VC软件,新建文件,选择[MFCAppWizardexe]项,工程名取为[tem_con],单击[OK]按钮,如图5.1所示。图5.1选择工程类型第二步,选择[Dialogbased]项,单击[Finish]按钮,如图5.2所示。图5.2选择对话框类型第三步,单击[Project—>AddToProject—ComponentsandControls...]菜单项,如图5.3所示图5.3添加控件第四步,等待软件打开文件夹,双击[RegisteredActiveXControls]文件夹,如图5.4所示。图5.4选择RegisteredActiveXControls文件夹第五步,选择[MicrosoftCommunicationsControl,version6.0]列表项,单击[Insert]按钮,如图5.5所示。图5.5选择MSCOMM控件第六步,接着弹出[ConfirmClasses]对话框,默认不修改,单击[OK]按钮,如图5.6所示。图5.6为新类添加名称第七步,将限制工具条中的串行口控件拖动到对话框中,用鼠标左键点住,始终拖到对话框中,在随意位置释放左键。第八步,单击[View—>ClassWizard]菜单项打开[MFCClassWizard]对话框,选中[IDC_MSCOMM1]和[OnComm]列表项,单击[AddFunction...]按钮。第九步,始终单击[OK]按钮,我们就会看到增加的[OnOnCommMscomm1()]函数。第十步,选择控件工具条中的编辑框控件ab|,在对话框中添加编辑框控件。第十一步,在[MFCClassWizard]对话框中,单击[MemberVariables]选项卡,为编辑框和串行口选择关联变量m_strRXData和m_ctrlComm,单击[OK]按钮。第十二步,在[OnOnCommMscomm1()]函数中添加代码,代码如下:voidCTem_conDlg::OnOnCommMscomm1(){ m_strRXData="";//每次进入则将编辑框内容清空等待显示新的数据 VARIANTvariant_inp; COleSafeArraysafearray_inp; LONGlen,k; BYTErxdata[2048]; CStringstrtemp; if(m_ctrlComm.GetCommEvent()==2) {variant_inp=m_ctrlComm.GetInput(); safearray_inp=variant_inp; len=safearray_inp.GetOneDimSize(); for(k=0;k<len;k++) safearray_inp.GetElement(&k,rxdata+k); for(k=0;k<len;k++) { BYTEbt=*(char*)(rxdata+k); strtemp.Format("%c",bt); m_strRXData+=strtemp; } } UpdateData(FALSE);}第十三步,在[OnInitDialog()]函数中添加代码,具体代码如下: if(m_ctrlComm.GetPortOpen()) m_ctrlComm.SetPortOpen(FALSE); m_ctrlComm.SetCommPort(5); if(!m_ctrlComm.GetPortOpen()) m_ctrlComm.SetPortOpen(TRUE); else AfxMessageBox("cannotopenserialport"); m_ctrlComm.SetSettings("9600,n,8,1"); m_ctrlComm.SetInputMode(1); m_ctrlComm.SetRThreshold(1); m_ctrlComm.SetInputLen(0); m_ctrlComm.GetInput(); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol第十四步,单击窗口上方工具栏上的!按钮,编译并运行,弹出对话框,用串行口线连接TX—1C试验板和计算机,关闭其他的串行口软件,即可在编辑框中显示出温度。试验结果见图5.7。图5.7试验结果结束语为期半年多的毕业设计即将结束了,在这段时间里我在同学和老师的扶植下驾驭了PC机与单片机间的串口通信技术。毕业设计作为综合性的设计,它不同于以前教学中的试验,课程设计等实践环节。以前的所做的一些设计主要是依据相关的课本及老师所给资料去完成的,有确定的参照性,所以相对而言比较简单,不能完全达到熬炼自己动手实力的目的。而毕业设计则是对我们大学四年所学知识的一个综合的训练及考核,是对所学知识的应用实力和大学所学理论知识对实践技能相结合的全面的检验。并对我们如何依据要做的课题对现有的资料进行理解和运用的实力的考核。真正做到了理论联系实际,把以前所学的知识综合贯穿进行实践,并在实践中不断学习和自我完善。从刚确定毕业设计课题以来,我首先是查找一些相关的书籍及资料,然后分析设计,并依据实际状况拟定设计方案,从而达到优化方案。对于硬件电路,由于单片机串口通信技术已经特别成熟,所以我在书上找到了现成的电路,我没有亲自去焊硬件电路,而是买了一块做好的板子,这就省去了一部分时间,最难的是调试了,但在老师和同学的扶植下,完成的设计达到了预定的要求。同时,通过这次毕业设计,我们在各个方面都有了很大的提高,特殊是在理论和实践结合方面使我们受益匪浅,使大学里学习的理论知识在根本上得到一次最完整的实践和提高。也为我即将面临的探讨生学习奠定了很好的基础。同时,在本次毕业设计中深深相识到自己的各个方面的不足之处,本着提高动手实力以及检测四年所学知识的目的,我严格要求自己,每一环节都细致对待,定期向知道老师报告进展状况和请教不懂的地方,得以完成任务。在以后的工作中,我们必需进一步深化在实践中去丰富理论,完善知识结构。由于环境条件的影响,理论与实践还是有确定的差距,这也要求我们在实践中留意检验的积累致谢历时将近半年的时间最终将这篇论文写完,在论文的写作过程中遇到了多数的困难和障碍,都在同学和老师的扶植下度过了。尤其要剧烈感谢我的论文指导老师—梅中辉老师,他对我进行了无私的指导和扶植,不厌其烦的扶植我进行论文的修改和改进。另外,在校图书馆查找资料的时候,图书馆的老师也给我供应了很多方面的支持与扶植。在此向扶植和指导过我的各位老师表示最中心的感谢!感谢这篇论文所涉及到的各位学者。本文引用了数位学者的探讨文献,假如没有各位学者的探讨成果的扶植和启发,我将很难完成本篇论文的写作。感谢我的同学和挚友,在我写论文的过程中赐予我了很多你问素材,还在论文的撰写和排版灯过程中供应热忱的扶植。由于我的学术水平有限,所写论文难免有不足之处,恳请各位老师和学友指责和指正!本课题在选题及探讨过程中得到梅中辉老师的悉心指导。梅老师多次询问探讨进程,并为我指引迷津,扶植我开拓探讨思路,细心点拨,热忱激励。梅老师一丝不苟的作风,严谨求实的看法,踏踏实实的精神,不仅授我以文,而且教我做人,虽历时三载,却给以终生受益无穷之道。对梅老师的感谢之情是无法用言语表达的。参考文献[1]李江全聂晶等.单片机串口通信及测控应用实战详解.北京:人民邮电出版社,2014[2]郭天祥.51单片机C语言教程—入门,提高,开发,拓展全攻略.北京:电子工业出版社,2009.[3]王爽,王鹏.

单片机与PC机通讯.

微处理器,2007(4):32-33.[4]李朝青.PC机及单片机数据通信技术.北京航空航天出版社.2000.[5]卢超.单片机与PC机的通信设计.工矿自动化.2007(5):116-117.[6]范逸之.RS-232/485串行通信.清华大学出版社.2002.[7]范逸之.C++Builder与RS-232串行通信限制.

清华大学出版社.2003.[8]UniversalSerialBusMassStorageClassSpecificationOverview,Revision12,2003[9]Compaq,Intel,Microsoft,UniversalSerialBusSpecificationRevision1.1,1998.[10]TheparalleloperationcontrolofamodularACtoDCconverterviaserialcommunicationbus,IEEJTransElecElectronEng,2012-11-28[11]TheserialcommunicationbasedonmultithreadingtechniqueofWindows,WuhanUniversityJournalofNaturalSciences,2000-09-15[12]AccessingStructureofMegacontrolTypeRTUUnits,JournalofComputerScienceandControlSystems,2008-06-15[13]ASchemeforSerialCommunicationsAmongSmallComputers,InstrumentationScience&Technology,1981-06-15[14]Precisiontemperaturemeasurementsystem,JournalofComputerScienceandControlSystems,2009-06-15[15]Designofamicro-UARTforSoCapplication,ComputersandElectricalEngineering,2004-06-15[16]AccessingStructureofMegacontrolTypeRTUUnits,JournalofComputerScienceandControlSystems,2008-06-15[17]Bitbybit:WhyuseserialcommunicationsControlEngineering,2009-01-01附录A单片机采集温度数据和发送数据的程序代码:#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitDS=P2^2;//defineinterface定义DS18B20接口uinttemp;//variableoftemperatureucharflag1;//signoftheresultpositiveornegativesbitdula=P2^6;sbitwela=P2^7;unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//不带小数点编码。unsignedcharcodetable1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带小数点编码。voiddelay(uintcount)//延时子函数{uinti;while(count){i=200;while(i>0)i--;count--;}}///////功能:串口初始化,波特率9600,方式1///////voidInit_Com(void){TMOD=0x20;PCON=0x00;SCON=0x50;TH1=0xFd;TL1=0xFd;TR1=1;}voiddsreset(void)//发送初始化及复位信号{uinti;//DS18B20初始化DS=0;i=103;while(i>0)i--;DS=1;i=4;while(i>0)i--;}bittmpreadbit(void)//readabit读一位{uinti;bitdat;DS=0;i++;//i++fordelay小延时一下DS=1;i++;i++;dat=DS;i=8;while(i>0)i--;return(dat);}uchartmpread(void)//readabytedate读一个字节{uchari,j,dat;dat=0;for(i=1;i<=8;i++){j=tmpreadbit();dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好//一个字节在DAT里}return(dat);//将一个字节数据返回}voidtmpwritebyte(uchardat)//writeabytetods18b20{//写一个字节到DS18B20里uinti;ucharj;bittestb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb)//write1写1部分{DS=0;i++;i++;DS=1;i=8;while(i>0)i--;}else{DS=0;//write0写0部分i=8;while(i>0)i--;DS=1;i++;i++;}}voidtmpchange(void)//DS18B20beginchange发送温度转换命令{dsreset();//初始化DS18B20delay(1);//延时tmpwritebyte(0xcc);//跳过序列号命令tmpwritebyte(0x44);//发送温度转换命令}uinttmp()//g

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论