找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4746|回复: 5
收起左侧

分享:支持多个IO口的DS18B20驱动(带滤波)—STM32

  [复制链接]
ID:142059 发表于 2019-5-29 17:53 | 显示全部楼层 |阅读模式
一个驱动,支持多个IO口挂载DS18B20,数量不限,带数据正确性检测和异常数值滤波。(多个DS18B20并联使用同个IO的方式需要识别ROM_ID不方便)

STM32单片机源程序如下
  1. #ifndef __DS18B20_H_
  2. #define __DS18B20_H _
  3. #include "stm32f10x.h" //基于stm32f1_std库,如为其他请修改为其他头文件并到DS18B20.c中修改3个配置函数
  4. #include "fsc_stos.h"

  5. /*------------------------用户参数--------------------------------*/
  6. #define DS18B20_NUM         1        //单位:个。DS18B20 IO口数量
  7. #define WarnTemperatureMax  30.0     //单位:度。默认最高报警温度值
  8. #define WarnTemperatureMin  0.0      //单位:度。默认最低报警温度值
  9. #define Deviatvalue        -3.7      //单位:度。偏差值(校正值,和标准的温度值之间的差值)

  10. #define C_Time              10       //单位:次。连续读取C_Time次数据之间的差值小于D_Value值则用作第一次读取出的正确值            
  11. #define D_Value             1.0      //单位:度。两次读取值的差值(视测温对象而定,如测环境温度则1度即可,测加热器则设为10度左右,视加热速度而定)
  12. #define TempMax             100.0    //单位:度。测温上限
  13. #define TempMin            -20.0     //单位:度。测温下限
  14. /*---------------------------------------------------------------*/

  15. typedef struct
  16. {
  17.         float Val[DS18B20_NUM];         //单位:度。当前温度
  18.         float ValAvgAws[DS18B20_NUM];   //单位:度。永久平均温度
  19.         float ValAvg[DS18B20_NUM];      //单位:度。临时平均温度(用于某段时间统计平均值,如一天的平均温度,到00点可以Reset)
  20.         float ValMax[DS18B20_NUM];      //单位:度。历史最高温度
  21.         float ValMin[DS18B20_NUM];      //单位:度。历史最低温度
  22.         float ValMaxWarn[DS18B20_NUM];  //单位:度。最高报警温度值
  23.         float ValMinWarn[DS18B20_NUM];  //单位:度。最低报警温度值
  24. }DS18B20;
  25. extern DS18B20 Ds18b20;         //数组温度数据对应初使化顺序

  26. uint8_t DS18B20_Config(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x);//初始化DS18B20,输入参数:IO口,如(GPIOB,GPIO_Pin_12)
  27. float   DS18B20_Update(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x);//获取DS18B20温度 或 更新温度(为结构体更新数据)
  28. void DS18B20_ValAvgReset(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x);//重置临时平均值
  29. u8 DS18B20_FirstReadStateGet(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x);//获取第一次读取值是否成功,1成功 0失败
  30. #endif

  31. /*
  32. 例1:(操作系统环境)

  33. #define DS18B20_NUM     2      //设为2个
  34.    
  35. void Task1(void)    //任务1用作更新数据
  36. {
  37.   char errchk1,errchk2;
  38.         errchk1=DS18B20_Config(GPIOB,GPIO_Pin_12); //第一个初使化,PB12对应结构体数组0的数据
  39.         errchk2=DS18B20_Config(GPIOB,GPIO_Pin_6);  //第二个初使化,PB6对应结构体数组1的数据,以此类推
  40.   if(errchk1) OSprintf("DS18B20 PB12 Config error! \r\n");
  41.   if(errchk2) OSprintf("DS18B20 PB6 Config error! \r\n");
  42.         while(1)
  43.         {
  44.                 OSSchedLock();                       //读取数据时,一定要关闭任务切换,防止切换到下个任务
  45.                 DS18B20_Update(GPIOB,GPIO_Pin_12); //更新温度数据, 更新数据时IO口无顺序要求,先更新哪个IO的数据都可以
  46.                 DS18B20_Update(GPIOB,GPIO_Pin_6);
  47.     OSSchedUnlock();                                 //读取数据完闭,恢复任务切换
  48.                 OS_delayMs(100); //100ms更新一次温度
  49.         }
  50. }
  51. void Task2(void)  //任务2用作处理数据
  52. {
  53.         while(1)
  54.         {
  55.                 OSprintf("PB12当前温度:%0.1f℃  \r\n",Ds18b20.Val[0]);//数组0对应PB12的温度的数据
  56.                 OSprintf("PB6当前温度: %0.1f℃  \r\n",Ds18b20.Val[1]); //数组1对应PB6的温度的数据
  57.                
  58.                 if(Ds18b20.Val[1]>30.0) //判断第二个初使化的DS18B20温度,即PB6线上的DS18B20
  59.                 {
  60.                   OSprintf("PB6温度超高!  \r\n");
  61.                         //xxxxx();//关闭加热器(xxxx()为关闭加热函数,根据实际加热器自己写)
  62.                 }
  63.                 OS_delayMs(1000);//1秒查询一次
  64.         }
  65. }



  66. 例2:(裸机环境)

  67. //main方式
  68. int main(void)
  69. {
  70.   char errchk1,errchk2;
  71.         errchk1=DS18B20_Config(GPIOB,GPIO_Pin_12); //第一个初使化,PB12对应结构体数组0的数据
  72.         errchk2=DS18B20_Config(GPIOB,GPIO_Pin_6);  //第二个初使化,PB6对应结构体数组1的数据,以此类推
  73.   if(errchk1) OSprintf("DS18B20 PB12 Config error! \r\n");
  74.   if(errchk2) OSprintf("DS18B20 PB6 Config error! \r\n");
  75.         while(1)
  76.         {
  77.           DS18B20_Update(GPIOB,GPIO_Pin_12); //更新温度数据, 更新数据时IO口无顺序要求,先更新哪个IO的数据都可以
  78.                 DS18B20_Update(GPIOB,GPIO_Pin_6);  //更新温度数据
  79.     printf("PB12当前温度:%0.1f℃  \r\n",Ds18b20.Val[0]);//数组0对应PB12的温度
  80.                 printf("PB6当前温度: %0.1f℃  \r\n",Ds18b20.Val[1]); //数组1对应PB6的温度
  81.                 if(Ds18b20.Val[1]>30.0) //判断第二个初使化的DS18B20温度,即PB6线上的DS18B20
  82.                 {
  83.                   printf("PB6温度超高!  \r\n");
  84.                         //xxxxx();//关闭加热器(xxxx()为关闭加热函数,根据实际加热器自己写)
  85.                 }  
  86.                 delay_ms(100);//100ms扫描一次(如main中有其他程序,则可以考虑定时器扫描方式)
  87.         }
  88. }

  89. //定时器方式
  90. int main(void)
  91. {
  92.   char errchk1,errchk2;
  93.         errchk1=DS18B20_Config(GPIOB,GPIO_Pin_12); //第一个初使化,PB12对应结构体数组0的数据
  94.         errchk2=DS18B20_Config(GPIOB,GPIO_Pin_6);  //第二个初使化,PB6对应结构体数组1的数据,以此类推
  95.   if(errchk1) OSprintf("DS18B20 PB12 Config error! \r\n");
  96.   if(errchk2) OSprintf("DS18B20 PB6 Config error! \r\n");
  97.         TIMER_Config(TIM1,10);//定时器初使化10ms中断一次(此函数不提供,用户自己实现)
  98.         while(1)
  99.         {
  100.           //其他程序代码
  101.         }
  102. }

  103. int Timer1_10ms_Cnt=0;
  104. void TIM1_IRQHandler(void)
  105. {
  106.   TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
  107.         
  108.         Timer1_10ms_Cnt++;
  109.         if(Timer1_10ms_Cnt>=50)//50*10ms=500ms更新一次温度数据
  110.         {
  111.           Timer1_10ms_Cnt=0;
  112.                 DS18B20_Update(GPIOB,GPIO_Pin_12); //更新温度数据, 更新数据时IO口无顺序要求,先更新哪个IO的数据都可以
  113.                 DS18B20_Update(GPIOB,GPIO_Pin_6);  //更新温度数据
  114.                 printf("PB12当前温度:%0.1f℃  \r\n",Ds18b20.Val[0]);//数组0对应PB12的温度
  115.                 printf("PB6当前温度: %0.1f℃  \r\n",Ds18b20.Val[1]); //数组1对应PB6的温度
  116.                 if(Ds18b20.Val[1]>30.0) //判断第二个初使化的DS18B20温度,即PB6线上的DS18B20
  117.                 {
  118.                         printf("PB6温度超高!  \r\n");
  119.                         //xxxxx();//关闭加热器(xxxx()为关闭加热函数,根据实际加热器自己写)
  120.                 }  
  121.         }
  122. }

  123. -by Angle145
  124. */
复制代码


所有资料51hei提供下载:
DS18B2多IO驱动(带滤波)—STM32.zip (5.75 KB, 下载次数: 111)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:879235 发表于 2021-1-20 17:03 | 显示全部楼层
谢谢了,非常符合需要
回复

使用道具 举报

ID:138247 发表于 2021-3-9 17:42 | 显示全部楼层

正在调这个,并5个,参考参考。。。
回复

使用道具 举报

ID:444494 发表于 2021-4-29 13:12 | 显示全部楼层
数组定义 Ds18b20.Val[1] 主函数怎么定义
回复

使用道具 举报

ID:504404 发表于 2021-5-5 12:06 | 显示全部楼层
535273032 发表于 2021-4-29 13:12
数组定义 Ds18b20.Val[1] 主函数怎么定义

extern DS18B20 Ds18b20;
回复

使用道具 举报

ID:316613 发表于 2022-3-5 15:57 | 显示全部楼层
没有主函数,只有\C\H文件
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表