您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > DS18B20数字温度计的设计
题目:DS18B20数字温度计的设计姓名学号:张琪2008221105200102吕群武2008221105200166蔡凌志2008221105200178专业班级:电信1班指导老师:余琼蓉设计时间:2010年12月单片机原理及应用课程设计报告书成绩评定题目DS18B20数字温度计的设计任务要求1、数字式温度计测温范围在-55~125℃2、误差在±0.5℃以内3、采用LED数码管直接显示实验完成1、数码管温度值显示正常2、在测不同的温度时反应比较灵敏3、与实际温度相比误差不大4、自评成绩良好互评1、2、3、4、互评成绩老师评价成绩日期:年月日一、课题介绍本设计是一款简单实用的小型数字温度计,所采用的主要元件有传感器18B20,单片机AT89S52,,四位共阴极数码管一个,电容电阻若干。18B20支持“一线总线”接口,测量温度范围-55°C~+125°C。在-10~+85°C范围内,精度为±0.5°C。18B20的精度较差为±2°C。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。本次数字温度计的设计共分为五部分,主控制器,LED显示部分,传感器部分,复位部分,时钟电路。主控制器即单片机部分,用于存储程序和控制电路;LED显示部分是指四位共阳极数码管,用来显示温度;传感器部分,即温度传感器,用来采集温度,进行温度转换;复位部分,即复位电路。测量的总过程是,传感器采集到外部环境的温度,并进行转换后传到单片机,经过单片机处理判断后将温度传递到数码管显示。本设计能完成的温度测量范围是-55°C~+128°C,由于能力有限,不能实现报警功能。二、方案论证方案一:由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。方案设计框图如下:方案二:考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。热敏电阻组成的感温电路AD转换数码管显示电路三、系统软硬件设计1、硬件设计按照系统设计功能的要求,确定系统由3个模块组成:主控制器、测温电路和显示电路。数字温度计总体电路结构框图所示:单片机的选择单片机AT89S52具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。复位电路设计单片机系统的复位电路在这里采用的是上电+按钮复位电路形式,其中电阻R采用6.8KΩ的阻值,电容采用电容值为10μ的电解电容。电路图如下:温度显示电路四位共阳极数码管,能够显示小数和负温度。零下时,第一个数码管显示负号。当温度超过99.9时,四个数码管全部亮。列扫描用P3.0~P3.3口来实现,列驱动用9012三极管。电路图如下:DS18B20AT89C52主控制器显示电路扫描驱动温度传感器DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。电路图如下:系统总电路图如下:2、软件设计主要包括主程序、读出温度子程序、温度转换命令子程序、计算温度子程序和现实数据刷新子程序等。主程序主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量温度值。温度测量每1S进行一次。主流程图如下:调用显示程序初始化1s到?NYYN初次上电读出温度值温度计算处理显示数据刷新发温度转换开始命令读出温度子程序读出温度子程序的主要功能是读出RAM中的9字节。在读出时须进行CRC校验,校验有错时不进行温度数据的改写。流程图如下:温度转换命令子程序温度转换命令子程序主要是发温度转换开始命令。当采用12位分辨率时,转换时间约为750ms。在本程序设计中,采用1s显示程序延时法等待转换的完成。流程图如下:发DS18B20复位命令发跳过ROM命令发读取温度命令读取操作,CRC校验9字节完?CRC校验正?确?移入温度暂存器结束NNYY发DS18B20复位命令发跳过ROM命令发温度转换开始命令结束计算温度子程序计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定。显示数据刷新子程序显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高数据显示位为0时,将符号显示位移入下一位。系统所运用的功能介绍:DS18B20与单片机之间采用串行通信的方式进行数据读写系统的调试及性能分析:硬件调试比较简单,首先检查电感的焊接是否正确,然后可用万用表测试或温度数据移入显示寄存器十位数0?百位数0?十位数显示符号百位数不显示百位数显示数据(不显示符号)结束开始温度零下?温度值取补码置“-”标志计算小数位温度BCD值计算整数位温度BCD值结束置“+”标志NY通电检测。软件调试可以先编写显示程序并进行硬件的正确性检验,然后分别进行主程序、读出温度子程序、温度转换命令子程序、计算温度子程序和现实数据刷新子程序等的编程及调试由于DS18B20与单片机采用串行数据传送,因此,对DS18B20进行读/写编程时必须严格地保证读/写时序;否则将无法读取测量结果。本程序采用单片机汇编或C语言编写用KeilC51编译器编程调试。软件调试到能显示温度值,并且在有温度变化时显示温度能改变,就基本完成。性能测试可用制作的温度机和已有的成品温度计同时进行测量比较。由于DS18B20的精度很高,所以误差指标可以限制在0.5℃以内。另外,-55~+125℃的测温范围使得该温度计完全适合一般的应用场合,其低电压供电特性可做成用电池供电的手持温度计。四、课程设计体会本次的课程设计使我们进一步巩固了书本上的知识,做到了学以致用。这是我们第二次自己动手设计的电路,通过系统仿真软件protues和编译软件keil,使我们进一步了解了单片机的设计制作过程,其中最为困难的是软件部分,即编程部分,我们上网找了好多资料,虽然经过自己的修改,但还是有很多功能不能实现,如温度上下限设置。由于protues并不是很熟练,在使用的过程中有很多原件的名称不知道,从而花费了大量的时间在网上查找,今后应该在这方面多多努力。最后一步的焊接硬件也遇到了不少麻烦,P0端口没有加上拉电阻,P1端口没有加电阻导致数码管不亮或者亮度不够。总结经验的时候我们得出这样的结论,学习应该学以致用,有目的的去学习,如果学了不用等于没学。其次,要学以致用,理论联系实际,这样才会取得事半功倍的效果。附件:DS18B20温度计C程序//使用AT89C2051单片机,12MHZ晶振,用共阳LED数码管//P1口输出段码,P3口扫描//#pragmasrc(d:\aa.asm)#includereg51.h#includeintrins.h//_nop_();延时函数用#defineDisdataP1//段码输出口#definediscanP3//扫描口#defineucharunsignedchar#defineuintunsignedintsbitDQ=P3^7;//温度输入口sbitDIN=P1^7;//LED小数点控制uinth;//*******温度小数部分用查表法**********//ucharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};ucharcodedis_7[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};/*共阳LED段码表0123456789不亮-*/ucharcodescan_con[4]={0xfe,0xfd,0xfb,0xf7};//列扫描控制字uchardatatemp_data[2]={0x00,0x00};//读出温度暂放uchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据,一个运算暂存用/***********11微秒延时函数**********/voiddelay(uintt){for(;t0;t--);}/***********显示扫描函数**********/scan(){chark;for(k=0;k4;k++)//四位LED扫描控制{Disdata=dis_7[display[k]];if(k==1){DIN=0;}discan=scan_con[k];delay(90);discan=0xff;}}/***********18B20复位函数**********/ow_reset(void){charpresence=1;while(presence){while(presence){DQ=1;_nop_();_nop_();DQ=0;//delay(50);//550usDQ=1;//delay(6);//66uspresence=DQ;//presence=0继续下一步}delay(45);//延时500uspresence=~DQ;}DQ=1;}/**********18B20写命令函数*********///向1-WIRE总线上写一个字节voidwrite_byte(ucharval){uchari;for(i=8;i0;i--)//{DQ=1;_nop_();_nop_();DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();//5usDQ=val&0x01;//最低位移出delay(6);//66usval=val/2;//右移一位}DQ=1;delay(1);}/*********18B20读1个字节函数********///从总线上读取一个字节ucharread_byte(void){uchari;ucharvalue=0;for(i=8;i0;i--){DQ=1;_nop_();_nop_();value=1;DQ=0;//_nop_();_nop_();_nop_();_nop_();//4usDQ=1;_nop_();_nop_();_nop_();_nop_();//4usif(DQ)value|=0x80;delay(6);//66us}DQ=1;return(value);}/***********读出温度函数**********/read_temp(){ow_reset();//总线复位write_byte(0xCC);//发SkipROM命令write_byte(0xBE);//发读命令temp_data[0]=read_byte();//温度低8位temp_data[1]=read_byte();//温度高8位ow_reset();write_byte(0xCC);//SkipROMwrite_byte(0x44);//发转换命令}/***********温度数据处理函数**********/work_temp(){ucharn=0;//if(temp_data[1]127){if(temp_data[0]!=0x00){temp_data[1]=(255-temp_data[1]);temp_data[0]=(256-temp_data[0]);n=1;}//负温度求补码else{temp_data[1]=(256-temp_data[1]);n=1;}//负温度求补码}display[4]
本文标题:DS18B20数字温度计的设计
链接地址:https://www.777doc.com/doc-6444641 .html