基于dsb的数字温度计.doc

上传人:wj 文档编号:2133686 上传时间:2023-05-02 格式:DOC 页数:14 大小:184KB
下载 相关 举报
基于dsb的数字温度计.doc_第1页
第1页 / 共14页
基于dsb的数字温度计.doc_第2页
第2页 / 共14页
基于dsb的数字温度计.doc_第3页
第3页 / 共14页
基于dsb的数字温度计.doc_第4页
第4页 / 共14页
基于dsb的数字温度计.doc_第5页
第5页 / 共14页
基于dsb的数字温度计.doc_第6页
第6页 / 共14页
基于dsb的数字温度计.doc_第7页
第7页 / 共14页
基于dsb的数字温度计.doc_第8页
第8页 / 共14页
基于dsb的数字温度计.doc_第9页
第9页 / 共14页
基于dsb的数字温度计.doc_第10页
第10页 / 共14页
基于dsb的数字温度计.doc_第11页
第11页 / 共14页
基于dsb的数字温度计.doc_第12页
第12页 / 共14页
基于dsb的数字温度计.doc_第13页
第13页 / 共14页
基于dsb的数字温度计.doc_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于dsb的数字温度计.doc

《基于dsb的数字温度计.doc》由会员分享,可在线阅读,更多相关《基于dsb的数字温度计.doc(14页珍藏版)》请在冰点文库上搜索。

基于dsb的数字温度计.doc

基于DS18B20的数字温度计

学院:

专业:

姓名:

指导老师:

摘要:

随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,本文将介绍一种基于单片机控制的数字温度计。

关键词:

单片机DS18B20LCD1602温度计

1引言

随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。

本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机AT89S51,测温传感器使用DS18B20,用LCD1602显示温度。

2设计方案

2.1数字温度计设计方案论证

2.1.1方案一

由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。

2.1.2方案二

进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。

从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。

2.2总体设计图

3程序流图:

4原件介绍

DS1B2B20:

DS18B20采用了独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

DS18B20的管脚排列

1.GND为电源地;

2.DQ为数字信号输入/输出端;

3.VDD为外接供电电源输入端

