目录

复位脉冲和应答脉冲

初始化

读时序

写时序

温度转换

获取温度

运行结果:


首先我用的是一块STM32F103VCT6

复位脉冲和应答脉冲

将总线切换为输出模式,主机先拉低电平480us,再拉高15~60us,我直接拉高60us,将总线切换为输入模式,读取ds18b20的应答,设置延时为240us,没超时的话最后切换为输出模式,拉高总线。

uint8_t DS18B20_Rst(void)
{        uint8_t retry=0;DS18B20_IO_OUT();   //设置为输出W1DQ_Write(0);     //拉低DQdelay_us(480);      //拉480usW1DQ_Write(1);    //DQ=1 delay_us(60);       //60USDS18B20_IO_IN();    //设置为输入 //等待ds18b20回应while (!W1DQ_Read()&&retry<240){retry++;delay_us(1);};   if(retry>=200)return -1;else retry=0;DS18B20_IO_OUT();W1DQ_Write(1);delay_us(240);  return retry;
}

初始化

//初始化DS18B20的IO口 DQ 同时检测DS的存在
//返回-1:不存在
//返回0:存在
uint8_t DS18B20_Init(void)
{rv=DS18B20_Rst();if(rv<0)return -1;GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_GPIOA_CLK_ENABLE();         //开启GPIOA时钟GPIO_Initure.Pin=GPIO_PIN_7;            //PA7GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出GPIO_Initure.Pull=GPIO_NOPULL;          //不拉GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速HAL_GPIO_Init(GPIOA,&GPIO_Initure);     //初始化return rv;
}

读时序

总线设为输出拉低2us,设为输入,延时13us再开始读ds18b20的回应,读完数据后延时50us再读下一个位。

//从DS18B20读取一个字节
//返回值:读到的数据
uint8_t DS18B20_Read_Byte(void)
{        uint8_t i,dt,date;date=0;for (i=1;i<=8;i++) {DS18B20_IO_OUT();   //设置为输出W1DQ_Write(0);delay_us(2);DS18B20_IO_IN();    //设置为输入delay_us(13);if(W1DQ_Read())dt=1;else dt=0;  delay_us(50);    //将获得的dt放在最前面,然后再右移一下空出最前面的位置      date=(dt<<7)|(date>>1);}                           return date;
}

写时序

//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(uint8_t dat)     {             uint8_t j;uint8_t testb;DS18B20_IO_OUT();     //设置为输出for (j=1;j<=8;j++) {testb=dat&0x01;dat=dat>>1;if(testb)       // 写1{W1DQ_Write(0);  delay_us(2);                            W1DQ_Write(1);delay_us(60);             }else            //写0{W1DQ_Write(0);  delay_us(60);             W1DQ_Write(1);delay_us(2);                          }}
}

温度转换

//开始温度转换
static inline int DS18B20_Start(void)
{                                          if(0!=DS18B20_Rst())return -1;DS18B20_Write_Byte(0xcc);// skip romDS18B20_Write_Byte(0x44);// convert
}

获取温度

//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250)
short DS18B20_Get_Temp(void)
{uint8_t temp;uint8_t LSB,MSB;short tem;DS18B20_Start ();           //开始转换DS18B20_Rst();
//    DS18B20_Check();   DS18B20_Write_Byte(0xcc);   // skip romDS18B20_Write_Byte(0xbe);   // convert      LSB=DS18B20_Read_Byte();     // LSB   MSB=DS18B20_Read_Byte();     // MSB   if(MSB>7){MSB=~MSB;LSB=~LSB; temp=0;//温度为负  }else temp=1;//温度为正          tem=MSB; //获得高八位tem<<=8;    tem+=LSB;//获得底八位tem=(double)tem*0.625;//转换 if(temp)return tem; //返回温度值else return -tem;
}

运行结果:

用手捂住之后温度上升:

