DS18B20温度测量设计实验报告2Word文件下载.docx
《DS18B20温度测量设计实验报告2Word文件下载.docx》由会员分享,可在线阅读,更多相关《DS18B20温度测量设计实验报告2Word文件下载.docx(18页珍藏版)》请在冰点文库上搜索。
•工作频率最高为24M。
•128B数据存储器。
•4KB程序存储器。
•程序存储器的寻址空间为64KB。
•片外数据存储器的寻址空间为64KB。
•128个用户位寻址空间。
•21个字节特殊功能寄存器。
•4个8位的并行I/O接口:
P0、P1、P2、P3。
•两个16位定时/计数器。
•两个优先级别的5个中断源。
•1个全双工的串行I/O接口,可多机通信。
•111条指令,喊乘法指令和除法指令。
•较强的位处理能力。
•采用单一+5V电源。
对于89C52而言,不同之处在于:
有256B的数据存储器、8K的程序存储器、全双工串行I/O接口、6个中断源、3个16位定时/计数器,工作频率可升直33Mhz。
比51拥有更高的性能。
单片机要对DS18B20进行读写,主要通过如下子程序进行驱动。
(1)复位:
在使用DS18B20时,首先需要对单片机进行复位。
复位时,单片机给DS18B20的单总线至少480us的低电平信号。
当DS18B20检测到此复位信号后会在15-60us内给出一个一个存在脉冲。
该存在脉冲是是一个60-240us的低电平信号。
为了能够接收到此低电平,需要单片机在复位电平结束之后将总线拉高。
(2)ROM指令:
包括读ROM指令,指定匹配芯片、跳跃ROM、芯片搜索、报警芯片搜索。
ROM指令为8位长度,功能是对片内的64位光刻ROM进行操作。
其主要目的是为了分辨总线上的多个器件。
不过,在本系统中由于只有一个DS18B20,所以不需要进行ID辨识,所以可以采用一条特殊的跳过指令。
具体指令可以参看其datasheet。
(3)发送存储器操作指令:
在ROM指令发送给DS18B20后,紧接着需要向它发送存储器操作指令,操作指令同样为8位,共六条,分别是写RAM数据、读RAM数据、将RAM数据复制到EEPROM、温度转换、将EEPROM中的报警值复制到RAM、工作方式切换。
(4)执行和读写操作:
一个存储器操作指令结束后则将进行指令执行或数据读写。
如果是进行温度转换,需要等待DS18B20执行其指令,转换时间一般为500us。
DS18B20温度值格式
默认的12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;
如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
如图:
DS18B20常用ROM指令:
指令
约定代码
功能
读ROM
33H
读DS1820温度传感器ROM中的编码(即64位地址
符合ROM
55H
发出此命令之后,接着发出64位ROM编码,访问单总线上与该编码相对应的DS1820使之作出响应,为下一步对该DS1820的读写作准备。
搜索ROM
0FOH
用于确定挂接在同一总线上DS1820的个数和识别64位ROM地址。
为操作各器件作好准备。
跳过ROM
0CCH
忽略64位ROM地址,直接向DS1820发温度变换命令。
适用于单片工作。
告警搜索命令
0ECH
执行后只有温度超过设定值上限或下限的片子才做出响应。
二、系统总体设计方案
1、基本设计思想
基本设计方案:
根据DS18B20的通讯协议,单片机控制DS18B20完成温度转换必须经过三个步骤:
每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。
复位要求主CPU将数据线下拉500微秒,然后释放,当DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。
于是,给DS18B20不同的时序,可以读取温度传感器的值,根据温度算法算出当时的温度值,在给显示部分,通过LCD显示出来。
2、实施方案论述
这个课题主要实现温度的检测以及通过数码管显示这两个大功能,以及读取这个相对较为容易的功能。
因此在温度检测这一模块上,利用DS18B20这一目前比较先进的温度传感器,可以很精确地感测实时温度,对于DS18B20的通讯协议的控制,读取测量的温度值,经过一定的算法,可以把温度转化为十进制,分别为高位和低位,先暂存起来。
经显示模块调用,最终在LCD上显示。
电路方框图
二、
系统分析与设计
1、程序流程图及说明
主函数完成对DS18B20的初始化,读取温度的转换值,调用数据处理的子程序然后再生成显示代码,再将温度显示出来,然后根据温度显示的代码判断温度值可以判断它的值是否超出了预设的范围。
然后返回到主函数开始的位置,无论温度值是否超出预设值,程序都会返回开始的位置,重复循环。
主函数流程图
DS18B20复位子程序
温度值子程序
2、温度计的的电路设计
温度计采用AT89C51单片机作为微处理器,温度计系统的外围接口电路由晶振、LCD显示电路、复位电路、温度检测电路、LCD驱动电路。
温度计系统的的硬件电路图如下图所示。
温度计的工作过程是:
初始化其接收需要检测的温度,并一直处于检测状态,并将检测到的温度值读取,并转化为十进制数值,通过LCD显示出来,再显示温度,方便用户来读数使用记录数据。
具体实现方法是:
单片机将从P2.2管脚读进来的数据进行处理,P0.1到P0.7为数码管的段选端口,通过RP1的驱动对LCD进行驱动。
硬件电路原理图
时钟电路
复位电路
显示电路
温度检测电路
三、源码清单
#include<
reg52.h>
intrins.h>
#defineuintunsignedint
#defineucharunsignedchar
#definedelayNOP(){_nop_();
_nop_();
}
sbitDQ=P3^3;
sbitLCD_RS=P2^0;
sbitLCD_RW=P2^1;
sbitLCD_EN=P2^2;
ucharcodeTemp_Disp_Title[]={"
CurrentTemp:
"
};
ucharCurrent_Temp_Display_Buffer[]={"
TEMP:
ucharcodeTemperature_Char[8]=
{
0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00
ucharcodedf_Table[]=
0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9
ucharCurrentT=0;
ucharTemp_Value[]={0x00,0x00};
ucharDisplay_Digit[]={0,0,0,0};
bitDS18B20_IS_OK=1;
voidDelayXus(uintx)
uchari;
while(x--)
{
for(i=0;
i<
200;
i++);
}
bitLCD_Busy_Check()
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(P0&
0x80);
LCD_EN=0;
returnresult;
voidWrite_LCD_Command(ucharcmd)
while(LCD_Busy_Check());
LCD_RW=0;
LCD_EN=0;
_nop_();
P0=cmd;
voidWrite_LCD_Data(uchardat)
LCD_RS=1;
P0=dat;
voidLCD_Initialise()
Write_LCD_Command(0x01);
DelayXus(5);
Write_LCD_Command(0x38);
Write_LCD_Command(0x0c);
Write_LCD_Command(0x06);
voidSet_LCD_POS(ucharpos)
Write_LCD_Command(pos|0x80);
voidDelay(uintx)
while(--x);
ucharInit_DS18B20()
ucharstatus;
DQ=1;
Delay(8);
DQ=0;
Delay(90);
returnstatus;
ucharReadOneByte()
uchari,dat=0;
for(i=0;
8;
i++)
DQ=0;
dat>
>
=1;
DQ=1;
_nop_();
if(DQ)
dat|=0X80;
Delay(30);
returndat;
voidWriteOneByte(uchardat)
DQ=dat&
0x01;
Delay(5);
voidRead_Temperature()
if(Init_DS18B20()==1)
DS18B20_IS_OK=0;
else
WriteOneByte(0xcc);
WriteOneByte(0x44);
Init_DS18B20();
WriteOneByte(0xbe);
Temp_Value[0]=ReadOneByte();
Temp_Value[1]=ReadOneByte();
DS18B20_IS_OK=1;
}
voidDisplay_Temperature()
uchart=150,ng=0;
if((Temp_Value[1]&
0xf8)==0xf8)
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0x00)
Temp_Value[1]++;
ng=1;
Display_Digit[0]=df_Table[Temp_Value[0]&
0x0f];
CurrentT=((Temp_Value[0]&
0xf0)>
4)|((Temp_Value[1]&
0x07)<
<
4);
Display_Digit[3]=CurrentT/100;
Display_Digit[2]=CurrentT%100/10;
Display_Digit[1]=CurrentT%10;
Current_Temp_Display_Buffer[11]=Display_Digit[0]+'
0'
;
Current_Temp_Display_Buffer[10]='
.'
Current_Temp_Display_Buffer[9]=Display_Digit[1]+'
Current_Temp_Display_Buffer[8]=Display_Digit[2]+'
Current_Temp_Display_Buffer[7]=Display_Digit[3]+'
if(Display_Digit[3]==0)
Current_Temp_Display_Buffer[7]='
'
if(Display_Digit[2]==0&
&
Display_Digit[3]==0)
Current_Temp_Display_Buffer[8]='
if(ng)
if(Current_Temp_Display_Buffer[8]=='
)
Current_Temp_Display_Buffer[8]='
-'
elseif(Current_Temp_Display_Buffer[7]=='
Current_Temp_Display_Buffer[7]='
else
Current_Temp_Display_Buffer[6]='
Set_LCD_POS(0x00);
16;
Write_LCD_Data(Temp_Disp_Title[i]);
Set_LCD_POS(0x40);
Write_LCD_Data(Current_Temp_Display_Buffer[i]);
}
Set_LCD_POS(0x4d);
Write_LCD_Data(0x00);
Set_LCD_POS(0x4e);
Write_LCD_Data('
C'
);
voidmain()
LCD_Initialise();
Read_Temperature();
Delay(50000);
while
(1)
Read_Temperature();
if(DS18B20_IS_OK)
Display_Temperature();
DelayXus(100);
五、改进意见与收获体会:
可以加入自动报警系统,方便用于实际的用途,可以在实际的应用中达到自动检测报警的效果,方便人们对于温度的检测。
六、成员分工
姓名
比例
30%
40%
七、主要参考资料
[1]单片机原理及应用(MCS-51);
蒋廷彪,刘电霆,高富强,方华;
重庆大学出版社;
[2]单片机C程序设计实例指导;
李光飞,李良儿,楼然苗;
北京航空航天大学出版社;
[3]单片机电路设计、分析与制作;
周润景,徐宏伟;
丁莉机械工业出版社