1、课程论文课程名 传感器与检测技术专业班级: 姓 名: 学 号: 指导教师: 二一三 年 月 日数字温度传感器 DS18B20 介绍、设计及应用摘要:传感器作为现代科技的前沿技术,被认为是现代信息技术的三大支柱之一,也是国内外公认的最具有发展前途的高技术产业和朝阳产业。随着时代的进步和发展,传感器与检测技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,本文将介绍数字式集成温度传感器 DS18B20 的结构、原理和接口技术,以及一种基于单片机控制的数字温度计,本温度计属于多功能温度计,可以设置上下报警温度,当温度不在设置范围内时,可以报警。该温度计具有简单、稳定、实用、精度
2、高等优点。 关键词:传感器,数字温度计,报警, DS18B20,STC89C52RC1 引言随着人们生活水平的不断提高, 传感器与检测技术、单片机控制技术无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中基于数字温度传感器 DS18B20 设计的数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为人们工作、科研、生活、提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。我们首先介绍数字式集成温度传感器 DS18B20 的结构、原理和接口技术,然后介绍其设计及应用。本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准
3、确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机STC89C52RC,测温传感器使用 DS18B20,报警提示模块采用蜂鸣器报警,用LCD1602 液晶显示器实现温度显示,能很好的达到以上要求。2 数字温度传感器 DS18B20 介绍2.1 简介 DS18B20 是 DALLAS 公司生产的一线式数字温度传感器,具有 3 引脚TO92 小体积封装形式;温度测量范围为55125,可编程为 9 位12位 A/D 转换精度,测温分辨率可达 0.0625,被测温度用符号扩展的 16 位数字量方式串行输出;其工作电源既可在远端引入,也可采用寄生电源方式产
4、生;多个 DS18B20 可以并联到 3 根或 2 根线上,CPU 只需一根端口线就能与诸多DS18B20 通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。以上特点使 DS18B20 非常适用于远距离多点温度检测系统。 2.2 DS18B20 的内部结构DS18B20 内部结构如图 1 所示,主要由 4 部分组成:64 位 ROM、温度传感器、非挥发的温度报警触发器 TH 和 TL、配置寄存器。DS18B20 的管脚排列如图 2 所示,DQ 为数字信号输入输出端;GND 为电源地;VDD 为外接供电电源输入端。图 1 DS18B20 的内部结构图 2 DS18B20 的管脚排列ROM
5、 中的 64 位序列号是出厂前被光刻好的,它可以看作是该 DS18B20 的地址序列码,每个 DS18B20 的 64 位序列号均不相同。64 位 ROM 的排的循环冗余校验码(CRC=X8 X5X41) 。ROM 的作用是使每一个 DS18B20 都各不相同,这样就可以实现一根总线上挂接多个 DS18B20 的目的。DS18B20 中的温度传感器完成对温度的测量,用 16 位符号扩展的二进制补码读数形式提供,以 0.0625/LSB 形式表达,其中 S 为符号位。例如125的数字输出为 07D0H,25.0625的数字输出为 0191H,25.0625的数字输出为 FF6FH,55的数字输出
6、为 FC90H。高低温报警触发器 TH 和 TL、配置寄存器均由一个字节的 EEPROM 组成,使用一个存储器功能命令可对 TH、TL 或配置寄存器写入。 高速暂存器是一个 9 字节的存储器。开始两个字节包含被测温度的数字量信息;第 3、4、5 字节分别是 TH、TL、配置寄存器的临时拷贝,每一次上电复位时被刷新;第 6、7、8 字节未用,表现为全逻辑 1;第 9 字节读出的是前面所有 8 个字节的 CRC 码,可用来保证通信正确。 2.3 DS18B20 的工作时序 DS18B20 的一线工作协议流程是:初始化ROM 操作指令存储器操作指令数据传输。其工作时序包括初始化时序、写时序,如图 3
7、(a) (b)所示。(a)初始化程序(b)写时序图 3 DS18B20 的工作时序图3 数字温度传感器 DS18B20 设计及应用3.1 基本设计构想 如图 4,预设定的正常温度范围是 25到 30 。当温度低于 25时,蜂鸣器报警提示,当温度回升到正常温度范围,停止报警提示;当温度高于 30时,蜂鸣器报警提示,当温度回落到正常温度范围,停止报警提示。图 4 基本设计构想(1) 硬件组成和设计原理图 5 温度报警系统仿真原理图如图 5 为该温度报警系统仿真原理图,主要分四大模块。温度采集模块,主控模块,显示模块和报警提示模块。(2) 核心算法设计图 6 核心算法(3) 软件程序设计调试 程序见
8、 附录 经仿真调试完全达到了设计预定的要求,之后购买相应元器件认真焊接电路板,制作出设计实物,实物如图 7。图 7 实物照片再调试实物,测试记录,得到以下数据,最终所有要求达到,完成本设计。表 1 测试数据记录表测试次数 显示情况 报警情况1 24 报警2 24.8 报警3 24.9 报警4 25 不报警5 25.1 不报警6 26 不报警4 总结与体会经过本学期对传感器与检测技课程的学习,我充分运用所学知识以及前段时间参加我院电子设计大赛之后所积累的经验,理论与实践相结合,终于完成了我的数字温度报警设计,而且达到了预期的设计要求,也让老师查看了我的设计实物,在此期间让我收获了很多,我很开心,
9、也很感谢老师。在本次设计的过程中,我发现很多的问题,虽然以前没做过这样的设计但这次设计真的让我长进了很多,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,有好多的东西,只有我们去试着做了,才能真正的掌握,只学习理论有些东西是很难理解的,更谈不上掌握。从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。5 致谢6 参考文献1 阎石.数字电子技术基础(第三版). 北京:高
10、等教育出版社,19892 李朝青. 单片机原理及接口技术(简明修订版).杭州:北京航空航天大学出版社,19983 李广弟. 单片机基础.北京:北京航空航天大学出版社,1994附录:C 程序#include#include /使用_nop_()函数#define uchar unsigned char#define uint unsigned int/*/函数申明/*/void delay(uchar k); /标准延时函数void delay1(uint s); /LCD 延时函数void init(); /初始化显示void init_18b20(); /复位 ds18b20void wri
11、te_18b20(uchar dat); /写 ds18b20 数据uchar read_18b20(); /读 ds18b20 数据void read_word_18b20(); /读数据并转换温度,进行显示void disp_tp(); /温度显示void init_LCD(); /初始化 LCD1602void write_data(uchar date); /写 LCD1602 显示数据void write_com(uchar com); /写 LCD1602 指令void sw(); /按键扫描,修改报警上下限值void sw_disp(); /显示修改报警上下限界面sbit DQ=
12、P17; /ds18b20 数据线引脚sbit rs=P20;sbit rw=P21;sbit en=P22;sbit P10=P10; /蜂鸣器报警引脚,P10=1 时报警sbit k0=P30; /4 个按键:k0-加上限值,k1-减上限值,k2- 加下限值,k3-减下限值sbit k1=P31;sbit k2=P32;sbit k3=P33;uint tvalue; /温度值uchar tflag; /温度正负标志uint i,j,kk=0,key=0; /kk 控制上下限值修改界面显示,key 控制温度界面显示 uint temph=30; /初始上限值uint templ=25; /
13、初始下限值uchar code dis0=“Welcome!“;uchar code dis1=0x00,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x00; /初始化等待界面,进程的代码uchar code dis2=“temperature:“;uchar code dis3=0x06,0x09,0x06,0x00,0x00,0x00,0x00,0x00, /温度符号代码(。 )0x00,0x00,0x06,0x09,0x08,0x08,0x09,0x06;/温度符号代码(C)uchar code dis4=“Change password:“;uchar code di
14、s5=“H:L:“;uchar data temp_data5; /储存温度值的数据/*/主函数/*/void main() init(); /初始化显示init_LCD(); /初始化 LCD1602ss: init_18b20(); /复位 ds18b20read_word_18b20(); /读数据并计算转换温度,显示温度值if(tvalue/10)%100)=temph)P10=1; /温度高于或等于上限值,报警else P10=0;kk=0;sw();goto ss; /*/开机初始化显示-欢迎等待界面/*/void init() /初始化显示uchar n,a,b,temp;P10
15、=0;P3=0x0f; init_LCD(); /初始化 LCD1602write_com(0x84); for(n=0;n0;t-)DQ=1; DQ=0; /从高拉倒低_nop_();_nop_();_nop_();_nop_();DQ=dat /写数据,从低位开始delay(6);dat=1; /8 位数据,一位一位的写入 ds18b20DQ=1;/*/读 18b20 数据/*/uchar read_18b20()uchar t;uchar value=0;for(t=8;t0;t-)DQ=1;value=1;DQ=0;_nop_();_nop_();_nop_();_nop_();DQ=
16、1;_nop_();_nop_();_nop_();_nop_();if(DQ)value|=0x80; delay(6);DQ=1;return(value);/*/void read_word_18b20()uchar x,y; write_18b20(0xcc); /发命令:Skip ROM,跳过读序列号write_18b20(0x44); /启动温度转换init_18b20();write_18b20(0xcc); /发命令:Skip ROM,跳过读序列号write_18b20(0xbe); /读取温度x=read_18b20(); /温度值低 8 为存入 xy=read_18b20(); /温度值高 8 为存入 ytvalue=y; /整合温度值的低 8 位与高 8 位:tvalue0;k-);void delay1(uint s) /LCD 延时函数for(i=0;is;i+)for(j=0;j100;j+);