复位(输出0保持480us,输出1保持60us,读取当前电平,延时420us)
在初始化序列期间,总线上的主设备通过拉低1-wire总线超过480us来发送(TX)复位脉冲之后主设备释放总线而进入接收模式(RX),当总线释放后,5ka 左右的上拉电阻将1-wire总线拉至高电平,当 18B20检测到该上升边沿信号后,其等待 15us至60us 后通过将 1-wire 总线拉低60us至240us 来实现发送一个存在脉冲。
写时段:
为了形成写1 时段,在将1-wire总线拉低后,主设备必须在15us之内释放总线。当总线释放后,
5KΩ 的上拉电阻将总线拉至高。为了形成写 0 时段,在将 1-wire 总线拉低后,在整个时段期间主设备必须一直拉低总线(至少 60us)。在主设备初始化写时段后,18B20 将会在 15us 至 60us 的时间窗口内对总线进行采样。如果总线在采样窗口期间是高电平,则逻辑1被写入18B20:若总线是低电平,则逻辑 0 被写入 18B20。
2)写0,写1写0(输出0保持60us+,输出1保持1us+)
写1(输出0保持1us+,输出1保持60us+)
3)读0,读1读0/1(输出0保持1us+输出1保持1us+,读取当前电平,延时60us)
总线图要仔细看清楚:
汇总一下:大致是3步:
好难懂,写代码前先停一下:
这个所有代码的底层逻辑图,要看懂:
简单讲:
把18b20.c 和18b20.h的架子搭起来:
在.c里把任务写清楚:
/*4.1 底层驱动
复位(输出0保持480us,输出1保持60us,读取当前电平,延时420us)
写0(输出0保持60us+,输出1保持1us+)
写1(输出0保持1us+,输出1保持60us+)
读0/1(输出0保持1us+,输出1保持1us+,读取当前电平;延时60us)
4.2 接口函数
写1字节(先输出低位,在输出高位)
读1字节(先读到的是低位,后读到的是高位)
4.3 用户功能函数
温度读取换算函数
(复位-CCH-44H-等待-复位-CCH-BEH-读取2字节温度数据-换算)
DS18B20 是接在P33上的,18b20.h里面有#define DQP33
*/
首先完成复位:
//复位(输出0保持480us,输出1保持60us,读取当前电平,延时420us)
void DS18B20_Reset(void)
{
u8 flag = 1;
while( flag ) //只要括号里的变量大于0,就会一直执行
{
DQ = 0;
Delay480us();
DQ = 1;
Delay60us();
flag = DQ; //设备存在,会拉低总线
Delay480us();
}
}
其中用的的时间函数:
void Delay480us(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
_nop_();
i = 2878UL;
while (i) i--;
}
void Delay60us(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
_nop_();
i = 358UL;
while (i) i--;
}
void Delay1us(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
_nop_();
i = 4UL;
while (i) i--;
}