基于DS18B20设计了一种多路温度数据采集系统.doc

上传人:精*** 文档编号:842800 上传时间:2023-09-08 格式:DOC 页数:32 大小:710.93KB
下载 相关 举报
基于DS18B20设计了一种多路温度数据采集系统.doc_第1页
第1页 / 共32页
基于DS18B20设计了一种多路温度数据采集系统.doc_第2页
第2页 / 共32页
基于DS18B20设计了一种多路温度数据采集系统.doc_第3页
第3页 / 共32页
基于DS18B20设计了一种多路温度数据采集系统.doc_第4页
第4页 / 共32页
基于DS18B20设计了一种多路温度数据采集系统.doc_第5页
第5页 / 共32页
点击查看更多>>
资源描述

1、目 录摘 要11 绪论21.1 课题研究的背景和意义21.2 本设计的主要要求22 系统方案设计与选型33 主要硬件介绍33.1 DS18B2033.2 AT89C5163.3 LCD160273.5 DS130273.6 24C02C84 软件介绍84.1 Proteus84.2 Keil85 硬件设计95.1 温度采集电路95.2 单片机最小系统105.3 按键输入电路115.4 报警电路125.5 LCD显示电路135.6 24C02存储电路145.7 DS1302时钟电路155.8 串行通讯电路166 软件设计166.1 功能概述166.2 系统软件流程图167 实验结果:177.1

2、温度显示仿真177.2 温度存储与串行通讯18总 结20参 考 文 献21致 谢22附录A 附录内容名称I19 摘 要本文基于DS18B20设计了一种多路温度数据采集系统,系统主要由单片机电路和一组DS18B20 数字传感器构成,同时具有温度显示、数据存储和串行通讯模块。软件方面,我们采用keil软件对程序进行编写以及调试,硬件方面,我们通过Proteus软件对硬件电路进行仿真以及测试,该系统结构简单,功耗较低,测温范围为- 55 + 125,通过LCD1602显示所测温度。同时,可以实现高低温报警,若所测温度超出设定范围,相关器件就会自动报警。我们也可以通过对按键的处理来改变显示不同通道的温

3、度。我们还可以把测得的温度存储到24C02芯片中,并且可以实现串行通讯,把温度传送到上位机。该系统硬件分为3部分:DS18B20 温度测量模块、单片机模块、温度显示模块、数据存储模块、上位机与单片机通讯接口电路。系统的测温精度可以达到0.5 ,并且能稳定的与单片机和上位机通讯。关键词:DS18B20、多路温度测控、高低温报警、串行通讯1 绪论1.1 课题研究的背景和意义在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数。其中,温度控制也越来越重要。在工业生产的很多领域中,人们都需要对各类加热炉、热处理炉、反应炉和锅炉中的温度进行检测和控制。采用单片机对温度进行控制不

4、仅具有控制方便、简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而大大提高产品的质量和数量。因此,单片机对温度的控制问题是工业生产中经常会遇到的控制问题。目前应用的温度检测系统大多采用由模拟温度传感器、多路模拟开关、AD转换器及单片机等组成的传输系统。这种温度采集系统需要大量的测温电缆,才能把现场传感器的信号送到采集卡上安装和拆卸繁杂,成本也高。同时线路上传送的是模拟信号,易受干扰和损耗,测量误差也比较大,不利于控制者根据温度变化及时做出决定。针对这种情况,本文提出一种采用数字化单总线技术的温度采集系统,并利用Proteus和Keil软件对设计电路进行综合虚拟仿真,实现了温度实时

5、测量和显示。1.2 本设计的主要要求 设计一多路温度测控系统,能实现8路及以上的温度点测量和实时显示,可根据设定的上下限输出报警及显示,具有RS485或RS232总线接口。设计完整的电路原理图和编写相关程序。 用MCS-51系列单片机或其它CPU作为控制器设计一完整测控仪器,包括以下内容: 温度可采用标准系列热电耦或标准热电阻或DS18B20; 用LCD1602显示或用LED显示; 用输入按键可以暂停、转换、通道的显示; 日历时钟显示; 数据记录存贮功能 RS485或RS232通讯 PROTEUS仿真以上一种功能2 系统方案设计与选型 系统主要由硬件和软件两大部分构成,当接收到系统发出的温度转

