你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32实例-DS18B20温度传感器实验③-DS18B20 初始化函数

[复制链接]
STMCU小助手 发布时间:2022-6-27 18:00
    本实验所要实现的功能是:系统开启时首先检测 DS18B20 温度传感器是否存在,若存在输出相应的提示信息,然后间隔 500ms 读取一次 DS18B20 的温度,并通过串口打印输出,最后让 D1 指示灯不断闪烁,提示系统正常运行。程序框架如下:
(1)初始化 DS18B20
(2)编写读取温度函数
(3)编写主函数
    因为 DS18B20 是单总线通信,所以需要使用 STM32F1 的 PG11 管脚模拟单总线时序,单总线相关时序在前面已经介绍。下面我们打开“DS18B20 温度传感器实验”工程,在 APP 工程组中添加ds18b20.c 文件(里面包含了 DS18B20 驱动程序),同时还要包含对应的头文件路径。
    要使用 PG11 管脚模拟单总线时序,就必须使能端口时钟及初始化 GPIO。初始化代码如下:
  1. /****************************************************************
  2. * 函 数 名 : DS18B20_Init
  3. * 函数功能 : 初始化 DS18B20 的 IO 口 DQ 同时检测DS的存在
  4. * 输 入 : 无
  5. * 输 出 : 1:不存在,0:存在
  6. *****************************************************************/
  7. u8 DS18B20_Init(void)
  8. {
  9. GPIO_InitTypeDef GPIO_InitStructure;
  10. RCC_APB2PeriphClockCmd(DS18B20_PORT_RCC,ENABLE);
  11. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
  12. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  13. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  14. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
  15. DS18B20_Reset();
  16. return DS18B20_Check();
  17. }
复制代码

    该函数带有一个返回值,如果返回值为 1 表示 DS18B20 初始化失败,返回值为 0表示初始化成功。函数返回值其实就是通过调用 DS18B20_Check函数获得,此函数用来检测DS18B20是否存在。初始化函数内还调用了DS18B20_Reset函数,这两个函数其实就是根据前面介绍的初始化时序编写,对应的代码如下:
  1. /****************************************************************
  2. * 函 数 名 : DS18B20_Reset
  3. * 函数功能 : 复位 DS18B20
  4. * 输 入 : 无
  5. * 输 出 : 无
  6. *****************************************************************/
  7. void DS18B20_Reset(void)
  8. {
  9. DS18B20_IO_OUT(); //SET PG11 OUTPUT
  10. DS18B20_DQ_OUT=0; //拉低 DQ
  11. delay_us(750); //拉低 750us
  12. DS18B20_DQ_OUT=1; //DQ=1
  13. delay_us(15); //15US
  14. }
复制代码
  1. /****************************************************************
  2. * 函 数 名 : DS18B20_Check
  3. * 函数功能 : 检测 DS18B20 是否存在
  4. * 输 入 : 无
  5. * 输 出 : 1:未检测到 DS18B20 的存在,0:存在
  6. *****************************************************************/
  7. u8 DS18B20_Check(void)
  8. {
  9. u8 retry=0;
  10. DS18B20_IO_IN();//SET PG11 INPUT
  11. while (DS18B20_DQ_IN&&retry<200)
  12. {
  13. retry++;
  14. delay_us(1);
  15. };
  16. if(retry>=200)return 1;
  17. else retry=0;
  18. while (!DS18B20_DQ_IN&&retry<240)
  19. {
  20. retry++;
  21. delay_us(1);
  22. };
  23. if(retry>=240)return 1;
  24. return 0;
  25. }
复制代码

    由于采用单总线,所以数据的写入和读取都是在 PG11 引脚上完成,所以当写入数据的时候需要配置此引脚为输出模式, 当读取数据的时候需要配置此引脚为输入模式,因此会有以下两个函数:
  1. /****************************************************************
  2. * 函 数 名 : DS18B20_IO_IN
  3. * 函数功能 : DS18B20_IO 输入配置
  4. * 输 入 : 无
  5. * 输 出 : 无
  6. *****************************************************************/
  7. void DS18B20_IO_IN(void)
  8. {
  9. GPIO_InitTypeDef GPIO_InitStructure;
  10. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
  11. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
  12. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
  13. }
复制代码
  1. /****************************************************************
  2. * 函 数 名 : DS18B20_IO_OUT
  3. * 函数功能 : DS18B20_IO 输出配置
  4. * 输 入 : 无
  5. * 输 出 : 无
  6. *****************************************************************/
  7. void DS18B20_IO_OUT(void)
  8. {
  9. GPIO_InitTypeDef GPIO_InitStructure;
  10. GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
  11. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  12. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  13. GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
  14. }
复制代码

    其实也可以直接使用寄存器来配置管脚的模式,可参考 GPIO寄存器部分。

收藏 评论0 发布时间:2022-6-27 18:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版