DS18B20Word下载.docx
《DS18B20Word下载.docx》由会员分享,可在线阅读,更多相关《DS18B20Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
其作用是使每一个出厂的DS18820地址序列号都各不相同,这样,就可以实现一根总线上挂接多个DS18820的目的。
2.DS18820中的温度传感器完成对温度的测量,输出格式为:
16位符号扩展的二进制补码。
当测温精度设置为12位时,分辨率为O.0625℃,即O.0625℃/LSB。
其二进制补码格式如图2所示。
其中,S为符号位,S=1,表示温度为负值;
S=0,表示温度为正值。
例如+125℃的数字输出为07D0H,-55℃的数字输出为FC90H。
一些温度值对应的数字输出如图4所示。
3.DS18820中的低温触发器TL、高温触发器TH,用于设置低温、高温的报警数值。
DS18820完成一个周期的温度测量后,将测得的温度值和TL、TH相比较,如果小于TL,或大于TH,则表示温度越限,将该器件内的告警标志位置位,并对主机发出的告警搜索命令作出响应。
需要修改上、下限温度值时,只需使用一个功能命令即可对TL、TH写入,十分方便。
4.DS18820中的高速暂存器是一个9字节的存储器,其含意如图5所示。
开始两个字节为被测温度的数字量,其含义如图2所示。
第3、4、5字节分别为TH、TL、配置寄存器的复制,每一次上电复位时被重写。
配置寄存器有R0、R1组成,其值决定温度转换的精度位数、转换时间等,含义如图6所示。
第7字节为测温计数的剩余值。
第8字节为测温时每度的计数值。
第9字节读出的是前8个字节的CRC校验码,通过此码,可判断通讯是否正确。
DS18B20的读写操作介绍
(一)ROM操作命令:
1.读命令(33H):
通过该命令主机可以读出DS18820的ROM中的8位系列产品代码、48位产品序列号和8位CRC校验码。
该命令仅限于单个DS18B20在线的情况。
2.选择定位命令(55H):
当多片DS18820在线时,主机发出该命令和一个64位数,DS18820内部ROM与主机一致者,才响应命令。
该命令也可用于单个DS18820的情况。
3.查询命令(0F0H):
该命令可查询总线上DS18B20的数目及其64位序列号。
4.跳过ROM序列号检测命令(OCCH):
该命令允许主机跳过ROM序列号检测而直接对寄存器操作,该命令仅限于单个DS18820在线的情况。
5.报警查询命令(0ECH):
只有报警标志置位后,DS18B20才相应该命令。
(二)存储器操作命令:
1.写入命令(4EH):
该命令可写入寄存器的第2、3、4字节,即高低温寄存器和配置寄存器。
复位信号发出之前,三个字节必须写完。
2.读出命令(0BEH):
该命令可读出寄存器中的内容,复位命令可终止读出。
3.开始转换命令(44H):
该命令使DS18B20立即开始温度转换,当温度转换正在进行时,主机这时读总线将收到O;
当温度转换结束时,主机这时读总线将收到1。
若用信号线给DS18820供电,则主机发出转换命令后,必须提供至少相应于分辨率的温度转换时间的上拉电平。
4.回调命令(088H):
该命令把EEROM中的内容写到寄存器TH、TL及配置寄存器中。
DS18820上电时能自动写入。
5.复制命令(48H):
该命令把寄存器TH、TL及配置寄存器中的内容写到EEROM中。
6读电源标志命令(084H):
主机发出该命令后,DS18B20将进行响应,发送电源标志,信号线供电发O,外接电源发1。
(三)DS18820的复位及读写时序:
1.复位:
对DS18B20操作之前,首先要将它复位。
复位时序为:
(1)主机将信号线置为低电平,时间为480~960μS。
(2)主机将信号线置为高电平,时间为15~60μS。
(3)DS18B20发出60~240μS的低电平作为应答信号。
主机收到此信号后,才能对DS18820作其它操作。
2.写操作:
主机将信号线从高电平拉至低电平,产生写起始信号。
从信号线的下降沿开始,在15~60μS的时间内DS18820对信号线检测,如信号线为高电平,则写1,如信号线为O,则写0,从而完成了一个写周期。
在开始另一个写周期前,必须有1μS以上的高电平恢复期。
3.读操作:
主机将信号线从高电平拉低至低电平1μS以上,再使数据线升为高电平,产生读起始信号。
从主机将信号线从高电平拉低至低电平起15~60μS的时间内,DS18820将数据放到信号线上,供主机读取。
从而完成了一个读周期。
在开始另一个读周期前,必须有1μS以上的高电平恢复期。
是LCD1602显示的.
#include
<
reg51.h>
intrins.h>
#define
uchar
unsigned
char
uint
int
sbit
DQ
=
P3^3;
//定义DS18B20端口DQ
BEEP=P3^7
;
//蜂鸣器驱动线
bit
presence
LCD_RS
P2^0;
LCD_RW
P2^1;
LCD_EN
P2^2;
code
cdis1[
]
{"
DS18B20
OK
"
};
cdis2[
cdis3[
ERR0R
cdis4[
PLEASE
CHECK
char
data
display[2]
{0x00,0x00};
RomCode[8]
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
Temp;
crc;
void
beep();
delayNOP();
{_nop_();
_nop_();
/*******************************************************************/
delay1(int
ms)
{
y;
while(ms--)
for(y
0;
y<
250;
y++)
}
/******************************************************************/
/*
*/
/*检查LCD忙状态
/*lcd_busy为1时,忙,等待。
lcd-busy为0时,闲,可写指令与数据。
/******************************************************************/
lcd_busy()
{
result;
1;
result
(bit)(P0&
0x80);
return(result);
/*写指令数据到LCD
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
lcd_wcmd(uchar
cmd)
while(lcd_busy());
P0
cmd;
/*写显示数据到LCD
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
lcd_wdat(uchar
dat)
dat;
LCD初始化设定
lcd_init()
delay1(15);
lcd_wcmd(0x01);
//清除LCD的显示内容
lcd_wcmd(0x38);
//16*2显示,5*7点阵,8位数据
delay1(5);
lcd_wcmd(0x0c);
//显示开,关光标
lcd_wcmd(0x06);
//移动光标
设定显示位置
lcd_pos(uchar
pos)
lcd_wcmd(pos
|
//数据指针=80+地址变量
/*us级延时函数
Delay(unsigned
int
num)
while(
--num
);
/*初始化ds1820
Init_DS18B20(void)
//DQ复位
Delay(8);
//稍做延时
//将DQ拉低
Delay(90);
//精确延时
大于
480us
//拉高总线
DQ;
//读取存在信号
Delay(100);
return(presence);
//返回信号,0=presence,1=
no
presence
读一位(bit)
read_bit(void)
i;
//将DQ
拉低开始读时间隙
//
then
return
high
for
(i=0;
i<
3;
i++);
延时15μs
return(DQ);
返回
线上的电平值
读一个字节
ReadOneChar(void)
i
dat
//for
(i
8;
>
i--)
//
read_bit();
给脉冲信号
i++)
读取字节,每次读取一个字节
if(read_bit())
dat|=0x01<
然后将其左移
if(DQ)
|=
0x80;
Delay(4);
(dat);
写一位
write_bit(char
bitval)
将DQ
拉低开始写时间隙
if(bitval==1)
=1;
如果写1,DQ
返回高电平
Delay(5);
在时间隙内保持电平值,
Delay函数每次循环延时16μs,因此delay(5)
104μs
写一个字节
WriteOneChar(unsigned
un