一、机构及功能的介绍
二、64位ROM、暂存器、EEPROM
三、DS18B20操作逻辑
四、初始化、读、写时序.
- 单总线初始化时序
/*****初始化DS18B20*****/
unsigned char DS18B20—_init(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时,480us-960us,
DQ = 1; //拉高总线
delay(8); //精确延时,16us-80us 丛从机等待时间
x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
delay(4);
return x;
}
- 写入时序
void DS18B20_write_char(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(4);
DQ = 1;
dat>>=1;
}
delay(4);
}
3、读出时序
//写一个字节到DS18B20 时序包含在函数内,写入一个字节
//dat:要写入的字节
void DS18B20_Write_Byte(u8 dat)
{
u8 j;
u8 testb;
DS18B20_IO_OUT(); //SET PG11 OUTPUT;
for (j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if (testb)
{
DS18B20_DQ_OUT=0; // Write 1
delay_us(2);
DS18B20_DQ_OUT=1;
delay_us(60);
}
else
{
DS18B20_DQ_OUT=0; // Write 0
delay_us(60);
DS18B20_DQ_OUT=1;
delay_us(2);
}
}
}
————————————————
五、重难点
**以下问题为51单片机学习过程中发现的,个人觉得比较偏,目前以系统性学习为主,待STM32单片机学习再深入:**
- 测量温度范围宽,测量精度高。DS18B20的测量范围为-55~+125℃。在-10~+85℃范围内,精度为±0.5℃。分辨率可编程,DS18B20的测量分辨率可由用户通过程序设定9~12位。其中9~12位对应的温度分辨率分别为0.5℃、0.25℃、0.125℃和0.0625℃。
.以上为资料上内容,个人认为分辨率为读书精度,以上±0.5为实际DS18B20温度精度 8位CRC:由CRC发生器产生,作为2、 - ROM中的前56位编码的校验码。
(猜测可能性大)个人理解为此CRC码可由暂存器第8byte设置。(很不靠谱猜测,目前找到的搜索匹配程序不可行,理论上可以为搜索DS18B20提供便利,匹配低8位家族码,再跳过中间48位,再匹配最高的8位CRC码,单个工程中的元器件有限,地址完全够用)。 - 报警搜索,代码为ECH,主要用于鉴别和定位系统中超出程序设定的报警温度界限的节点。
报警的状态表现,怎么定位到那一个报警,报警触发条件等 - 启动温度转换,代码为44H,用于启动DS18B20进行温度测量,执行温度转换命令后DS18B20保持等待状态。如果主机在这条命令之后跟着发出读时间隙,而DS18B20又忙于温度转换的话,DS18B20将在总线上输出“0”;若温度转换完成,则输出“1”。
转换温度应该是当执行该命令后,DS18B20将温度数据转换到暂存器中,而不是此命令开始后时刻转换待主机读取。转换开启以后,需要等一会(理论上720us的最大转换时间)再进行读取或其他操作 - 读电源,代码为B4H,用于将DS18B20的供电方式信号发送到主机。若在这条命令发出之后发出读时间隙,DS18B20将返回它的供电方式,“0”为寄生电源,“1”为外部电源。
此状态下,0/1怎么读取,函数怎么写等需要具体了解。初始化,64位ROM匹配或跳过,写入该指令,再判断IO的值 - 搜索ROM函数、匹配ROM函数、读出ROM函数需要了解并独立写出。
**//*下一章会将相关程序列出来,尽量自己写