单片机实验报告-温度计
成绩:
滨江学院
单片机原理及应用 实验项目
温度计 DS18B20
院
系 滨江学院电子工程系
专
业
信息工程
学生姓名
马骏
学
号
20142309029
二零一七年十一月十八日 一、实验目得 1、1 实验意义 在日常生活及工农业生产中,经常要用到温度得检测及控制,传统得测温元件有热电偶与热电阻。而热电偶与热电阻测出得一般都就是电压,再转换成对应得温度,需要比较多得外部硬件支持.其缺点如下: ● 硬件电路复杂; ● 软件调试复杂; ● 制作成本高。
本数字温度计设计采用美国 DALLAS半导体公司继 DS1820 之后推出得一种改进型智能温度传感器 DS18B20 作为检测元件,测温范围为-55~125℃,最
高分辨率可达 0、0625℃。
DS18B20可以直接读出被测温度值,而且采用三线制与单片机相连,减少了外部得硬件电路,具有低成本与易使用得热点。
1、2 功能要求 设计出得DS18B20 数字温度计测温范围在—55~125℃,误差在±0、5℃以内,采用LED数码管直接读显示。
二、实验硬件 2、1 方案设计 按照系统设计功能得要求,确定系统由 3 个模块组成:主控制器、测温电路与显示电路。
数字温度计总体电路结构框图如图所示:
2、2 硬件设计 温度计电路设计原理图如下图所示,控制器使用单片机AT89C2051,温度传感器使用DS18B20,使用四位共阳 LED数码管以动态扫描法实现温度显示 AT89C2051 主 控 制 器 DS18B20 显 示 电扫 描 驱
2、3 主控制器
单片机 AT89C2051 具有低电压供电与小体积等特点,两个端口刚好满足电路系统得设计需要,很适合便携手持式产品得设计使用。系统可用两节电池供电。AT89C2051 得引脚图如下图所示: 1、VCC:电源电压。
2、GND:地。
3、P1 口:P1 口就是一个 8 位双向 I/O口。口引脚 P1、2~P1、7 提供内部上拉电阻,P1、0 与P1、1要求外部上拉电阻。P1、0与 P1、1 还分别作为片内精密模拟比较器得同相输入(ANI0)与反相输入(AIN1)。P1 口输出缓冲器可吸收
20mA 电流并能直接驱动 LED 显示.当P1 口引脚写入“1”时,其可用作输入端,当引脚 P1、2~P1、7 用作输入并被外部拉低时,它们将因内部得写入“1”时,其可用作输入端。当引脚 P1、2~P1、7用作输入并被外部拉低时,它们将因内部得上拉电阻而流出电流.
4、P3口:P3 口得 P3、0~P3、5、P3、7 就是带有内部上拉电阻 得七个双向 I/O 口引脚。P3、6用于固定输入片内比较器得输出信号并且它作为一通用 I
/O 引脚而不可访问。P3 口缓冲器可吸收20mA 电流。当P3 口写入“1”时,它们被内部上拉电阻拉高并可用作输入端。用作输入时,被外部拉低得 P3口脚将用上拉电阻而流出电流。
5、RST:复位输入。RST一旦变成高电平所有得 I/O 引脚就复位到“1”。当振荡器正在运行时,持续给出 RST 引脚两个机器周期得高电平便可完成复位。每一个机器周期需12个振荡器或时钟周期。
6、XTAL1:作为振荡器反相器得输入与内部时钟发生器得输入.
7、XTAL2:作为振荡器反相放大器得输出.
2、4 总线驱动器
74LS244 74LS244为 3 态 8 位缓冲器,一般用作总线驱动器。引脚图如下图。
2、5 显示电路
显示电路采用 4 位共阳极 LED 数码管,从 P1口输出段码,列扫描用 P3、0~P3、3口来实现,列驱动用8055 三极管。
2、6温度传感器
DS18B20 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,同时可传送 CRC 校验码,具有极强得抗干扰纠错能力。
9、负压特性:电源极性接反时,芯片不会因发热而烧毁, 但不能正常工作。DS18B20 与单片机得接口电路(引脚图见右图) DS18B20可以采用电源供电方式,此时DS18B20得第1
脚接地,第2脚作为信号线,第 3 脚接电源。
三、软件设计 系统程序主要包括主程序、读出温度子程序、温度转换命令子程序、计算温度子程序与显示数据刷新子程序等. 3、1 主程序 主程序得主要功能就是负责温度得实时显示、读出并处理DS18B20得测量温度值。温度测量每 1s进行一次。主程序流程图如图所示。
3、2
读出温度子程序 读出温度子程序得主要功能就是读出 RAM中得 9 字节。在读出时必须进行CRC 校验,校验有错时不能进行温度数据得改写。读出温度子程序流程图如下图所示: 读出温度子程序
读出温度子程序得主要功能就是读出 RAM 中得 9 字节。在读出时须进行CRC校验,校验有错时不进行温度数据得改写。得出温度子程序流程图如下图所示。
3、3 温度转换命令子程序
温度转换命令子程序主要就是发温度转换开始命令.当采用12 位分辨率时,转换时间约为 750ms。在本程序设计中,采用 1s 显示程序延时法等待转换得完成。温度转换命令子程序流程图如下图所示。
计算温度子程序
计算温度子程序将RAM中读取值进行BCD码得转换运算,并进行温度值正负得判定。计算温度子程序流程图如下左图所示、
现实数据刷新子程序
现实数据刷新子程序主要就是对显示缓冲器中得显示数据进行刷新操作,当最高数据显示位为 0 时,将符号显示位移入下一位.现实数据刷新子程序流程图如下右图所示、 四、实验操作过程 系统得调试以程序调试为主。
硬件调试比较简单,首先检查电感得焊接就是否正确,然后可用万用表测试或通电检测。
软件调试可以先编写显示程序并进行硬件得正确性检验,然后分别进行主程序、读出温度子程序、温度转换命令子程序、计算温度子程序与现实数据刷新子程序等得编程及调试 由于 DS18B20 与单片机采用串行数据传送,因此,对 DS18B20进行读/写编程时必须严格地保证读/写时序;否则将无法读取测量结果。本程序采用单片机汇编或 C 语言编写用Wave3、2 或 Keil C51 编译器编程调试。
软件调试到能显示温度值,并且在有温度变化时显示温度能改变,救基本完成。56、性能测试可用制作得温度机与已有得成品温度计同时进行测量比较。由于 DS18B20 得精度很高,所以误差指标可以限制在0、5℃以内. 另外,-55~+125℃得测温范围使得该温度计完全适合一般得应用场合,其低电压供电特性可做成用电池供电得手持温度计。
DS18B20 温度计还可以在高低温报警、远距离多点测温控制等方面进行应用开发,但在实际设计中应注意以下问题; 1、DS18B20 工作时电流高大 1、5mA,总线上挂接点数较多且同时进行转换时要考虑增加总线驱动,可用单片机端口在温度转换时导通一个 MOSFET 供电。
2、连接 DS18B20 得总线电缆就是有长度限制得,因此在用DS18B20进行
长距离测温系统设计时要充分考虑总线分布电容与阻抗匹配等问题。
3、在DS18B20测温程序设计中,向 DS18B20 发出温度转换命令后,程序总要等待 DS18B20得返回信号。一旦某个 DS18B20 接触不好或断线,当程序读DS18B20 时,将没有返回信号,程序进入死循环.这一点在进行 DS18B20 硬件连接与软件设计时要给予一定得重视。
五、实验现象 六、实验总结 本次课程设计即将进入尾声,回想这两周来得电子设计制作经历,我感触甚就是深刻.通过本次课程设计,使我对电子设计及制作产生了较为浓厚得兴趣,这不仅加强了自己对理论知识得理解与巩固,还能提高自己得动手能力,可以说受益匪浅。当然更重要得就是,激起了我学好单片机得斗志. 本次课程设计主要分为四部分:设计、仿真、调试.这三个步骤在整个课程设计过程中起着重要得作用。
本次毕业设计就是针对 MCS-52 系列得单片机芯片STC89C52 来设计一个数字温度计,该设计充分利用了温度传感器DS18B20 功能强大得优点,如DS18B20 可以直接读出被测温度值,进行转换;而且采用三线制与单片机相连,减少了外部得硬件电路,具有低成本与易使用得特点,大大简化了硬件电路,也使得该数字温度计不仅具有结构简单、成本低廉、精确度较高、反应速度较快、数字化显示与不易损坏等特点,而且性能稳定,适用范围广,因此特别适用于对测温要求比较准确得场所。
附录:程序代码 #include 〈reg52、h>
#define uchar unsigned char #define uint unsigned int sbit DS=P2^2;
uint temp;
uchar flag1;
sbit dula=P2^6; sbit wela=P2^7; unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef}; void delay(uint count)
{uint i;
while(count) {i=200;
while(i>0)
i-—;
count--;
} } void dsreset(void)
{uint i;
DS=0;
i=103;
while(i〉0)i-—;
DS=1;
i=4;
while(i〉0)i—-; } bit tmpreadbit(void)
{ uint i;
bit dat;
DS=0;i++;
DS=1;i++;i++;
dat=DS;
i=8;while(i〉0)i——;
return (dat); } uchar tmpread(void)
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit(); dat=(j<〈7)|(dat〉〉1);
}
return(dat); } void tmpwritebyte(uchar dat)
{uint i;
uchar j;
bit testb;
for(j=1;j〈=8;j++)
{
testb=dat&0x01;
dat=dat>〉1; if(testb)
{
DS=0;
i++;i++;
DS=1;
i=8;while(i〉0)i--;
}
else
{
DS=0;
i=8;while(i>0)i-—;
DS=1;
i++;i++;
}}} void tmpchange(void)
{dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0x44);
conversion } uint tmp()
{
float tt;
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();
b=tmpread();
temp=b;
temp<<=8;
temp=temp|a;
tt=temp*0、0625;
temp=tt*10+0、5;
return temp; } void display(uint temp)
{
uchar A1,A2,A2t,A3;
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
dula=0;
P0=table[A1];
ﻩ ﻩ
dula=1;
dula=0;
wela=0;
P0=0x7e;
wela=1;
wela=0;
delay(1);
dula=0;
P0=table1[A2];
ﻩ
dula=1;
dula=0;
wela=0;
P0=0x7d;
wela=1;
wela=0;
delay(1);=
P0=table[A3];
ﻩ
dula=1;
dula=0;
P0=0x7b;
wela=1;
wela=0;
delay(1); } void main() {
uchar a;
do
{
tmpchange();
for(a=10;a>0;a——)
{ ﻩ
ﻩ
;))(pmt(yalpsidﻩ
}
} while(1); }