DS18B20温度传感器电路设计.docx
《DS18B20温度传感器电路设计.docx》由会员分享,可在线阅读,更多相关《DS18B20温度传感器电路设计.docx(14页珍藏版)》请在冰豆网上搜索。
![DS18B20温度传感器电路设计.docx](https://file1.bdocx.com/fileroot1/2023-4/19/92750768-e3ff-4cca-8920-50f38b4c6d58/92750768-e3ff-4cca-8920-50f38b4c6d581.gif)
DS18B20温度传感器电路设计
DS18B20温度传感器电路设计
默认分类2010-06-2912:
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、项目展望
本设计也有许多可以改进的地方,首先可以安装报警器,当温度超过温度测量范围时就可报警。
其次也可以安装一个可以在可变范围内调节温度上下限的按钮。
本电路也存在缺点,由于将传感器焊接在板子上,板子不能绝缘密封的,所以不适合测量液体的温度。
限制了此温度计的使用。
三、本人对项目设计的贡献
1、小组成员
组长:
xxx
组员:
xxx
2、 每个人对项目设计的贡献
xx(x%):
测试板子、原理图、编程、调试程序、项目报告、传感器模块
xx(x%):
焊板子、原理图、编程、PPT制作及演示、显示模块
xx(x%):
焊板子、原理图、项目报告、电源模块
xx(x%):
焊板子、原理图、总控模块
四、项目设计的理解
单片机的接口信号是数字信号。
要想用单片机获取温度这类非电信号的信息,必须使用温度传感器,将温度信息转换为电流或电压输出。
如果转换后的电流或电压输出是模拟信号,还必须进行A/D转换,以满足单片机接口的需要。
传统的温度检测大多以热敏电阻作为温度传感器。
但是,热敏电阻的可靠性较差、测量温度准确率低,而且还必须经专门的接口电路转换成数字信号后才能由单片机进行处理。
附件一:
1、 原理图
附件二:
1、 仿真图
附件三:
1、 程序代码
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P3^4;//ds18b20与单片机连接口
sbitRS=P3^0;
sbitRW=P3^1;
sbitEN=P3^2;
unsignedcharcodestr1[]={"temperature:
"};
unsignedcharcodestr2[]={" "};
unsignedcharcodestr3[]={"Hello!
DaLian."};
uchardatadisdata[6];
uinttvalue;//温度值
uchartflag;//温度正负标志
/*************************lcd1602程序**************************/
voiddelay1ms(unsignedintms)//延时1毫秒(不够精确的)
{
unsignedinti,j;
for(i=0;i for(j=0;j<100;j++);
}
voidwr_com(unsignedcharcom)//写指令//
{
delay1ms
(1);
RS=0;
RW=0;
EN=0;
P1=com;
delay1ms
(1);
EN=1;
delay1ms
(1);
EN=0;
}
voidwr_dat(unsignedchardat)//写数据//
{
delay1ms
(1);;
RS=1;
RW=0;
EN=0;
P1=dat;
delay1ms
(1);
EN=1;
delay1ms
(1);
EN=0;
}
voidlcd_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);
}
voiddisplay(unsignedchar*p)//显示//
{
while(*p!
='\0')
{
wr_dat(*p);
p++;
delay1ms
(1);
}
}
voidinit_play()//初始化显示
{
lcd_init();
wr_com(0x80);
display(str1);
wr_com(0xc0);
display(str2);
}
voidinit_play1()//初始化显示
{
lcd_init();
wr_com(0x80);
display(str3);
wr_com(0xc0);
delay1ms(2000);
display(str2);
}
/*************************ds18b20程序**************************/
voiddelay_18B20(unsignedinti)//延时1微秒
{
while(i--);
}
voidds1820rst()/*ds1820复位*/
{
unsignedcharx=0;
DQ=1; //DQ复位
delay_18B20(4);//延时
DQ=0; //DQ拉低
delay_18B20(100);//精确延时大于480us
DQ=1; //拉高
delay_18B20(40);
}
uchards1820rd()/*读数据*/
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
voidds1820wr(ucharwdata)/*写数据*/
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=wdata&0x01;
delay_18B20(10);
DQ=1;
wdata>>=1;
}
}
read_temp()/*读取温度值并转换*/
{
uchara,b;
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{
tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/
voidds1820disp()//温度值显示
{
ucharflagdat;
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]);
}
/********************主程序***********************************/
voidmain()
{
init_play1();
init_play();//初始化显示
while
(1)
{
read_temp();//读取温度
ds1820disp();//显示
}
}