课程设计基于数字温度传感器数字温度计的设计WORD档P17Word文档下载推荐.docx

上传人:b****7 文档编号:22695374 上传时间:2023-02-05 格式:DOCX 页数:17 大小:250.17KB
下载 相关 举报
课程设计基于数字温度传感器数字温度计的设计WORD档P17Word文档下载推荐.docx_第1页
第1页 / 共17页
课程设计基于数字温度传感器数字温度计的设计WORD档P17Word文档下载推荐.docx_第2页
第2页 / 共17页
课程设计基于数字温度传感器数字温度计的设计WORD档P17Word文档下载推荐.docx_第3页
第3页 / 共17页
课程设计基于数字温度传感器数字温度计的设计WORD档P17Word文档下载推荐.docx_第4页
第4页 / 共17页
课程设计基于数字温度传感器数字温度计的设计WORD档P17Word文档下载推荐.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

课程设计基于数字温度传感器数字温度计的设计WORD档P17Word文档下载推荐.docx

《课程设计基于数字温度传感器数字温度计的设计WORD档P17Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《课程设计基于数字温度传感器数字温度计的设计WORD档P17Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。

课程设计基于数字温度传感器数字温度计的设计WORD档P17Word文档下载推荐.docx

●无须外部器件;

●可通过数据线供电,电压范围为3.0~5.5V;

●零待机功耗;

●温度以9或12位数字;

●用户可定义报警设置;

●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;

●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;

DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构框图如图2所示。

64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。

温度报警触发器TH和TL,可通过软件写入户报警上下限。

DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。

高速暂存RAM的结构为8字节的存储器,结构如图3所示。

头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。

第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。

DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。

该字节各位的定义如图3所示。

低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分率。

由表1可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。

因此,在实际应用中要将分辨率和转换时间权衡考虑。

高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。

第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。

当DS18B20接收到温度转换命令后,开始启动转换。

转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。

单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。

当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;

当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。

表2是一部分温度值对应的二进制温度数据。

DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。

另一种是寄生电源供电方式,如图4所示单片机端口接单线总线,为保证在有DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。

1.2LCD显示模块

1602采用标准的16脚接口,其中:

第1脚:

VSS为地电源

第2脚:

VDD接5V正电源

第3脚:

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

第4脚:

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

第5脚:

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

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

第6脚:

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

第7~14脚:

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

第15~16脚:

空脚

1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表1所示

液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。

要显示字符时要先输入显示字符地址,,下表是DM-162的内部显示地址.

3软件设计

软件设计的主要任务是完成从DS18B20中读出温度值,并在LCD上显示。

四电路仿真及仿真结果分析:

将设计的电路图用proteus仿真,等到仿真结果如下:

由仿真结果可以看出,本设计的功能可以得到满足,软件硬件设计基本没问题。

五设计方案和测试结果

将此电路接上电源,LCD显示当前室温,当用手按住温度传感器时,可以看到温度逐渐上升,将手放开,温度逐渐下降。

将此电路放在室温中一段时间,其温度基本保持不变,电路工作稳定,符合本次设计的目的。

六作品功能和使用说明

此温度传感器的测试范围是−55℃~125℃,考虑到通用单片机和通用LCD的工作温度的范围大致为0℃~55℃,但是若将此温度传感器单独放到被测物体中,仍可以满足测试要求。

考虑到此作品是为满足一般日常生活要求而设计,为了充分利用单片机和LCD资源,接入一个时钟芯片,可以显示时间,还可完成定时闹钟的功能。

七心得体会

通过这次对数字温度计的设计与制作,让我了解了设计电路的程序,也让我了解了关于数字温度计的原理与设计理念,要设计一个电路总要先用仿真仿真成功之后才实际接线的。

但是最后的成品却不一定与仿真时完全一样,因为,再实际接线中有着各种各样的条件制约着。

而且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功。

所以,在设计时应考虑两者的差异,从中找出最适合的设计方法。

通过这次学习,让我对各种电路都有了大概的了解,所以说,坐而言不如立而行,对于这些电路还是应该自己动手实际操作才会有深刻理解。

在焊接过程中我曾将温度传感器的电源、地焊反啦,导致温度传感器急剧发热,后经观察和查询资料才得以改正。

从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。

八参考文献

【1】郭天祥51单片机C语言教程【M】北京电子工业出版社2009

【2】毛谦敏单片机原理及应用系统设计【M】国防工业出版社2008

附件

完整源程序

