|
DS18B20.H文件是溫度傳感器的驅(qū)動 大家可以另存為到硬盤下載到電腦
- /*把我一直珍藏的程序全部拿出來,給大家共享,這也讓我想起來,我剛學(xué)的時候,搜集資料是那么辛苦,而且找不到完整的資料,我將把我整理的和自己制作的H文件共享出來,只要修改定義端口,便可以隨意的調(diào)用,以后我還會慢慢完善我的C資料,也希望大家給我指出程序的漏洞和缺點(diǎn),已達(dá)到相互學(xué)習(xí)目地。*/
- #ifndef __DS18B20_H__
- #define __DS18B20_H__
- #include<intrins.h>
- #define uch unsigned char //給unsigned char 起別名 uch
- sbit DQ=P2^3;///////////////定義一個數(shù)據(jù)端口
- unsigned char TLV_ds=0 ; ///采集到的溫度高8 位
- unsigned char THV_ds=0; ////采集到的溫度低8 位
- unsigned char bwei_ds; /////整數(shù)百位
- unsigned char shwei_ds; ////整數(shù)十位
- unsigned char gwei_ds; /////整數(shù)個位
- unsigned char shfen_ds; ////十分位
- unsigned char bfen_ds; /////百分位
- //------------------------------------------------
- //延時函數(shù)
- void delay_ds(uch x,uch y) //誤差0,12M
- {
- uch a,b;
- for(b=x;b>0;b--)
- for(a=y;a>0;a--);
- }
- //-----------------------------------------------
- //復(fù)位DS18B20 函數(shù)
- void reset_ds(void)
- {
- char presence=1;
- while(presence)
- {
- DQ=0; //////////////////主機(jī)拉至低電平
- delay_ds(1,80); ///////延時大于480us
- DQ=1; //////////////////釋放總線等電阻拉高總線,并保持15~60us
- delay_ds(1,7); /////////延時20us
-
- if(DQ==1) presence=1; //沒有接收到應(yīng)答信號,繼續(xù)復(fù)位
- else presence=0; ///////接收到應(yīng)答信號
- delay_ds(1,64); ////////延時430us
- }
- }
- //-----------------------------------------------
- //寫18b20 寫字節(jié)函數(shù)
- void write_byte_ds(uch val_ds)
- {
- uch i;
- uch temp_ds;
- for(i=8;i>0;i--)
- {
- temp_ds=val_ds&0x01; //最低位移出
- DQ=0;
- if(temp_ds==1) DQ=1; //如果寫1,拉高電平
- delay_ds(1,11); ///////延時63us
- DQ=1;
- _nop_();
- _nop_(); //////////////延時6us
- val_ds=val_ds>>1; /////右移一位
- }
- }
- //------------------------------------------------
- //18b20 讀字節(jié)函數(shù)
- uch read_byte_ds(void)
- {
- uch i;
- uch value_ds=0; ///讀出溫度
- static bit j;//////靜態(tài)變量
- for(i=8;i>0;i--)
- {
- DQ=0; /////////拉低給脈沖信號
- value_ds>>=1;//右移并起到延時作用
- DQ=1; /////////拉至高電平
- _nop_(); /////延時6us等待響應(yīng)
- j=DQ;
- if(j) value_ds|=0x80;//寫入高電平
- delay_ds(1,11); ///////延時63us
- }
- return(value_ds);
- }
- //-------------------------------------------------
- //啟動溫度轉(zhuǎn)換函數(shù)
- void get_temp_ds()
- {
- int i=10;
- int T_ds;
- float tt;
- DQ=1;
- reset_ds(); ///////////復(fù)位等待從機(jī)應(yīng)答
- write_byte_ds(0XCC); //忽略ROM 匹配
- write_byte_ds(0X44); //發(fā)送溫度轉(zhuǎn)化命令
- while(i--)
- {
- delay_ds(50,100); //確保溫度轉(zhuǎn)換完成所需要的時間
- }
- reset_ds(); /////////////再次復(fù)位,等待從機(jī)應(yīng)答
- write_byte_ds(0XCC); ////忽略ROM 匹配
- write_byte_ds(0XBE); ////發(fā)送讀溫度命令
- TLV_ds=read_byte_ds(); //讀出溫度低8
- THV_ds=read_byte_ds(); //讀出溫度高8 位
- DQ=1;////////////////////釋放總線
- T_ds=THV_ds;////////寫入高八位
- T_ds<<=8;///////////高八位上移
- T_ds=T_ds|TLV_ds;///寫入低八位
- tt=T_ds*0.0625;/////直接計算,單位萬分之一度
- T_ds= tt*100+0.5; //可校準(zhǔn),單位0.01度
-
- bwei_ds=T_ds/10000;////////顯示百位
- shwei_ds=T_ds%10000/1000;//顯示十位
- gwei_ds=T_ds%1000/100;/////顯示個位
- shfen_ds=T_ds%100/10;//////顯示十分位
- bfen_ds=T_ds%10;///////////顯示百分位
- }
- #endif
復(fù)制代碼
調(diào)用方法研究:http://www.torrancerestoration.com/bbs/dpj-218922-1.html
|
|