STM32的DS18B20驱动相关推荐

  1. K_A11_002 基于STM32等单片机驱动DS18B20串口与OLED0.96双显示

    K_A11_002 基于STM32等单片机驱动DS18B20 串口与OLED0.96双显示 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 时序 对应程序: 四.部分代码说明 1.接 ...

  2. STM32与DS18B20数字温度传感器寄生供电方式的优化方案与1-wire总线程序设计

    STM32与DS18B20数字温度传感器寄生供电方式的优化方案与1-wire总线程序设计 DS18B20是常用的一种数字温度传感器,通过1-wire总线实现传感器内部寄存器的访问.传感器有两种供电方式 ...

  3. STM32 USB转串口驱动安装不成功出现黄色感叹号解决方法!

    STM32 USB转串口驱动安装不成功出现黄色感叹号解决方法! 参考文章: (1)STM32 USB转串口驱动安装不成功出现黄色感叹号解决方法! (2)https://www.cnblogs.com/ ...

  4. STM32之继电器驱动(上下拉电阻)

    事情的经过:今天买了一个5V继电器,商家说可以用STM32驱动,所以准备用STM32引脚直接驱动,后来,上午试了2小时,引脚一直有电平变化(配置为推挽输出),但是继电器就是没有反应,直接接上5V的电源 ...

  5. K_A11_008 基于STM32等单片机驱动SHT30和SHT31 串口与OLED0.96双显示

    K_A11_008 基于STM32等单片机驱动SHT30和SHT31 串口与OLED0.96双显示 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 时序 对应程序: 四.部分代码说明 1.接 ...

  6. K_A16_001 基于STM32等单片机驱动HX711称重模块 串口与OLED0.96双显示

    K_A16_001 基于STM32等单片机驱动HX711称重模块 串口与OLED0.96双显示 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 对应程序: 四.部分代码说明 1.接线引脚定义 ...

  7. K_A08_013 基于 STM32等单片机驱动大功率MOS管模块按键控制直流电机加减速启停

    目录 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 大功率MOS模块驱动 对应程序: 四.部分代码说明 接线说明 STC89C52RC+大功率MOS模块 STM32F103C8T6+大功率 ...

  8. 12. STM32——硬件IIC驱动OLED屏幕显示

    STM32--硬件IIC驱动OLED屏幕显示 OLED屏幕 OLED屏幕特点 OLED屏幕接线说明 OLED屏幕显存 OLED屏幕原理 OLED屏幕常用指令 OLED屏幕字模软件的使用 写命令 写数据 ...

  9. STM32 FSMC接口驱动4.3寸TFT LCD屏

    STM32 FSMC接口驱动4.3寸TFT LCD屏 STM32的FSMC接口是并行总线接口,可以用于驱动存储芯片如FLASH/SRAM等,也可以用于驱动并口LCD屏. 这里以STM32F103VET ...

最新文章

  1. 为私有Kubernetes集群创建LoadBalancer服务
  2. SCI论文写作中的注意事项
  3. 使用supervisor启动hbase
  4. SAP云平台CloudFoundry环境试用帐号过期了怎么办
  5. verilog设置24进制计数器_阅读笔记:《Verilog HDL入门》第3章 Verilog语言要素
  6. ApacheCN PHP 译文集 20211101 更新
  7. 表达式求值(nyoj305)
  8. 火山中文编程 -- 存款本息和
  9. harmonyos 2.0开机动画壁纸,华为鸿蒙OS 2.0开机动画
  10. NSA永恒之蓝病毒,如何通过360工具修复?
  11. 配置阿里云maven仓库地址
  12. 房产电商新变数:阿里加码易居
  13. windows 7编辑启动菜单 bcdedit linux,bcdedit用法详解 windows7/vista启动修改
  14. Vue组件设置缓存kepp-alive 后如何获取数据
  15. 计算机二级新题word,计算机二级word试题最新.pdf
  16. 调试输出信息OutPutDebugString
  17. 搭建深度学习网络时节约GPU显存的技巧
  18. SEO一场智慧心理之战
  19. js删除数组对象中的某个属性的方法
  20. plc控制可调节阀流程图_工业电气控制及PLC技术第四章可编程控制器及其工作原理ppt课件...

热门文章

  1. 简易扎金花java程序
  2. 计算思维与数据科学 K-Means聚类模型信用卡用户风险评估 python连接数据库来处理数据
  3. 简单的android ant 批量打包
  4. 无人驾驶汽车系统入门(十七)——无人驾驶系统基本框架
  5. p2p命令行方式连线其他陪测设备(Ubuntu+其他设备(PC,手机))
  6. MATLAB中输入微分方程dy表示,怎么用MATLAB求解如Dy = y+1/y 的微分方程
  7. 聪明人都在用这种方法混职场
  8. Java爬虫技术—入门秘籍之HTTP协议和robtos协议(一)
  9. 量化投资学习-6:谈谈熊市思维转牛市思维,解读牛市踏空和亏本的原因
  10. 端口监控软件-Device Monitoring Studio