基于LCD1602液晶的DS18B20温度传感器的温度采集系统设计.docx
《基于LCD1602液晶的DS18B20温度传感器的温度采集系统设计.docx》由会员分享,可在线阅读,更多相关《基于LCD1602液晶的DS18B20温度传感器的温度采集系统设计.docx(27页珍藏版)》请在冰点文库上搜索。
基于LCD1602液晶的DS18B20温度传感器的温度采集系统设计
2012~2013学年第2学期
《单片机原理及应用》
课程设计报告
题目:
基于DS18B20的温度采集系统设计
专业:
自动化
班级:
姓名:
指导教师:
电气工程学院
2013年6月6日
1、任务书
课题名称
基于DS18B20的温度采集系统设计
指导教师(职称)
执行时间
2012~2013学年第2学期第10周
学生姓名
学号
承担任务
设计目的
通过该课程设计进一步熟悉单片机的基本知识与工作原理;
1.熟悉DS18B20温度传感器的内部资源及其使用方法;
2.学会使用Protues仿真软件进行单片机系统设计的方法;
3.学会使用LCD1602对所需要显示的内容进行显示。
设计要求
要求:
1.液晶第一行显示“Temperature”;
2.使用DS18B20温度传感器采集当前的温度,并采集的温度值液晶第二行显示。
3.设计温度的上下界限,超过温度上限或下限时,蜂鸣器报警同时一个发光二极管闪烁报警。
摘要
随着信息技术的飞速发展,嵌入式智能电子技术已渗透到社会生产、工业控制以及人们日常生活的各个方面。
单片机又称为嵌入式微型控制器,在智能仪表、工业控制、智能终端、通信设备、医疗器械、汽车电器、导航系统和家用电器等很多领域都有着广泛的应用,已成为当今电子信息领域应用最广泛的技术之一。
本文主要介绍了一个基于STC89C52RC单片机的测温系统,详细描述了利用液晶显示器件温度传感器DS18B20开发测温系统的原理,重点对传感器与单片机的硬件连接和软件编程进行了详细分析。
主要地介绍了数字温度传感器DS18B20的数据采集过程,进而对各部分硬件电路的工作原理进行了介绍。
温度传感器DS18B20与STC89C52RC结合构成了最简温度检测系统,该系统可以方便的实现温度采集和显示,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他主系统的辅助扩展。
关键词:
单片机STC89C52RC、DS18B20温度传感器、液晶显示器LCD1602
基于DS18B20的温度采集系统设计
第1章绪论
1.1温度检测系统的介绍
温度检测在各领域应用的非常广泛,可以说渗透到了社会的每一个领域。
人们的生活与温度检测息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。
1.1.1温度检测系统的组成
温度检测的首要问题是温度传感器的选取。
温度传感器的发展经历了三个发展阶段:
①传统的分立式温度传感器、②模拟式集成温度传感器、③智能集成温度传感器。
目前的智能温度传感器(也称数字温度传感器)是在20世纪90年代中期问世的,它是微电子技术、计算机技术和自动测试技术(ATE)的结晶。
它的优点是能输出温度数据及相关的温度控制量,适配各种微控制器(MCU)。
目前温度传感器正在朝着基于单片机的基础上从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展,并朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片机测温系统等高科技的方向迅速发展。
我们采用DS18B20数字温度传感器采集温度信号,使用MCS-51单片机控制温度传感器,然后将采集到的温度信号在LCD1602液晶显示屏上显示。
这种温度检测系统性能较好,并易于实现。
1.1.2温度检测的实际意义
在工业生产和实践研究中,像电力、化工、石油、冶金、航空航天、机械制造、粮食存储、酒类生产等领域,温度常常是表征对象和过程状态的重要参数之一。
比如,发电厂锅炉的温度必须控制在一定的范围之内;许多化学反应的工艺过程必须在适当的温度下才能正常进行;炼油过程中,原油必须在不同的温度和压力条件下进行分馏才能得到汽油、柴油、煤油等产品。
没有合适的温度环境,许多电子设备就不能正常工作,粮仓的储粮就会变质霉烂,酒类的品质就没有保障。
由此可见,温度的检测对日常生活很重要。
第二章温度检测系统方案的选取
2.1温度检测系统方案的选取
由于温度检测的方法多种多样,而不同的检测方法适合不同的场所。
我们针对温度检测提出了温度采集系统的多种设计方案。
由于温度检测系统基本组成为温度检测模块和温度变送传输模块以及温度显示模块。
下面对这些不同模块的选取分别进行具体地分析。
2.1.1温度检测模块
方案一:
采用热敏电阻。
因热敏电阻是温度敏感元件,使用它来感受温度变化,其电阻值的变化是可以衡量温度大小的。
但热敏电阻测温具有精度低,可靠性差,不适用检测变化小的温度信号等特点,所以这种方法不适用于精度要求高的场合。
方案二:
采用单总线数字温度传感器DS18B20测量温度。
因为它直接输出数字信号,便于单片机进行处理及控制,同时也节省了硬件电路。
该芯片的物理化学性质很稳定,元件线形性能好。
当温度在0—100摄氏度范围内变化时,最大线形偏差小于1摄氏度。
方案三:
在温度测量系统中,也可采用单片机温度传感器,比如AD590,LM35等。
但这些芯片输出的都是模拟信号,必须经过A/D转换后才能送给计算机,这样就使测温系统的硬件结构变的复杂。
另外,这种测温系统难以实现多点测温,也要用到复杂的算法,一定程度上也增加了软件实现的难度。
经过讨论分析,为符合课程设计要求,我们选用方案二。
温度检测模块示意图
2.1.2温度显示模块
方案一:
采用8位段数码管。
将单片机得到的数据通过数码管显示出来。
该方案简单易行,但所需的元件较多,可读性差,一旦设定后很难再加入其他的功能,而且温度显示格式受限制,耗电量大,不宜用电池给系统供电。
方案二:
采用液晶显示器件。
液晶显示具有平稳、省电、美观等优点,更容易满足题目要求。
而且对后续的工艺兼容性高,只需将修改软件中程序设计即可,可操作性强,也易于读数。
LCD1602液晶显示器具有两行十六个字符的显示,能同时显示其它的信息如日期、时间、星期、温度。
通过比较,我们选用方案二。
温度显示模块示意图
2.2温度检测系统结构的设计
采用STC89C52RC单片机作为控制核心对温度传感器DS18B20进行控制,由它读取温度信号并进行计算处理后送到液晶显示器LCD1602显示。
按照系统设计功能的要求,确定系统由3个模块组成:
主控制器、测温电路和显示电路。
温度检测系统总体电路结构框图如下图所示。
温度检测系统电路结构框图
第三章硬件电路的设计
3.1STC89C52RC的介绍
STC89C52RC单片机是宏晶科技推出的新一代超强抗干扰、高速、低功耗的单片机。
它的指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可任意选择,最新的D版本内部集成MAX810专用复位电路。
(1). 增强型6时钟/机器周期,12时钟/机器周期 8051CPU
(2). 工作电压:
5.5V-3.4V(5V单片机)/3.8V-2.0V(3V单片机)
(3). 工作频率范围:
0-40MHz,相当于普通8051的0~80MHz.实际工作频率可达到48MHz.
(4). 用户应用程序空间4K/8K/13K/16K/20K/32K/64K字节
(5). 片上集成1280字节/512字节RAM
(6). 通用I/O口(32/36个),复位后为:
P1/P2/P3/P4是准双向口,P0口是开漏输出,作为总线扩展使用时,不用加上拉电阻,作为I/O口使用时,需加上拉电阻。
(7). ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器/仿真器,可通过串口(P3.0/P3.1)直接下载用户程序,8K程序3秒即可完成一片
(8). EEPROM功能
(9). 看门狗
(10).内部集成MAX810专用复位电路(D版本才有),外部20M以下时,可省外部复位电路
3.2DS18B20的介绍
3.2.1DS18B20的主要特点
温度传感器的种类众多,在高精度、高可靠性的应用场合时DALLAS(达拉斯)公司生产的DS18B20温度传感器比较理想。
它体积小,硬件开消低,抗干扰能力强,精度高,附加功能强。
与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
它具有独特的单线接口仅需要一个端口引脚进行通信,并可通过数据线供电,电压范围为3.0~5.5V。
3.2.2DS18B20的结构
TO-92封装的DS18B20的引脚排列见下图。
图3.2.1DS18B20实物图及封装
其引脚功能描述见下表。
表3.2.1 DS18B20详细引脚功能描述
序号
名称
引脚功能描述
1
GND
接地信号
2
DQ
数据输入/输出引脚。
开漏单总线接口引脚。
当被用着在寄生电源下,也可以向器件提供电源。
3
VDD
可选择的VDD引脚。
当工作于寄生电源时,此引脚必须接地。
DS18B20的内部结构示意图如下图所示。
图3.2.2DS18B20内部结构
64位ROM的结构起始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。
温度报警触发器TH和TL,可通过软件写入户报警上下限。
DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。
高速暂存器RAM由9个字节的存储器组成。
第0-1个字节是温度的显示位;第2和第3个字节是TH和TL,同时第2和第3个字节的数字可以更新;第4个字节是配置寄存器,同时第4个字节的数字也可以更新;第5、6、7三个字节是保留的。
第8字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。
表3.2.3列出了温度数据在高速暂存器RAM的第0和第1个字节中的存储格式。
表3.2.3温度数据存储格式
位7
位6
位5
位4
位3
位2
位1
位0
23
22
21
20
2-1
2-2
2-3
2-4
位15
位14
位13
位12
位11
位10
位9
位8
S
S
S
S
S
26
25
24
3.2.3DS18B20的测温原理
DS18B20的测温原理是这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。
器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。
计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1和温度寄存器中。
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。
另一种是寄生电源供电方式,如图3.2.3所示单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。
图3.2.3DS18B20的接口电路
当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有上拉,上拉开启时间最大为10us。
采用寄生电源供电方式时VDD端接地。
由于单线制只有一根线,因此发送接口必须是三态的。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。
该协议定义了几种信号的时序:
初始化时序、写数据、读数据。
所有时序都是将主机作为主设备,单总线器件作为从设备。
而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是低位在先。
(1)DS18B20的初始化时序
1)先将数据线置高电平1
2)延时(该时间要求不是很严格,但尽可能短一点)
3)数据线拉到低电平0
4)延时750us(该时间范围可以设定为480-960us范围内)
5)数据线拉到高电平1
6)延时等待。
如果初始化成功则在15-60ms内产生一个由DS18B20返回的低电平0,据该状态可以确定它的存在。
7)若CPU读到数据线上的低电平0后,还要进行延时,其延时的时间从发出高电平算起最少480us
8)将数据线再次拉到高电平1后结束
(2)DS18B20的写数据
1)数据线先置低电平0
2)延时确定的时间为15us
3)按从低位到高位的顺序发送数据(一次只发送一位)
4)延时时间为45us
5)将数据线拉到高电平1
6)重复1-5步骤,直到发送完整个字节
7)最后将数据线拉到1
(3)DS18B20的读数据
1)将数据线拉高到1
2)延时2us
3)将数据线拉低到0
4)延时6us
5)将数据线拉高到1
6)延时4us
7)读数据线的状态得到一个状态位,并进行数据处理
8)重复1-7步骤,直到读取完一个字节
3.3LCD1602的介绍
LCD1602液晶显示器也叫1602字符型液晶显示器。
它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它由若干个5X7或者5X11等点阵字符位组成。
每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。
LCD1602是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块。
管脚功能
LCD1602引脚图
LCD1602采用标准的16脚接口,其中:
第1脚:
VSS为电源地
第2脚:
VCC接5V电源正极
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高
第4脚:
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器
第5脚:
RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
第6脚:
E(或EN)端为使能(enable)端。
第7~14脚:
D0~D7为8位双向数据端。
第15~16脚:
空脚或背灯电源。
15脚背光正极,16脚背光负极。
操作控制
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形。
这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等。
每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如'A’。
指令集
1602通过D0~D7的8位数据端传输数据和指令。
显示模式设置:
(初始化)
00111000[0x38]设置16×2显示,5×7点阵,8位数据接口;
显示开关及光标设置:
(初始化)
00001DCBD显示(1有效)、C光标显示(1有效)、B光标闪烁(1有效)
000001NSN=1(读或写一个字符后地址指针加1&光标加1),
N=0(读或写一个字符后地址指针减1&光标减1),
S=1且N=1(当写一个字符后,整屏显示左移)
s=0当写一个字符后,整屏显示不移动
数据指针设置:
数据首地址为80H,所以数据地址为80H+地址码(0-27H,40-67H)
其他设置:
01H(显示清屏,数据指针=0,所有显示=0);02H(显示回车,数据指针=0)。
3.4硬件设计
3.4.1硬件设计目标
系统通过温度传感器DS18B20的数据线DQ与主控芯片51单片机的P3.3相连接,DS18B20将采集到的数据送给单片机,经过单片机处理后,显示在8位数据线与单片机P0口的液晶显示器LCD上。
串口经过MAX232的电平转换后R1OUT和T1IN接到单片机的RXD与TXD来实现与用C语言编辑的计算机软件的界面间的通信。
液晶LCD的RS、RW¯、E分别接到单片机的P2.0~P2.2来实现单片机控制液晶的读写命令和数据的显示控制。
3.4.2硬件功能模块划分
(1)STC89C52RC单片机:
实现对整个系统的控制。
(2)DS18B20、LCD1602:
温度传感器DS18B20的数据线DQ与主控芯片51单片机的P3.3相连接,DS18B20将采集到的数据送给单片机,经过单片机处理后,显示在8位数据线与单片机P0口的液晶LCD上。
3.4.3接口和连接方式
(1)液晶LCD1602的数据和指令选择控制端RS接到单片机的P2.0,读写控制
接到单片节的P2.1,数据读写控制位E接到单片机的P2.2,8位数据线DB0~DB7接到单片机的P0口。
(2)4个按键K1~K4分别接到单片机的P1.0~P1.3。
(3)DS18B20的DQ接到单片机的P3.3.
3.4.4硬件仿真电路
第四章软件设计
4.11602液晶显示处理部分
在本次设计系统中定义了P2^2口为1602液晶的使能端;P2^0为数据命令的选择端;P2^1为读,写选择端。
定义了有关的函数;write_com()向1602写入命令码函数,write_date()向1602写入数据函数;display()1602显示函数;lcd_init()1602初始化;lcd_display()1602显示初始化。
具体程序如下所示;
voidlcd_init()//1602初始化
{write_com(0x38);//两行显示,5*7点阵
delayms(5);//延时5毫秒
write_com(0x01);//显示清屏
delayms(5);
write_com(0x0c);//开显示,不显示光标,光标不闪烁
delayms(5);
write_com(0x06);//当读或写一个字符后地址指针加一,且光标加一
delayms(5);
}
voidlcd_display()//1602显示初始化
{lcd_init();//1602初始化
write_com(0x80);//第一行第一个字符开始显示
display(str1);//第一行显示temperature
write_com(0xc0);//第二行第一个字符开始显示
display(str2);//显示空白
}
4.218B20函数处理部分
在本次设计系统中P3^3口用来单片机与温度传感器通讯;它用到的相关函数如下;ds_init()18B20初始化;ds_write()向18B20中写入数据;ds_read()由18B20读取数据;ds_temp()从18B20中读取温度值;ds_dis()把温度值送入1602中显示。
具体程序如下所示;
voidds_init()//18B20初始化
{dq=1;
delayus(4);//CPU将总线拉高
dq=0;
delayus(480);//CPU将总线拉低延时480微妙
dq=1;
delayus(60);//CPU将总线拉高延时60微妙
if(dq==0)
delayus(240);//CPU判断是否为低电平,是的话说明温度传感器在线上
}
voidds_write(uchardate1)//向18B20中写入数据注意写入是按从低位到高位的顺序发送数据一次只发送一位。
uchards_read()//由18B20读取数据,读的时候也是从最低位读
uintds_temp()//从18B20中读取温度值
{uchara,b;
ds_init();//初始化温度传感器
ds_write(0xcc);//忽略ROM指令
ds_write(0x44);//开始温度转换
ds_init();//初始化温度传感器
ds_write(0xcc);//忽略ROM指令
ds_write(0xbe);//读取温度值
a=ds_read();//读取低八位
b=ds_read();//读取高八位
tvalue=b;//
tvalue<<=8;//
tvalue=tvalue|a;//得到16位的温度值
if(tvalue<0x0fff)//判断温度大于0
tflag=0;
else
{tvalue=~tvalue+1;//如果温度小于0,取反加一
tflag=1;//
}
tvalue=tvalue*(0.625);//乘以最小分辨率得到温度值
return(tvalue);//
}
voidds_dis()//把温度值送入1602中显示
{ucharflagdat;
disdata[0]=tvalue/1000+0x30;//温度百位
disdata[1]=tvalue%1000/100+0x30;//温度十位
disdata[2]=tvalue%100/10+0x30;//温度个位
disdata[3]=tvalue%10+0x30;//小数点后一位
if(tflag==0)
flagdat=0x20;//如果温度大于0,不显示
if(tflag==1)
flagdat=0x2d;//如果温度小于0显示负号
if(disdata[0]==0x30)
{disdata[0]=0x20;//百位为0不显示
if(disdata[1]==0x30)
{disdata[1]=0x20;//十位为0不显示
}
}
write_com(0xc0);
write_date(flagdat);//第二行第一个显示温度正负
write_com(0xc1);
write_date(disdata[0]);//第二行第二个显示温度百位
write_com(0xc2);
write_date(disdata[1]);//第二行第三个显示温度十位
write_com(0xc3);
write_date(disdata[2]);//第二行第四个显示温度个位
write_com(0xc4);//
write_date(0x2e);//第二行第五个显示小数点
write_com(0xc5);//
write_date(disdata[3]);//第二行第六个显示小数点后一位
}
voidmain()//主程序
{lcd_display();//1602显示初始化
while
(1)
{ds_temp();//从18B20中读取温度
ds_dis();//1602显示温度
}
}
第五章心得体会
作为一名自动化专业的大三学生,我觉得做单片机课程设计是十分有意义而且是十分必要的。
在已度过的大学时间里,我们接触的大多数是专业课。
我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?
如何把我们