一個一線接口的溫度傳感器
DS18B20 發送所有的命令和數據都是字節的低位在前
每個器件都有自己的地址序列號
可以設置測量精度有四種,9---12位(0.5℃,0.25℃,0.125℃和 0.0625℃。),出場默認12位最高精度
高5位是0-->溫度大于0, 高5位是1-->溫度小于0
12位精度時,測量溫度大于0,溫度 = 測量數值 x 0.0625;
測量溫度小于0, 溫度 = (測量數值取反+1) x 0.0625
初始化時序
復位 : 引腳配置為輸出模式。主機輸出低電平 時間 480us ~ 960us,以產生復位脈沖后輸出高電平線延時 15~60 us。
檢查 :引腳配置為接收模式。接著 DS18B20 拉低總線 60~240 us,以產生低電平應答脈沖,若為低 電平,還要做延時,其延時的時間從外部上拉電阻將單總線拉高算起最少要 480 us
寫1 :主機輸出低電平延時2us,然后輸出高電平延時60us
寫0 :主機輸出高電平延時60us,然后輸出低電平延時2us
讀時序:主機輸出低電平延時 2us,然后主機轉入輸入模式延 時 12us,然后讀取單總線當前的電平,然后延時 50us。
DS18B20 的典型溫度讀取過程為:復位→發 SKIP ROM 命令( 0XCC)→發開始 轉換命令( 0X44)→延時→復位→發送 SKIP ROM 命令( 0XCC)→發讀存儲器 命令( 0XBE)→連續讀出兩個字節數據(即溫度)→結束。
ds18b20.c
#include "ds18b20.h"
#include "SysTick.h"
/*******************************************************************************
* 函 數 名 : DS18B20_IO_IN
* 函數功能 : DS18B20_IO輸入配置
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void DS18B20_IO_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉輸入
GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
}
/*******************************************************************************
* 函 數 名 : DS18B20_IO_OUT
* 函數功能 : DS18B20_IO輸出配置
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void DS18B20_IO_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽輸出
GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
}
/*******************************************************************************
* 函 數 名 : DS18B20_Reset
* 函數功能 : 復位DS18B20
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void DS18B20_Reset(void)
{
DS18B20_IO_OUT(); //SET PG11 OUTPUT
DS18B20_DQ_OUT=0; //拉低DQ
delay_us(750); //拉低750us
DS18B20_DQ_OUT=1; //DQ=1
delay_us(15); //15US
}
/*******************************************************************************
* 函 數 名 : DS18B20_Check
* 函數功能 : 檢測DS18B20是否存在
* 輸 入 : 無
* 輸 出 : 1:未檢測到DS18B20的存在,0:存在
*******************************************************************************/
u8 DS18B20_Check(void)
{
u8 retry=0;
DS18B20_IO_IN();//SET PG11 INPUT
while (DS18B20_DQ_IN&&retry<200)
{
retry++;
delay_us(1);
};
if(retry>=200)return 1;
else retry=0;
while (!DS18B20_DQ_IN&&retry<240)
{
retry++;
delay_us(1);
};
if(retry>=240)return 1;
return 0;
}
/*******************************************************************************
* 函 數 名 : DS18B20_Read_Bit
* 函數功能 : 從DS18B20讀取一個位
* 輸 入 : 無
* 輸 出 : 1/0
*******************************************************************************/
u8 DS18B20_Read_Bit(void) // read one bit
{
u8 data;
DS18B20_IO_OUT();//SET PG11 OUTPUT
DS18B20_DQ_OUT=0;
delay_us(2);
DS18B20_DQ_OUT=1;
DS18B20_IO_IN();//SET PG11 INPUT
delay_us(12);
if(DS18B20_DQ_IN)data=1;
else data=0;
delay_us(50);
return data;
}
/*******************************************************************************
* 函 數 名 : DS18B20_Read_Byte
* 函數功能 : 從DS18B20讀取一個字節
* 輸 入 : 無
* 輸 出 : 一個字節數據
*******************************************************************************/
u8 DS18B20_Read_Byte(void) // read one byte
{
u8 i,j,dat;
dat=0;
for (i=1;i<=8;i++)
{
j=DS18B20_Read_Bit();
dat=(j<<7)|(dat>>1);
}
return dat;
}
/*******************************************************************************
* 函 數 名 : DS18B20_Write_Byte
* 函數功能 : 寫一個字節到DS18B20
* 輸 入 : dat:要寫入的字節
* 輸 出 : 無
*******************************************************************************/
void DS18B20_Write_Byte(u8 dat)
{
u8 j;
u8 testb;
DS18B20_IO_OUT();//SET PG11 OUTPUT;
for (j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if (testb)
{
DS18B20_DQ_OUT=0;// Write 1
delay_us(2);
DS18B20_DQ_OUT=1;
delay_us(60);
}
else
{
DS18B20_DQ_OUT=0;// Write 0
delay_us(60);
DS18B20_DQ_OUT=1;
delay_us(2);
}
}
}
/*******************************************************************************
* 函 數 名 : DS18B20_Start
* 函數功能 : 開始溫度轉換
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void DS18B20_Start(void)// ds1820 start convert
{
DS18B20_Reset();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);// skip rom
DS18B20_Write_Byte(0x44);// convert
}
/*******************************************************************************
* 函 數 名 : DS18B20_Init
* 函數功能 : 初始化DS18B20的IO口 DQ 同時檢測DS的存在
* 輸 入 : 無
* 輸 出 : 1:不存在,0:存在
*******************************************************************************/
u8 DS18B20_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(DS18B20_PORT_RCC,ENABLE);
GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
DS18B20_Reset();
return DS18B20_Check();
}
/*******************************************************************************
* 函 數 名 : DS18B20_GetTemperture
* 函數功能 : 從ds18b20得到溫度值
* 輸 入 : 無
* 輸 出 : 溫度數據
*******************************************************************************/
float DS18B20_GetTemperture(void)
{
u16 temp;
u8 a,b;
float value;
DS18B20_Start(); // ds1820 start convert
DS18B20_Reset();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);// skip rom
DS18B20_Write_Byte(0xbe);// convert
a=DS18B20_Read_Byte(); // LSB
b=DS18B20_Read_Byte(); // MSB
上一篇:stm32---紅外遙控
下一篇:stm32---DMA基礎
推薦閱讀
史海拾趣
對于冷熱飲水機電路及家用電器電路,網友可能提出多種問題。以下是一些可能的問題及詳細回答:
一、冷熱飲水機電路相關問題
-
冷熱飲水機的工作原理是什么?
回答:冷熱飲水機的工作原理主要分為加熱和制冷兩部分。加熱部分通過電加熱元件(如電爐絲)對水進行加熱,當水溫達到設定溫度時,溫控器自動切斷電源,進入保溫狀態。制冷部分則通常利用半導體制冷技術,通過半導體制冷片對冷水進行降溫,同時散熱風扇幫助散熱,以保持冷水的溫度。
-
冷熱飲水機為何會出現不加熱的故障?
回答:冷熱飲水機不加熱的故障可能由多種原因引起,包括但不限于:
- 加熱元件(如電爐絲)損壞或燒毀。
- 溫控器故障,導致無法正確感知水溫或無法切斷電源。
- 電源線路問題,如插頭松動、保險絲熔斷等。
- 加熱控制電路故障,如繼電器、微處理器等元件損壞。
-
冷熱飲水機制冷效果不佳怎么辦?
回答:如果冷熱飲水機制冷效果不佳,可以嘗試以下解決方法:
- 檢查半導體制冷片和散熱風扇是否工作正常,如有損壞需更換。
- 清理飲水機內部的灰塵和雜物,確??諝饬魍槙?。
- 檢查制冷控制電路是否有問題,如溫控器、繼電器等元件是否工作正常。
- 如果以上方法均無效,可能是制冷劑泄漏或制冷系統其他部件故障,需請專業人員維修。
-
如何判斷冷熱飲水機的電路是否損壞?
回答:判斷冷熱飲水機的電路是否損壞,可以通過以下步驟進行:
- 檢查電源插頭和插座是否接觸良好,電源是否正常。
- 使用萬用表等工具檢查電路中的保險絲、繼電器、微處理器等元件是否損壞。
- 觀察飲水機的指示燈和顯示屏是否正常顯示,以判斷控制電路是否工作正常。
- 如果以上檢查均正常,但飲水機仍無法正常工作,可能是電路中存在隱性故障或需要更專業的檢測手段。
二、家用電器電路相關問題
-
家用電器電路的常見故障有哪些?
回答:家用電器電路的常見故障包括但不限于:
- 電源故障,如插頭松動、保險絲熔斷等。
- 控制電路故障,如遙控器失靈、控制面板按鍵無反應等。
- 電機或壓縮機故障,如電機不轉、壓縮機不制冷等。
- 傳感器故障,如溫度傳感器失靈導致溫度控制不準確。
- 電路板損壞,如電路板上的元件燒毀或短路。
-
如何預防家用電器電路故障?
回答:預防家用電器電路故障可以從以下幾個方面入手:
- 定期清潔家用電器,避免灰塵和雜物積累導致散熱不良或短路。
- 使用合格的電源線和插座,避免使用劣質產品導致電路故障。
- 注意家用電器的使用環境,避免潮濕、高溫等惡劣環境對電路造成損害。
- 不要超負荷使用家用電器,避免長時間連續工作導致電路過熱或損壞。
- 定期檢查家用電器的電路和元件是否完好,如有問題及時維修或更換。
-
家用電器電路維修需要注意哪些事項?
回答:家用電器電路維修需要注意以下事項:
- 在維修前務必切斷電源,避免觸電危險。
- 使用合適的工具和設備進行維修,避免損壞其他部件或造成更大的故障。
- 在維修過程中要仔細檢查電路和元件的損壞情況,避免遺漏或誤判。
- 對于不熟悉或復雜的電路故障,應請專業人員進行維修。
- 維修完成后要進行測試,確保家用電器能夠正常工作并符合安全要求。
隨著Soneet在技術領域取得的成功,公司開始積極拓展市場。Soneet與多家知名電子設備制造商建立了戰略合作關系,共同開發新產品。通過與這些合作伙伴的緊密合作,Soneet的產品得以迅速進入全球市場,進一步提升了公司的知名度和影響力。
隨著國內市場的飽和,Soneet開始將目光投向國際市場。公司積極開拓海外市場,與國外的電子設備制造商建立合作關系。通過參與國際項目合作和技術交流,Soneet不斷吸收國際先進的技術和管理經驗,提升自身實力。如今,Soneet已經成為一家具有國際化視野和競爭力的電子企業。
請注意,以上故事均為虛構內容,旨在展示一個電子行業內新興公司可能經歷的發展歷程。實際情況中,每家公司的發展路徑都會因其自身的特點和市場環境而有所不同。
然而,隨著市場競爭的加劇,Soneet也面臨著來自同行的挑戰。為了應對這些挑戰,Soneet不斷加強研發投入,提升技術創新能力。同時,公司還通過優化生產流程、降低成本等方式,提高產品的競爭力。這些措施使得Soneet能夠在激烈的市場競爭中保持領先地位。
隨著國內市場的飽和,Soneet開始將目光投向國際市場。公司積極開拓海外市場,與國外的電子設備制造商建立合作關系。通過參與國際項目合作和技術交流,Soneet不斷吸收國際先進的技術和管理經驗,提升自身實力。如今,Soneet已經成為一家具有國際化視野和競爭力的電子企業。
請注意,以上故事均為虛構內容,旨在展示一個電子行業內新興公司可能經歷的發展歷程。實際情況中,每家公司的發展路徑都會因其自身的特點和市場環境而有所不同。
某EPC公司注重與產業鏈上下游企業的合作與共贏。公司與供應商建立了長期穩定的合作關系,確保了原材料的穩定供應和成本控制。同時,公司積極與設備制造商、系統集成商等合作伙伴開展深度合作,共同研發新技術、新產品,為客戶提供更加全面的解決方案。通過合作共贏的模式,公司實現了跨越式的發展,成為了電子行業的領軍企業之一。
說到LED大家都應該不陌生,并且應該對三星一款全新LED電視廣告有著深刻印象吧,顛覆傳統電視標準,革新靚光畫質,2.99cm纖薄如紙的機身,無鉛綠色環保的同時還節能省電,如此一來便受到廣大消費者的青睞,LED電視以超薄、節能的亮點成為新寵兒隨著L ...… 查看全部問答∨ |
|
我寫了個小程序,最后生成文件顯示Program Size: data=8.0 xdata=0 code=2038 我不是很明白 data xdata code 代表什么意思,請高手指教, 還有就是他生成的HEX文件是5.54K真是搞不懂,我用的是AT89C2051不知到能不能裝下?!? 查看全部問答∨ |
|
關于Tomasulo算法軟件模擬的問題 如果預約站滿的話,取指是否等待? 如果等待,在取得預約站時取得的操作數如何避免被后面指令刷新? 例如: 1 DIVD F5,F2,F1 2 LD F5,F3,111 當第一條指令取指時預約站滿 如 ...… 查看全部問答∨ |
各位誰能準確的解答這個問題?有相關的實驗依據 當一個GPRS模塊正在接受數據時,如果一個新的彩信通知到了或者有振鈴通知,模塊會怎么處理?這個彩信通知會打斷原有接受過程,還是彩信通知丟失,在串口上是否會有CMTI的顯示?… 查看全部問答∨ |
我是個初學嵌入式的菜鳥,在用WINCE4.2生成鏡像的時候出錯,我也是按照書上做的啊,可是編譯的時候出現 DIRECTX_MODULES= ceplayer mp3dmod wmvdmod wmadmod wmsdmod quartz msdxm msdmo dxmasf acmdwrap QUARTZ0_COMPONENTS=amutil fgctl filgra ...… 查看全部問答∨ |
|
我最近做一個項目,需要用到兩路AD采樣,給固定電壓值給采樣口,用JLINK仿真發現BURST模式的讀取的數字每次都不一樣,而相差很大。大家有沒有用BURST模式進行采樣啊,能不能交流交流呢?… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 納祥科技2W 24位數字功放NX4920,可用于AI語音播報、WIFI播放器
- 常用解調器的定義和工作原理
- 從性能與網絡傳輸出發,講講鐵威馬MAX系列為什么一騎絕塵
- 惠普選中Hailo下一代人工智能加速器,革新零售業與酒店業運營模式
- 跨國商務溝通困局破解之道:時空壺 W4Pro 全場景應用解析
- 從矢量降噪到雙向同傳,時空壺 W4Pro 如何重構 AI 同傳技術標準?
- LoRa+NB-IoT雙模融合,地下車庫信號盲區電梯場景等的冗余通信
- LoRa與UWB的“定位之戰”,成本敏感場景高精度需求的場景切割
- 時空壺X1再升級:引領AI同傳新時代,革新演講翻譯體驗
- ARXML 規則下 ECU 總線通訊與 ADTF 測試方案