久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5550|回復: 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 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復

使用道具 舉報

7#
ID:316613 發表于 2022-3-5 15:57 | 只看該作者
沒有主函數,只有\C\H文件
回復

使用道具 舉報

6#
ID:504404 發表于 2021-5-5 12:06 | 只看該作者
535273032 發表于 2021-4-29 13:12
數組定義 Ds18b20.Val[1] 主函數怎么定義

extern DS18B20 Ds18b20;
回復

使用道具 舉報

5#
ID:444494 發表于 2021-4-29 13:12 | 只看該作者
數組定義 Ds18b20.Val[1] 主函數怎么定義
回復

使用道具 舉報

地板
ID:138247 發表于 2021-3-9 17:42 | 只看該作者

正在調這個,并5個,參考參考。。。
回復

使用道具 舉報

板凳
ID:879235 發表于 2021-1-20 17:03 | 只看該作者
謝謝了,非常符合需要
回復

使用道具 舉報

無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕在线观看 | 久久精品一区二区 | 国产精品一区二区久久久久 | 伊人啪啪网 | 人人九九精 | 亚洲最大av | 欧美一级二级视频 | 国产精品有限公司 | 9999国产精品欧美久久久久久 | 中文字幕 国产 | 久久久久国产精品午夜一区 | 亚洲国产一区在线 | 日韩在线不卡 | 看毛片的网站 | 一区观看| 日韩中文在线观看 | 日日人人 | 欧美日韩高清 | 欧美日韩美女 | 久久久免费精品 | 亚洲精品视频播放 | 精品一区二区三区四区外站 | 黄色亚洲| 亚洲一区在线日韩在线深爱 | 久久久久久久久久久一区二区 | 99re在线视频| 午夜视频在线免费观看 | 日韩一区二区三区av | 国产成人精品午夜视频免费 | 欧美综合在线视频 | 成人毛片在线观看 | 精品久久久精品 | 国产精品1区 | 国产一区| 1区2区视频 | 国产二区在线播放 | 91午夜在线 | 日韩欧美高清 | 国产成人99久久亚洲综合精品 | 爱爱综合网 | 午夜影院在线观看视频 |