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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5390|回復: 5
打印 上一主題 下一主題
收起左側(cè)

分享:支持多個IO口的DS18B20驅(qū)動(帶濾波)—STM32

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:142059 發(fā)表于 2019-5-29 17:53 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一個驅(qū)動,支持多個IO口掛載DS18B20,數(shù)量不限,帶數(shù)據(jù)正確性檢測和異常數(shù)值濾波。(多個DS18B20并聯(lián)使用同個IO的方式需要識別ROM_ID不方便)

STM32單片機源程序如下
  1. #ifndef __DS18B20_H_
  2. #define __DS18B20_H _
  3. #include "stm32f10x.h" //基于stm32f1_std庫,如為其他請修改為其他頭文件并到DS18B20.c中修改3個配置函數(shù)
  4. #include "fsc_stos.h"

  5. /*------------------------用戶參數(shù)--------------------------------*/
  6. #define DS18B20_NUM         1        //單位:個。DS18B20 IO口數(shù)量
  7. #define WarnTemperatureMax  30.0     //單位:度。默認最高報警溫度值
  8. #define WarnTemperatureMin  0.0      //單位:度。默認最低報警溫度值
  9. #define Deviatvalue        -3.7      //單位:度。偏差值(校正值,和標準的溫度值之間的差值)

  10. #define C_Time              10       //單位:次。連續(xù)讀取C_Time次數(shù)據(jù)之間的差值小于D_Value值則用作第一次讀取出的正確值            
  11. #define D_Value             1.0      //單位:度。兩次讀取值的差值(視測溫對象而定,如測環(huán)境溫度則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];      //單位:度。臨時平均溫度(用于某段時間統(tǒng)計平均值,如一天的平均溫度,到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;         //數(shù)組溫度數(shù)據(jù)對應初使化順序

  26. uint8_t DS18B20_Config(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x);//初始化DS18B20,輸入?yún)?shù):IO口,如(GPIOB,GPIO_Pin_12)
  27. float   DS18B20_Update(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x);//獲取DS18B20溫度 或 更新溫度(為結(jié)構(gòu)體更新數(shù)據(jù))
  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:(操作系統(tǒng)環(huán)境)

  33. #define DS18B20_NUM     2      //設為2個
  34.    
  35. void Task1(void)    //任務1用作更新數(shù)據(jù)
  36. {
  37.   char errchk1,errchk2;
  38.         errchk1=DS18B20_Config(GPIOB,GPIO_Pin_12); //第一個初使化,PB12對應結(jié)構(gòu)體數(shù)組0的數(shù)據(jù)
  39.         errchk2=DS18B20_Config(GPIOB,GPIO_Pin_6);  //第二個初使化,PB6對應結(jié)構(gòu)體數(shù)組1的數(shù)據(jù),以此類推
  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();                       //讀取數(shù)據(jù)時,一定要關(guān)閉任務切換,防止切換到下個任務
  45.                 DS18B20_Update(GPIOB,GPIO_Pin_12); //更新溫度數(shù)據(jù), 更新數(shù)據(jù)時IO口無順序要求,先更新哪個IO的數(shù)據(jù)都可以
  46.                 DS18B20_Update(GPIOB,GPIO_Pin_6);
  47.     OSSchedUnlock();                                 //讀取數(shù)據(jù)完閉,恢復任務切換
  48.                 OS_delayMs(100); //100ms更新一次溫度
  49.         }
  50. }
  51. void Task2(void)  //任務2用作處理數(shù)據(jù)
  52. {
  53.         while(1)
  54.         {
  55.                 OSprintf("PB12當前溫度:%0.1f℃  \r\n",Ds18b20.Val[0]);//數(shù)組0對應PB12的溫度的數(shù)據(jù)
  56.                 OSprintf("PB6當前溫度: %0.1f℃  \r\n",Ds18b20.Val[1]); //數(shù)組1對應PB6的溫度的數(shù)據(jù)
  57.                
  58.                 if(Ds18b20.Val[1]>30.0) //判斷第二個初使化的DS18B20溫度,即PB6線上的DS18B20
  59.                 {
  60.                   OSprintf("PB6溫度超高!  \r\n");
  61.                         //xxxxx();//關(guān)閉加熱器(xxxx()為關(guān)閉加熱函數(shù),根據(jù)實際加熱器自己寫)
  62.                 }
  63.                 OS_delayMs(1000);//1秒查詢一次
  64.         }
  65. }



  66. 例2:(裸機環(huán)境)

  67. //main方式
  68. int main(void)
  69. {
  70.   char errchk1,errchk2;
  71.         errchk1=DS18B20_Config(GPIOB,GPIO_Pin_12); //第一個初使化,PB12對應結(jié)構(gòu)體數(shù)組0的數(shù)據(jù)
  72.         errchk2=DS18B20_Config(GPIOB,GPIO_Pin_6);  //第二個初使化,PB6對應結(jié)構(gòu)體數(shù)組1的數(shù)據(jù),以此類推
  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); //更新溫度數(shù)據(jù), 更新數(shù)據(jù)時IO口無順序要求,先更新哪個IO的數(shù)據(jù)都可以
  78.                 DS18B20_Update(GPIOB,GPIO_Pin_6);  //更新溫度數(shù)據(jù)
  79.     printf("PB12當前溫度:%0.1f℃  \r\n",Ds18b20.Val[0]);//數(shù)組0對應PB12的溫度
  80.                 printf("PB6當前溫度: %0.1f℃  \r\n",Ds18b20.Val[1]); //數(shù)組1對應PB6的溫度
  81.                 if(Ds18b20.Val[1]>30.0) //判斷第二個初使化的DS18B20溫度,即PB6線上的DS18B20
  82.                 {
  83.                   printf("PB6溫度超高!  \r\n");
  84.                         //xxxxx();//關(guān)閉加熱器(xxxx()為關(guān)閉加熱函數(shù),根據(jù)實際加熱器自己寫)
  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對應結(jié)構(gòu)體數(shù)組0的數(shù)據(jù)
  94.         errchk2=DS18B20_Config(GPIOB,GPIO_Pin_6);  //第二個初使化,PB6對應結(jié)構(gòu)體數(shù)組1的數(shù)據(jù),以此類推
  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中斷一次(此函數(shù)不提供,用戶自己實現(xiàn))
  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更新一次溫度數(shù)據(jù)
  110.         {
  111.           Timer1_10ms_Cnt=0;
  112.                 DS18B20_Update(GPIOB,GPIO_Pin_12); //更新溫度數(shù)據(jù), 更新數(shù)據(jù)時IO口無順序要求,先更新哪個IO的數(shù)據(jù)都可以
  113.                 DS18B20_Update(GPIOB,GPIO_Pin_6);  //更新溫度數(shù)據(jù)
  114.                 printf("PB12當前溫度:%0.1f℃  \r\n",Ds18b20.Val[0]);//數(shù)組0對應PB12的溫度
  115.                 printf("PB6當前溫度: %0.1f℃  \r\n",Ds18b20.Val[1]); //數(shù)組1對應PB6的溫度
  116.                 if(Ds18b20.Val[1]>30.0) //判斷第二個初使化的DS18B20溫度,即PB6線上的DS18B20
  117.                 {
  118.                         printf("PB6溫度超高!  \r\n");
  119.                         //xxxxx();//關(guān)閉加熱器(xxxx()為關(guān)閉加熱函數(shù),根據(jù)實際加熱器自己寫)
  120.                 }  
  121.         }
  122. }

  123. -by Angle145
  124. */
