温度传感器 ds18b20Word文件下载.docx
《温度传感器 ds18b20Word文件下载.docx》由会员分享,可在线阅读,更多相关《温度传感器 ds18b20Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
1设计目的:
(1)了解温度检测和控制技术的基本知识以及单片机、传感器等相关技术。
(2)熟练使用相关的EDA软件进行硬件电路的设计与仿真
(3)具体掌握DS18B20温度传感器的使用方法。
2.基本要求
(1)孵化室对温度有一定要求,温度是否合适直接影响孵化效果,为此需要对温度进行严格控制,主要指标如下:
孵化室温控制在36.5±
0.5℃,温度低时启动电热器加热,用红灯报警;
温度高时,启动空调冷却,用绿灯报警。
(2)要求设计相关的硬件电路,选择合适的传感器、控制系统和显示系统。
3详细设计:
3.1系统设计原理框图:
图1DS18B20温度测温系统框图
通过单片机控制温度传感器,读出DS18B20的温度,并用数码管显示,当温度超过37℃时,启动空调冷却,用绿灯报警,当温度低于36℃时,启动电热器加热,用红灯报警。
所以根据设计要求确定了系统的总体方案,整个系统由控制模块、湿度检测模块、显示模块、报警器等构成。
3.2硬件电路设计图
图2硬件电路设计图
3.3程序设计
系统程序主要包括主程序、读取温度子程序、数据转换子程序、显示数据子程序等。
3.3.1主程序设计流程图
图3主程序流程图
3.3.2初始化程序流程图
图4初始化流程图
3.3.3读取温度子程序
读取温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
主要包括以下三个命令:
(1)写暂存器命令【4EH】
这个命令为由TH寄存器开始向DS18B20暂存器写入数据,4EH命令后的3字节数据将被保存到暂存器的地址2、3、4(TH、TL、CONFIG)三个字节。
所有数据必须在复位脉冲前写完。
即如果只想写一个字节的数据到地址2,可按如下流程:
初始化;
写0CCH,跳过ROM检测;
写4EH;
写1字节数据;
复位,即向DQ输出480~960us低电平
(2)读暂存命令【BEH】
这个命令由字节0读取9个暂存器内容,如果不需要读取所有暂存内容,可随时输出复位脉冲终止读取过程
(3)转换温度命令【44H】
这个命令启动温度转换过程。
转换温度时DS18B20保持空闲状态,此时如果单片机发出读命令,DS18B20将输出0直到转换完成,转换完成后将输出1。
图5读取温度子程序
3.3.4写流程图
写时隙:
写时隙由DQ引脚的下降沿引起。
18B20有写1和写0两种写时隙。
所有写时隙必须持续至少60μs,两个时隙之间至少有1μs的恢复时间。
DS18B20在DQ下降沿后15μs~60μs间采样DQ引脚,若此时DQ为高电平,则写入一位1,若此时DQ为低电平,则写入一位0,如图9所示。
所以,若想写入1,则单片机应先将DQ置低电平,15us后再将DQ置高电平,持续45μs;
若要写入0,则将DQ置低电平,持续60μs。
图6写流程图
3.3.5读流程图
读时隙:
读时隙由DQ下降沿引起,持续至少1μs的低电平后释放总线(DQ置1)DS18B20的输出数据将在下降沿15μs后输出,此时单片机可读取1位数据。
读时隙结束时要将DQ置1。
所有读时隙必须持续至少60μs,两个时隙之间至少有1μs的恢复时间。
图7读流程图
3.3.6程序
#include<
reg52.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P1^3;
//数据口defineinterface
uinttemp;
//温度值variableoftemperature
//不带小数点
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//带小数点
unsignedcharcodetable1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
/*************精确延时函数*****************/
voiddelay(unsignedchari)
{while(--i);
}
/******************************************
此延时函数针对的是12Mhz的晶振
delay(0):
延时518us误差:
518-2*256=6
delay
(1):
延时7us(原帖写"
5us"
是错的)
delay(10):
延时25us误差:
25-20=5
delay(20):
延时45us误差:
45-40=5
delay(100):
延时205us误差:
205-200=5
delay(200):
延时405us误差:
405-400=5
********************************************/
/*****************DS18B20******************/
voidInit_Ds18b20(void)//DS18B20初始化sendresetandinitializationcommand
{
DQ=1;
//DQ复位,不要也可行。
delay
(1);
//稍做延时
DQ=0;
//单片机拉低总线
delay(250);
//精确延时,维持至少480us
//释放总线,即拉高了总线
delay(100);
//此处延时有足够,确保能让DS18B20发出存在脉冲。
}
ucharRead_One_Byte()//读取一个字节的数据readabytedate
//读数据时,数据以字节的最低有效位先从总线移出
uchari=0;
uchardat=0;
for(i=8;
i>
0;
i--)
DQ=0;
//将总线拉低,要在1us之后释放总线
//单片机要在此下降沿后的15us内读数据才会有效。
_nop_();
//至少维持了1us,表示读时序开始
dat>
>
=1;
//让从总线上读到的位数据,依次从高位移动到低位。
DQ=1;
//释放总线,此后DS18B20会控制总线,把数据传输到总线上
delay
(1);
//延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分
if(DQ)//控制器进行采样
{
dat|=0x80;
//若总线为1,即DQ为1,那就把dat的最高位置1;
若为0,则不进行处理,保持为0
}
delay(10);
//此延时不能少,确保读时序的长度60us。
return(dat);
voidWrite_One_Byte(uchardat)
//拉低总线
//至少维持了1us,表示写时序(包括写0时序或写1时序)开始
DQ=dat&
0x01;
//从字节的最低位开始传输
//指令dat的最低位赋予给总线,必须在拉低总线后的15us内,
//因为15us后DS18B20会对总线采样。
//必须让写时序持续至少60us
//写完后,必须释放总线,
uintGet_Tmp()//获取温度getthetemperature
floattt;
uchara,b;
Init_Ds18b20();
//初始化
Write_One_Byte(0xcc);
//忽略ROM指令
Write_One_Byte(0x44);
//温度转换指令
Write_One_Byte(0xbe);
//读暂存器指令
a=Read_One_Byte();
//读取到的第一个字节为温度LSB
b=Read_One_Byte();
//读取到的第一个字节为温度MSB
temp=b;
//先把高八位有效数据赋于temp
temp<
<
=8;
//把以上8位数据从temp低八位移到高八位
temp=temp|a;
//两字节合成一个整型变量
tt=temp*0.0625;
//得到真实十进制温度值
//因为DS18B20可以精确到0.0625度
//所以读回数据的最低位代表的是0.0625度
temp=tt*10+0.5;
//放大十倍
//这样做的目的将小数点后第一位也转换为可显示数字
//同时进行一个四舍五入操作。
returntemp;
/****************数码码动态显示函数**************/
voidDisplay(uinttemp)//显示程序
ucharA1,A2,A3;
A1=temp/100;
//十位
A2=temp%100/10;
//个位
A3=temp%10;
//小数位
P0=table[A1];
//显示十位
P2=0;
delay(0);
P0=table1[A2];
//显示个位,使用的是有小数点的数组(因为temp值扩大了10倍,虽然是十位,实际为个位)
P2=1;
P0=table[A3];
//显示小数
P2=2;
voidmain()
while
(1)
Display(Get_Tmp());
3.4结果验证与仿真
仿真如图:
图8仿真图
4总结
从这次的设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,这就是我在这次课程设计中的最大收获。
随着电子技术的不断发展,按着此思路设计的温度传感器的性能也一定会越来越好。
5
参考文献
[1]《传感器原理及接口技术》梅丽凤,王艳秋,清华大学出版社,2006年。
[2]《传感器与检测技术》徐科军,电子工业出版社,2011年。