6、换命令后, DS18B20开始进行温度转换操作并把转化后的结果放到16 位暂存寄存器中的温度寄存器内, 然后与系统进行数据通信,系统将温度读出并驱动LCD显示。如果温度值低于设定下限值或高于设定上限值,则自动启动报警装置。 同时,基于本设计的设计要求,存储芯片选用了24C02C,时钟芯片选用了DS1302,显示模块选择的是LCD显示。 由于DS18B20 单总线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。该系统结构图单 片 机 按键输入电路测温电路时钟电路显示电路串行通讯报警电路图1、系统结构图3 主要硬件介绍3.1 DS18B20 DSl820数字温度计是美国Dallas公

7、司生产的数字温度计,它提供9位(二进制)温度读数,指示器件的温度。信息经过单线接口送入DSl8B20或从DSl8B20送出,因此从主机CPU到DSl8B20仅需一条线。DSl820的电源可以由数据线本身提供而不需要外部电源。因为每一个DSl820在出厂时已经给定了唯一的序号,因此任意多DSl820可以存放在同一条单线总线上。这允许在许多不同的地方放置温度敏感器件。DSl820的测量范围从-55到+125,增量值为0.5,可在l s(典型值)内把温度变换成数字。每一个DSl820包括一个唯一的64位长的序号,该序号值存放在DSl820内部ROM(只读存贮器)中。开始8位是产品类型编码(DSl82

8、0编码均为10H)。接着的48位是每个器件唯一的序号,最后8位是前面56位的CRC(CRC=X8+X5+X4+1)码。下图为DS18B20的实物图。 图2、DS18B20图3、DS18B20内部结构温度/数据关系(表1)根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待1660微秒左右,后发出60240微秒的存在低脉冲,主CPU收到此信号表示复位成功。

9、图4、DS18B20内部指令3.2 AT89C51 AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4k bytes的可反复擦写的只读程序存储器(PEROM)和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89C51单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。ATC9C51实物图如图3。主要参数如下: 与MCS-51产品指令系统完全兼容4k字节可重擦写Flash闪速存储器1000次擦写周

10、期全静态操作:0Hz24MHz三级加密程序存储器1288字节内部RAM32个可编程IO口线2个16位定时计数器 图5、单片机6个中断源可编程串行UART通道低功耗空闲和掉电模式 3.3 LCD1602 由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。数字式接口液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。体积小、重量轻液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。功耗低相对而言,液晶显示器的功耗主要消

11、耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。LCD1602的实物图如图4,主要参数如下: 显示容量:162个字符 芯片工作电压:4.55.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.954.35(WH)mm 图63.5 DS1302DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个318的用于临时性存放数据的RAM

12、寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。 X1,X2 32.768kHz晶振引脚GND/RST 地/复位SCLK 串行时钟 VCC1 电池引脚 VCC2 主电源引脚3.6 24C02C24C02是低工作电压的2K位串行电可擦除只读存储器,内部组织为256个字节,每个字节8 位,该芯片被广泛应用于低电压及低功耗的工商业领域。主要特性􀂋 工作电压:1.8V5.5V􀂋 输入/输出引脚兼容5V􀂋 应用在内部结构:256x8(2K)⣷

13、15; 二线串行接口􀂋 输入引脚经施密特触发器滤波抑制噪声􀂋 双向数据传输协议􀂋 兼容400KHz(1.8V,2.5V,2.7V,3.6V )􀂋 支持硬件写保护􀂋 高可靠性:读写次数:1,000,000 次 数据保存:100 年4 软件介绍4.1 Proteus Proteus是英国Labeenter electronics公司研发的EDA工具软件。Proteus不仅是模拟电路、数字电路、模数混合电路的设计与仿真平台,更是目前世界最先进、最完整的多种型号微控制器系统的设计与仿真平台。它真正实现了在计算机上

14、完成从原理图设计、电路分析与仿真、单片机代码级调试与仿真、系统测试与功能验证到形成PCB的完整电子设计与研发过程。Proteus产品系列也包含了革命性的VSM技术,可以对基于微控制器的设计连同所有的外围电子器件一起仿真。4.2 KeilKeil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。运行Keil软件需要WIN9

