基于STM32的 DS18b20 驅(qū)動程序
《基于STM32的 DS18b20 驅(qū)動程序》由會員分享,可在線閱讀,更多相關(guān)《基于STM32的 DS18b20 驅(qū)動程序(8頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、//=========================DS18b20.h=========================// /*----------------------------------------------- ?????????????? DS18b20驅(qū)動程序 ------------------------------------------------*/ #ifndef __DS18B20_H #define __DS18B20_H typedef enum{FAILED = 0 ,PASSED = !FAILED} TestStatus ; #defi
2、ne DQ_GPIO? GPIOD #define DQ_GPIO_Pin GPIO_Pin_5 //REGISTER COMMANDS #define REGISTER_9_BITS? 0x1F #define REGISTER_10_BITS 0x3F #define REGISTER_11_BITS 0x5F #define REGISTER_12_BIT2 0x7F //ROM COMMANDS #define ROM_Search_Cmd?? 0xF0 #define ROM_Read_Cmd???? 0x33 #define ROM_Match_Cmd??? 0
3、x55 #define ROM_Skip_Cmd???? 0xCC #define ROM_AlarmSearch_Cmd 0xEC //DS18b20 FUNCTION COMMANDS #define Convert_T????????? 0x44 #define Write_Scratchpad? 0x4E #define Read_Scratchpad?? 0xBE #define Copy_Scratchpad?? 0x48 #define Recall_EEPROM???? 0x88 #define Read_PowerSupply? 0x84 #define
4、DQ_Write_1()???? GPIO_SetBits(DQ_GPIO ,DQ_GPIO_Pin)? //寫1 #define DQ_Write_0()???? GPIO_ResetBits(DQ_GPIO ,DQ_GPIO_Pin)//寫0 #define DQ_ReadBit()???? GPIO_ReadInputDataBit(DQ_GPIO ,DQ_GPIO_Pin) //讀DQ上的值 extern void GPIO_DQ_Out_Mode(void) ; //DQ輸出模式 extern void GPIO_DQ_Input_Mode(void) ;? //DQ輸入模式
5、 extern void Tx_ResetPulse(void) ;??? //發(fā)送復(fù)位脈沖 extern void Rx_PresencePulse(void) ; //接受應(yīng)答信號 extern void Write_OneByte_ToDS18b20(unsigned char data) ; //寫一個字節(jié)到18b20 extern unsigned char Read_OneByte_FromDS18b20(void) ; //從18b20讀一個字節(jié) extern void Read_Temperature(unsigned char *sign ,unsigned cha
6、r *interger , ????????????????????? unsigned int *decimal) ; //讀溫度 //寫配置參數(shù)TH,TL和初始化配置寄存器 extern void Write_EEPROM(unsigned char Th,unsigned char Tl,unsigned char Register_Con ); void DS18B20_Init(void) ; //初始化 #endif /*DS18B20*/ //===============================================================
7、==// //=========================DS18b20.c================================// #include "stm32f10x_lib.h" #include "DS18b20.h" #include "SysTick_Delay.h" /****************************************** 函數(shù)名稱:GPIO_DQ_Out_Mode 功??? 能:設(shè)置DQ引腳為開漏輸出模式 參??? 數(shù):無 返回值? :無 ***********************************
8、********/ void GPIO_DQ_Out_Mode(void) { ??? GPIO_InitTypeDef GPIO_InitStructure ; ??? ??? GPIO_InitStructure.GPIO_Pin = DQ_GPIO_Pin ; ??? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ; ??? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD ; //開漏輸出 ??? GPIO_Init(DQ_GPIO ,&GPIO_InitStructur
9、e) ; } /****************************************** 函數(shù)名稱:GPIO_DQ_Input_Mode 功??? 能:設(shè)置DQ引腳為浮空輸入模式 參??? 數(shù):無 返回值? :無 *******************************************/ void GPIO_DQ_Input_Mode(void) { ??? GPIO_InitTypeDef GPIO_InitStructure ; ??? ??? GPIO_InitStructure.GPIO_Pin = DQ_GPIO_Pin ; ??
10、? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ; ??? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ; //浮空輸入 ??? GPIO_Init(DQ_GPIO ,&GPIO_InitStructure) ; } /****************************************** 函數(shù)名稱:Tx_ResetPulse 功??? 能:發(fā)送復(fù)位脈沖 參??? 數(shù):無 返回值? :無 ******************************
11、*************/ void Tx_ResetPulse(void) { ??? GPIO_DQ_Out_Mode() ; ??? DQ_Write_0() ;? //復(fù)位脈沖 ??? Delay_Nus(500) ; //至少保持480us ??? DQ_Write_1() ;? //加速上升沿速度 ??? Delay_Nus(1) ; } /****************************************** 函數(shù)名稱:Rx_PresencePulse 功??? 能:接受應(yīng)答信號 參??? 數(shù):無 返回值? :無 ***********
12、********************************/ void Rx_PresencePulse(void) { ??? GPIO_DQ_Input_Mode() ; ??? while( DQ_ReadBit()) ;? //等待DS18b20應(yīng)答 ??? while( DQ_ReadBit() == 0) ; //DS18b20將總線拉低60~240us ,然后總線由上拉電阻拉高 ??? Delay_Nus(300) ; ??? GPIO_DQ_Out_Mode() ;??? //接受完成,主機重新控制總線 } /**********************
13、******************** 函數(shù)名稱:Write_OneByte_ToDS18b20 功??? 能:寫一個字節(jié)到DS18b20 參??? 數(shù):無 返回值? :無 *******************************************/ void Write_OneByte_ToDS18b20(unsigned char data) { ??? unsigned char i ; ??? GPIO_DQ_Out_Mode() ; ??? for(i=0 ;i<8 ;i++) ??? { ??????? if(data&0x01)??? //低
14、位在前 ??????? { ??????????? //寫1 ??????????? DQ_Write_0() ; //寫時間空隙總是從總線的低電平開始 ??????????? Delay_Nus(8) ;? //15us內(nèi)拉高 ??????????? DQ_Write_1() ; ??????????? Delay_Nus(80) ; //整個寫1時隙不低于60us ??????? } ??????? else ??????? { ??????????? //寫0 ??????????? DQ_Write_0() ; ??????????? Delay_Nus(110
15、) ; //保持在60us到120us之間 ??????????? DQ_Write_1() ; ??????????? Delay_Nus(5) ; ??????? } ??????? data >>= 1 ; ??? } } /****************************************** 函數(shù)名稱:Read_OneByte_FromDS18b20 功??? 能:從DS18b20讀一個字節(jié) 參??? 數(shù):無 返回值? :讀出的數(shù)據(jù) *******************************************/ unsigned ch
16、ar Read_OneByte_FromDS18b20(void) { ??? unsigned char i ,data = 0 ; ??? ??? for(i=0 ;i<8 ;i++) ??? { ??????? GPIO_DQ_Out_Mode() ; ??????? data >>= 1 ; ??????? DQ_Write_0() ; ??????? Delay_Nus(2) ; ??????? GPIO_DQ_Input_Mode() ; ??????? Delay_Nus(1) ; ??????? if(DQ_ReadBit()) ??????? {
17、 ??????????? data |= 0x80 ; ??????? } ??????? Delay_Nus(70) ;?? //等待這一位數(shù)據(jù)完成傳輸 ??? } ??? GPIO_DQ_Out_Mode() ; ??? return data ; } /****************************************** 函數(shù)名稱:Read_Temperature 功??? 能:讀取溫度信息 參??? 數(shù):*sign - 保存符號(零上或零下) ????????? *integer - 保存整數(shù)部分 ????????? *decimal - 保存小
18、數(shù)部分 返回值? :無 *******************************************/ void Read_Temperature(unsigned char *sign , ????????????????????? unsigned char *interger , ????????????????????? unsigned int *decimal) { ??? unsigned char a=0; ??? unsigned char b=0; ??? //volatile unsigned char c=0; ??? //volatile
19、 unsigned char d=0; ??? //volatile unsigned char e=0; ??? ??? unsigned int tmp ; ??? ??? DS18B20_Init(); ??? Write_OneByte_ToDS18b20(ROM_Read_Cmd); ? ??? DS18B20_Init(); ??? Write_OneByte_ToDS18b20(ROM_Skip_Cmd);//跳過讀序列號操作 ??? Write_OneByte_ToDS18b20(Convert_T); //啟動溫度轉(zhuǎn)換 ??? Delay_Nms(
20、780);//等待DS18b20轉(zhuǎn)換完成 ??? ??? DS18B20_Init(); ??? Write_OneByte_ToDS18b20(ROM_Skip_Cmd); ??? Write_OneByte_ToDS18b20(Read_Scratchpad); //讀取寄存器內(nèi)容(可以從寄存器0讀到寄存器8) ??? ??? a= Read_OneByte_FromDS18b20();???? //溫度低8位 ??? b= Read_OneByte_FromDS18b20();???? //溫度高8位 ??? //c= Read_OneByte_FromDS18B20
21、();?? //TH ??? //d= Read_OneByte_FromDS18B20();?? //TL ??? //e= Read_OneByte_FromDS18B20();?? //Configuration Register ??? ??? Tx_ResetPulse();? //中斷數(shù)據(jù)讀取 ??? tmp = (b<<8) | a ; ??? if(b & 0xF0) ??? { ??? *sign = 1 ;????????????? //符號部分 ??? tmp = ~tmp+1 ; ??? } ??? else ??? { ??? sign
22、= 0 ; ??? } ??? *interger = (tmp>>4) & 0x00FF;? //整數(shù)部分 ??? *decimal = (tmp & 0x000F) * 625 ; //小數(shù)部分 } /****************************************** 函數(shù)名稱:Write_EEPROM 功??? 能:寫配置參數(shù) 參??? 數(shù):Th - 報警溫度上限 ????????? Tl - 報警溫度下限 ????????? Register_Con - 控制寄存器的值 返回值? :讀出的數(shù)據(jù) ************************
23、*******************/ void Write_EEPROM(unsigned char Th,unsigned char Tl,unsigned char Register_Con ) { ? ??? DS18B20_Init(); ??? Write_OneByte_ToDS18b20(ROM_Skip_Cmd); ??? Write_OneByte_ToDS18b20(Write_Scratchpad); ??? ??? Write_OneByte_ToDS18b20(Th);//Th=7F ??? Write_OneByte_ToDS18b20(T
24、l);//Tl=FF 最高位符號位 ??? Write_OneByte_ToDS18b20(Register_Con);//12位模式 ??? ??? Delay_Nms(700); ??? DS18B20_Init(); ??? Write_OneByte_ToDS18b20(ROM_Skip_Cmd); ??? Write_OneByte_ToDS18b20(Copy_Scratchpad);//將寄存器的配置值寫入EEPROM ??? ??? Delay_Nms(300); ? } /***************************************
25、*** 函數(shù)名稱:DS18B20_Init 功??? 能:初始化DS18b20 參??? 數(shù):無 返回值? :無 *******************************************/ void DS18B20_Init(void) { ??? Tx_ResetPulse(); ??? Rx_PresencePulse(); } //=================================================================// //========================要用到的其他文件========
26、====================// //===========================Systick_Delay.h==========================// /*-------------------------------------------------- ???????????????? 利用SysTick進行精確定時 ---------------------------------------------------*/ #ifndef __SYSTICKDELAY_H #define __SYSTICKDELAY_H??????
27、#include "stm32f10x_lib.h" extern void Delay_Nms(u16 Nms); extern void Delay_Nus(u32 Nus); #endif? /*SYSTICKDELAY_H*/ //=================================================================// //=========================Systick_Delay.c============================// #include "stm32f10x_lib.h" #i
28、nclude "SysTick_Delay.h" //延時Nms //注意Nms的范圍 //Nms<=0xffffff*8/SYSCLK //對72M條件下,Nms<=1864 void Delay_Nms(u16 Nms) {??? ? SysTick->LOAD=(u32)Nms*9000; //給重裝載寄存器賦值,9000時,將產(chǎn)生1ms的時基 ? SysTick->CTRL|=0x01;?????????????? //開始倒數(shù)??? ? while(!(SysTick->CTRL&(1<<16)));?? //等待時間到達 ? SysTick->CTRL
29、=0X00000000;???????? //關(guān)閉計數(shù)器 ? SysTick->VAL=0X00000000;?????????? //清空計數(shù)器???? }?? //延時us?????????? void Delay_Nus(u32 Nus) { ? SysTick->LOAD=Nus*9;?????? //時間加載????? ? SysTick->CTRL|=0x01;??????????? //開始倒數(shù)??? ? while(!(SysTick->CTRL&(1<<16)));//等待時間到達 ? SysTick->CTRL=0X00000000;?????? //關(guān)閉計數(shù)器 ? SysTick->VAL=0X00000000;??????? //清空計數(shù)器???? }? //=================================================================// ? /*?? 寫得一般,希望大家能給點建議!? */
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2020年5月開學(xué)典禮PPT模板課件
- 一年級上冊語文-識字6《畫》課件-人教部編版
- 急性肺栓塞的觀察護理課件
- 一年級心理健康教學(xué)ppt課件-第4課--我和我的小伙伴
- 《春夜喜雨》ppt課件
- 八年級下《磁生電》優(yōu)秀課件浙教版1
- 人教版東晉南朝政局與江南地區(qū)的開發(fā)經(jīng)典課件
- 第三章-3.3 軸對稱與坐標變化
- 第9章 地面沉降的工程地質(zhì)研究
- 離騷-課件-人教版-必修二
- 實用外貿(mào)英語課件
- 人教版七年級下冊實數(shù)ppt課件
- 部編版小學(xué)三年級下冊語文期末復(fù)習(xí)——句子排序?qū)嵱眉记蓮?fù)習(xí)ppt課件
- 部編版一年級語文上冊語文園地五課件
- 神經(jīng)根型頸椎病中醫(yī)護理方案