DS18B20是很常用的溫度傳感器,精度很高,測試結(jié)果如下:
整個(gè)驅(qū)動(dòng)程序基本是根據(jù)時(shí)序?qū)懙摹R⒁獾牡胤接袃蓚€(gè):
1 讀數(shù)據(jù)的時(shí)間 < 15us,這個(gè)值要實(shí)際測試,跟自己實(shí)現(xiàn)的延時(shí)函數(shù)效率有關(guān),我使用的是10us,這個(gè)值如果設(shè)置的不合理,會(huì)直接導(dǎo)致整個(gè)數(shù)據(jù)讀取出錯(cuò);
2 建議使用DS18B20_GetTemp_SkipRom函數(shù),不推薦使用設(shè)備號(hào)相關(guān)的那個(gè)讀取函數(shù),不太穩(wěn)定;
HAL庫驅(qū)動(dòng)程序源碼:
bsp_ds18b20.c
/**
******************************************************************************
* @file bsp_ds18b20.c
* @author
* @date
* @version v1.0
* @note DHT11 driver
******************************************************************************
*/
#include "bsp_ds18b20.h"
/**
* @brief DS18B20 輸出模式
*/
static void DS18B20_Mode_OUT_PP(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = BSP_DS18B20_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(BSP_DS18B20_PORT, &GPIO_InitStruct);
}
/**
* @brief DS18B20 輸入模式
*/
static void DS18B20_Mode_IN_NP(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = BSP_DS18B20_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(BSP_DS18B20_PORT, &GPIO_InitStruct);
}
/**
* @brief 主機(jī)給從機(jī)發(fā)送復(fù)位脈沖
*/
static void DS18B20_Reset(void)
{
DS18B20_Mode_OUT_PP(); // 主機(jī)輸出
DS18B20_OUT_0; // 主機(jī)至少產(chǎn)生 480us 的低電平復(fù)位信號(hào)
bsp_delay_us(750);
DS18B20_OUT_1; // 主機(jī)在產(chǎn)生復(fù)位信號(hào)后,需將總線拉高
// 從機(jī)接收到主機(jī)的復(fù)位信號(hào)后,會(huì)在 15 ~ 60 us 后給主機(jī)發(fā)一個(gè)存在脈沖
bsp_delay_us(15);
}
/**
* @brief 檢測從機(jī)給主機(jī)返回的存在脈沖
* @return 0:成功 1:失敗
*/
static uint8_t DS18B20_Presence(void)
{
uint8_t pulse_time = 0;
DS18B20_Mode_IN_NP(); // 主機(jī)設(shè)為輸入
// 等待存在脈沖的到來,存在脈沖為一個(gè) 60 ~ 240 us 的低電平信號(hào)
// 如果存在脈沖沒有來則做超時(shí)處理,從機(jī)接收到主機(jī)的復(fù)位信號(hào)后,會(huì)在 15 ~ 60 us 后給主機(jī)發(fā)一個(gè)存在脈沖
while (DS18B20_IN && (pulse_time < 100)) // 等待低電平響應(yīng)脈沖
{
pulse_time++;
bsp_delay_us(1);
}
// 經(jīng)過 100 us 后,存在脈沖都還沒有到來
if (pulse_time >= 100)
{
return 1;
}
else
{
pulse_time = 0;
}
// 響應(yīng)脈沖(低電平)到來,且存在的時(shí)間不能超過 240 us
while(!(DS18B20_IN) && pulse_time < 240)
{
pulse_time++;
bsp_delay_us(1);
}
if(pulse_time >= 240)
{
return 1;
}
else
{
return 0;
}
}
/**
* @brief DS18B20 初始化函數(shù)
* @reurn 0:成功 1:失敗
*/
uint8_t DS18B20_Init(void)
{
DS18B20_Mode_OUT_PP();
DS18B20_OUT_1;
DS18B20_Reset();
return DS18B20_Presence();
}
/**
* @brief 從DS18B20讀取一個(gè)bit
*/
static uint8_t DS18B20_ReadBit(void)
{
uint8_t dat;
DS18B20_Mode_OUT_PP(); // 讀 0 和讀 1 的時(shí)間至少要大于 60 us
DS18B20_OUT_0; // 讀時(shí)間的起始:必須由主機(jī)產(chǎn)生 > 1us < 15us 的低電平信號(hào)
// 這個(gè)時(shí)間非常重要,設(shè)置為 < 15,需要多次嘗試;如果設(shè)置不合理,數(shù)據(jù)會(huì)直接出錯(cuò)
// 參數(shù)建議設(shè)為 10 11 12,具體值要根據(jù)延時(shí)函數(shù)的執(zhí)行效率測試
bsp_delay_us(10);
DS18B20_Mode_IN_NP(); // 設(shè)置成輸入,釋放總線,由外部上拉電阻將總線拉高
if (DS18B20_IN == 1)
{
dat = 1;
}
else
{
dat = 0;
}
bsp_delay_us(45); // 這個(gè)延時(shí)參數(shù)參考時(shí)序圖
return dat;
}
/**
* @brief 從 DS18B20 讀一個(gè)字節(jié),低位先行
*/
static uint8_t DS18B20_ReadByte(void)
{
uint8_t i, j, dat = 0;
for(i = 0; i < 8; i++)
{
j = DS18B20_ReadBit();
dat = (dat) | (j << i);
}
return dat;
}
/**
* @brief 寫一個(gè)字節(jié)到 DS18B20,低位先行
*/
static void DS18B20_WriteByte(uint8_t dat)
{
uint8_t i, testb;
DS18B20_Mode_OUT_PP();
for( i = 0; i < 8; i++ )
{
testb = dat & 0x01;
dat = dat >> 1;
// 寫 0 和寫 1 的時(shí)間至少要大于60us
if (testb) // 當(dāng)前位寫 1
{
DS18B20_OUT_0;
bsp_delay_us(5); // 拉低發(fā)送寫時(shí)段信號(hào)
DS18B20_OUT_1; // 讀取電平時(shí)間保持高電平
bsp_delay_us(65);
}
else // 當(dāng)前位寫 0
{
DS18B20_OUT_0; // 拉低發(fā)送寫時(shí)段信號(hào)
bsp_delay_us(70); // 讀取電平時(shí)間保持低電平
DS18B20_OUT_1;
bsp_delay_us(2); // 恢復(fù)時(shí)間
}
}
}
/**
* @brief 跳過匹配 DS18B20 ROM
*/
static void DS18B20_SkipRom(void)
{
DS18B20_Reset();
DS18B20_Presence();
DS18B20_WriteByte(0XCC); /* 跳過 ROM */
}
/**
* @brief 執(zhí)行匹配 DS18B20 ROM
*/
static void DS18B20_MatchRom(void)
{
DS18B20_Reset();
DS18B20_Presence();
DS18B20_WriteByte(0X55); /* 匹配 ROM */
}
/**
* 存儲(chǔ)的溫度是16 位的帶符號(hào)擴(kuò)展的二進(jìn)制補(bǔ)碼形式
* 當(dāng)工作在12位分辨率時(shí),其中5個(gè)符號(hào)位,7個(gè)整數(shù)位,4個(gè)小數(shù)位
*
* |---------整數(shù)----------|-----小數(shù) 分辨率 1/(2^4)=0.0625----|
* 低字節(jié) | 2^3 | 2^2 | 2^1 | 2^0 | 2^(-1) | 2^(-2) | 2^(-3) | 2^(-4) |
*
*
* |-----符號(hào)位:0->正 1->負(fù)-------|-----------整數(shù)-----------|
* 高字節(jié) | s | s | s | s | s | 2^6 | 2^5 | 2^4 |
*
*
* 溫度 = 符號(hào)位 + 整數(shù) + 小數(shù)*0.0625
*/
/**
* @brief 在跳過匹配 ROM 情況下獲取 DS18B20 溫度值
* @param 無
* @retval 溫度值
*/
float DS18B20_GetTemp_SkipRom(void)
{
uint8_t tpmsb, tplsb;
int16_t s_tem;
float f_tem;
DS18B20_SkipRom();
DS18B20_WriteByte(0X44); /* 開始轉(zhuǎn)換 */
DS18B20_SkipRom();
DS18B20_WriteByte(0XBE); /* 讀溫度值 */
tplsb = DS18B20_ReadByte();
tpmsb = DS18B20_ReadByte();
s_tem = tpmsb << 8;
s_tem = s_tem | tplsb;
if(s_tem < 0) /* 負(fù)溫度 */
{
f_tem = (~s_tem + 1) * 0.0625f;
}
else
{
f_tem = s_tem * 0.0625f;
}
return f_tem;
}
/**
* @brief 在匹配 ROM 情況下獲取 DS18B20 溫度值
* @param ds18b20_id:用于存放 DS18B20 序列號(hào)的數(shù)組的首地址
*/
void DS18B20_ReadId(uint8_t *ds18b20_id)
{
uint8_t uc;
DS18B20_WriteByte(0x33); //讀取序列號(hào)
for (uc = 0; uc < 8; uc++)
{
ds18b20_id[uc] = DS18B20_ReadByte();
}
}
/**
* @brief 在匹配 ROM 情況下獲取 DS18B20 溫度值
* @param ds18b20_id:存放 DS18B20 序列號(hào)的數(shù)組的首地址
* @retval 溫度值
*/
float DS18B20_GetTemp_MatchRom(uint8_t * ds18b20_id)
{
uint8_t tpmsb, tplsb, i;
int16_t s_tem;
float f_tem;
DS18B20_MatchRom(); /* 匹配ROM */
for(i = 0;i < 8; i++)
{
DS18B20_WriteByte(ds18b20_id[i]);
}
DS18B20_WriteByte(0X44); /* 開始轉(zhuǎn)換 */
DS18B20_MatchRom(); /* 匹配ROM */
for(i = 0; i < 8; i++)
{
DS18B20_WriteByte(ds18b20_id[i]);
}
DS18B20_WriteByte(0XBE); /* 讀溫度值 */
tplsb = DS18B20_ReadByte();
tpmsb = DS18B20_ReadByte();
s_tem = tpmsb << 8;
s_tem = s_tem | tplsb;
if (s_tem < 0) /* 負(fù)溫度 */
{
f_tem = (~s_tem + 1) * 0.0625f;
}
else
{
f_tem = s_tem * 0.0625f;
}
return f_tem;
}
// 測試程序
#if 0
uint8_t uc, ucDs18b20Id[8];
while (DS18B20_Init())
{
printf("rn no ds18b20 exit rn");
}
printf("rn ds18b20 exit rn");
DS18B20_ReadId(ucDs18b20Id); // 讀取 DS18B20 的序列號(hào)
printf("rnDS18B20的序列號(hào)是: 0x");
for (uc = 0; uc < 8; uc++) // 打印 DS18B20 的序列號(hào)
{
printf("%.2x", ucDs18b20Id[uc]);
}
while (1)
{
printf("rn溫度: %.1frn", DS18B20_GetTemp_SkipRom());
HAL_Delay(1000); /* 1s 讀取一次溫度值 */
}
#endif
bsp_ds18b20.h
/**
******************************************************************************
* @file bsp_ds18b20.h
* @author
* @date
* @version v1.0
* @note DS18B20 driver
******************************************************************************
*/
#ifndef __BSP_DS18B20_H
#define __BSP_DS18B20_H
#include "bsp_conf.h"
#define BSP_DS18B20_PORT TEMP_SENSOR_GPIO_Port
#define BSP_DS18B20_PIN TEMP_SENSOR_Pin
#define DS18B20_OUT_1 HAL_GPIO_WritePin(BSP_DS18B20_PORT, BSP_DS18B20_PIN, GPIO_PIN_SET)
#define DS18B20_OUT_0 HAL_GPIO_WritePin(BSP_DS18B20_PORT, BSP_DS18B20_PIN, GPIO_PIN_RESET)
#define DS18B20_IN HAL_GPIO_ReadPin(BSP_DS18B20_PORT, BSP_DS18B20_PIN)
uint8_t DS18B20_Init(void);
void DS18B20_ReadId(uint8_t *ds18b20_id);
float DS18B20_GetTemp_SkipRom(void);
float DS18B20_GetTemp_MatchRom(uint8_t * ds18b20_id);
#endif /* __BSP_DS18B20_H */
上一篇:stm32實(shí)用篇5:HAL庫 DHT11 驅(qū)動(dòng)
下一篇:STM32的DMA串口直通
推薦閱讀
史海拾趣
Kemet公司在EMI濾波器領(lǐng)域也有著一席之地。他們致力于研發(fā)符合環(huán)保標(biāo)準(zhǔn)的EMI濾波器。隨著全球?qū)Νh(huán)保問題的日益重視,Kemet看到了綠色環(huán)保EMI濾波器的巨大潛力。他們采用環(huán)保材料和無鉛工藝,生產(chǎn)出了符合RoHS標(biāo)準(zhǔn)的EMI濾波器。這些產(chǎn)品不僅性能穩(wěn)定,而且對(duì)環(huán)境友好,贏得了眾多環(huán)保意識(shí)強(qiáng)烈的客戶的青睞。
隨著市場的不斷變化和消費(fèi)者需求的升級(jí),澤耀科技(Ashining)意識(shí)到只有不斷創(chuàng)新才能在競爭中立于不敗之地。公司加大了對(duì)研發(fā)的投入,引進(jìn)了一批高素質(zhì)的研發(fā)人才,并建立了完善的研發(fā)體系。經(jīng)過多次嘗試和實(shí)驗(yàn),澤耀科技成功突破了某項(xiàng)關(guān)鍵技術(shù),并推出了升級(jí)版的產(chǎn)品。這些新產(chǎn)品不僅性能更加優(yōu)越,而且具有更高的性價(jià)比,深受消費(fèi)者的喜愛。
作為一家具有社會(huì)責(zé)任感的企業(yè),Conflux始終關(guān)注社會(huì)公益事業(yè)。公司積極參與扶貧、教育等公益活動(dòng),為社會(huì)做出積極貢獻(xiàn)。同時(shí),Conflux還注重環(huán)保和可持續(xù)發(fā)展,通過采用環(huán)保材料和節(jié)能技術(shù),降低生產(chǎn)過程中的環(huán)境污染。這些舉措不僅提升了公司的社會(huì)形象,也贏得了社會(huì)各界的廣泛贊譽(yù)。
以上五個(gè)故事是虛構(gòu)的,但反映了一個(gè)科技公司可能經(jīng)歷的發(fā)展階段和策略選擇。在現(xiàn)實(shí)中,一個(gè)公司的成長和發(fā)展往往涉及更多復(fù)雜的因素和決策過程。希望這些故事能夠?yàn)槟峁┮恍﹩l(fā)和參考。
Conflux公司自創(chuàng)立之初,便專注于區(qū)塊鏈技術(shù)的研發(fā)與應(yīng)用。在電子支付領(lǐng)域,公司團(tuán)隊(duì)成功研發(fā)出了一種高效、安全的分布式賬本技術(shù),這一技術(shù)突破迅速吸引了業(yè)界的關(guān)注。隨后,Conflux與多家金融機(jī)構(gòu)合作,推出了基于區(qū)塊鏈技術(shù)的電子支付解決方案,不僅提高了交易速度,還大大降低了交易成本。這一系列的創(chuàng)新舉措使Conflux在電子支付領(lǐng)域嶄露頭角,奠定了其在行業(yè)內(nèi)的領(lǐng)先地位。
進(jìn)入21世紀(jì)后,Harris公司經(jīng)歷了重要的戰(zhàn)略轉(zhuǎn)型。2019年,Harris與L3 Technologies合并成立了L3Harris Technologies。這次合并旨在通過整合兩家公司的技術(shù)、資源和市場優(yōu)勢,打造一家綜合性的國防和信息技術(shù)公司。合并后的L3Harris在通信系統(tǒng)、雷達(dá)系統(tǒng)、太空和導(dǎo)航系統(tǒng)等多個(gè)領(lǐng)域均取得了顯著進(jìn)展,進(jìn)一步提升了其在電子行業(yè)中的競爭力。
長園維安一直注重產(chǎn)品質(zhì)量管理。公司建立了完善的質(zhì)量管理體系,通過ISO9001、TS16949等認(rèn)證,確保產(chǎn)品質(zhì)量的穩(wěn)定性和可靠性。此外,長園維安還積極推行6Sigma等質(zhì)量管理方法,不斷提高產(chǎn)品質(zhì)量和客戶滿意度。這些措施使長園維安贏得了客戶的信賴和好評(píng)。
如圖 scsi <---> scsi controller <---> pci <---> cpu 如果我想對(duì)scsi編寫驅(qū)動(dòng)我該對(duì)哪個(gè)部分編寫? 如圖 scsi <---> scsi controller <---> pci <---> cpu 如果我想對(duì)scsi編寫驅(qū)動(dòng)我該對(duì)哪個(gè)部分編寫?… 查看全部問答∨ |
我最近在跟著老師做點(diǎn)項(xiàng)目,也是剛接觸WinCE,我想讓Skype在Windows CE操作系統(tǒng)下運(yùn)行 ,可是運(yùn)行不起來,但是在Pocket PC 上可以跑起來,所以感覺要對(duì)WinCE 系統(tǒng)重新定制,請(qǐng)問各位高手給點(diǎn)意見。WinCE 相對(duì)于Pocket PC到底缺少那些咚咚.如何添加啊 ...… 查看全部問答∨ |
還有哪位網(wǎng)友申請(qǐng)到了MCU DAY的CC430 有哪位網(wǎng)友的CC430用不到,希望可以出給我,也算是資源充分利用,如果您有的話加我QQ77413811… 查看全部問答∨ |
|
本帖最后由 ddllxxrr 于 2016-1-7 17:08 編輯 參加青島2011年6月29號(hào)TI M3 DAY研討會(huì),依舊換新?lián)Q來的一塊LM3S8962的板子,全新,跟之前壇里活動(dòng)的板子一樣的, 所以想350元要出手,或者交換STM32開發(fā)板一塊。 有意者請(qǐng)聯(lián)系QQ:712996168 … 查看全部問答∨ |
|
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 人形機(jī)器人馬拉松背后的思考,兆易創(chuàng)新如何賦能機(jī)器人產(chǎn)業(yè)
- 一種基于STM32的智能柜控制器設(shè)計(jì)
- 小型傾轉(zhuǎn)旋翼機(jī)的無刷直流電機(jī)驅(qū)動(dòng)器設(shè)計(jì)
- 超高速攝影機(jī)電控系統(tǒng)設(shè)計(jì)
- 基于GPS自動(dòng)授時(shí)的無線智能控制器的設(shè)計(jì)
- 基于PTR2000的無線氣象信息采集系統(tǒng)設(shè)計(jì)
- Microchip推出MEC175xB系列器件,為嵌入式控制器引入硬件 抗量子攻擊能力
- 無人飛行器機(jī)載穩(wěn)定云臺(tái)控制系統(tǒng)的設(shè)計(jì)
- 匠芯創(chuàng)推出面向具身智能高性能實(shí)時(shí)處理器M7000
- 全域800V架構(gòu):在行業(yè)亂象的荊棘中的花朵
- 納芯微推出全新第三代汽車級(jí)數(shù)字隔離器系列
- 插混,“突圍”歐洲車市
- 機(jī)器人行業(yè)周報(bào)|5月20日:華為優(yōu)必選深度聯(lián)手,人形機(jī)器人走“科技紅毯”等
- 超快充爆發(fā),汽車電池安全怎么辦?
- 數(shù)字化,高性能激光雷達(dá)爭奪戰(zhàn)的核武器
- L3+智能座艙時(shí)代 主機(jī)廠三大核心需求揭秘
- 從機(jī)械應(yīng)答到深度交互 移遠(yuǎn)通信如何讓機(jī)器人 靈魂覺醒
- 寶馬全固態(tài)電池電動(dòng)汽車上路測試,續(xù)航有望大幅提升
- CIS、ISP、AI三重加持下,視覺智駕方案終于成熟了
- 有獎(jiǎng)直播報(bào)名:大聯(lián)大世平集團(tuán)&恩智浦 | AI 無所不在,單板電腦也可以
- 【下載有禮】利用泰克新MSO6示波器 Spectrum View功能演示多通道信號(hào)頻譜分析
- 【問題征集】大學(xué)生美國TI行,你問我送禮!
- MPS 隔離式穩(wěn)壓 DCDC 模塊——MIE系列,小且不凡!痛點(diǎn)討論|你理想中的電源模塊是怎樣的?
- TE 官微人工客服功能上線,可以與 TE 技術(shù)專家直接微信溝通了!
- 分享、評(píng)論《Vishay光電子博文》盡享精彩好禮!
- 悅讀 TI 工業(yè)應(yīng)用精選方案,闖關(guān)贏好禮嘍!
- MSP430經(jīng)典資料大搜集!贏給力TI 無線運(yùn)動(dòng)手表開發(fā)工具!!!
- 有獎(jiǎng)直播 | keysight 如何避免損害示波器
- 一加6發(fā)布前瞻 從價(jià)格到配置看這就夠了
- 剛剛撕完羅永浩 王自如閃電買了兩部堅(jiān)果R1
- 5G第一階段網(wǎng)絡(luò)標(biāo)準(zhǔn)將完成 華為等中國企業(yè)確認(rèn)參會(huì)商討
- 兼容劉海屏 Android P狀態(tài)欄最多只顯示四個(gè)通知圖標(biāo)
- 用數(shù)據(jù)說話 手機(jī)屏幕像素密度變化歷程和趨勢
- 貿(mào)澤與樂鑫簽訂全球分銷協(xié)議 面向全球開售無線 SoC 和模組
- NXP擴(kuò)充汽車以太網(wǎng)產(chǎn)品組合,推出新型千兆交換機(jī)和雙端口PHY
- 恩智浦最新CAN收發(fā)器系列保障CAN通信安全而無需加密
- 日月光與Cadence攜手開發(fā)首套系統(tǒng)級(jí)封裝EDA解決方案
- 環(huán)球晶:半導(dǎo)體硅晶圓仍有漲價(jià)空間,今年拼逐季成長
- 新開的淘寶小店,希望大家支持下
- 請(qǐng)高手指點(diǎn)嵌入式軟件工程師 (linux)開發(fā)驅(qū)動(dòng)的三個(gè)問題(可以是基于ARM平臺(tái)的)
- 如何把goahead移植到rt-thread上?
- MPU6050陀螺儀數(shù)據(jù)抖動(dòng)問題
- 數(shù)顯實(shí)驗(yàn)電源的制作
- 曬樣片+TPS25940、TPS238761哇哇哈
- STM32CubeMX引腳配置時(shí)顯示圖釘圖標(biāo)是什么意思?
- phone jack的各管腳功能定義
- 用STM32合作開發(fā)產(chǎn)品--找高手
- 如何加入Led二極管?