復制代碼


所有資料51hei提供下載:
DS18B2多IO驅(qū)動(帶濾波)—STM32.zip (5.75 KB, 下載次數(shù): 111)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

板凳
ID:138247 發(fā)表于 2021-3-9 17:42 | 只看該作者

正在調(diào)這個,并5個,參考參考。。。
回復

使用道具 舉報

地板
ID:444494 發(fā)表于 2021-4-29 13:12 | 只看該作者
數(shù)組定義 Ds18b20.Val[1] 主函數(shù)怎么定義
回復

使用道具 舉報

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

extern DS18B20 Ds18b20;
回復

使用道具 舉報

6#
ID:316613 發(fā)表于 2022-3-5 15:57 | 只看該作者
沒有主函數(shù),只有\(zhòng)C\H文件
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 综合自拍 | 精品欧美一区二区三区久久久 | 日韩图区 | 国产成人啪免费观看软件 | 91精品国产综合久久婷婷香蕉 | 美女高潮网站 | 久久一区二区av | 97视频人人澡人人爽 | 狠狠干综合视频 | 日本又色又爽又黄的大片 | 成人免费在线视频 | 日韩免费网 | av网站免费观看 | 久久久久久久久久性 | 99热精品在线观看 | 精品视频在线一区 | 久久久不卡网国产精品一区 | 91动漫在线观看 | 午夜三级在线观看 | 激情婷婷 | 91av在线免费观看 | 国产三级国产精品 | 91精品久久久久久久久 | 在线免费av观看 | 精品国产欧美一区二区三区成人 | 欧美激情 亚洲 | 性色的免费视频 | 亚洲一区在线免费观看 | 亚洲精品一区二区在线观看 | 国产黄色大片在线免费观看 | 粉嫩一区二区三区国产精品 | 在线免费观看色 | 成人一区二区三区 | 一区二区三区高清不卡 | 欧美日韩三级 | 亚洲精品高清视频在线观看 | 欧美a∨| 粉嫩国产精品一区二区在线观看 | 夜夜夜操| 成人激情视频在线 | 91麻豆精品国产91久久久久久久久 |