一個驅(qū)動,支持多個IO口掛載DS18B20,數(shù)量不限,帶數(shù)據(jù)正確性檢測和異常數(shù)值濾波。(多個DS18B20并聯(lián)使用同個IO的方式需要識別ROM_ID不方便)
STM32單片機源程序如下- #ifndef __DS18B20_H_
- #define __DS18B20_H _
- #include "stm32f10x.h" //基于stm32f1_std庫,如為其他請修改為其他頭文件并到DS18B20.c中修改3個配置函數(shù)
- #include "fsc_stos.h"
- /*------------------------用戶參數(shù)--------------------------------*/
- #define DS18B20_NUM 1 //單位:個。DS18B20 IO口數(shù)量
- #define WarnTemperatureMax 30.0 //單位:度。默認最高報警溫度值
- #define WarnTemperatureMin 0.0 //單位:度。默認最低報警溫度值
- #define Deviatvalue -3.7 //單位:度。偏差值(校正值,和標準的溫度值之間的差值)
- #define C_Time 10 //單位:次。連續(xù)讀取C_Time次數(shù)據(jù)之間的差值小于D_Value值則用作第一次讀取出的正確值
- #define D_Value 1.0 //單位:度。兩次讀取值的差值(視測溫對象而定,如測環(huán)境溫度則1度即可,測加熱器則設為10度左右,視加熱速度而定)
- #define TempMax 100.0 //單位:度。測溫上限
- #define TempMin -20.0 //單位:度。測溫下限
- /*---------------------------------------------------------------*/
- typedef struct
- {
- float Val[DS18B20_NUM]; //單位:度。當前溫度
- float ValAvgAws[DS18B20_NUM]; //單位:度。永久平均溫度
- float ValAvg[DS18B20_NUM]; //單位:度。臨時平均溫度(用于某段時間統(tǒng)計平均值,如一天的平均溫度,到00點可以Reset)
- float ValMax[DS18B20_NUM]; //單位:度。歷史最高溫度
- float ValMin[DS18B20_NUM]; //單位:度。歷史最低溫度
- float ValMaxWarn[DS18B20_NUM]; //單位:度。最高報警溫度值
- float ValMinWarn[DS18B20_NUM]; //單位:度。最低報警溫度值
- }DS18B20;
- extern DS18B20 Ds18b20; //數(shù)組溫度數(shù)據(jù)對應初使化順序
- uint8_t DS18B20_Config(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x);//初始化DS18B20,輸入?yún)?shù):IO口,如(GPIOB,GPIO_Pin_12)
- float DS18B20_Update(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x);//獲取DS18B20溫度 或 更新溫度(為結(jié)構(gòu)體更新數(shù)據(jù))
- void DS18B20_ValAvgReset(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x);//重置臨時平均值
- u8 DS18B20_FirstReadStateGet(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x);//獲取第一次讀取值是否成功,1成功 0失敗
- #endif
- /*
- 例1:(操作系統(tǒng)環(huán)境)
- #define DS18B20_NUM 2 //設為2個
-
- void Task1(void) //任務1用作更新數(shù)據(jù)
- {
- char errchk1,errchk2;
- errchk1=DS18B20_Config(GPIOB,GPIO_Pin_12); //第一個初使化,PB12對應結(jié)構(gòu)體數(shù)組0的數(shù)據(jù)
- errchk2=DS18B20_Config(GPIOB,GPIO_Pin_6); //第二個初使化,PB6對應結(jié)構(gòu)體數(shù)組1的數(shù)據(jù),以此類推
- if(errchk1) OSprintf("DS18B20 PB12 Config error! \r\n");
- if(errchk2) OSprintf("DS18B20 PB6 Config error! \r\n");
- while(1)
- {
- OSSchedLock(); //讀取數(shù)據(jù)時,一定要關(guān)閉任務切換,防止切換到下個任務
- DS18B20_Update(GPIOB,GPIO_Pin_12); //更新溫度數(shù)據(jù), 更新數(shù)據(jù)時IO口無順序要求,先更新哪個IO的數(shù)據(jù)都可以
- DS18B20_Update(GPIOB,GPIO_Pin_6);
- OSSchedUnlock(); //讀取數(shù)據(jù)完閉,恢復任務切換
- OS_delayMs(100); //100ms更新一次溫度
- }
- }
- void Task2(void) //任務2用作處理數(shù)據(jù)
- {
- while(1)
- {
- OSprintf("PB12當前溫度:%0.1f℃ \r\n",Ds18b20.Val[0]);//數(shù)組0對應PB12的溫度的數(shù)據(jù)
- OSprintf("PB6當前溫度: %0.1f℃ \r\n",Ds18b20.Val[1]); //數(shù)組1對應PB6的溫度的數(shù)據(jù)
-
- if(Ds18b20.Val[1]>30.0) //判斷第二個初使化的DS18B20溫度,即PB6線上的DS18B20
- {
- OSprintf("PB6溫度超高! \r\n");
- //xxxxx();//關(guān)閉加熱器(xxxx()為關(guān)閉加熱函數(shù),根據(jù)實際加熱器自己寫)
- }
- OS_delayMs(1000);//1秒查詢一次
- }
- }
- 例2:(裸機環(huán)境)
- //main方式
- int main(void)
- {
- char errchk1,errchk2;
- errchk1=DS18B20_Config(GPIOB,GPIO_Pin_12); //第一個初使化,PB12對應結(jié)構(gòu)體數(shù)組0的數(shù)據(jù)
- errchk2=DS18B20_Config(GPIOB,GPIO_Pin_6); //第二個初使化,PB6對應結(jié)構(gòu)體數(shù)組1的數(shù)據(jù),以此類推
- if(errchk1) OSprintf("DS18B20 PB12 Config error! \r\n");
- if(errchk2) OSprintf("DS18B20 PB6 Config error! \r\n");
- while(1)
- {
- DS18B20_Update(GPIOB,GPIO_Pin_12); //更新溫度數(shù)據(jù), 更新數(shù)據(jù)時IO口無順序要求,先更新哪個IO的數(shù)據(jù)都可以
- DS18B20_Update(GPIOB,GPIO_Pin_6); //更新溫度數(shù)據(jù)
- printf("PB12當前溫度:%0.1f℃ \r\n",Ds18b20.Val[0]);//數(shù)組0對應PB12的溫度
- printf("PB6當前溫度: %0.1f℃ \r\n",Ds18b20.Val[1]); //數(shù)組1對應PB6的溫度
- if(Ds18b20.Val[1]>30.0) //判斷第二個初使化的DS18B20溫度,即PB6線上的DS18B20
- {
- printf("PB6溫度超高! \r\n");
- //xxxxx();//關(guān)閉加熱器(xxxx()為關(guān)閉加熱函數(shù),根據(jù)實際加熱器自己寫)
- }
- delay_ms(100);//100ms掃描一次(如main中有其他程序,則可以考慮定時器掃描方式)
- }
- }
- //定時器方式
- int main(void)
- {
- char errchk1,errchk2;
- errchk1=DS18B20_Config(GPIOB,GPIO_Pin_12); //第一個初使化,PB12對應結(jié)構(gòu)體數(shù)組0的數(shù)據(jù)
- errchk2=DS18B20_Config(GPIOB,GPIO_Pin_6); //第二個初使化,PB6對應結(jié)構(gòu)體數(shù)組1的數(shù)據(jù),以此類推
- if(errchk1) OSprintf("DS18B20 PB12 Config error! \r\n");
- if(errchk2) OSprintf("DS18B20 PB6 Config error! \r\n");
- TIMER_Config(TIM1,10);//定時器初使化10ms中斷一次(此函數(shù)不提供,用戶自己實現(xiàn))
- while(1)
- {
- //其他程序代碼
- }
- }
- int Timer1_10ms_Cnt=0;
- void TIM1_IRQHandler(void)
- {
- TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
-
- Timer1_10ms_Cnt++;
- if(Timer1_10ms_Cnt>=50)//50*10ms=500ms更新一次溫度數(shù)據(jù)
- {
- Timer1_10ms_Cnt=0;
- DS18B20_Update(GPIOB,GPIO_Pin_12); //更新溫度數(shù)據(jù), 更新數(shù)據(jù)時IO口無順序要求,先更新哪個IO的數(shù)據(jù)都可以
- DS18B20_Update(GPIOB,GPIO_Pin_6); //更新溫度數(shù)據(jù)
- printf("PB12當前溫度:%0.1f℃ \r\n",Ds18b20.Val[0]);//數(shù)組0對應PB12的溫度
- printf("PB6當前溫度: %0.1f℃ \r\n",Ds18b20.Val[1]); //數(shù)組1對應PB6的溫度
- if(Ds18b20.Val[1]>30.0) //判斷第二個初使化的DS18B20溫度,即PB6線上的DS18B20
- {
- printf("PB6溫度超高! \r\n");
- //xxxxx();//關(guān)閉加熱器(xxxx()為關(guān)閉加熱函數(shù),根據(jù)實際加熱器自己寫)
- }
- }
- }
- -by Angle145
- */
復制代碼
所有資料51hei提供下載:
DS18B2多IO驅(qū)動(帶濾波)—STM32.zip
(5.75 KB, 下載次數(shù): 111)
2019-6-4 17:54 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|