课程设计基于数字温度传感器数字温度计的设计WORD档P17Word文档下载推荐.docx
《课程设计基于数字温度传感器数字温度计的设计WORD档P17Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《课程设计基于数字温度传感器数字温度计的设计WORD档P17Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
![课程设计基于数字温度传感器数字温度计的设计WORD档P17Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2023-2/3/6b9fa79c-f8d3-4672-b4fb-c23eddba684f/6b9fa79c-f8d3-4672-b4fb-c23eddba684f1.gif)
●无须外部器件;
●可通过数据线供电,电压范围为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