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

【经验分享】STM32实例-DS18B20温度传感器实验④-温度读取函数

[复制链接]
STMCU小助手 发布时间:2022-6-26 18:46
温度读取函数
    初始化 DS18B20 后,我们就可以按照前面介绍的 DS18B20 的典型温度读取过程来编写温度读取函数,代码如下:
  1. /****************************************************************
  2. * 函 数 名 : DS18B20_GetTemperture
  3. * 函数功能 : 从ds18b20 得到温度值
  4. * 输 入 : 无
  5. * 输 出 : 温度数据
  6. *****************************************************************/
  7. float DS18B20_GetTemperture(void)
  8. {
  9. u16 temp;
  10. u8 a,b;
  11. float value;
  12. DS18B20_Start(); // ds1820 start convert
  13. DS18B20_Reset();
  14. DS18B20_Check();
  15. DS18B20_Write_Byte(0xcc);// skip rom
  16. DS18B20_Write_Byte(0xbe);// convert
  17. a=DS18B20_Read_Byte(); // LSB
  18. b=DS18B20_Read_Byte(); // MSB
  19. temp=b;
  20. temp=(temp<<8)+a;
  21. if((temp&0xf800)==0xf800)
  22. {
  23. temp=(~temp)+1;
  24. value=temp*(-0.0625);
  25. }
  26. else
  27. {
  28. value=temp*0.0625;
  29. }
  30. return value;
  31. }
复制代码

    该函数首先调用了 DS18B20_Start 函数用来开始 DS18B20 的温度转换, 其代码如下:
  1. /****************************************************************
  2. * 函 数 名 : DS18B20_Start
  3. * 函数功能 : 开始温度转换
  4. * 输 入 : 无
  5. * 输 出 : 无
  6. *****************************************************************/
  7. void DS18B20_Start(void)// ds1820 start convert
  8. {
  9. DS18B20_Reset();
  10. DS18B20_Check();
  11. DS18B20_Write_Byte(0xcc);// skip rom
  12. DS18B20_Write_Byte(0x44);// convert
  13. }
复制代码

    最终将 2 个字节的温度数据读取出来,判断最高字节的高 5 位是否为 0,如果为 0 表明读取的温度值为正温度,直接乘以 0.0625 即可,否则为负温度,需取反后加 1 再乘以 0.0625。

主函数
    编写好 DS18B20 初始化和温度读取函数后,接下来就可以编写主函数了,代码如下:
  1. /****************************************************************
  2. * 函 数 名 : main
  3. * 函数功能 : 主函数
  4. * 输 入 : 无
  5. * 输 出 : 无
  6. *****************************************************************/
  7. int main()
  8. {
  9. u8 i=0;
  10. float temper;
  11. SysTick_Init(72);
  12. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级
  13. 分组 分2 组
  14. LED_Init();
  15. USART1_Init(9600);
  16. while(DS18B20_Init())
  17. {
  18. printf("DS18B20检测失败,请插好!\r\n");
  19. delay_ms(500);
  20. }
  21. printf("DS18B20检测成功!\r\n");
  22. while(1)
  23. {
  24. i++;
  25. if(i%20==0)
  26. {
  27. led1=!led1;
  28. }
  29. if(i%50==0)
  30. {
  31. temper=DS18B20_GetTemperture();
  32. if(temper<0)
  33. {
  34. printf("检测的温度为:-");
  35. }
  36. else
  37. {
  38. printf("检测的温度为:");
  39. }
  40. printf("%.2f°C\r\n",temper);
  41. }
  42. delay_ms(10);
  43. }
  44. }
复制代码

    主函数实现的功能很简单,首先调用之前编写好的硬件初始化函数,包括SysTick 系统时钟,中断分组,LED 初始化等。然后调用我们前面编写的DS18B20_Init 函数用来检测 DS18B20 温度传感器是否成功,若初始化成功,打印输出“DS18B20 检测成功!”提示信息,否则一直循环打印输出“DS18B20检测失败,请插好!”,初始化成功后进入 while 循环,间隔 500ms 读取一次温度,并将温度打印输出,并且D1指示灯间隔 200ms 闪烁,提示系统正常运行。

实验现象
    将工程程序编译后下载到开发板内, 如果未将 DS18B20 插入开发板上温度传感器接口,串口将一直打印输出“DS18B20 检测失败,请插好!”提示信息,如果插好DS18B20 后,将打印输出“DS18B20 检测成功!”信息,并且每间隔 500ms打印输出一次读取的温度数据,同时可以看到 D1 指示灯不断闪烁,表示程序正常运行。如果想在串口调试助手上看到输出信息, 可以打开 串口调试助手,首先勾选下标号1 DTR 框,然后再取消勾选。
    这是因为此串口助手启动时会把系统复位住,通过 DTR 状态切换下即可。然后设置好波特率等参数后,串口助手上即会收到串口发送过来的信息。(串口助手上先勾选下标号 1 DTR 框,然后再取消勾选)如下图所示:

微信图片_20220626184606.png

收藏 评论0 发布时间:2022-6-26 18:46

举报

0个回答

所属标签

相似分享

官网相关资源

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