正文1.设计内容和要求。
随着社会的进步和工业技术的发展,人们越来越重视温度因素,许多产品对温度范围要求严格,而目前市场上普遍存在的温度检测仪器大都是单点测量,同时有温度信息传递不及时、精度不够的缺点,不利于工业控制者根据温度变化及时做出决定。
在这样的形式下,开发一种能够同时测量多点,并且实时性高、精度高,能够综合处理多点温度信息的测量系统就很有必要。
本课题以STC89C52单片机系统为核心,能对多点的温度进行实时巡检。
DS18B20是一种可组网的高精度数字式温度传感器,由于其具有单总线的独特优点,可以使用户轻松地组建起传感器网络,并可使多点温度测量电路变得简单、可靠。
本文结合实际使用经验,介绍了DS18B20数字温度传感器在单片机下的硬件连接及软件编程,并通过LCD1602显示当前温度,实现实时温度测量。
2、系统总体结构系统的系统设计方框图如图1-1所示,它主要由三部分组成:①控制部分主芯片采用单片机STC89C52;②显示部分采用LCD1602以动态扫描方式实现温度显示;③温度采集部分的温度传感器采用DS18B20智能温度温度传感器。
DS18B20进行温度采集和转换输出数字型的温度值,然后通过数据引脚传到单片机的P3.7口,单片机通过P2口将数据扫描到LCD1602显示屏上。
图2-13、硬件设计3.1 控制模块本设计采用单片机基于数字温度传感器DS18B20的系统。
单片机STC89C52具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用。
温度传感器DS18B20利用单总线的特点可以方便的实现多点温度的测量,组建传感器网络,且系统的抗干扰性好、设计灵活、方便,而且能在恶劣的环境下进行现场温度检测。
3.2温度采集模块这一部分主要完成对温度信号的采集和转换工作,由DS18B20数字温度传感器及其与单片机的接口部分组成。
DS18B20智能温度温度传感器进行温度采集和转换输出数字型的温度值,然后通过数据引脚传到单片机的P3.7口,单片机接受温度并存储。
DS18B20是美国DALLAS半导体公司最新推出的一种单线智能温度传感器,属于新一代适配微处理器的智能温度传感器,它可将温度信号直接转换为数字信号,实现了与单片机的直接接口,从而省去了信号调理和A/D转换等复杂模/数转换电路。
DS18B20构成的温度采集模块电路简单、功能可靠、测量效率高,很好地弥补了传统温度测量方法的不足可广泛用于工业、民用、军事等领域的温度测量及控制仪器、测控系统和大型设备中。
它具有集成度高、模拟输入数字输出、抗干扰能力强、体积小、接口方便、传输距离远测温误差小等特点。
如图3-1.图3-13.3温度显示模块本课程设计的显示模块采用LCD1602液晶显示器显示温度数据,整数进行显示,从P0口送数,P2口扫描。
显示当前测量的温度。
3.4电源220V的交流变压器经过变压器转换成10V的交流电,经过整流电路得到5V 的直流电,供给电路使用。
4软件设计按照硬件设计中的模块划分,软件设计业可分为三部分:DS18B20模块程序设计,LCD1602驱动程序设计,单片机主程序设计。
其中前两部分是本例软件设计的关键,而相比较,主程序设计则比较简单。
下面分别为主程序流程图,DS18B20流程图和LCD1602液晶模块程序流程图。
如图4-1.4.1单片机主程序图4-14.2 DS18B20模块程序设计在主程序流程图中,先初始化液晶模块,然后延时几百微秒,进入While 循环,先初始化DS18B20,然后启动温度转换,读取转换后的温度值,并进行处理,最终将温度显示在LCD屏幕上。
DS18B20是1-wire单线器材,即在一根数据线上实现数据的双向传输,这就需要严格的通信协议来保证各位数据传输的正确性和完整性。
单片机操作单线器材DS18B20的流程图如图4-2所示。
图4-2首先DS18B20初始化。
复位DS18B20,然后单片机等待DS18B20的应答脉冲,一旦单片机监测到应答脉冲,变发起跳过ROM匹配操作命令。
成功执行了ROM 操作命令后,就可以使用内存操作命令,启动温度转换,延时一段时间后,等待温度转换完成。
再发起跳过ROM匹配操作命令,然后读暂存器,将转换结果读出,并转换为显示码,送液晶显示。
需要注意的是:复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。
4.3 LCD1602驱动程序设计用LCD1602液晶显示模块显示字符或字符串之前必须对其进行初始化,LCD1602液晶显示模块的初始化程序流程图如图4-3所示。
图4-3上电复位以后,延时15ms,写3次38H指令,写指令前不监测忙标志位。
当3次写38H指令完成后,开始进行显示模式设置操作,此时必须先监测忙标志位,只有当其为空闲时,才能进行显示模式设置。
伺候依次为显示关闭。
显示清屏,显示光标移动设置和显示开关及光标设置。
同写显示模式设置一样,每次写之前,都必须先检测忙标志位。
5,系统调试5.1综述单片机应用系统的硬件调试和软件调试是分不开的.许多硬件故障只有通过软、硬件联调才能发现,但一般是先排除系统中比较明显的硬件故障后才和软件一起联调。
常见的硬件故障.5.2常见问题逻辑错误样机硬件的逻辑错误是由于设计错误和加工过程中的工艺错误而造成的,包括错线、开路、短路、相位错误、时序错误等,其中最常见的是短路故障。
2元器件错误元器件错误的原因有器件损坏或性能不符合要求,电解电容、二极管的极性接反或集成块装反等。
3可靠性差应用系统可靠性差的原因很多,如金属化孔、接插件接触不良、内部和外部的干扰、电压纹波系数过大、器件负载过重等均会造成系统的可靠性差。
另外,走线和布置的不合理也会造成系统可靠性差。
4电源故障电源故障包括:电压值不符合设计要求、电源功率不足、负载能力差、纹波太重等。
5.3.硬件调试力法(1)脱机调试脱机调试是在加电前,先用万用表等工具,按图纸仔细核对样机线路是否正确,并对元器件的安装、型号、规格等进行仔细检查,特别注意印制板加工和焊接时有无走线之间相互短路等。
(2)联机调试联机前先切断电源,把仿真插头插到样机的单片机插座上,检查一下开发机与样机之间的电源、接地是否良好。
一切正常后,即可打开电源。
通电后执行开发机读/写指令,对用者样机的存储器I/O口进行读/写操作,进行逻辑检查。
若有故障,可用示波器观察有关点的波形,寻找和分析故障原因,并进一步排除故障。
在用者系统的样机(主机部分)调试好后,便可按入用者系统的其它外围部件,如键盘、显示器等,再进一步进行调试。
5.4软件调试方法:软件调试与所选用的软件结构有关,如果采用模块程序设计技术,则逐个模块调好后再进行系统程序总调。
如果采用实时多任务操作系统,一般是逐个任务进行调试。
对于模块结构程序.要一个个子程序分别调试。
调试时,一定要符合入口条件和出口条件,调试可用单步运行和断点运行方式,通过检查用者系统的CPU现场情况、 RAM的内容和I/O口的状态,检测程序执行结果是否符合设计要求,有无循环错误、有无机器码错误以及转移地址的错误,同时,还可以发现用者系统中存在的硬件设计错误和软件算法错误。
各程序模块通过后,则可以把相关功能块连在一起进行总调。
这个阶段若有故障,可以考虑各子程序运行时是否破坏了现场,缓冲单元、工作寄存器是否发生冲突,标志位的建立和清除是否有误,堆栈区是否有溢出,输入设备的状态是否正常等等,若用者系统是在开发机的监控程序下运行时,还要考虑用者缓冲单元是否和监控程序的工作单元发生冲突。
单步和断点调试后,还应进行连续调试,用以确定定时精度、CPU的实时响应等问题。
对于实时多任务操作系统的调试方法和模块结构的调试方法类似,只是需逐个任务进行调试,在调试某一个任务时,同时也调试相关的子程序、中断服务程序。
逐个任务调试好后,再使各个任务同时运行。
当全部调试和修改完成后,将用者程序固化到EPROM中,插入用者样机后,用者系统即能独立工作,至此,单片机应用系统研制完成。
6,设计小结本设计使用的温度控制器结构简单、测温准确,具有一定的实际应用价值。
该智能温度控制器只是DS18B20在温度控制领域的一个简单实例,还有许多需要完善的地方,例如可以将测得的温度通过单片机与通讯模块相连接,以手机短消息的方式发送给用户,使用户能够随时对温度进行监控。
此外,还能广泛地应用于其他一些工业生产领域,如建筑,仓储等行业。
本温度控制系统可以应用于多种场合,像花房的多点温度、育婴房的温度、水温的检测与控制。
用户可灵活选择本设计的用途,有很强的实用价值。
由衷感谢我们的老师,教予了我诸多传感器的理论知识。
指导了我顺利的独立地完成了这一次的课程设计。
期间,让我学到了许多在实践中需注意的问题。
怎样思考问题,然后如何去收集整理资料。
再次特别感谢庄老师对我们的帮助,以及平日对我们的谆谆教诲。
7:参考文献及资料[1]肖洪兵. 跟我学用单片机[M]北京:北京航空航天大学出版社,2002.8[2] 何立民. 单片机高级教程.第1版[M]北京:北京航空航天大学出版社,2001[3]赵晓安. MCS-51单片机原理及应用[m] 天津:天津大学出版社,2001.3[4]李广第.单片机基础.第1版[M]北京:北京航空航天大学出版社,1999[5]徐惠民、安德宁.单片微型计算机原理接口与应用[M] 第1版.北京:北京邮电大学出版社,1996[6]何立民.从Cygnal 80C51F看8位单片机发展之路[J] 单片机与嵌入式系统应用,2002年,第5期:P5~8[7]常敏,51单片机应用程序开发与实践[ M] 电子工业出版社 2009.3四,附录1)元器件清单2)原理图3)程序清单#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P3^7;//ds18b20与单片机连接口sbit RS=P3^0;sbit RW=P3^1;sbit EN=P3^2;unsigned char code str1[]={"temperature: "};unsigned char code str2[]={" "};uchar data disdata[5];uint tvalue;//温度值uchar tflag;//温度正负标志/*************************lcd1602程序**************************/ void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);}void wr_com(unsigned char com)//写指令//{ delay1ms(1);RS=0;RW=0;EN=0;P2=com;delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据//{ delay1ms(1);;RS=1;RW=0;EN=0;P2=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;void lcd_init()//初始化设置//{delay1ms(15);wr_com(0x38);delay1ms(5);wr_com(0x08);delay1ms(5);wr_com(0x01);delay1ms(5);wr_com(0x06);delay1ms(5);wr_com(0x0c);delay1ms(5);}void display(unsigned char *p)//显示// {while(*p!='\0'){wr_dat(*p);p++;delay1ms(1);}}init_play()//初始化显示{ lcd_init();wr_com(0x80);display(str1);wr_com(0xc0);display(str2);}/******************************ds1820程序***************************************/void delay_18B20(unsigned int i)//延时1微秒{while(i--);}void ds1820rst()/*ds1820复位*/{ unsigned char x=0;DQ = 1; //DQ复位delay_18B20(4); //延时DQ = 0; //DQ拉低delay_18B20(100); //精确延时大于480usDQ = 1; //拉高delay_18B20(40);}uchar ds1820rd()/*读数据*/{ unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){ DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}void ds1820wr(uchar wdata)/*写数据*/ {unsigned char i=0;for (i=8; i>0; i--){ DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata>>=1;}}read_temp()/*读取温度值并转换*/{uchar a,b;ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0x44);//*启动温度转换*/ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0xbe);//*读取温度*/a=ds1820rd();b=ds1820rd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0x0fff)#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P3^7;//ds18b20与单片机连接口sbit RS=P3^0;sbit RW=P3^1;sbit EN=P3^2;unsigned char code str1[]={"temperature: "};unsigned char code str2[]={" "};uchar data disdata[5];uint tvalue;//温度值uchar tflag;//温度正负标志/*************************lcd1602程序**************************/ void delay1ms(unsigned int 1ms)//延时1毫秒(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);}void wr_com(unsigned char com)//写指令//{ delay1ms(1);RS=0;RW=0;EN=0;P2=com;delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据// { delay1ms(1);;RS=1;RW=0;EN=0;P2=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;}void lcd_init()//初始化设置//{delay1ms(15);wr_com(0x38);delay1ms(5);wr_com(0x08);delay1ms(5);wr_com(0x01);delay1ms(5);wr_com(0x06);delay1ms(5);wr_com(0x0c);delay1ms(5);}void display(unsigned char *p)//显示//{while(*p!='\0'){wr_dat(*p);p++;delay1ms(1);}}init_play()//初始化显示{ lcd_init();wr_com(0x80);display(str1);wr_com(0xc0);display(str2);}/******************************ds1820程序***************************************/void delay_18B20(unsigned int i)//延时1微秒{while(i--);}void ds1820rst()/*ds1820复位*/{ unsigned char x=0;DQ = 1; //DQ复位delay_18B20(4); //延时DQ = 0; //DQ拉低delay_18B20(100); //精确延时大于480us DQ = 1; //拉高delay_18B20(40);}uchar ds1820rd()/*读数据*/{ unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){ DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}void ds1820wr(uchar wdata)/*写数据*/{unsigned char i=0;for (i=8; i>0; i--){ DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata>>=1;}read_temp()/*读取温度值并转换*/{uchar a,b;ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0x44);//*启动温度转换*/ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0xbe);//*读取温度*/a=ds1820rd();b=ds1820rd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0x0fff)tflag=0;else{tvalue=~tvalue+1;tflag=1;}tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数return(tvalue);}/****************************************************************void ds1820disp()//温度值显示{ uchar flagdat;disdata[0]=tvalue/1000+0x30;//百位数disdata[1]=tvalue%1000/100+0x30;//十位数disdata[2]=tvalue%100/10+0x30;//个位数disdata[3]=tvalue%10+0x30;//小数位if(tflag==0)flagdat=0x20;//正温度不显示符号elseflagdat=0x2d;//负温度显示负号:-if(disdata[0]==0x30){disdata[0]=0x20;//如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20;//如果百位为0,十位为0也不显示}}wr_com(0xc0);wr_dat(flagdat);//显示符号位wr_com(0xc1);wr_dat(disdata[0]);//显示百位wr_com(0xc2);wr_dat(disdata[1]);//显示十位wr_com(0xc3);wr_dat(disdata[2]);//显示个位wr_com(0xc4);wr_dat(0x2e);//显示小数点wr_com(0xc5);wr_dat(disdata[3]);//显示小数位}/********************主程序***********************************/ void main(){ init_play();//初始化显示delaynms(100);while(1){read_temp();//读取温度ds1820disp();//显示}}4)实物图五:任务书二级学院:电子信息与电气工程学院班级: 11电卓姓名:翟俊先学号: 11060328指导教师:庄志红职称:副教授。