YangHY 发表于 2026-2-2 22:19:27

复位(输出0保持480us,输出1保持60us,读取当前电平,延时420us)

在初始化序列期间,总线上的主设备通过拉低1-wire总线超过480us来发送(TX)复位脉冲之后主设备释放总线而进入接收模式(RX),当总线释放后,5ka 左右的上拉电阻将1-wire总线拉至高电平,当 18B20检测到该上升边沿信号后,其等待 15us至60us 后通过将 1-wire 总线拉低60us至240us 来实现发送一个存在脉冲。

YangHY 发表于 2026-2-2 22:20:29

写时段:

YangHY 发表于 2026-2-2 22:23:57

为了形成写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)

YangHY 发表于 2026-2-2 22:25:25

总线图要仔细看清楚:

YangHY 发表于 2026-2-2 22:26:22

汇总一下:大致是3步:

YangHY 发表于 2026-2-2 22:28:55

好难懂,写代码前先停一下:

这个所有代码的底层逻辑图,要看懂:

YangHY 发表于 2026-2-11 10:54:11

简单讲:

YangHY 发表于 2026-2-11 11:02:13

把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
*/

YangHY 发表于 2026-2-11 11:06:08

首先完成复位:

//复位(输出0保持480us,输出1保持60us,读取当前电平,延时420us)
void DS18B20_Reset(void)
{
        u8 flag = 1;
       
        while( flag )                //只要括号里的变量大于0,就会一直执行
        {
                DQ = 0;
                Delay480us();
                DQ = 1;
                Delay60us();
                flag = DQ;                        //设备存在,会拉低总线
                Delay480us();
        }
}

YangHY 发表于 2026-2-11 11:06:58

其中用的的时间函数:

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--;
}

页: 85 86 87 88 89 90 91 92 93 94 [95] 96 97 98 99 100 101 102 103 104
查看完整版本: 第一课 序言《AI8051U的特点》