欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
分享:支持多個(gè)IO口的DS18B20驅(qū)動(dòng)(帶濾波)—STM32
[打印本頁]
作者:
Angle145
時(shí)間:
2019-5-29 17:53
標(biāo)題:
分享:支持多個(gè)IO口的DS18B20驅(qū)動(dòng)(帶濾波)—STM32
一個(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庫,如為其他請(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口無順序要求,先更新哪個(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口無順序要求,先更新哪個(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口無順序要求,先更新哪個(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
作者:
ljld1201
時(shí)間:
2021-1-20 17:03
謝謝了,非常符合需要
作者:
plj213
時(shí)間:
2021-3-9 17:42
正在調(diào)這個(gè),并5個(gè),參考參考。。。
作者:
535273032
時(shí)間:
2021-4-29 13:12
數(shù)組定義 Ds18b20.Val[1] 主函數(shù)怎么定義
作者:
QI0609
時(shí)間:
2021-5-5 12:06
535273032 發(fā)表于 2021-4-29 13:12
數(shù)組定義 Ds18b20.Val[1] 主函數(shù)怎么定義
extern DS18B20 Ds18b20;
作者:
QEQWE123
時(shí)間:
2022-3-5 15:57
沒有主函數(shù),只有\(zhòng)C\H文件
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1