《基于51单片机的多点温度测量系统设计.doc》由会员分享,可在线阅读,更多相关《基于51单片机的多点温度测量系统设计.doc(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、目录第一章 摘要2第二章 引言2第三章 DS18B20温度传感器相关介绍33.1 DS18B20的特点33.2 DS18B20工作过程及时序3 3.3 DS18B20结构图5第四章 LED数码管介绍8第五章 硬件的设计 10 5.1温度采集模块11 5.2温度显示模块11第六章 软件的设计12 6.1读18B20的ROM系列号程序.126.2温度的转换与读取程序176.3温度在数码管显示的程序23第七章 心得体会26 参考资料27第一章 摘要本次课程设通过基于MCS-51系列单片机SST80C51和DS18B20温度传感器检测温度,熟悉芯片的使用,温度传感器的功能,LED数码管的使用,汇编语言
2、的设计;并且把我们这一年所学的数字和模拟电子技术、检测技来掌握相关知识。第二章 引言在人类的生活环境中,温度扮演着极其重要的角色。无论你生活在哪里,从事什么工作,无时无刻不在与温度打着交道。自18世纪工业革命以来,工业开展对是否能掌握温度有着绝对的联系。在冶金、钢铁、石化、水泥、玻璃、医药等等行业,可以说几乎80%的工业部门都不得不考虑着温度的因素。温度对于工业如此重要,由此推进了温度传感器的开展。进入21世纪后,温度传感器正朝着高精度、多功能、总线标准化、高可靠性及平安性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速开展。在工农业生产中,温度检测及其控制占有举足轻重的地位,
3、随着现代信息技术的飞速开展和传统工业改造的逐步实现 ,能够独立工作的温度检测和显示系统已经应用于诸多领域。要到达较高的测量精度需要很好的解决引线误差补偿问题、多点测量切换误差问题和放大电路零点漂移误差等问题,使温度检测复杂化。单片机以其功能强、体积小、可靠性高、造价低和开发周期短等优点,成为自动化和各个测控领域中必不可少且广泛应用的器件,尤其在日常生活中也发挥越来越大的作用。采用单片机对温度采集进行控制,不仅具有控制方便、组态简单和灵活性大等优点,而且可以大幅度提高被控数据的技术指标,从而能够大大提高产品的质量和数量。第三章 DS18B20温度传感器相关介绍3.1 DS18B20的特点:1独特
4、的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。2在使用中不需要任何外围元件。3可用数据线供电,电压范围:+3.0 +5.5 V。4测温范围:-55 - +125 。固有测温分辨率为0.5 。5通过编程可实现9-12位的数字读数方式。6用户可自设定非易失性的报警上下限值。7支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温.8负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。3.2 DS18B20工作过程及时序DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频
5、率稳定的计数脉冲。高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。初始时,计数器1预置的是与-55相对应的一个预置值。以后计数器1每一个循环的预置数都由斜率累加器提供。为了补偿振荡器温度特性的非线性性,斜率累加器提供的预置数也随温度相应变化。计数器1的预置数也就是在给定温度处使温度存放器存放值增加1计数器所需要的计数个数。DS18B20内部的比拟器以四舍五入的量化方式确定温度存放器的最低有效位。在计数器2停止计数后,比拟器将计数器1中的计数剩余值转换为温度值后与0.25进行比拟,假设低于0.25,温度存放器的最低位就置0;假设高于0.25,最低位
6、就置1;假设高于0.75时,温度存放器的最低位就进位然后置0。这样,经过比拟后所得的温度存放器的值就是最终读取的温度值了,其最后位代表0.5,四舍五入最大量化误差为1/2LSB,即0.25。温度存放器中的温度值以9位数据格式表示,最高位为符号位,其余8位以二进制补码形式表示温度值。测温结束时,这9位数据转存到暂存存储器的前两个字节中,符号位占用第一字节,8位温度数据占据第二字节。DS18B20测量温度时使用特有的温度测量技术。DS18B20内部的低温度系数振荡器能产生稳定的频率信号;同样的,高温度系数振荡器那么将被测温度转换成频率信号。当计数门翻开时,DS18B20进行计数,计数门开通时间由高
7、温度系数振荡器决定。芯片内部还有斜率累加器,可对频率的非线性度加以补偿。测量结果存入温度存放器中。一般情况下的温度值应该为9位,但因符号位扩展成高8位,所以最后以16位补码形式读出。DS18B20工作过程一般遵循以下协议:初始化ROM操作命令存储器操作命令处理数据 初始化单总线上的所有处理均从初始化序列开始。初始化序列包括总线主机发出一复位脉冲,接着由附属器件送出存在脉冲。存在脉冲让总线控制器知道DS1820 在总线上且已准备好操作。 ROM操作命令一旦总线主机检测到附属器件的存在,它便可以发出器件ROM操作命令之一。所有ROM操作命令均为8位长。这些命令列表如下:Read ROM(读ROM)
8、33h 此命令允许总线主机读DS18B20的8位产品系列编码,唯一的48位序列号,以及8位的CRC。此命令只能在总线上仅有一个DS18B20的情况下可以使用。如果总线上存在多于一个的附属器件,那么当所有从片企图同时发送时将发生数据冲突的现象漏极开路会产生线与的结果。Match ROM( 符合ROM)55h 此命令后继以64位的ROM数据序列,允许总线主机对多点总线上特定的DS18B20寻址。只有与64位ROM序列严格相符的DS18B20才能对后继的存贮器操作命令作出响应。所有与64位ROM序列不符的从片将等待复位脉冲。此命令在总线上有单个或多个器件的情况下均可使用。Skip ROM( 跳过RO
9、M )CCh 在单点总线系统中,此命令通过允许总线主机不提供64位ROM编码而访问存储器操作来节省时间。如果在总线上存在多于一个的附属器件而且在Skip ROM命令之后发出读命令,那么由于多个从片同时发送数据,会在总线上发生数据冲突漏极开路下拉会产生线与的效果。Search ROM( 搜索ROM)F0h 当系统开始工作时,总线主机可能不知道单线总线上的器件个数或者不知道其64位ROM编码。搜索ROM命令允许总线控制器用排除法识别总线上的所有从机的64位编码。Alarm Search(告警搜索)ECh 此命令的流程与搜索ROM命令相同。但是,仅在最近一次温度测量出现告警的情况下,DS18B20才
10、对此命令作出响应。告警的条件定义为温度高于TH 或低于TL。只要DS18B20一上电,告警条件就保持在设置状态,直到另一次温度测量显示出非告警值或者改变TH或TL的设置,使得测量值再一次位于允许的范围之内。贮存在EEPROM内的触发器值用于告警。存储器操作命令 Write Scratchpad写暂存存储器4Eh 这个命令向DS18B20的暂存器中写入数据,开始位置在地址2。接下来写入的两个字节将被存到暂存器中的地址位置2和3。可以在任何时刻发出复位命令来中止写入。Read Scratchpad读暂存存储器BEh 这个命令读取暂存器的内容。读取将从字节0开始,一直进行下去,直到第9字节8,CRC
11、字节读完。如果不想读完所有字节,控制器可以在任何时间发出复位命令来中止读取。Convert T温度变换44h 这条命令启动一次温度转换而无需其他数据。温度转换命令被执行,而后DS18B20保持等待状态。如果总线控制器在这条命令之后跟着发出读时间隙,而DS18B20又忙于做时间转换的话,DS18B20将在总线上输出“0,假设温度转换完成,那么输出“1。如果使用寄生电源,总线控制器必须在发出这条命令后立即起动强上拉,并保持500ms。处理数据: DS18B20的高速暂存存储器由9个字节组成,其分配如图3所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个
12、字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后。 DS18B20温度数据表上表是DS18B20温度采集转化后得到的12位数据,存储在DS18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于或等于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。温度转换计算方法举例: 例如当DS18B20采集到+125的实际温度后,输出为07D0H,那么:实际温度=07D0H0.0625=20000.0625=1250C。例如当DS18B20采集到-55的实际温度后,
13、输出为FC90H,那么应先将11位数据位取反加1得370H符号位不变,也不作为计算,那么:实际温度=370H0.0625=8800.0625=550C。3.3 DS18B20结构图 图1管脚排列图 在TO-92和SO-8的封装中引脚有所不同,具体差异请查阅PDF手册,在TO-92封装中引脚分配如下: 1GND:地2DQ:单线运用的数据输入输出引脚3VDD:可选的电源引脚 第四章 LED数码管的介绍LED数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。当数码管特定的段加上电压后,这些特定的段就会发亮。一般情况下,单个发光二极
14、管的管压降为1.8V左右,电流不超过30mA。发光二极管的阳极连接到一起连接到电源正极的称为共阳数码管,发光二极管的阴极连接到一起连接到电源负极的称为共阴数码管。常用LED数码管显示的数字和字符是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。 图2 数码管引脚定义图八段LED数码显示管原理和结构:数码管分为共阳型和共阴型,共阳极型就是发光管的正极都连在一起 ,作为一条引线,负极分开。八段数码发光管就是8个发光二极管组成的,在空间排列成为8字型带个小数点,只要将电压加在阳极和阴极之间相应的笔画就会发光。8个发光二极管的阳极并接在一起,8个阴极分开,因此称为共阳八段数码管。相反那
15、么为共阴八段数码管。共阴极八段译码管显码表:输入为sp、g、f、e、d、c、b、a输入输出输入输出3FH07FH806H16FH95BH277HA4FH37CHB66H439HC6DH55EHD7DH679HE07H771HF动态显示驱动:数码管动态显示介面是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划a,b,c,d,e,f,g,dp 的同名端连在一起,另外为每个数码管的公共极COM增加位元选通控制电路,位元选通由各自独立的I/O线控制。当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位元选通COM端电路的控制
16、,所以我们只要将需要显示的数码管的选通控制翻开,该位元就显示出字形,没有选通的数码管就不会亮。 透过分时轮流控制各个LED数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位元数码管的点亮时间为12ms,由于人的视觉暂留现象及发光二极体的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示资料,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。第五章 硬件的设计温度采集系统的硬件局部主要是由温度采集模块、MSC51处理模块、温度显示模块组成:图3系统硬件框图5.1温度采集模块:图4
17、 温度采集模块电路原理图两个18B20的输入/输出端口接在同一根总线上,GND接地,VCC端口接+5V电源,DQ端口接单片机的P2.0口5.2温度显示模块:图5 温度显示模块电路原理图51单片机通过CH452驱动八共阴极数码管显示,其中CH452的SCL输入端口接单片机的P2.2,SDA输入输出端口接P2.1口。第六章 软件的设计程序的编写主要分为 读18B20的ROM系列号的程序,温度的转换与读取程序,温度在数码管显示的程序。6.1 读18B20的ROM系列号的程序在编写读18B20的ROM系列号的程序的过程中需要分为几个子程序如:初始化,写时序,读时序,读ROM系列号等过程 图6 读ROM
18、序列号流程图#include#include#define uchar unsigned char#define uint unsigned intuchar busf8;sbit DQ = P20;/* 22.11484MHz时微秒级延时*/void delayus(uchar us)while(us-);/* 22.11484MHz时毫秒级延时*/void delayms(uint xms)uint x,y;for(x=xms; x0; x-)for(y=229; y0; y-);void DQ_Init(void)DQ=1;_nop_();_nop_();DQ=0;delayus(150
19、);/492usDQ=1; delayus(30);/103uswhile(DQ=1); delayus(150);/492usuchar DQ_read(void)uchar i, rdata;for(i=0; i1; DQ = 1;_nop_();_nop_();_nop_();_nop_();DQ = 0;_nop_();_nop_();_nop_();_nop_();DQ = 1;delayus(2);if(DQ=1)rdata = rdata|0x80;else rdata = rdata&0x7F;delayus(12); /45usDQ = 1; return rdata;voi
20、d DQ_write(uchar sdata)uchar i;for(i=0; i1;DQ = 1;void get_num()uchar i;DQ_Init();DQ_write(0x33);for(i=0;i8;i+)busfi=DQ_read();void main()delayms(1000);while(1)get_num();delayms(1000);P0=busf0;6.2温度的转换与读取程序二温度的读取与相应转换程序中主要包括 初始化,跳过ROM,温度转换,匹配ROM,写入指令读暂存器温度,温度值的转换成实际温度等过程。 图7 温度读取与转换流程图#include #incl
21、ude C_Delay.h#include PIN.h#include DS18B20.huchar TH,TL;uint TEMP;/*18b20的ROM地址:单个连接读取*/unsigned char rom18 =0x28,0xfe,0x97,0x4a,0x03,0x00,0x00,0x86;unsigned char rom28 =0x28,0xe6,0x7b,0x79,0x02,0x00,0x00,0xec;/* 1-wire通信初始化*/void DQ_Init(void)DQ=1;_nop_();_nop_();DQ=0;delayus(150);/492usDQ=1; /释放总
22、线delayus(30);/103uswhile(DQ=1); /等到18B20delayus(150);/492us/* 1-wire通信读1字节*/uchar DQ_read(void)uchar i, rdata;for(i=0; i1; DQ = 1;_nop_();_nop_();_nop_();_nop_();DQ = 0;_nop_();_nop_();_nop_();_nop_();DQ = 1;delayus(2);/12us,加上前面DQ之后的时间,大约14-15usif(DQ=1)rdata = rdata|0x80;else rdata = rdata&0x7F;del
23、ayus(12); /45usDQ = 1; return rdata;/* 1-wire通信写1字节*/void DQ_write(uchar sdata)uchar i;for(i=0; i1;DQ = 1;/释放总线uint get_Temp(uchar on) uchar i;DQ_Init();DQ_write(0xcc);/跳过ROMDQ_write(0x44);/开始转换温度delayms(750);DQ_Init();DQ_write(0x55); /match ROMif(on=1)for(i=0;i8;i+)DQ_write(rom1i);if(on=2)for(i=0;i
24、8;i+)DQ_write(rom2i);DQ_write(0xBE);TL = DQ_read();TH = DQ_read();TEMP = TH;TEMP = (TEMP8)|TL;TEMP = (unsigned int)(TEMP*0.0625*100+0.5);return TEMP;,6.3 温度在数码管显示的程序三温度显示局部程序主要包括初始化,通过CH452进行温度代码的转换,通过按键逐一显示在LED数码管上等过程。 图8 温度显示流程图#include#include#includeCH452CMD.h#includeC_Delay.h/#includeDS1302.h#i
25、ncludeDS18b20.h/#includeAD_TLC549.h#includePIN.h#define uint unsigned int#define uchar unsigned char/位定义/sbitLED = P00;/sbit LED1 = P01;/sbitFMQ = P33;/全局变量定义uchar keyValue;/键值/bit isRTCSet = 0;/1302是否调时模式/uchar TimeOn;/显示缓冲区uchar DISBUF8 = 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10;/DS1302时间缓冲区
26、uchar DATETIME7 = 0, 0x27, 0x21, 0x19, 0x08, 0x02, 0x11;/显示数据类型enum RTCModetime = 0,date = 1 RTC_Display = time;/* CH452显示程序 */void CH452_Fresh_Display(void)/配置CH452:采用BCD译码方式,8个数码管CH452_Write(CH452_SYSON2);CH452_Write(CH452_BCD); / BCD译码,8个数码管CH452_Write(CH452_DIG7 | DISBUF4);CH452_Write(CH452_DIG6
27、 | DISBUF5);CH452_Write(CH452_DIG5 | DISBUF6);CH452_Write(CH452_DIG4 | DISBUF7);CH452_Write(CH452_DIG3 | DISBUF0);CH452_Write(CH452_DIG2 | DISBUF1);CH452_Write(CH452_DIG1 | DISBUF2);CH452_Write(CH452_DIG0 | DISBUF3);显示温度*/void Dis_temp(uchar Dev_No)uint TEMP; TEMP=get_Temp(Dev_No);DISBUF0 = 0x17;DIS
28、BUF1 = 0x18+0x80;if(Dev_No=1)DISBUF2 = 1; if(Dev_No=2)DISBUF2 = 2; DISBUF3 = 0x12;DISBUF4 = TEMP % 10000 / 1000;/拆分温度信息DISBUF5 = TEMP % 1000 / 100+0x80;DISBUF6 = TEMP % 100 / 10;DISBUF7 = TEMP % 10;CH452_Fresh_Display();void init()/初始化函数/配置中断:使能外部中断0,使能串口中断,使能总中断IE0=0;EX0=1;ET0 = 1;EA=1; /只点亮LED1P0
29、= 0x01;/设备初试化测试CH452_Write(CH452_SYSON2);/DS1302_Test();/RTC_WRDateTime(DATETIME);void choice() interrupt 0 keyValue = CH452_Read();void main()P0=0;init();while(1) if(keyValue=0x40)CH452_Write(CH452_TWINKLE & 0xFF00);Dis_temp(1);if(keyValue=0x41)CH452_Write(CH452_TWINKLE & 0xFF00);Dis_temp(2);else C
30、H452_Write(CH452_TWINKLE & 0xFF00);Dis_temp(1);/delayms(20);第七章 心得体会 通过本次的综合训练,自己感觉学到了很多东西,虽然只有短短的一周时间,但确实使自己对知识的认识和了解有了很大的提升。首先要说的是对数字信号处理的认识,通过查阅资料,自己在里仁图书馆借个几本相关的书籍,通过这次基于DS18B20传感器测量温度的和LED数码管设计,我学到了许多东西。,这次设计加强了我们独立思考的能力。一个好的设计需要通过我们不断的思维,不断的改善。经过设计之后,我们不像以前那样,遇到问题都不愿意独立思考,只会一味的向别人求助。现在,我们会通过自己
31、的思考,解决我们自己遇到的问题和困难。一开始我们通过讨论,初步有了设计的方案,觉得还是比拟简单的。但是,具体到设计时,我们遇到了很多麻烦,比方如何将传感器得到的温度转换成为对应的电信号,如何将电信号输送到单片机进行控制,如何把测得的温度用数字显示出来等等。这就要求我们学习要一步一个脚印,掌握扎实的理论根底了。最重要的一点是,我们在这次设计中培养了自己的学习能力。由于好多知识超出了我们的课本范围,这就要求我们自己通过查资料来增加我们的知识,解决遇到的一些问题。在短时间内从书本资料中帅选出我们所需要的知识,对我们的自主学习能力有很大的帮助。就那DS18B20来说,由于我们书本上没有介绍到这种温度传
32、感器,所以我们就通过学习DS18B20和数码管的说明书,了解它工作的原理以及特性,并弄清楚在实际应用时要注意的事项,对DS18B20进行初始化、编程的要求和规定等。培养了自主学习的能力,无论以后我们要做什么样的设计,我们都能够通过查阅资料来实现。最后,本次设计能够顺利完成,我要特别感谢实验室老师给予的大力支持和热心帮助。通过四周的综合训练,自己感到收获很大,同时也让自己感到了知识的重要性。 参考文献高洪志 MCS-51单片机原理及应用技术教程 人民邮电出版社 2021谢宜仁 单片机实用技术问答 人民邮电出版社 2003龚光华 单片机认识与实践 北京航空航天大学出版社 2006唐继贤 51单片机工程应用实例 北京航空航天大学出版社 2007仅供学习参考