引言
传统的玻璃水银(汞)温度计因价格便宜读数准确, 目前仍为国内医院和家庭使用的主流体温计,但该温度计存在易破碎产生水银中毒的安全隐患。欧美各国从上世纪末就已纷纷宣布禁止使用与销售水银体温计,换代升级为安全环保的电子体温计。当前市场上大量销售的简易电子温度计普遍读数不准确; 而临床使用的电子体温测量装置体积庞大、价格昂贵[1~7]。本项研究设计了一种测量准确、操作简单、便于携带且价格低廉的多功能电子温度计。采用数字温度传感器DS18B20 检测温度, 并将数字化的温度信号传至单片机。经单片机计算、校正后的温度值及测量时间由液晶显示器实时显示。该温度计可精确、方便地测量体温和食物温度,也可用于测量室内外温度、冰箱温度等,具有测温定时、温度记忆、音响提示、背光显示、自动关机等多项功能,可作为一种通用测温仪器广泛用于医院和家庭。该温度计配备的附加探头,特别适用于婴幼儿和老人饮食时测量食物温单片机在测控领域中具有十分广泛的应用,它既能测量信号,又可以测量温度湿度等非电信号。由单片机构成的温度检测、温度控制可广泛的应用于各个领域。在日常生活及生产中我们常常检测温度,传统的方式是采用热电偶或热电阻。其硬件电路和软件调试比较复杂,制作成本高。本系统采用DS18B20,它直接输入数字温度信号,与单片机借口,结构非常简洁,制作成本低。单片机的接口信号是数字信号。要想用单片机获取温度这类非电信号的信息, 必须使用温度传感器, 将温度信息转换为电流或电压输出。如果转换后的电流或电压输出是模拟信号, 还必须进行A/ D转换, 以满足单片机接口的需要。传统的温度检测大多以热敏电阻作为温度传感器。但是, 热敏电阻的可靠性较差、测量温度准确率低, 而且还必须经专门的接口电路转换成数字信号后才能由单片机进行处理。本文介绍一种采用数字温度传感器实现的基于单片机的数字温度计。
第 1 页 共 19 页
中北大学单片机课程设计说明书
1、设计任务与要求
1.1基本功能
该课程设计基本思路是基于单片机AT89C52和1602LED与DS18B20,使得期间可以测得周围环境的温度并在LED上显示出该温度值,在自主设计的系统中,如果该温度超出设定的范围,就会引起蜂鸣器的发声来通知工作人员。在这一课题中,可以利用K已设置功能的开关。
1.2 课程设计的内容与要求
利用数字温度传感器DS18B20与单片机结合来测量温度。利用数字温度传感器DS18B20测量温度信号,计算后在LED数码管上显示相应的温度值。其温度测量范围为−55℃~125℃,精确到0.5℃。数字温度计所测量的温度采用数字显示,控制器使用单片机AT89C51,测温传感器使用DS18B20,用3位共阳极LED数码管以串口传送数据,实现温度显示。 1.3 课程设计的指标
1)利用数字温度传感器DS18B20测量温度信号,计算后在1602LED上显示. 2)其温度测量范围为−55℃~125℃,精确到0.5℃。 3) 用蜂鸣器设置警告音。
2、总体电路设计
2.1 电路设计
LED与AT89C51的连接,(如图一所示)将LED的D0~D7引脚分别与单片机的P0.1~P0.7相连,使LED能接受来自单片机的信号。
图2.1电路接线图
第 2 页 共 19 页
中北大学单片机课程设计说明书
2.2 各元件的功能 2.2.1 芯片DS18B20的说明
美国Dallas 半导体公司的数字化温度传感器DS18B20 是世界上第一片支持 \"一线总线\"接口的温度传感器,在其内部使用了在板(ON-B0ARD)专利技术。全部传感元件及转换电路集成在形如一只三极管的集成电路内。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。现在,新一代的DS18B20 体积更小、更经济、更灵活。使你可以充分发挥“一线总线”的优点。
图2.2 DS18B20外形
第 3 页 共 19 页
中北大学单片机课程设计说明书
2.2.2 DS18B20 的主要特性
(1)适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电
(2)独特的单线接口方式,DS18B20 在与微处理器连接时仅需要一条口线即可实现微处理与DS18B20 的双向通讯
(3)DS18B20 支持多点组网功能,多个DS18B20 可以并联在唯一的三线上,实现组网多点测温
(4)DS18B20 在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内
(5)温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃
(6)可编程的分辨率为9~12 位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可以实现高精度测温。
(7)在9位分辨率最多在93.75ms把温度转换成数字,12 位分辨率是最多可在750ms内将温度转换成数字,速度更快。
(8)温度测试结果直接转换成数字温度信号,以“一线总线”串行传输给CPU,同事科传送SRC检验码,菊友极强的抗干扰校正能力。
(9)负压特性:电源极性接反时芯片不会因发热而烧毁,但不会正常工作。 2.2.3 液晶显示器1602LCD的说明
表2.1接口信号说明
编号 符号 引脚说明 1 2 3 4 5 6 7 8
编号 符号 引脚说明 9 10 11 12 13 14 15 16 D2 D3 D4 D5 D6 D7 Data I/0 Data I/0 Data I/0 Data I/0 Data I/0 Data I/0 VSS 电源地 VDD 电源正极 VL RS E D0 D1 液晶显示偏压信号 数据/命令选择端 使能信号 Data I/0 Data I/0 R/W 读/写选择端 BLA 背光级正极 BLK 背光级负极 第 4 页 共 19 页
中北大学单片机课程设计说明书
表2.2 控制命令表
序号 指令 1 2 3 4 5 6 7 8 9 清显示 光标返回 置输入模式 显示开/关控制 光标或字符移位 置功能 置字符发生存贮器地址 置数据存贮器地址 读忙标志或地址 RS R/W D7 D6 D5 D4 D3 D2 D1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 D0 1 * S B * * 1 I/D D C 1 S/C R/L * DL N F * 1 字符发生存贮器地址 1 显示数据存贮器地址 BF 计数器地址 10 写数到CGRAM或DDRAM) 11 从CGRAM或DDRAM读数
0 要写的数据内容 1 读出的数据内容 液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符。
图2.3 内部显址
第 5 页 共 19 页
中北大学单片机课程设计说明书
2.3 电路的说明
如图可见,电路主要是由AT89C52芯片和1602LCD和蜂鸣器构成了主要电路。开关的控制,可调整温度的范围。
图2.4 仿真图
2.4 流程图
第 6 页 共 19 页
中北大学单片机课程设计说明书
3、系统程序的设计
程序清单 :
#include 第 7 页 共 19 页 中北大学单片机课程设计说明书 #include #define uint unsigned int #define unchar unsigned char unchar templ,temph,i,y,z,n; unchar a,b;//LCD的变量 unchar sign=0;//标志变量 bit k; //判断正负变量 sbit dq=P3^5; sbit rs=P2^0;//LCD显示的定义取值 sbit rw=P2^1; sbit e=P2^2; sbit bf=P0^7; sbit DQ=P2^5; //键盘定义 sbit read=P3^0; sbit incH=P3^2; sbit desH=P3^3; sbit reset=P3^4; //蜂鸣器 sbit BUZZER=P2^6; float t4,t5,t6,t7,tt;//温度转换的变量 uint tp; unchar temperature,Htemp,Ltemp; unchar D1,D2,D3; uint D4,D5,D6,D9,D7,D8; unchar code dis1[]={\"0123456789\unchar code dis2[]={\"temp:\unchar code dis3[]={\"WARN\unchar code dis4[]={\"Htemp:\unchar code dis5[]={\"working\unchar code dis6[]={\"Ltemp:\bit flag_1820_1; bit flag_1820_2; void delay_ms(unsigned char time); void ledshow(void); void keypress(void); void init(void); void gettemp(); void init1820(void); 第 8 页 共 19 页 中北大学单片机课程设计说明书 void write1820(unchar); unsigned char read1820(void); void delay_us(unchar); void delay3(unchar); /* 延时*/ void delay(uint t) { uint i; while(t--) { for(i=0;i<125;i++) {} } } //LCD显示函数 void delay1(unchar time) { unchar n; n=0; while(n