专 业: 计算机控制技术
年 级: 2011 级
姓 名: 樊 益 明
学 号: 20113042
指导教师: 刘 德 春
阿坝师专电子信息工程系
1. 引 言
1.1. 设计意义
在日常生活及工农业生产中,经常要用到温度的检测及控制,传统的测温元件有热电偶和热电阻。而热电偶和热电阻测出的一般都是电压,再转换成对应的温度,需要比较多的外部硬件支持。其缺点如下:
● 硬件电路复杂;
● 软件调试复杂;
● 制作成本高。
本数字温度计设计采用美国DALLAS半导体公司继DS1820之后推出的一种改进型智能温度传感器DS18B20作为检测元件,测温范围为-55~125℃,最高分辨率可达0.0625℃。
DS18B20可以直接读出被测温度值,而且采用三线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的热点。
2 设计要求
2.1基本要求
1) 用LCD12232实现实时温度显示温度和自己的学号。
2) 采用LED数码管直接读显示。
2.2扩展功能
温度报警,能任意设定温度范围实现铃声报警;
3资料准备
3.1单片机89C52模块
单片机89C52是本设计中的控制核心,是一个40管脚的集成芯片构成。引脚部分:单片机引脚基本电路部分与普通设计无异,40脚接Vcc+5V,20脚接地。X1,X2两脚接12MHZ的晶振,可得单片机机器周期为1微秒。RST脚外延一个RST复位键,一端通过10K电阻接Vcc,一端通过10K电阻接地。AT89S52是一种低功耗、高性能的8位CMOS微控制器,具有8K的可编程Flash 存储器。使用高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在线系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下标准功能:8K字节Flash,256字节RAM,32位I/O 口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。P 0口接一个470的上拉电阻。P0口0~8脚接4位共阳数码管的段选,P2口0~4脚接4位共阳数码管的位选,P3.7接DS18B20采集信号。
3.2 DS18B20简介
DALLAS最新单线数字温度传感器DS18B20简介新的“一线器件”体积更小、适用电压更宽、更经济 Dallas 半导体公司的数字化温度传感器DS1820是世界上第一片支持 “一线总线”接口的温度传感器。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。DS18B20、 DS1822 “一线总线”数字化温度传感器 同DS1820一样,DS18B20也支持“一线总线”接口,测量温度范围为 -55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。DS1822的精度较差为± 2°C 。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。与前一代产品不同,新的产品支持3V~5.5V的电压范围,使系统设计更灵活、方便。而且新一代产品更便宜,体积更小。 DS18B20、 DS1822 的特性 DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。可选更小的封装方式,更宽的电压适用范围。分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。DS18B20的性能是新一代产品中最好的!性能价格比也非常出色! DS1822与 DS18B20软件兼容,是DS18B20的简化版本。省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。 继“一线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。DS18B20和DS1822使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。3.3 温度传感器的工作原理
DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s 减为750ms。 DS18B20测温原理:低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振 随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值,即为所测温度。
3.4 DS18B20中的温度传感器对温度的测量
高速暂存存储器由9个字节组成,其分配如表5所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在 高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后。
温度数据值格式
下表为12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0, 这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这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℃。
可见其中低四位为小数位。
DS18B20温度与表示值对应表
3.5 DS18B20的内部结构
DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列如下:
DQ为数字信号输入/输出端;
GND为电源地;
VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
1) 64位的ROM
光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。
2) DS18B20温度传感器的存储器
DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的E2RAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。
暂存存储器包含了8个连续字节,前两个字节是测得的温度信息,第一个字节的内容是温度的低八位,第二个字节是温度的高八位。第三个和第四个字节是TH、TL的易失性拷贝,第五个字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新。第六、七、八个字节用于内部计算。第九个字节是冗余检验字节。
3.6 DS18B20的时序
由于DS18B20采用的是单总线协议方式,即在一根数据线实现数据的双向传输,而对89C51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。
1) DS18B20的复位时序
2)DS18B20的读时序
对于DS18B20的读时序分为读0时序和读1时序两个过程。
对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。DS18B20在完成一个读时序过程,至少需要60us才能完成。
3) DS18B20的写时序
对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。
对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。
4系统框架设计如下图所示:
按照系统设计功能的要求数字温度计总体电路结构框图如下图所示
5硬件设计
温度计采用AT89C51单片机作为微处理器,温度计系统的外围接口电路由晶振、LCD显示电路、复位电路、温度检测电路、LCD驱动电路。
温度计的工作过程是:初始化其接收需要检测的温度,并一直处于检测状态,并将检测到的温度值读取,并转化为十进制数值,通过LCD显示出来,再显示温度,方便用户来读数使用记录数据。
温度计系统的的硬件电路图如下图所示。
DS18B20测温和学号显示
6系统程序的设计
6.1主程序
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量温度值。温度测量每1s进行一次。
主程序流程图如图4.1.1所示。
主程序流程图
6.2读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节。在读出时须进行CRC校验,校验有错时不进行温度数据的改写。
读出温度子程序流程图如图4.2所示。
6.3温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令。当采用12位分辨率时,转换时间大约为750ms。在本程序设计中,采用1s显示程序延时法等待转换的完成。
温度转换命令子程序图如图4.3所示。
6.4计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值的正负判断。
计算温度子程序流程图如图4.4所示。
6.5显示数据刷新子程序
显示数据刷新子程序主要是对显示缓冲器中得显示数据进行刷新操作,当最高数据显示位为0时,将符号显示位移入下一位。
显示数据刷新子程序流程图如图4.5所示。
7 设计总结
本设计利用89S51芯片控制温度传感器DS18B52,再辅之以部分外围电路实现对环境温度的控制,性能稳定,精度较高,而且扩展性很强。由于DS18B20支持单总线协议,我们可以将多个DS18B52并联到3根或2根线上,CPU只需一根端口线就能与诸多DS18B52通信,占用较少的微处理器的端口就可以实现多点测温监控系统。
我们在老师的指导下完成了基于DS18B20的数字温度计的设计和制作。在进行实验的过程中,我们了解并熟悉DS18B20、AT89C2051以及74LS244的工作原理和性能。并且通过温度计的制作,我们将电子技能实训课堂上学到的知识进行运用,并在实际操作中发现问题,解决问题,更加增加对知识的认识和理解。
第二篇:基于DS18B20温度传感器的温度计设计
基于DS18B20温度传感器的温度计设计
摘要:以DS18B20温度传感器,4位7段数码管和AT89C52RC微控制器为主要部分实现数字温度计的设计,利用DS18B20本身具有的模数转换功能和暂时存储功能将模拟量——气温转换为微控制器可处理的数字量,并使用AT89C52RC的输入输出及定时器中断功能通过DS18B20的单线连接结构与DS18B20进行信息传输,读取温度值并用数码管显示出来。
1. 设计选题的目的、意义
通过数字温度计的设计进一步熟悉单片机微控制器及相关数字/模拟电路的原理和功能,熟悉单片机的程序设计,学会传感器的使用和相关文献的查找及学习。
2. 硬件电路设计
硬件部分主要包括微控制器、温度传感器模块和数码管显示模块三部分。
2.1 微控制器主要功能电路
如下图,包括电源,接地,复位电路,时钟脉冲电路(11.0592MHz)。
2.2 温度传感器模块
如下图,使用外部电源,可以减少程序复杂程度。
DS18B20特性:
l 独特的单线接口仅需一个端口进行通讯
l 简单的多点分布应用
l 无需外部器件
l 可通过数据线供电
l 零待机功耗
l 测温范围-55~+125℃
l 温度以12位数字量读出
l 温度数字量转换时间750ms(12位)
l 用户可定义的非易失性温度警报设置
l 报警搜索命令识别并超过程序限定温度(温度报警条件)的器件
l 应用包括温度控制、工业系统、消费品、温度计或任何热感测系统
2.3 数码管显示模块
如上图,由两片SN74HC573N八路透明锁存器分别控制共阳极数码管位和段的锁存,实现只用MCU的一组I/O口分别控制数码管位和段的选通。
3. 软件电路设计
软件同样包括三个部分:传感器控制,显示控制,主程序。
3.1 温度传感器控制
A.DS18B20内部存储读写与控制原理
右图是DS18B20内部9字节的暂存器的结构,向其传送读取命令后,暂存器会依次将9个字节的数据通过单线送出,每个字节都是低位在先。
在本课题,只需0字节和1字节,也就是温度LSB(低8位)和温度MSB(高8位)中的数据。
这两个字节中各位数据的意义如下表所示。
MSB的高5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625才能得到实际温度。
DS18B20有5条ROM操作命令和6条存储器操作命令,本实例中用到1条ROM操作命令和2条存储器操作命令,见下表。
对DS18B20操作之前必须初始化(复位),而且,操作必须遵守一定的时序规则,具体见附件程序部分。
B.温度传感器控制流程
温度传感器控制程序见附件“DS18B20.h”。
3.2 数码管显示控制
显示小数点后一位,即显示范围:-99.9~999.9,需要四位数码管同时显示,短时内连续扫描4位数码管,视觉效果即为同时显示。流程图如下。
数码管显示程序见附件“numled.h”。
3.3 主程序
不断显示温度值,同时利用定时器中断控制温度传感器,每当中断到达且判断条件(转换时间完毕)符合时从DS18B20接收并转换数据并使其复位和再一次转换温度数值,中断结束等待下一次中断
流程图如下,程序见附件“温度计.c”。
总结
该项目的重点,同时也是耗时最长的难点在于搞清楚DS18B20的工作原理及工作方式,其难在涉及到比较多的基础硬件控制,而这是C语言学习者相对汇编语言学习者来说比较吃力的地方,其次还有DS18B20读写时序控制规则也是比较耗时的地方,我们通过不断地修改测试和借鉴网络已有实例解决。
附件目录:<温度计.c><userlib.h><DS18B20.h><numled.h>
File: <温度计.c>
#include<reg52.h>
#include "userlib.h"
#include "numled.h"
#include "DS18B20.h"
unsigned int intcount=0; //中断次数
unsigned char tempH=0; //保存LSB,MSB
unsigned char tempL=0;
unsigned int temperature=0; //温度值保存在temperature里
//----------主程序-------------
void main()
{
IE=0x82;
TMOD=0x01;
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
while(Init_DS18B20());//初始化
WriteOneChar(0xcc);//跳过读序列号的操作
WriteOneChar(0x44); //启动温度转换
TR0=1;
while(1)
{
temperature=(0x00ff&tempL)|((0x00ff&tempH)<<8);
if(tempH>8)
{
temperature=~temperature+1;
Show(4,16,0);
}else{
Show(4,temperature/1600%10,0);
}
Show(3,temperature/160%10,0);
Show(2,temperature/16%10,1);
Show(1,temperature/8%10,0);
}
}
//--------------定时器中断----------------------
void timer0(void) interrupt 1
{
TH0=(65535-1000)/256; //定时器初值
TL0=(65535-1000)%256;
intcount++;
if(intcount==1000) // 1000*1000大约1090ms
{
intcount=0;
Init_DS18B20();//初始化
WriteOneChar(0xcc);//跳过读序列号的操作
WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
tempL=ReadOneChar(); //读出16bit温度
tempH=ReadOneChar();
while(Init_DS18B20());//初始化
WriteOneChar(0xcc);//跳过读序列号的操作
WriteOneChar(0x44); //启动温度转换
}
}
File:<userlib.h>
#define LED P0 //LED+数码管使用端口
sbit seclock=P1^6; //数码管段锁存
sbit bbitlock=P1^7; //数码管位锁存
sbit DQ=P2^2; //DS18B20
void Delayms(unsigned int x) //延时函数,单位ms
{
unsigned int i,j;
for(i=0;i<x;i++)
for(j=0;j<110;j++);
}
void Delay(unsigned int x) //延时函数
{
for(;x>0;x--);
}
File: <DS18B20.h>
//------初始化--------------------
unsigned Init_DS18B20(void)
{
unsigned char x=0;
DQ=1;//DQ先置高
Delay(5);//稍延时
DQ=0; //发送复位脉冲
Delay(70); //延时(480us<x<960us)
DQ=1;//拉高数据线
Delay(5);//等待(15~60us)
x=DQ;//用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
Delay(60);
return(x);
}
//------读一个字节----------------------------------------------------------------
unsigned char ReadOneChar(void)//主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
{
unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
unsigned char dat=0;
for(i=8;i>0;i--)//一个字节有8位
{
DQ=1;
Delay(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ) dat|=0x80;
else dat&=0x7f;
Delay(4);
}
return(dat);
}
//------写一个字节----------------------------------------------------------------
void WriteOneChar(unsigned char dat)
{ unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上
for(i=8;i>0;i--)//在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生
{
DQ=0;//在开始另一个写周期前必须有1us以上的高电平恢复期。
DQ=dat&0x01;
Delay(5);
DQ=1;
dat>>=1;
}
Delay(4);
}
File: <numled.h>
unsigned char bbitcode[5]={0,0x01,0x02,0x04,0x08}; //位选代码
unsigned char numcode[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xa0,0x83,0xa7,0xa1,0x84,0x8e,0xbf}; //显示数字代码0~f和负号
unsigned char dotcode[2]={0xff,0x7f}; //是否显示dp
void Cls() //清屏消影
{
LED=0xff;
seclock=1;
bbitlock=1;
bbitlock=0;
seclock=0;
Delayms(2);
}
void Show(unsigned char bbit,unsigned char num,unsigned char dot) //数码管一位显示
{
LED=bbitcode[bbit];
bbitlock=1;
bbitlock=0;
LED=0xff;
LED=numcode[num]&dotcode[dot];
seclock=1;
seclock=0;
Delayms(3);
Cls();
}