15、8、NT、WIN2000、WINXP等操作系统。如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。 5 硬件设计系统硬件设计包括温度采集设计、单片机控制电路设计、通信接口电路设计。采用数字温度芯片DS18B20 测量温度,输出信号全数字化。便于单片机处理及控制,省去传统的测温方法的很多外围电路。且该芯片的物理化学性很稳定,它能用做工业测温元件,此元件线形较好。DS18B20 的最大特点之一采用了单总线的数据传输,由数字温度计DS18B20和单片机构成的温度测量装置,它直接输出温度的数字信号,

16、可直接与计算机连接。这样,测温系统的结构就比较简单,体积也不大。采用DS1302时钟芯片可以方便地得到系统时间并且输出方便。采用了24C02这种应用广泛的芯片进行数据存储。采用51单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便。该系统利用单片机控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限报警温度。 下面分别介绍了各个硬件部分的电路连接图。5.1 温度采集电路采用DS18B20一线制芯片,其中1脚接地,3接电源,2为数据传输线,每个传感器有一个独立的光刻地址,用于区分数据传输

17、次序。理论上说,这个电路最多能连接8个DS18B20,但是要连接更多,DQ端需要外加驱动电源。图7.温度采集电路5.2 单片机最小系统 单片机最小系统包括51系列单片机、晶振电路、复位电路。如下所示:图8.单片机最小系统5.3 按键输入电路按键输入如下,其中按下“开始/暂停”按钮LCD开始显示通道的温度,“通道+”用于向上切换测量通道,“通道-”用于向下切换测量通道。图9.按键输入电路5.4 报警电路 如下所示,LED-H为当高限报警时报警,LED-L为当低限报警时的报警。图10.报警电路5.5 LCD显示电路 本设计中,LCD只用了四线,实现四线显示。图11.LCD显示电路5.6 24C02

18、存储电路图12.24C02电路5.7 DS1302时钟电路图13.DS1302电路5.8 串行通讯电路图14.串行通讯电路图中模拟了一个上位机和一个RS232串行接口。6 软件设计6.1 功能概述本系统的软件由C语言编写,程序的主要功能是负责温度的实时测量、显示、存储并读出存储器中的当前温度值给上位机。6.2 系统软件流程图 开始执行初始化程序系统时间为2MS获取温度值扫描按键显示、发送、存储温度,并判断报警NY系统时间为2MS系统时间为2MS系统时间为2MST0,T1计数器图15.系统软件流程图 7 实验结果:7.1 温度显示仿真图中可以看出,LCD第一行显示“0 27.0”表示0通道的温度

19、为27.0度,第二行显示“22:04:19”表示测量温度时的时间。图16.温度显示仿真7.2 温度存储与串行通讯如图所示,左边对话框为24C02内存空间,其中“00 00 1B 00”意义是“00”为0通道,“00”为正温度,“1B”为十六进制温度(27),“00”为小数部分为0。右边对话框中模拟的是上位机显示,也是十六进制表示。图17. 温度存储与串行通讯总 结经过两周多的设计以及调试,实现实验的部分设计要求,能读出并显示DS18B20采集的温度,并且能够实现高低温报警,能够实现温度数据的存储和串行通讯,能通过对按键的处理来切换需要显示的通道温度,使得1条总线上可以读取到8个温度传感器的温度

20、值并将其依次显示在液晶屏幕上,同时液晶屏幕可以清楚显示温度传感器温度值的具体时间。我在这为期两周多的设计性实验中,我们在老师的指导下,有把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和独立思考的能力。我希望自己能在今后的深入学习中设计出更好的,力求创新,努力地提升自己,寻求更大的进步!最后用一句话来结束吧。“实践是检验真理的唯一标准”。参 考 文 献1DS18B20、lcd LM1602说明书、DS1302说明书、24C02说明书;2 黄惟公等 单片机原理与应用技术 西安电子科大出版社 2007;3周润景等 基于PROTEUS的电路及单片机系统设计与仿真 北航出

21、版社 2006.54常敏等 单片机应用程序开发与实践 电子工业出版社 2009;5马建国、孟宪元.电子设计自动化技术基础.清华大学出版 ,20046姜威.实用电子系统设计基础,2008 7姜威.单片机系统的PROTEUS设计与仿真 ,2007 8陈小忠 等 单片机接口技术实用子程序.北京:人民邮电出版社 2005.99徐爱钧,彭秀华编著 Keil Cx51 V7.0单片机高级语言编程与 Vision2应用实践 北京:电子工业出版致 谢为期两周的课程设计也接近了尾声。此次课程设计的完成,凝聚着许多人的关怀和帮助。首先要感谢我敬爱的指导教师邓成中、刘克福。他们在学术上的精心指导和严格要求,在系统研

