欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
分享:支持多個IO口的DS18B20驅動(帶濾波)—STM32
[打印本頁]
作者:
Angle145
時間:
2019-5-29 17:53
標題:
分享:支持多個IO口的DS18B20驅動(帶濾波)—STM32
一個驅動,支持多個IO口掛載DS18B20,數量不限,帶數據正確性檢測和異常數值濾波。(多個DS18B20并聯使用同個IO的方式需要識別ROM_ID不方便)
STM32單片機源程序如下
#ifndef __DS18B20_H_
#define __DS18B20_H _
#include "stm32f10x.h" //基于stm32f1_std庫,如為其他請修改為其他頭文件并到DS18B20.c中修改3個配置函數
#include "fsc_stos.h"
/*------------------------用戶參數--------------------------------*/
#define DS18B20_NUM 1 //單位:個。DS18B20 IO口數量
#define WarnTemperatureMax 30.0 //單位:度。默認最高報警溫度值
#define WarnTemperatureMin 0.0 //單位:度。默認最低報警溫度值
#define Deviatvalue -3.7 //單位:度。偏差值(校正值,和標準的溫度值之間的差值)
#define C_Time 10 //單位:次。連續讀取C_Time次數據之間的差值小于D_Value值則用作第一次讀取出的正確值
#define D_Value 1.0 //單位:度。兩次讀取值的差值(視測溫對象而定,如測環境溫度則1度即可,測加熱器則設為10度左右,視加熱速度而定)
#define TempMax 100.0 //單位:度。測溫上限
#define TempMin -20.0 //單位:度。測溫下限
/*---------------------------------------------------------------*/
typedef struct
{
float Val[DS18B20_NUM]; //單位:度。當前溫度
float ValAvgAws[DS18B20_NUM]; //單位:度。永久平均溫度
float ValAvg[DS18B20_NUM]; //單位:度。臨時平均溫度(用于某段時間統計平均值,如一天的平均溫度,到00點可以Reset)
float ValMax[DS18B20_NUM]; //單位:度。歷史最高溫度
float ValMin[DS18B20_NUM]; //單位:度。歷史最低溫度
float ValMaxWarn[DS18B20_NUM]; //單位:度。最高報警溫度值
float ValMinWarn[DS18B20_NUM]; //單位:度。最低報警溫度值
}DS18B20;
extern DS18B20 Ds18b20; //數組溫度數據對應初使化順序
uint8_t DS18B20_Config(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x);//初始化DS18B20,輸入參數:IO口,如(GPIOB,GPIO_Pin_12)
float DS18B20_Update(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin_x);//獲取DS18B20溫度 或 更新溫度(為結構體更新數據)
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:(操作系統環境)
#define DS18B20_NUM 2 //設為2個
void Task1(void) //任務1用作更新數據
{
char errchk1,errchk2;
errchk1=DS18B20_Config(GPIOB,GPIO_Pin_12); //第一個初使化,PB12對應結構體數組0的數據
errchk2=DS18B20_Config(GPIOB,GPIO_Pin_6); //第二個初使化,PB6對應結構體數組1的數據,以此類推
if(errchk1) OSprintf("DS18B20 PB12 Config error! \r\n");
if(errchk2) OSprintf("DS18B20 PB6 Config error! \r\n");
while(1)
{
OSSchedLock(); //讀取數據時,一定要關閉任務切換,防止切換到下個任務
DS18B20_Update(GPIOB,GPIO_Pin_12); //更新溫度數據, 更新數據時IO口無順序要求,先更新哪個IO的數據都可以
DS18B20_Update(GPIOB,GPIO_Pin_6);
OSSchedUnlock(); //讀取數據完閉,恢復任務切換
OS_delayMs(100); //100ms更新一次溫度
}
}
void Task2(void) //任務2用作處理數據
{
while(1)
{
OSprintf("PB12當前溫度:%0.1f℃ \r\n",Ds18b20.Val[0]);//數組0對應PB12的溫度的數據
OSprintf("PB6當前溫度: %0.1f℃ \r\n",Ds18b20.Val[1]); //數組1對應PB6的溫度的數據
if(Ds18b20.Val[1]>30.0) //判斷第二個初使化的DS18B20溫度,即PB6線上的DS18B20
{
OSprintf("PB6溫度超高! \r\n");
//xxxxx();//關閉加熱器(xxxx()為關閉加熱函數,根據實際加熱器自己寫)
}
OS_delayMs(1000);//1秒查詢一次
}
}
例2:(裸機環境)
//main方式
int main(void)
{
char errchk1,errchk2;
errchk1=DS18B20_Config(GPIOB,GPIO_Pin_12); //第一個初使化,PB12對應結構體數組0的數據
errchk2=DS18B20_Config(GPIOB,GPIO_Pin_6); //第二個初使化,PB6對應結構體數組1的數據,以此類推
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); //更新溫度數據, 更新數據時IO口無順序要求,先更新哪個IO的數據都可以
DS18B20_Update(GPIOB,GPIO_Pin_6); //更新溫度數據
printf("PB12當前溫度:%0.1f℃ \r\n",Ds18b20.Val[0]);//數組0對應PB12的溫度
printf("PB6當前溫度: %0.1f℃ \r\n",Ds18b20.Val[1]); //數組1對應PB6的溫度
if(Ds18b20.Val[1]>30.0) //判斷第二個初使化的DS18B20溫度,即PB6線上的DS18B20
{
printf("PB6溫度超高! \r\n");
//xxxxx();//關閉加熱器(xxxx()為關閉加熱函數,根據實際加熱器自己寫)
}
delay_ms(100);//100ms掃描一次(如main中有其他程序,則可以考慮定時器掃描方式)
}
}
//定時器方式
int main(void)
{
char errchk1,errchk2;
errchk1=DS18B20_Config(GPIOB,GPIO_Pin_12); //第一個初使化,PB12對應結構體數組0的數據
errchk2=DS18B20_Config(GPIOB,GPIO_Pin_6); //第二個初使化,PB6對應結構體數組1的數據,以此類推
if(errchk1) OSprintf("DS18B20 PB12 Config error! \r\n");
if(errchk2) OSprintf("DS18B20 PB6 Config error! \r\n");
TIMER_Config(TIM1,10);//定時器初使化10ms中斷一次(此函數不提供,用戶自己實現)
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更新一次溫度數據
{
Timer1_10ms_Cnt=0;
DS18B20_Update(GPIOB,GPIO_Pin_12); //更新溫度數據, 更新數據時IO口無順序要求,先更新哪個IO的數據都可以
DS18B20_Update(GPIOB,GPIO_Pin_6); //更新溫度數據
printf("PB12當前溫度:%0.1f℃ \r\n",Ds18b20.Val[0]);//數組0對應PB12的溫度
printf("PB6當前溫度: %0.1f℃ \r\n",Ds18b20.Val[1]); //數組1對應PB6的溫度
if(Ds18b20.Val[1]>30.0) //判斷第二個初使化的DS18B20溫度,即PB6線上的DS18B20
{
printf("PB6溫度超高! \r\n");
//xxxxx();//關閉加熱器(xxxx()為關閉加熱函數,根據實際加熱器自己寫)
}
}
}
-by Angle145
*/
復制代碼
所有資料51hei提供下載:
DS18B2多IO驅動(帶濾波)—STM32.zip
(5.75 KB, 下載次數: 111)
2019-6-4 17:54 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
ljld1201
時間:
2021-1-20 17:03
謝謝了,非常符合需要
作者:
plj213
時間:
2021-3-9 17:42
正在調這個,并5個,參考參考。。。
作者:
535273032
時間:
2021-4-29 13:12
數組定義 Ds18b20.Val[1] 主函數怎么定義
作者:
QI0609
時間:
2021-5-5 12:06
535273032 發表于 2021-4-29 13:12
數組定義 Ds18b20.Val[1] 主函數怎么定義
extern DS18B20 Ds18b20;
作者:
QEQWE123
時間:
2022-3-5 15:57
沒有主函數,只有\C\H文件
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1