DS18B20温度传感器电路设计 默认分类 2010-06-29 12:08:49 阅读393 评论0 字号:大中
小 订阅
《单片机原理及应用》---项目设计
DS18B20温度传感器电路设计
一. 项目设计方案概述
温度是一种最基本的环境参数,人民的生活与环境的温度息息相关,在工业生产过程中要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要意义。在单片机的应用中,一个很重要的应用就是对温度进行检测。测量温度的关键是温度传感器,采用智能温度传感器以实现温度数字化,既能以数字形式直接输出被测温度值,具有测量误差小,分辨力高,抗干扰能力强,能够远程传输数据,带串行总线接口等优点。温度的数字输出显示LCD1602液晶显示器上。单片机、温度传感器DS18B20与LCD 液晶显示器等电子元器件的互联,可以研制和开发出具有高性价比的新一代测温系
统——基于单片机AT89S52的数字温度计。
基于单片机的数字温度计设计,即对温度进行实时测量,使用单线数字温度传感器DS18B20把温度信号直接转换成数字信
号输入单片机。经单片机处理后,将实时温度显示LCD 液晶显
示器上。
二. 项目设计具体模块分析
1、 总控模块
AT89S52 是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash 允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash ,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 AT89S52具有以下标准功能:8k 字节Flash ,256字节RAM ,32位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM 、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM 内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
2、电源模块
电源采用了7805芯片。他的封装形式为TO-220. 他有一系列固定的限制,以及过热保护和安全工作区的保护,使它基本上不会损坏。如果能够提供足够的散热片,它们就能提供大于1.5A 的输出电流。虽然是按照固定电压值来设计的,但是当接入适当
的外部器件后,就能获得各种不同的电压和电流。
它的特点有:最大输出电流为1.5A ;输出电压为5V ;拥有热过载保护、短路保护以及输出晶体管安全工作区保护。
3、传感器模块
本项目的传感器模块采用了DS18B20芯片。传统的温度检测可以使用热敏电阻作为温度敏感元件,热敏电阻主要优点是成本低,但需后续信号处理电路,而且可靠性相对较差,准确度和精度都较低。美国Dallas 公司最新推出的DS18B20 数字式温度传感器,与传统的热敏电阻温度传感器不同,它能够直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12 位的数字值读数方式,可以分别在93.75ms 和750ms 内将温度值转化9 位和12 位的数字量。因而使用DS18B20 可使系统结构更简单,可靠性更高。芯片的耗电量很小,从总线上“偷”一点电存储在片内的电容中就可正常工作,一般不用另加电源。最可贵的是这些芯片在检测点已把被测信号数字化了,因此在单
总线上传送的是数字信号,这使得系统的抗干扰性好、可靠性
高、传输距离远。
系统有如下特点:
(1)单线接口,只有一根信号线与CPU 连接单总线器件,
具有线路简单,体积小的特点;
(2)不需要备份电源,可通过信号线供电,电源电压范围
从3.3~5V ;
(3)传送串行数据,不需要外部元件;
(4)温度测量范围从-55℃~+125℃,-10~+85℃时测量精
度为±0.5℃;
(5)通过编程可实现9~12 位的数字值读数方式(出厂时
被设置为12 位);
(6)零功耗等待;
(7)现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性,适合于恶劣环境的现场温度测量,如环境
控制、设备或过程控制、测温类消费电子产品等。
4、 显示模块
显示模块采用了型号为1602的LCD 。它体积小、功耗低、超薄轻巧等优点,在袖珍式仪表和低功耗应用系统中得到广泛的应用。它分为带背光和不带背光两种,基控制器大部分为HD44780. 本设计中应用的是带背光的1602,带背光的比不带背
光的厚,但两者在应用中并无差别。
1602LCD 主要技术参数:显示容量:16×2个字符;芯片工作
电压:4.5—5.5V ;
工作电流:2.0mA(5.0V);模块最佳工作电压:5.0V;字符尺
寸:2.95×4.35(W×H)mm 。
5、项目展望
本设计也有许多可以改进的地方,首先可以安装报警器,当温度超过温度测量范围时就可报警。其次也可以安装一个可以在可变范围内调节温度上下限的按钮。本电路也存在缺点,由于将传感器焊接在板子上,板子不能绝缘密封的,所以不适合测量液
体的温度。限制了此温度计的使用。
四、项目设计的理解
单片机的接口信号是数字信号。要想用单片机获取温度这类非电信号的信息, 必须使用温度传感器, 将温度信息转换为电流或电压输出。如果转换后的电流或电压输出是模拟信号, 还必须进行A/ D转换, 以满足单片机接口的需要。传统的温度检测大多以热敏电阻作为温度传感器。但是, 热敏电阻的可靠性较差、测量温度准确率低, 而且还必须经专门的接口电路转换成数字信号后
才能由单片机进行处理。
附件一:
1、 原理图
附件二:
1、 仿真图
附件三:
1、 程序代码
#include
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^4;//ds18b20与单片机连接口
sbit RS= P3^0;
sbit RW = P3^1;
sbit EN = P3^2;
unsigned char code str1[]={"temperature:"}; unsigned char code str2[]={" "};
unsigned char code str3[]={"Hello!Da Lian."};
uchar data disdata[6];
uint tvalue;//温度值
uchar tflag;//温度正负标志
/*************************lcd1602程序
**************************/
void delay1ms(unsigned int ms)//延时1毫秒(不够精确
的)
{
unsigned int i,j;
for(i=0;i
for(j=0;j
}
void wr_com(unsigned char com)//写指令//
{
delay1ms(1);
RS=0;
RW=0;
EN=0;
P1=com;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void wr_dat(unsigned char dat)//写数据//
{
delay1ms(1);;
RS=1;
RW=0;
EN=0;
P1=dat;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void lcd_init()//初始化设置//
{
delay1ms(15);
wr_com(0x38);delay1ms(100);
wr_com(0x08);delay1ms(100);
wr_com(0x01);delay1ms(100);
wr_com(0x06);delay1ms(100);
wr_com(0x0c);delay1ms(100);
}
void display(unsigned char *p)//显示//
{
while(*p!='\0')
{
wr_dat(*p);
p++;
delay1ms(1);
}
}
void init_play()//初始化显示
{
lcd_init();
wr_com(0x80);
display(str1);
wr_com(0xc0);
display(str2);
}
void init_play1()//初始化显示
{
lcd_init();
wr_com(0x80);
display(str3);
wr_com(0xc0);
delay1ms(2000);
display(str2);
}
/*************************ds18b20程序
**************************/
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
void ds1820rst()/*ds1820复位*/
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}
read_temp()/*读取温度值并转换*/
{
uchar a,b;
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue
tvalue=tvalue|a;
if(tvalue
tflag=0;
else
{
tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/******************************************************************
*/
void ds1820disp()//温度值显示
{
uchar flagdat;
disdata[0]=tvalue/1000+0x30;//百位数
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位
disdata[4]=0xdf;
disdata[5]='C';
disdata[6]='H';
if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-
if(disdata[0]==0x30)
{
disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{
disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}
wr_com(0xc0);
wr_dat(flagdat);//显示符号位
wr_com(0xc1);
wr_dat(disdata[0]);//显示百位
wr_com(0xc2);
wr_dat(disdata[1]);//显示十位
wr_com(0xc3);
wr_dat(disdata[2]);//显示个位
wr_com(0xc4);
wr_dat(0x2e);//显示小数点
wr_com(0xc5);
wr_dat(disdata[3]);//显示小数位
wr_dat(disdata[4]);
wr_dat(disdata[5]);
}
/********************主程序***********************************/
void main()
{
init_play1();
init_play();//初始化显示
while(1)
{
read_temp();//读取温度
ds1820disp();//显示
}
}
DS18B20温度传感器电路设计 默认分类 2010-06-29 12:08:49 阅读393 评论0 字号:大中
小 订阅
《单片机原理及应用》---项目设计
DS18B20温度传感器电路设计
一. 项目设计方案概述
温度是一种最基本的环境参数,人民的生活与环境的温度息息相关,在工业生产过程中要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要意义。在单片机的应用中,一个很重要的应用就是对温度进行检测。测量温度的关键是温度传感器,采用智能温度传感器以实现温度数字化,既能以数字形式直接输出被测温度值,具有测量误差小,分辨力高,抗干扰能力强,能够远程传输数据,带串行总线接口等优点。温度的数字输出显示LCD1602液晶显示器上。单片机、温度传感器DS18B20与LCD 液晶显示器等电子元器件的互联,可以研制和开发出具有高性价比的新一代测温系
统——基于单片机AT89S52的数字温度计。
基于单片机的数字温度计设计,即对温度进行实时测量,使用单线数字温度传感器DS18B20把温度信号直接转换成数字信
号输入单片机。经单片机处理后,将实时温度显示LCD 液晶显
示器上。
二. 项目设计具体模块分析
1、 总控模块
AT89S52 是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash 允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash ,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 AT89S52具有以下标准功能:8k 字节Flash ,256字节RAM ,32位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM 、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM 内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
2、电源模块
电源采用了7805芯片。他的封装形式为TO-220. 他有一系列固定的限制,以及过热保护和安全工作区的保护,使它基本上不会损坏。如果能够提供足够的散热片,它们就能提供大于1.5A 的输出电流。虽然是按照固定电压值来设计的,但是当接入适当
的外部器件后,就能获得各种不同的电压和电流。
它的特点有:最大输出电流为1.5A ;输出电压为5V ;拥有热过载保护、短路保护以及输出晶体管安全工作区保护。
3、传感器模块
本项目的传感器模块采用了DS18B20芯片。传统的温度检测可以使用热敏电阻作为温度敏感元件,热敏电阻主要优点是成本低,但需后续信号处理电路,而且可靠性相对较差,准确度和精度都较低。美国Dallas 公司最新推出的DS18B20 数字式温度传感器,与传统的热敏电阻温度传感器不同,它能够直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12 位的数字值读数方式,可以分别在93.75ms 和750ms 内将温度值转化9 位和12 位的数字量。因而使用DS18B20 可使系统结构更简单,可靠性更高。芯片的耗电量很小,从总线上“偷”一点电存储在片内的电容中就可正常工作,一般不用另加电源。最可贵的是这些芯片在检测点已把被测信号数字化了,因此在单
总线上传送的是数字信号,这使得系统的抗干扰性好、可靠性
高、传输距离远。
系统有如下特点:
(1)单线接口,只有一根信号线与CPU 连接单总线器件,
具有线路简单,体积小的特点;
(2)不需要备份电源,可通过信号线供电,电源电压范围
从3.3~5V ;
(3)传送串行数据,不需要外部元件;
(4)温度测量范围从-55℃~+125℃,-10~+85℃时测量精
度为±0.5℃;
(5)通过编程可实现9~12 位的数字值读数方式(出厂时
被设置为12 位);
(6)零功耗等待;
(7)现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性,适合于恶劣环境的现场温度测量,如环境
控制、设备或过程控制、测温类消费电子产品等。
4、 显示模块
显示模块采用了型号为1602的LCD 。它体积小、功耗低、超薄轻巧等优点,在袖珍式仪表和低功耗应用系统中得到广泛的应用。它分为带背光和不带背光两种,基控制器大部分为HD44780. 本设计中应用的是带背光的1602,带背光的比不带背
光的厚,但两者在应用中并无差别。
1602LCD 主要技术参数:显示容量:16×2个字符;芯片工作
电压:4.5—5.5V ;
工作电流:2.0mA(5.0V);模块最佳工作电压:5.0V;字符尺
寸:2.95×4.35(W×H)mm 。
5、项目展望
本设计也有许多可以改进的地方,首先可以安装报警器,当温度超过温度测量范围时就可报警。其次也可以安装一个可以在可变范围内调节温度上下限的按钮。本电路也存在缺点,由于将传感器焊接在板子上,板子不能绝缘密封的,所以不适合测量液
体的温度。限制了此温度计的使用。
四、项目设计的理解
单片机的接口信号是数字信号。要想用单片机获取温度这类非电信号的信息, 必须使用温度传感器, 将温度信息转换为电流或电压输出。如果转换后的电流或电压输出是模拟信号, 还必须进行A/ D转换, 以满足单片机接口的需要。传统的温度检测大多以热敏电阻作为温度传感器。但是, 热敏电阻的可靠性较差、测量温度准确率低, 而且还必须经专门的接口电路转换成数字信号后
才能由单片机进行处理。
附件一:
1、 原理图
附件二:
1、 仿真图
附件三:
1、 程序代码
#include
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^4;//ds18b20与单片机连接口
sbit RS= P3^0;
sbit RW = P3^1;
sbit EN = P3^2;
unsigned char code str1[]={"temperature:"}; unsigned char code str2[]={" "};
unsigned char code str3[]={"Hello!Da Lian."};
uchar data disdata[6];
uint tvalue;//温度值
uchar tflag;//温度正负标志
/*************************lcd1602程序
**************************/
void delay1ms(unsigned int ms)//延时1毫秒(不够精确
的)
{
unsigned int i,j;
for(i=0;i
for(j=0;j
}
void wr_com(unsigned char com)//写指令//
{
delay1ms(1);
RS=0;
RW=0;
EN=0;
P1=com;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void wr_dat(unsigned char dat)//写数据//
{
delay1ms(1);;
RS=1;
RW=0;
EN=0;
P1=dat;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void lcd_init()//初始化设置//
{
delay1ms(15);
wr_com(0x38);delay1ms(100);
wr_com(0x08);delay1ms(100);
wr_com(0x01);delay1ms(100);
wr_com(0x06);delay1ms(100);
wr_com(0x0c);delay1ms(100);
}
void display(unsigned char *p)//显示//
{
while(*p!='\0')
{
wr_dat(*p);
p++;
delay1ms(1);
}
}
void init_play()//初始化显示
{
lcd_init();
wr_com(0x80);
display(str1);
wr_com(0xc0);
display(str2);
}
void init_play1()//初始化显示
{
lcd_init();
wr_com(0x80);
display(str3);
wr_com(0xc0);
delay1ms(2000);
display(str2);
}
/*************************ds18b20程序
**************************/
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
void ds1820rst()/*ds1820复位*/
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}
read_temp()/*读取温度值并转换*/
{
uchar a,b;
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue
tvalue=tvalue|a;
if(tvalue
tflag=0;
else
{
tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/******************************************************************
*/
void ds1820disp()//温度值显示
{
uchar flagdat;
disdata[0]=tvalue/1000+0x30;//百位数
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位
disdata[4]=0xdf;
disdata[5]='C';
disdata[6]='H';
if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-
if(disdata[0]==0x30)
{
disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{
disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}
wr_com(0xc0);
wr_dat(flagdat);//显示符号位
wr_com(0xc1);
wr_dat(disdata[0]);//显示百位
wr_com(0xc2);
wr_dat(disdata[1]);//显示十位
wr_com(0xc3);
wr_dat(disdata[2]);//显示个位
wr_com(0xc4);
wr_dat(0x2e);//显示小数点
wr_com(0xc5);
wr_dat(disdata[3]);//显示小数位
wr_dat(disdata[4]);
wr_dat(disdata[5]);
}
/********************主程序***********************************/
void main()
{
init_play1();
init_play();//初始化显示
while(1)
{
read_temp();//读取温度
ds1820disp();//显示
}
}