22、究和调试过程中给予的及时帮助。在完成设计期间给我许多帮助和建议,他们兢兢业业、对工作认真负责的态度为我们做出了好的表率,时刻鞭策着我们向他们学习。这些使我的课程设计得以顺利完成,并激励着我们在今后的人生道路上不断开拓进取,勇往直前。在此,我再一次对老师的培养和关怀表示诚挚的谢意!同时,非常感谢我的同学们,在与他们共同的学习、工作、生活过程中,他们给予了我及时的帮助和建议,开拓了我的思路。我对他们致以真诚的谢意和衷心的祝福。最后,向所有帮助过我的人致以最诚挚的谢意! 西华大学课程设计附录A 电路原理图附录B 主要程序IXIIC驱动电路:#includeiic.h uchar slaw=0xa0;

23、 uchar slar=0xa1; void delay(uchar n) uchar i; for(i=0;in;i+) nop; /* 功能:毫秒延时函数 参数:当晶振为11.0592时x为毫秒数*/ void delayms(unsigned int x) uchar j; while(x-) for(j=0;j113;j+); /* 功能:起始信号函数 说明: */void sta(void)SDA=0;SCL=1; SDA=1;delay(4);SDA=0;SCL=0;delay(4); /* 功能:停止信号函数 说明: */void stop() SDA=0; /SDA初始化为低电

24、平“0” _n SCL=1; /*这两句顺序不可以改变*/delay(4);SDA=1;delay(4);/*发送应答位函数*/ void ack() SDA=0;SCL=1;nop;SCL=0;SDA=1; /*发送应答非位函数*/ void nack() SDA=1;SCL=1;nop;SCL=0;SDA=0; /* 功能:应答检查 参数:返回检查值 =1表示返回异常 说明:每次发送一个数据后,从即会发送一个0的信号应答 这里先让SDA=1;没有返回值 则一直=1 应答异常 */ bit cack() bit rdflag; SDA=1; /先释放SDA SCL=1; nop;nop; i

25、f(SDA=1) rdflag=1; else rdflag=0; SCL=0; return rdflag; /* 功能:写入当前位置的一个字节的函数 写入顺序7-0; 说明:调用此函数前使用sta(void);已经让SCL为0 在上升沿写入数据 */ void WrbytCurrent(uchar dat) uchar i;for (i=0;i8;i+)nop; SDA=(bit)(dat&0x80);nop;SCL=1;dat=1;nop;nop;SCL=0; /* 功能:在address写入一个字节的函数 写入位顺序7-0; 说明:调用此函数前使用sta(void);已经让SCL为0

26、在上升沿读取数据 */void wrbyt(uchar address,uchar dat) bit flag;do sta(); /开始 WrbytCurrent(slaw); flag=cack(); /应答while(flag=1);WrbytCurrent(address);flag=cack(); /应答while(flag=1);WrbytCurrent(dat);flag=cack(); /应答while(flag=1);stop();delayms(5);void WriteSetN(uchar address,uchar wr,uchar n) uchar i;bit fla

27、g;do sta(); /开始 WrbytCurrent(slaw); /器件地址 flag=cack(); /应答while(flag=1); /一直发送到应答成功WrbytCurrent(address); /数据地址flag=cack(); /应答while(flag=1);for(i=0;in;i+) /从address开始写入n个字节数 WrbytCurrent(wri); flag=cack(); /应答while(flag=1);stop();delayms(5); /* 功能:读取当前位置的一个字节的函数 读取顺序7-0; 说明:调用此函数前使用sta(void);已经让SCL

28、为0 在下降沿读取数据 */ uchar RdbytCurrent() uchar dat,i;for(i=0;i8;i+) SCL=1;nop;nop;dat=(dat1)|SDA;SCL=0; nop;nop;return dat; uchar ReadByte(uchar address) uchar dat; sta(); /开始WrbytCurrent(slaw); /器件地址ack(); /应答WrbytCurrent(address); /写入数据地址ack();sta(); /应答WrbytCurrent(slar); /器件地址ack();dat=RdbytCurrent()

