DS18B20读写时序编程
1结构知道了,指令知道了,数据格式和转换的四个疑问也解决了。
2该设备DS18B20严格采用单总线通信协议来保证数据的完整性和有效性。
3将单总线配置套路用时序来模拟
第一:发送初始化时序——从时序的角度来看——给出初始化电平脉冲。
第二:发送ROM指令和第三:发送功能指令——从时序的角度来看——在单总线上进行写“0”、写“1”、读“0”和读“1”的过程。
4现在就按照时序去构造初始化函数
所谓的函数就是把时序抄一遍,变成语句。
因为你不理解它这图咋看的,这个图可以看成(敲门—听回声)的过程。
设初始化函数DS18B20_RESET(),无形参,无返回值
Void DS18B20_RESET()
{
U8 x;
DS18B20_DQ_DDR(1);
DS18B20_DQ=1;
Delay(800);
DS18B20_DQ=0;
Delay(800);
DS18B20_DQ=1;
Delay(30);
DS18B20_DQ_DDR(0);
Delay(30);
X=DS18B20_DQ;
Print(“[1],开始检测\t\n);
While(x);
Print(“[1],检测成功\t\n);
Delay(480);
}
5从时序的角度构造写“0”和写“1”的过程
首先得清楚时间隙的含义:在规定的时间内做某个动作达成某个效果,超过这个时间,即使有这个动作也不行了。
根据写“0”时间隙和写“1”时间隙,总结一下:由1到0,让它采样为“0”;由1到0再到1,让它采样为“1”。
别小看0X01,它是分割字节的关键(本质是右移与读最后一位)。
设写“0”和写“1”的函数DS18B20_WByte(u8 Byte),有形参,无返回值Void DS18B20_WByte(u8 Byte)
{
U8 i,x=0;
DS18B20_DQ_DDR(1);
For(i=0;i<=8;i++)
{
X=Byte&0X01;
If(x)
{
DS18B20_DQ=0;
Delay(15);
DS18B20_DQ=1;
Delay(45);
DS18B20_DQ=1;
}
Else
{
DS18B20_DQ=0;
Delay(15);
DS18B20_DQ=0;
Delay(45);
DS18B20_DQ=1;
}
}
Byte=Byte>>1;
}
6从时序的角度去构造读“0”和读“1”的过程
根据时间隙总结一下:抛媚眼的过程。
设读取单个位函数DS18B20_RBit(void),无形参,有返回值
U8 DS18B20_RBIT(void)
{
U8 x=0,rbit=0;
DS18B20_DQ_DDR(1);
DS18B20_DQ=0;
Delay(15);
DS18B20_DQ=1;
DS18B20_DQ_DDR(0);
Delay(15);
X=DS18B20_DQ;
if(x)
Rbit=0x80;
Delay(60);
Return rbit;
}
7别小看0X80,它是重组字节的关键(本质是右移或写最后一位)
设读取单个字节函数DS18B20_RByte(void),无形参,有返回值
U8 DS18B20_RByte(void)
{
U8 i,rbyte=0,tempbit=0;
For(i=0;i<=8;i++)
{
Tempbit=DS18B20_RBIT();
rbyte=rbyte>>1;
rbyte=rbyte&tempbit;
}
Return rbyte;
}
8 DS18B20确实是个小玩意儿,但是也折磨人。