STM32的DS18B20驱动
目录
复位脉冲和应答脉冲
初始化
读时序
写时序
温度转换
获取温度
运行结果:
首先我用的是一块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驱动相关推荐
- K_A11_002 基于STM32等单片机驱动DS18B20串口与OLED0.96双显示
K_A11_002 基于STM32等单片机驱动DS18B20 串口与OLED0.96双显示 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 时序 对应程序: 四.部分代码说明 1.接 ...
- STM32与DS18B20数字温度传感器寄生供电方式的优化方案与1-wire总线程序设计
STM32与DS18B20数字温度传感器寄生供电方式的优化方案与1-wire总线程序设计 DS18B20是常用的一种数字温度传感器,通过1-wire总线实现传感器内部寄存器的访问.传感器有两种供电方式 ...
- STM32 USB转串口驱动安装不成功出现黄色感叹号解决方法!
STM32 USB转串口驱动安装不成功出现黄色感叹号解决方法! 参考文章: (1)STM32 USB转串口驱动安装不成功出现黄色感叹号解决方法! (2)https://www.cnblogs.com/ ...
- STM32之继电器驱动(上下拉电阻)
事情的经过:今天买了一个5V继电器,商家说可以用STM32驱动,所以准备用STM32引脚直接驱动,后来,上午试了2小时,引脚一直有电平变化(配置为推挽输出),但是继电器就是没有反应,直接接上5V的电源 ...
- K_A11_008 基于STM32等单片机驱动SHT30和SHT31 串口与OLED0.96双显示
K_A11_008 基于STM32等单片机驱动SHT30和SHT31 串口与OLED0.96双显示 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 时序 对应程序: 四.部分代码说明 1.接 ...
- K_A16_001 基于STM32等单片机驱动HX711称重模块 串口与OLED0.96双显示
K_A16_001 基于STM32等单片机驱动HX711称重模块 串口与OLED0.96双显示 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 对应程序: 四.部分代码说明 1.接线引脚定义 ...
- K_A08_013 基于 STM32等单片机驱动大功率MOS管模块按键控制直流电机加减速启停
目录 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 大功率MOS模块驱动 对应程序: 四.部分代码说明 接线说明 STC89C52RC+大功率MOS模块 STM32F103C8T6+大功率 ...
- 12. STM32——硬件IIC驱动OLED屏幕显示
STM32--硬件IIC驱动OLED屏幕显示 OLED屏幕 OLED屏幕特点 OLED屏幕接线说明 OLED屏幕显存 OLED屏幕原理 OLED屏幕常用指令 OLED屏幕字模软件的使用 写命令 写数据 ...
- STM32 FSMC接口驱动4.3寸TFT LCD屏
STM32 FSMC接口驱动4.3寸TFT LCD屏 STM32的FSMC接口是并行总线接口,可以用于驱动存储芯片如FLASH/SRAM等,也可以用于驱动并口LCD屏. 这里以STM32F103VET ...
最新文章
- 为私有Kubernetes集群创建LoadBalancer服务
- SCI论文写作中的注意事项
- 使用supervisor启动hbase
- SAP云平台CloudFoundry环境试用帐号过期了怎么办
- verilog设置24进制计数器_阅读笔记:《Verilog HDL入门》第3章 Verilog语言要素
- ApacheCN PHP 译文集 20211101 更新
- 表达式求值(nyoj305)
- 火山中文编程 -- 存款本息和
- harmonyos 2.0开机动画壁纸,华为鸿蒙OS 2.0开机动画
- NSA永恒之蓝病毒,如何通过360工具修复?
- 配置阿里云maven仓库地址
- 房产电商新变数:阿里加码易居
- windows 7编辑启动菜单 bcdedit linux,bcdedit用法详解 windows7/vista启动修改
- Vue组件设置缓存kepp-alive 后如何获取数据
- 计算机二级新题word,计算机二级word试题最新.pdf
- 调试输出信息OutPutDebugString
- 搭建深度学习网络时节约GPU显存的技巧
- SEO一场智慧心理之战
- js删除数组对象中的某个属性的方法
- plc控制可调节阀流程图_工业电气控制及PLC技术第四章可编程控制器及其工作原理ppt课件...
热门文章
- 简易扎金花java程序
- 计算思维与数据科学 K-Means聚类模型信用卡用户风险评估 python连接数据库来处理数据
- 简单的android ant 批量打包
- 无人驾驶汽车系统入门(十七)——无人驾驶系统基本框架
- p2p命令行方式连线其他陪测设备(Ubuntu+其他设备(PC,手机))
- MATLAB中输入微分方程dy表示,怎么用MATLAB求解如Dy = y+1/y 的微分方程
- 聪明人都在用这种方法混职场
- Java爬虫技术—入门秘籍之HTTP协议和robtos协议(一)
- 量化投资学习-6:谈谈熊市思维转牛市思维,解读牛市踏空和亏本的原因
- 端口监控软件-Device Monitoring Studio