本帖最后由 zhouminjie 于 2021-4-15 13:09 编辑
本次实现开发板挂载1个DS18B20测量温度,硬件如下:
VDD接到电源,DQ接MCU引脚,GND接地,由于DQ引脚为开漏输出,不具有输出高电平的能力,必须要接一个上拉电阻
①新建工程
②初始化DS18B20
初始化时序如下:
MCU拉低总线至少480us,产生复位脉冲,然后释放总线(拉高电平);这时DS8B20检测到请求之后,会拉低信号,大约60~240us表示应答;DS8B20拉低电平的60~240us之间,单片机读取总线的电平,如果是低电平,那么表示初始化成功;DS18B20拉低电平60~240us之后,会释放总线
代码实现:
- //复位DS18B20
- void DS18B20_Rst(void)
- {
- DS18B20_SetDigitalOutput(); //输出模式
- DS18B20_SetLow(); //拉低DQ
- _delay_us(750); //拉低750us(480~960us)
- DS18B20_SetHigh(); //拉高DQ
- }
- //等待DS18B20应答,有应答返回0,无应答返回1
- uint8_t DS18B20_Check(void)
- {
- uint8_t retry = 0;
- //进入接收模式,等待应答信号
- //等待时间
- DS18B20_SetDigitalInput(); //输入模式
- _delay_us(15); //等待15~60us
- while(DS18B20_GetValue() && retry<120) //最多再等待120us
- {
- retry++;
- _delay_us(1);
- };
- if(retry >= 120)
- return 1; //120us未响应,则判断未检测到
- else
- retry = 0;
- //DS18B20开始拉低DQ
- while(!DS18B20_GetValue() && retry<240) //最长拉低240us
- {
- retry++;
- _delay_us(1);
- };
- if(retry >= 240)
- return 1;
- return 0;
- }
③写DS18B20时序
写时序如下:
MCU给DS18B20写0时,MCU引脚拉低,延时60us,然后释放总线,延时2us
MCU给DS18B20写1时,MCU引脚拉低,延时2us,然后释放总线,延时60us
在写时序起始后15μs到60μs期间,DS18B20处于采样单总线电平状态。如果在此期间总线为高电平,则向DS18B20写入1;如果总线为低电平,则向DSl8B20写入0
代码实现:
|