1、安徽农业大学课程设计报告基于单片机的 DS18B20 数字温度计设计学生姓名 杜恒院系名称 物理与电子工程学院专业名称 电子信息工程班 级 2008 级 6 班学 号 2008070607指导教师 汪文蝶完成时间 2011 年 5 月 20 日基于单片机的 DS18B20 数字温度计设计学生姓名:杜恒 指导老师:汪文蝶内容摘要:随着现代信息化技术的飞速发展和传统工业改造的逐步实现,能独立工作的温度检测系统已广泛应用于各种不同的领域。本文介绍了一个基于STC89C52 单片机和数字温度传感器 DS18B20 的测温系统,并用 LED 数码管显示温度值,易于读数。系统电路简单、操作简便,能任意设定
2、报警温度并可查询最近的 10 个温度值,系统具有可靠性高、成本低、功耗小等优点。关键词:单片机 数字温度传感器 温度计1 引言 42 设计要 求 42.1 基本要求 .42.2 扩展功能 .43 总体 方案设计 43.1 方案论证 .43.1.1 方案一 43.1.2 方案二 53.2 总体设计框图 .54 硬件 设计 54.1 单片机系统 .54.2 数字温度传感器模块 .64.2.1 DS18B20 性能 64.2.2 DS18B20 外形及引脚说明 74.2.3 DS18B20 接线原理图 74.2.4 DS18B20 时序图 74.2.5 数据处理 94.3 显示电路 .104.4 声
3、光报警电路 .104.5 键盘输入电路 .115 软件 设计 115.1 主程序模块 .115.2 读温度值模块 .125.3 中断模块 .145.4 温度查询模块 .155.5 温度设定、报警模块 .165.6 数码管驱动模块 .186 源 程序 197 总 结 26参考 文献: 281 引言随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便是不可否定的,各种数字系统的应用也使人们的生活更加舒适。数字化控制、智能控制为现代人的工作、生活、科研等方面带来方便。其中数字温度计就是一个典型的例子。数字温度计与传统的温度计相比,具有读数方便、测温范围广、测温精确、功能
4、多样话等优点。其主要用于对测温要求准确度比较高的场所,或科研实验室使用,该设计使用 STC89C52 单片机作控制器,数字温度传感器 DS18B20 测量温度,单片机接受传感器输出,经处理用 LED 数码管实现温度值显示。2 设计要求2.1 基本要求实现实时温度显示,测温范围 050 0C,误差 50C 以内。2.2 扩展功能温度报警,能任意设定温度范围实现声光报警;每隔 10 分钟记录一次温度数据,至少能查询过去 10 个时刻的温度情况。3 总体方案设计3.1 方案论证3.1.1 方案一由于本设计是测温电路,可以使用热敏电阻之类的器件,将随被测温度变化的电压或电流采样,进行 A/D 转换后就
5、可以用单片机进行数据处理,实现温度显示。这种设计需要用到 A/D 转换电路,增大了电路的复杂性,而且要做到高精度也比较困难。3.1.2 方案二考虑到在单片机属于数字系统,容易想到数字温度传感器,可选用DS18B20 数字温度传感器,此传感器为单总线数字温度传感器,起体积小、构成的系统结构简单,它可直接将温度转化成串行数字信号给单片机处理,即可实现温度显示。另外 DS18B20 具有 3 引脚的小体积封装,测温范围为 -55+125摄氏度,测温分辨率可达 0.0625 摄氏度,其测量范围与精度都能符合设计要求。以上两种方案相比较,第二种方案的电路、软件设计更简单,此方案设计的系统在功耗、测量精度
6、、范围等方面都能很好地达到要求,故本设计采用方案二。3.2 总体设计框图本方案设计的系统由单片机系统、数字温度传感器、LED 显示模块、按键控制模块、温度报警模块组成,其总体架构如下图 1。、AT89C2051单片机DS18B20 显示电路图 1 系统总体方框图4 硬件设计4.1 单片机系统1. 本设计采用 STC89C52 单片机作为控制器,完成所有功能的控制,包括: DS18B20 数字温度传感器的初始化和读取温度值 LED 数码管显示驱动与控制 按键识别和响应控制 温度设置和报警 温度值的存储和读取2. 单片机系统电路原理图:图 2 单片机系统原理图4.2 数字温度传感器模块4.2.1
7、DS18B20 性能 独特的单线接口仅需一个端口引脚进行通信 简单的多点分布应用 无需外部器件 可通过数据线供电 零待机功耗 测温范围-55+125,以 0.5递增 可编程的分辨率为 912 位,对应的可分辨温度分别为 0.5、0.25、0.125和 0.0625 温度数字量转换时间 200ms,12 位分辨率时最多在 750ms 内把温度转换为数字 应用包括温度控制、工业系统、消费品、温度计和任何热感测系统 负压特性:电源极性接反时,传感器不会因发热而烧毁,但不能正常工作4.2.2 DS18B20 外形及引脚说明图 3 DS18B20 外形及引脚 GND:地 DQ:单线运用的数据输入/输出引
8、脚 VD:可选的电源引脚4.2.3 DS18B20 接线原理图单总线通常要求接一个约 4.7K 左右的上拉电阻,这样,当总线空闲时,其状态为高电平。图 4 DS18B20 接线原理图4.2.4 DS18B20 时序图主机使用时间隙来读写 DS18B20 的数据位和写命令字的位。1. 初始化时序如下图:图 5 DS18B20 初始化时序2. DS18B20 读写时序:图 6 DS18B20 读写时序4.2.5 数据处理高 速 暂 存 存 储 器 由 9 个 字 节 组 成 , 其 分 配 如 表 5 所 示 。 当 温 度 转 换 命 令发 布 后 , 经 转 换 所 得 的 温 度 值 以 二
9、 字 节 补 码 形 式 存 放 在 高 速 暂 存 存 储 器 的第 0 和 第 1 个 字 节 。 单 片 机 可 通 过 单 线 接 口 读 到 该 数 据 , 读 取 时 低 位 在 前 ,高 位 在 后 。图 7 字节分配下 表 为 12 位 转 化 后 得 到 的 12 位 数 据 , 存 储 在 18B20 的 两 个 8 比 特 的RAM 中 , 二 进 制 中 的 前 面 5 位 是 符 号 位 , 如 果 测 得 的 温 度 大 于 0, 这 5位 为 0, 只 要 将 测 到 的 数 值 乘 于 0.0625 即 可 得 到 实 际 温 度 ; 如 果 温 度 小 于0,
10、 这 5 位 为 1, 测 到 的 数 值 需 要 取 反 加 1 再 乘 于 0.0625 即 可 得 到 实 际 温度 。 例 如 +125 的 数 字 输 出 为 07D0H,实 际 温 度 =07D0H*0.0625=2000*0.0625=125 。例 如 -55 的 数 字 输 出 为 FC90H, 则 应 先 将 11 位 数 据 位 取 反 加 1 得370H( 符 号 位 不 变 , 也 不 作 运 算 ) ,实 际 温 度 =370H*0.0625=880*0.0625=55 。可 见 其 中 低 四 位 为 小 数 位 。图 8 DS18B20 温度数据表4.3 显示电路
11、LED 数码管显示采用动态扫描方式,能简化电路布线,节约单片机 I/O 端口。段码和位码由单片机 P0 送出,分别用 74HC673N 锁存。图 9 数码管驱动显示电路4.4 声光报警电路当温度超过设定温度值时,实现声光报警,蜂鸣器鸣叫、8 个发光二极管点亮。蜂鸣器由单片机 P23 口控制,用三极管驱动,发光二极管接单片机 P1 口,由 74HC673N 锁存。图 10 声光报警电路4.5 键盘输入电路四个键分别连接单片机 P34、P35、P36 、P37 构成独立式键盘,分别实现加、减、报警温度设定功能键和温度查询功能键。图 11 键盘输入电路5 软件设计5.1 主程序模块主程序需要调用 3
12、 个子程序,分别为: 实时温度显示子程序:驱动数码管把实时温度值送出在 LED 数码管显示 查询记录温度值子程序:查询过去存储的温度值,最多可查询 10 个值 温度设定、报警子程序:设定报警温度值,当温度超过该值时产生报警,即驱动蜂鸣器鸣叫、8 个发光二极管发光主程序流程图:图 12 主程序流程图开始显示实时温度温度设定、报警查询记录温度值定时器初始化、启动5.2 读温度值模块读温度值模块需要调用 4 个子程序,分别为: DS18B20 初始化子程序:让单片机知道 DS18B20 在总线上且已准备好操作 DS18B20 写字节子程序:对 DS18B20 发出命令 DS18B20 读字节子程序:
13、读取 DS18B20 存储器的数据 延时子程序:对 DS18B20 操作时的时序控制1. 读温度值模块流程图:图 13 读温度值子程序流程图 2. DS18B20 初始化子程序流程图:DS18B20 初始化跳过读序列号启动温度转换延时DS18B20 初始化跳过读序列号读取温度值高低位数据转换处理返回入口NY图 14 DS18B20 初始化子程序流程图3. DS18B20 写字节和读字节子程序流程图:DQ 置高电平稍延时DQ 复位 0延时480msDQ 拉高电平延时 1560msDQ 为低电平?返回入口图 15 DS18B20 写字节子程序流程图 图 16 DS18B20 读字节子程序流程图5.
14、3 中断模块中断采用 T0 方式 1,初始值定时为 50ms。中断模块需调用两个子程序: 读温度值子程序:定时读取温度值,实时更新温度值 记录温度值子程序:定时记录温度值,供查询使用把这两个子程序放在中断的原因是,不会因为调整报警温度或查询历史温度值而停止更新温度值和记录温度值。中断模块流程图:YN图 17 中断模块流程图5.4 温度查询模块温度查询模块需要接受按键输入,进入查询界面后,按加减键分别查询上一个和下一个历史温度值,并驱动数码管显示需要查询的温度值。温度查询模块流程图如下:NYNY中断入口定时器重置初值计数值加 11 秒?记录温度值读温度值中断返回入口功能键按下?延时消抖确认按下?
15、显示温度值与位次NYYNNYYNNY图 18 温度查询模块流程图5.5 温度设定、报警模块此模块跟温度查询模块类似,需要接受按键输入,进入模块界面后,按加减键分别上调和下调设定报警温度值,当实时温度值超过设定值时驱动蜂鸣器发声,并点亮 8 位发光二极管,实现声光报警。温度设定、报警模块流程图如下:加键按下?延时消抖确认按下?查询下一个值减键按下?延时消抖确认按下?查询上一个值退出功能键按下?返回NYNYNYYNNYYNYNNY入口功能键按下?延时消抖确认按下?显示设定温度值加键按下?延时消抖确认按下?减键按下?延时消抖确认按下?温度超出设定值?取消报警判断退出界面?返回上调设定值下调设定值声光
16、报警图 19 温度设定、报警模块流程图5.6 数码管驱动模块本设计数码管通过锁存器接单片机 P0 口,采用动态扫描驱动 7 段 LED 数码管进行显示,需调用延时子程序以稳定显示。模块流程图如下:图 20 数码管驱动模块流程图入口关段选P0 置高开位选送位码关位选P0 清零开段选送段码关段选延时返回6 源程序#include #define uchar unsigned char#define uint unsigned intsbit DS=P10; sbit lcden=P34;sbit lcdrs=P35;/define interfaceuint temp; / variable of
17、 temperatureuchar flag1; uchar m4; / sign of the result positive or negative/sbit dula=P26;/sbit wela=P27;void delay(uint count) /delayuint i;while(count)i=200;while(i0)i-;count-;void dsreset(void) /send reset and initialization commanduint i;DS=0;i=103;while(i0)i-;DS=1;i=4;while(i0)i-;bit tmpreadbi
18、t(void) /read a bituint i;bit dat;DS=0;i+; /i+ for delayDS=1;i+;i+;dat=DS;i=8;while(i0)i-;return (dat);uchar tmpread(void) /read a byte dateuchar i,j,dat;dat=0;for(i=1;i1); /读出的数据最低位在最前面,这样刚好一个字节在 DAT里return(dat);void tmpwritebyte(uchar dat) /write a byte to ds18b20uint i;uchar j;bit testb;for(j=1;j
19、1;if(testb) /write 1DS=0;i+;i+;DS=1;i=8;while(i0)i-;elseDS=0; /write 0i=8;while(i0)i-;DS=1;i+;i+;void tmpchange(void) /DS18B20 begin changedsreset();delay(1);tmpwritebyte(0xcc); / address all drivers on bustmpwritebyte(0x44); / initiates a single temperature conversionuint tmp() /get the temperature
20、float tt;uchar a,b;dsreset();delay(1);tmpwritebyte(0xcc);tmpwritebyte(0xbe);a=tmpread();b=tmpread();temp=b;temp=8; /two byte compose a int variabletemp=temp|a;tt=temp*0.0625;temp=tt*10+0.5;return temp;void write_com(uchar com)lcdrs=0;P2=com;delay(5);lcden=1;delay(5);lcden=0;void write_data(uchar date)lcdrs=1;