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