(在寄生电源接线方式时接地,

DS18B20内部结构主要由四部分组成:

64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。

    光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。

64位光刻ROM的排列是:

开始8位(地址:

28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,并且每个DS18B20的序列号都不相同,因此它可以看作是该DS18B20的地址序列码;最后8位则是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。

由于每一个DS18B20的ROM数据都各不相同,因此微控制器就可以通过单总线对多个DS18B20进行寻址,从而实现一根总线上挂接多个DS18B20的目的。

DS18B20中的温度传感器完成对温度的测量,用16位二进制形式提供,形式表达,其中S为符号位。

DS18B20的工作时序

DS18B20的一线工作协议流程是:

初始化→ROM操作指令→存储器操作指令→数据传输。

其工作时序包括:

初始化时序,写时序,读时序

初始化时序

主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。

若无低电平出现一直都是高电平说明总线上无器件应答。

  做为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备。

若没有检测到就一直在检测等待。

LCD1602:

1602LCD主要技术参数:

显示容量:

16×2个字符

芯片工作电压:

4.5—5.5V

工作电流:

2.0mA(5.0V)

模块最佳工作电压:

5.0V

字符尺寸:

2.95×4.35(W×H)mm

引脚功能说明

1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表10-13所示:

编号

符号

引脚说明

编号

符号

引脚说明

1

VSS

电源地

9

D2

数据

2

VDD

电源正极

10

D3

数据

3

VL

液晶显示偏压

11

D4

数据

4

RS

数据/命令选择

12

D5

数据

5

R/W

读/写选择

13

D6

数据

6

E

使能信号

14

D7

数据

7

D0

数据

15

BLA

背光源正极

8

D1

数据

16

BLK

背光源负极

第1脚:

VSS为地电源。

第2脚:

VDD接5V正电源。

第3脚:

VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。

第4脚:

RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:

R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。

当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。

第6脚:

E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:

D0~D7为8位双向数据线。

第15脚:

背光源正极。

第16脚:

背光源负极。

LCD1602的一般初始化(复位)过程

延时15mS

写指令38H(不检测忙信号)

延时5mS

写指令38H(不检测忙信号)

延时5mS

写指令38H(不检测忙信号)

以后每次写指令、读/写数据操作均需要检测忙信号

写指令38H:

显示模式设置

写指令08H:

显示关闭

写指令01H:

显示清屏

写指令06H:

显示光标移动设置

写指令0CH:

显示开及光标设置

#include//包含单片机寄存器的头文件

#include//包含_nop_()函数定义的头文件

unsignedcharcodedigit[10]={"0123456789"};//定义字符数组显示数字

unsignedcharcodeStr[]={"TestbyDS18B20"};//说明显示的是温度

unsignedcharcodeError[]={"Error!

Check!

"};//说明没有检测到DS18B20

unsignedcharcodeTemp[]={"Temp:

"};//说明显示的是温度

unsignedcharcodeCent[]={"Cent"};//温度单位

/******************************************************************************

以下是对液晶模块的操作程序

*******************************************************************************

sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.0引脚

sbitRW=P2^1;//读写选择位,将RW位定义为P2.1引脚

sbitE=P2^2;//使能信号位,将E位定义为P2.2引脚

sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.7引脚

/*****************************************************

函数功能:

延时1ms

(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒

***************************************************/

voiddelay1ms()

{

unsignedchari,j;

for(i=0;i<10;i++)

for(j=0;j<33;j++)

;

}

/*****************************************************

函数功能:

延时若干毫秒

入口参数:

n

***************************************************/

voiddelaynms(unsignedcharn)

{

unsignedchari;

for(i=0;i

delay1ms();

}

/*****************************************************

函数功能:

判断液晶模块的忙碌状态

返回值:

result。

result=1,忙碌;result=0,不忙

***************************************************/

bitBusyTest(void)

{

bitresult;

RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态

RW=1;

E=1;//E=1,才允许读写

_nop_();//空操作

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

result=BF;//将忙碌标志电平赋给result

E=0;//将E恢复低电平

returnresult;

}

/*****************************************************

函数功能:

将模式设置指令或显示地址写入液晶模块

入口参数:

dictate

***************************************************/

voidWriteInstruction(unsignedchardictate)

{

while(BusyTest()==1);//如果忙就等待

RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令

RW=0;

E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲,

//就是让E从0到1发生正跳变,所以应先置"0"

_nop_();

_nop_();//空操作两个机器周期,给硬件反应时间

P0=dictate;//将数据送入P0口,即写入指令或地址

_nop_();

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

E=1;//E置高电平

_nop_();

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令

}

/*****************************************************

函数功能:

指定字符显示的实际地址

入口参数:

x

***************************************************/

voidWriteAddress(unsignedcharx)

{

WriteInstruction(x|0x80);//显示位置的确定方法规定为"80H+地址码x"

}

/*****************************************************

函数功能:

将数据(字符的标准ASCII码)写入液晶模块

入口参数:

y(为字符常量)

***************************************************/

voidWriteData(unsignedchary)

{

while(BusyTest()==1);

RS=1;//RS为高电平,RW为低电平时,可以写入数据

RW=0;

E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲,

//就是让E从0到1发生正跳变,所以应先置"0"

P0=y;//将数据送入P0口,即将数据写入液晶模块

_nop_();

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

E=1;//E置高电平

_nop_();

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令

}

/*****************************************************

函数功能:

对LCD的显示模式进行初始化设置

***************************************************/

voidLcdInitiate(void)

{

delaynms(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间

WriteInstruction(0x38);//显示模式设置:

16×2显示,5×7点阵,8位数据接口

delaynms(5);//延时5ms ,给硬件一点反应时间

WriteInstruction(0x38);

delaynms(5);//延时5ms ,给硬件一点反应时间

WriteInstruction(0x38);//连续三次,确保初始化成功

delaynms(5);//延时5ms ,给硬件一点反应时间

WriteInstruction(0x0c);//显示模式设置:

显示开,无光标,光标不闪烁

delaynms(5);//延时5ms ,给硬件一点反应时间

WriteInstruction(0x06);//显示模式设置:

光标右移,字符不移

delaynms(5);//延时5ms ,给硬件一点反应时间

WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除

delaynms(5);//延时5ms ,给硬件一点反应时间

}

/************************************************************************

以下是DS18B20的操作程序

************************************************************************/

sbitDQ=P3^3;

unsignedchartime;//设置全局变量,专门用于严格延时

/*****************************************************

函数功能:

将DS18B20传感器初始化,读取应答信号

出口参数:

flag

***************************************************/

bitInit_DS18B20(void)

{

bitflag;//储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在

DQ=1;//先将数据线拉高

for(time=0;time<2;time++)//略微延时约6微秒

;

DQ=0;//再将数据线从高拉低,要求保持480~960us

for(time=0;time<200;time++)//略微延时约600微秒

;//以向DS18B20发出一持续480~960us的低电平复位脉冲

DQ=1;//释放数据线(将数据线拉高)

for(time=0;time<10;time++)

;//延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)

flag=DQ;//让单片机检测是否输出了存在脉冲(DQ=0表示存在)

for(time=0;time<200;time++)//延时足够长时间,等待存在脉冲输出完毕

;

return(flag);//返回检测成功标志

}

/*****************************************************

函数功能:

从DS18B20读取一个字节数据

出口参数:

dat

***************************************************/

unsignedcharReadOneChar(void)

{

unsignedchari=0;

unsignedchardat;//储存读出的一个字节数据

for(i=0;i<8;i++)

{

DQ=1;//先将数据线拉高

_nop_(); //等待一个机器周期

DQ=0;//单片机从DS18B20读书据时,将数据线从高拉低即启动读时序

dat>>=1;

_nop_();//等待一个机器周期

DQ=1;//将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备

for(time=0;time<2;time++)

;//延时约6us,使主机在15us内采样

if(DQ==1)

dat|=0x80;//如果读到的数据是1,则将1存入dat

else

dat|=0x00;//如果读到的数据是0,则将0存入dat

//将单片机检测到的电平信号DQ存入r[i]

for(time=0;time<8;time++)

;//延时3us,两个读时序之间必须有大于1us的恢复期

}

return(dat);//返回读出的十进制数据

}

/*****************************************************

函数功能:

向DS18B20写入一个字节数据

入口参数:

dat

***************************************************/

WriteOneChar(unsignedchardat)

{

unsignedchari=0;

for(i=0;i<8;i++)

{

DQ=1;//先将数据线拉高

_nop_(); //等待一个机器周期

DQ=0;//将数据线从高拉低时即启动写时序

DQ=dat&0x01;//利用与运算取出要写的某位二进制数据,

//并将其送到数据线上等待DS18B20采样

for(time=0;time<10;time++)

;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样

DQ=1;//释放数据线

for(time=0;time<1;time++)

;//延时3us,两个写时序间至少需要1us的恢复期

dat>>=1;//将dat中的各二进制位数据右移1位

}

for(time=0;time<4;time++)

;//稍作延时,给硬件一点反应时间

}

/******************************************************************************

以下是与温度有关的显示设置

******************************************************************************/

/*****************************************************

函数功能:

显示没有检测到DS18B20

***************************************************/

voiddisplay_error(void)

{

unsignedchari;

WriteAddress(0x00);//写显示地址,将在第1行第1列开始显示

i=0;//从第一个字符开始显示

while(Error[i]!

='\0')//只要没有写到结束标志,就继续写

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2