#include"

reg51.h"

1602.h"

18b20.h"

#defineucharunsignedchar

#defineuintunsignedint

uchartable[]={"

temperature:

"

};

voidmain()

{

ucharee,*p=table;

intril();

//1602初始化函数

pos(0,0);

//将数据指针定位到第一行第一列处

while(*p)//显示"

{

senddata(*p);

p++;

}

while

(1)

pos(1,0);

//将数据指针定位到第二行第一列

read();

//读转换的温度数据

if(flag==1)senddata('

+'

);

//温度大于0显示“+”

if(flag==0)senddata('

-'

//温度小于0显示“-”

for(ee=0;

ee<

8;

ee++)

senddata(disbuf[ee]);

//将转换后的温度值显示

}

#ifndef_18b20_h_

#define_18b20_h_

sbitDQ=P1^0;

//定义数据端口

ucharx,flag;

ucharh,l,zhen;

uchardisbuf[10]={0};

voiddelay(uchart);

//延时程序子函数

voidread();

//读程序子函数

voidshow();

//显示程序子函数

voidwrite18b20(ucharaa);

//写程序子函数

voiddelay(uchart)//延时函数

for(;

t>

0;

t--);

ucharinit18b20()//初始化函数

DQ=1;

//DQ先置高

delay(8);

//稍延时

DQ=0;

//发送复位脉冲

delay(80);

//延时(>

480us)

//拉高数据线

delay(5);

//等待(15~60us)

x=DQ;

//用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1

delay(20);

if(x==1)return1;

elsereturn0;

voidwrite18b20(ucharaa)//写字节

uchari=0;

//数据线从高电平拉至低电平,15us之内将所需写的位送到数据线上,

for(i=8;

i>

i--)//在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。

DQ=0;

//在开始另一个写周期前必须有1us以上的高电平恢复期。

DQ=aa&

0x01;

delay(5);

DQ=1;

aa>

>

=1;

}

delay(4);

ucharread18b20()//读字节

{

//每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期

uchard=0;

for(i=8;

i--)//一个字节有8位

delay

(1);

d>

if(DQ)

d|=0x80;

returnd;

voidread()//读温度

unsignedinthh;

while(init18b20());

//初始化

write18b20(0xcc);

//跳过读序列号的操作

write18b20(0x44);

//启动温度转换

delay(125);

//转换需要一点时间,延时

//跳过读序列号的操作

write18b20(0xbe);

//读温度寄存器(头两个值分别为温度的低位和高位)

l=read18b20();

//读出温度的低位LSB

h=read18b20();

//读出温度的高位MSB

hh=l;

if(h>

0x7f)

{

flag=0;

//温度小于0

h=~h;

l=~l+1;

elseflag=1;

h=h<

<

4;

l=l>

zhen=h|l;

hh&

=0x0f;

hh*=625;

disbuf[0]=zhen/100+'

0'

;

//将温度值转换,存储以便显示

if(zhen/100==0){disbuf[0]='

'

disbuf[1]=zhen%100/10+'

disbuf[2]=zhen%10+'

disbuf[3]='

.'

disbuf[4]=hh/1000+'

//小数部分

disbuf[5]=hh/100%10+'

disbuf[6]=0xdf;

disbuf[7]='

c'

#endif

//防止被重定义

#ifndef_l602_h

#define_1602_h

//函数声明

voiddelay(uchara);

voidsenddata(ucharm);

voidsendcmd(ucharn);

voidpos(uchari,ucharj);

//i=0表示在第一行,i=1表示在第二行

voidintril();

//定义通道

sbiten=P2^6;

sbitrw=P2^5;

sbitrs=P2^4;

voiddelayss(uchara)//延时1602显示时必须延时

{uchari,j;

for(i=a;

i--)

for(j=0;

j<

248;

j++);

voidsenddata(ucharm)//送数据

rw=0;

rs=1;

en=1;

P0=m;

delayss(5);

en=0;

voidsendcmd(ucharn)//送地址命令

rs=0;

en=1;

P0=n;

delayss(5);

en=0;

voidpos(uchari,ucharj)//定位是哪一行

if(i)

sendcmd(0xc0+j);

else

sendcmd(0x80+j);

voidintril()

sendcmd(0x38);

//显示模式设置5*7点

sendcmd(0x0c);

//开显示光标不显示且不闪烁

sendcmd(0x06);

//光标地址自动加一

sendcmd(0x01);

//清屏

#endif

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

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1