单片机原理及系统课程设计专业:自动化班级:动201302姓名:邓笛学号:201309352指导教师:汪莉娟兰州交通大学自动化与电气工程学院2015年12月29日评语:考勤10分守纪10分过程30分设计报告30分答辩20分总成绩(100分)单片机原理及系统课程设计报告1基于单片机的数字温度计设计1引言设计一个数字温度计,以单片机为控制核心,运用集成度较高的温度传感器和显示器能够较为准确测量并显示出温度结果,且测温范围较广,可根据实际需要通过软件设置高低温报警,并在仿真的基础上制作出设计产品,通过对具体问题的提出,对问题的分析和解决,加强了理论运用于实际的能力,最终该产品要能够运用于实际,如冷冻库,粮仓,储罐,电讯机房,电力机房,电缆线槽等测温和控制领域,主要用于测量室温。2设计方案及原理2.1总体设计方案根据电子元件的发展要求,要在可实现的前提下,选择硬件简单、集成度高、可靠性强的设计方案;软件与硬件呈现互补关系,当硬件较为简单时,需要软件控制实现其功能,因此选择集成度高,控制方法清晰、实际运用广泛的硬件。总体设计要求:(1)温度测量范围为传感器的理论值(-55℃—125℃)(2)通过软件分别实现高温和低温报警(预设35℃和-20℃)(3)使用LCD1602显示所测温度(4)温度测量精度为0.5℃总体设计方框图如图1所示:图1总体设计方框图单片机控制系统温度采集模块输出显示模块温度报警模块单片机原理及系统课程设计报告22.2系统组成原理温度测量模块选用集成芯片DS18B20作为温度的测量和变送,输出信号为数字信号。DS18B20采用单总线的数据传送,可以直接通过一个I/O口向单片机接收设置信号和向单片机发送温度的测量值。控制模块采用STC89C52单片机。功能强大STC89C52单片机适合于许多较为复杂控制应用场合。输出模块采用液晶显示LCD1602,总共可以显示两行共32个字符,设计中显示器的第一行使用软件预设想要显示的字符,温度值则放在第二行中显示。本次设计采用红色LED作为高温报警指示灯,黄色作为低温报警指示灯。另外在高低温报警的同时有蜂鸣器发出报警的蜂鸣声。设计总电路图原理如图2所示:图2总体设计电路图3软件设计本次设计采用c语言编程,程序主要由传感器复位,温度转换,温度显示三个子程序和一个主程序组成,主程序首先执行传感器的温度转换子程序将实际温度转换成数字量并存储在传感器内部的存储器中,再将测量温度的数字量读到单片机中,判断正负温度和是否达到报警要求,如果达到报警要求,执行报警模块,最后将温度值的每一位转换成对应的ASCII码值,由主程序调用温度显示子程序将测量的温度值显示出来。温度采集子程序功能是:初始化DS18B20后,启动测单片机原理及系统课程设计报告3温,将温度的模拟量转化为数字量,暂存于DS18B20内的存储器中,再由读位函数判断:温度采集是否结束,若结束,则开始将分别读取高位和低位的数据,最终把采集结果传输到单片机内由主程序处理。主程序流程图如3图所示:开始初始化,设置常量调用DS18820复位子程序调用温度转换子程序处理温度数据大于预设最高温?低于预设最低温?高温报警生成ASCII显示码显示温度低温报警YYNN图3主程序流程图单片机原理及系统课程设计报告4复位子程序流程图如4图所示:定义变量iDQ置0延时至少573us短延时,等待回应i=DQ将i返回DQ置1图4复位子程序流程图温度显示子程序流程图如5图所示:LCD初始化第一行显示预设字符第二行显示温度值返回图5温度显示子程序流程图单片机原理及系统课程设计报告5温度转换子程序流程图如图6所示:DQ置1DS18B20复位i=0?跳过ROM匹配开始温度转换延时750us以上DS18B20复位跳过ROM匹配读取温度返回YN图6温度转换子程序流程图4系统仿真及实际调试Protues软件是英国Labcenterelectronics公司出版的EDAprotues工具软件。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。本次设计即采用Protues软件进行软件仿真,分别进行了处于正常温度时,高温报警时和低温报警时的仿真并得出相应结果,最后在仿真的基础上进行实物的焊接和调试。当温度检测为正常范围时,仿真结果如图7所示:单片机原理及系统课程设计报告6图7正常温度范围仿真当温度大于预设最高温度值时,仿真结果如图8所示:图8高温报警仿真结果当温度低于于预设最低温度值时,仿真结果如图9所示:单片机原理及系统课程设计报告7图9低温报警仿真实物调试结果(正常温度下)如图10所示:图10正常温度下实物调试单片机原理及系统课程设计报告85总结本次单片机课程设计,具体谈谈以下几方面:首先,关于知识内容的学习。通过本次课程设计,复习和巩固了单片机知识的有关内容;通过对具体问题的解决,加强了理论运用于实际的能力;修改和调试程序的过程中,进一步锻炼和提高了我们的逻辑思维能力。其次,关于硬件设计的认识。硬件设计主要考虑两方面的问题,设计要求的实现:根据电子元件的发展要求,要在可实现的前提下,选择硬件简单、集成度高、可靠性强的设计方案;设计的可操作性:软件与硬件呈现互补关系,当硬件较为简单时,我们需要软件控制实现其功能,因此我们要选择集成度高,控制方法清晰、实际运用广泛的硬件。然后,关于软件设计的认识。由于产品软件功能的实现是个较为复杂的问题,通过课程设计我学习到了“化复杂为简单”的方法。如果每次进行软件设计时,能够把一个复杂的功能划分成多个具体的模块功能,再逐一对模块具体分析和设计,便可以更高效、更清晰的解决问题。最后,关于实物制作的认识。对于实物的制作是基于仿真的实现,实物的制作比想象中的还要困难很多,从购买元件到各个模块的焊接再到最后的调试每一个环节都有许多大大小小的问题,理论运用于实际才是真正的挑战,好在经过不懈的努力和不断的调试后终于达到了预期的效果,从一开始的理论设计到最后的实物制作,完成了此次数字温度计的设计,对自身来说有很大的成就感,也对电子设计产生了更加浓厚的兴趣,相信会在以后的学习中将这次设计的经验好好的运用,相信以后会做的更加好。参考文献[1]王思明,张鑫等.单片机原理及应用系统设计[M].北京:科学出版社,2012.2[2]陶红艳,余成波.传感器与现代检测技术[M].北京:清华大学出版社,2009.3[3]清惠.Proteus教程.电子线路设计制版与仿真[M].北京:清华大学出版社,2009.12[4]周润景,刘晓霞.单片机实用系统设计与仿真经典实例[M].北京:电子工业出版社,2014.1单片机原理及系统课程设计报告9附录源代码#includereg52.h#includeintrins.h//包含_nop()#defineuintunsignedint#defineucharunsignedchar#defineLCD1602DBP0//输出端口宏定义sbitDQ=P3^0;//温度输出端口定义sbitLCD1602RS=P2^0;//LCD控制命令和数据端口定义sbitLCD1602RW=P2^1;//LCD读写端口定义sbitLCD1602E=P2^2;//LCD使能端口定义ucharT[2];//读温度存放数组voiddelay(uchar);//延时函数声明ucharlcd1602r(bitx);//LCD读一位函数声明voidlcd1602w(bitx,uchary);//LCD写一位函数声明voidlcd1602b(void);//LCD等待函数声明voidlcd1602d(charx,chary);//写地址函数声明voidprint(uchar,uchar,uchar*);//显示函数声明bitDS18B20reset(void);//传感器复位函数声明bitDS18B20readbit(void);//传感器读一位函数声明ucharDS18B20readbyte(void);//传感器读一字节函数声明voidDS18B20writebyte(uchar);//传感器写一字节函数声明voidDS18B20start(void);//开始温度转换函数声明voidDS18B20get(void);//读取温度函数声明voidmain(){uchari,f;//小数和判断正负标志变量定义ucharxsbuf1[]={BFDHYLSJRC12.19};//预设第一行字符显示ucharxsbuf[10];//第二行温度显示ASCII码值存放数组lcd1602w(0,0x38);//功能设置lcd1602w(0,0x06);//设置输入方式lcd1602w(0,0x0c);//控制显示开关lcd1602w(0,0x01);//清屏lcd1602d(0,0);//写地址指向第一行第一列print(0,0,xsbuf1);//输出第一行预设字符单片机原理及系统课程设计报告10DS18B20start();//开始温度转换while(1){DS18B20get();//读取温度值存入数组DS18B20start();//温度转换刷新BUZZ=0;//蜂鸣器关闭f=0;//置为正数标志i=T[0]&0x0f;//取小数位T[0]=T[0]4;//取整数低四位T[1]=T[1]4;//取整数高四位T[1]=T[1]|T[0];//取完整整数位if(T[1]127)//负数判断{i=~i+1;//负小数补码T[1]=~T[1]+1;//负整数补码f=1;//置为负标志位}if(f)xsbuf[0]=0x2d;//显示负号else{xsbuf[0]=0x20;//显示空格}if(i=8)//小数是否大于0.5{T[1]++;//四舍五入}if(T[1]35&&f==0)//高温报警判断{BUZZ=1;//蜂鸣器报警delay(7);HL=0;//红灯亮}if(T[1]20&&f==1)//低温报警判断{BUZZ=1;//蜂鸣器报警delay(7);LO=0;//黄灯亮}sbuf[1]=T[1]/100+48;//存放百位ASCII码T[1]=T[1]%100;//取十位温度值xsbuf[2]=T[1]/10+48;//存放十位ASCII码单片机原理及系统课程设计报告11xsbuf[3]=T[1]%10+48;//存放个位ASCII码if(xsbuf[1]==48)//百位为空判断{xsbuf[1]=0x20;百位显示空格if(xsbuf[2]==48)十位为空判断xsbuf[2]=0x20;显示空格}xsbuf[4]='.';//小数点显示xsbuf[5]=i*10/32+48;//存放小数位ASCII码xsbuf[6]=0xdf;//存放单位符号1xsbuf[7]='C';//存放单位符号2print(3,1,xsbuf);//显示第二行温度值}}voidlcd1602b(void)//等待{uchary;while(1){LCD1602RS=0;//发送指令LCD1602RW=1;//读选通LCD1602E=1;//使能选通LCD1602DB=0xff;//端口初始化y=LCD1602DB;//显示器赋值LCD1602E=0;//显示器锁定if(!(y&0x80))//判断有无输入return;}}voidlcd1602w(bitx,uchary)//{lcd1602b();//等待LCD1602RS=x;//指令或数据选通LCD1602RW=0;//写选通LCD1602E=1;//使能选通LCD1602DB=y;//写地址选择LCD1602E=0;//锁定显示器}ucharlcd1602r(bitx)//读一位函数单片机原理及系统课程设计报告12{uchary;lcd1602b();//等待LCD1602RS=x;//指令或数据选通LCD1602RW=1;////读选通LCD1602E=1;//使能选通LCD1602DB=0xff;y=LCD1602DB;LCD1602E=