29、; /读取数据nack();stop();delayms(5);return dat;Timer.c驱动函数:#include#includeconst.h#includeTimer.hbit g_systTime2Ms=0;bit g_time10Ms=0;bit g_time50Ms=0;void Timer0_com_Init()TMOD=0X21;SCON=0xd0;TH0=0XF8;TL0=0XCC;ET0=1;TR0=1;TH1=0xfd; /波特率设置为9600 TL1=0xfd; TR1=1; /开定时器T1运行控制位void Timer0() interrupt 1stati

30、c s_countFor10Ms=0;static s_countFor50Ms=0;TH0=0XF8;TL0=0XCC;g_systTime2Ms=1;if(+s_countFor10Ms=5) s_countFor10Ms=0; g_time10Ms=1; if(+s_countFor50Ms=25) s_countFor50Ms=0; g_time50Ms=1; 主函数main.c:#includereg52.h#includeLCD1602_4.h /四线LCD#include18b20.h#includekey.h#includeTimer.h#includeds1302.h#inc

31、ludeiic.hsbit Hight_Warning=P20;sbit Low_Warning=P21;uchar DispArray6; /储存显示字符char T_num;bit Start;uint8 data disp5;uchar RT_data6; extern struct /定义日历时间结构uint8 Second ;uint8 Minute ;uint8 Hour ;uint8 Day ;uint8 Week ;uint8 Month ;uint8 Year ;CurrentTime ;void LcdShow(uchar dat) /LCD显示函数 uint8 temp;

32、 temp=dat/16*10+dat%16; disp0=temp/10+0x30; disp1=temp%10+0; disp2=0;void Show_Time(void)v_ClockUpdata_f( );LcdShow(CurrentTime.Hour); /显示时间LCD_Prints(0,1,disp);LcdShow(CurrentTime.Minute);LCD_Prints(3,1,disp);LcdShow(CurrentTime.Second);LCD_Prints(6,1,disp);static code unsigned char get_serial= /获取

33、的八个DS18B20内部RAM 64位序列号185, 0,0,0, 184, 197, 49,40, 224, 0,0,0, 184, 197, 50,40, /e0.0.0.0 b8,c5,32,28 b8,c5,32 romserial number 28 familynumber 215, 0,0,0, 184, 197, 51,40, 82, 0,0,0, 184, 197, 52,40, 101, 0,0,0, 184, 197, 53,40,60, 0,0,0, 184, 197, 54,40,11, 0,0,0, 184, 197, 55,40,47, 0,0,0, 184, 1

34、97, 56,40, ;void Get_Temperature(uchar n) /获取温度的函数 有关变量均为全局变量Tm=read0(get_serial+n*8);void Show_Temperature(void)if(fushu=0) /判断是否加负号DispArray0=T_num+0x30; /通道号DispArray1= ; /空格DispArray2= ; /温度正负if(Tm%1000)/100=0)DispArray3= ;if(Tm%1000)/100!=0)DispArray3=(Tm%1000)/100)+0x30;DispArray4=(Tm%100)/10)

35、+0x30;DispArray5=(Tm%10)+0x30;DispArray6=.;DispArray7=dian/10+0x30;DispArray8=dian%10+0x30;DispArray9=0; LCD_Prints(0,0,DispArray);if(fushu=1) /判断是否加负号DispArray0=T_num+0x30; /通道号DispArray1= ; /空格DispArray2=-; /温度正负if(Tm%1000)/100=0)DispArray3= ;if(Tm%1000)/100!=0)DispArray3=(Tm%1000)/100)+0x30;DispA

36、rray4=(Tm%100)/10)+0x30;DispArray5=(Tm%10)+0x30;DispArray6=.;DispArray7=dian/10+0x30;DispArray8=dian%10+0x30;DispArray9=0; LCD_Prints(0,0,DispArray);void EErom_PC(void)uchar i;RT_data0=T_num; /通道号RT_data1=fushu; /温度符号RT_data2=Tm; /温度整数RT_data3=dian; /温度小数WriteSetN(0x00,RT_data,4);/发送到eeromfor(i=0;i50) /高报警Hight_Warning=0;Low_Warning=1;else if(fushu=1) /低报警Hight_Warning=1;Low_Warning=0;else /正常Hight_Warning=1;Low_Warni

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 毕业设计

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922