?? 1602 ds1302 18b20-=-
字號:
/*******************DS18B20測溫程序******************************************
運行結果會在函數ReadTemperature()保存兩位十進制數字的溫度值
調用時,要這樣:
uchar temp; 設定一個無符號變量temp
temp=ReadTemperature(); 變量temp=函數值=二位數的溫度值
然后可以用temp參與顯示工作。
***************************************************************************/
/*********************************端口定義**********************************/
sbit DQ=P3^3; //數據傳輸線接單片機的相應的引腳
/*********************************定義全局變量******************************/
unsigned char tempL=0; //臨時變量低位(無符號字符變量)
unsigned char tempH=0; //臨時變量高位
unsigned char tempa; //溫度值(整型變量)
/****************************************************************************
函數功能:延時子程序
入口參數:k
出口參數:
****************************************************************************/
void DS18_delay(int useconds)
{
int s;
for (s=0; s<useconds;s++);
}
/***************************************************************************
函數功能:DS18B20初始化子程序
入口參數:
出口參數:
****************************************************************************/
unsigned char Init_DS18B20(void)
{
unsigned char x=0;
DQ=0; //發送復位脈沖
DS18_delay(29); //延時(>480ms)
DQ=1; //拉高數據線
DS18_delay(3); //等待(15~60ms) 等待存在脈沖
x=DQ; //獲得存在信號(用于判斷是否有器件)
DS18_delay(25); // 等待時間隙結束
return(x); //返回存在信號,0 = 器件存在, 1 = 無器件
}
/****************************************************************************
函數功能:向DS18B20讀一字節數據
入口參數:
出口參數:dat
****************************************************************************/
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat=0;
for (i=8;i>0;i--)
{
DQ=1;
DS18_delay(1);
DQ=0;
dat>>=1;//復合賦值運算,等效dat=dat>>1(dat=dat右移一位后的值)
DQ=1;
if(DQ)
dat|=0x80;
DS18_delay(4);
}
return(dat);
}
/****************************************************************************
函數功能:向DS18B20寫一字節數據
入口參數:dat
出口參數:
****************************************************************************/
WriteOneChar(unsigned char dat)//有參函數,功能是"寫",而寫的內容就是括號內的參數
{
unsigned char i=0;
for(i=8;i>0;i--)
DQ=0;
DQ=dat&0x01;
DS18_delay(5);
DQ=1;
dat>>=1;//復合賦值運算,等效dat=dat>>1(dat=dat右移一位后的值)
}
DS18_delay(4);
}
/****************************************************************************
函數功能:向DS18B20讀溫度值
入口參數:
出口參數:temperature
****************************************************************************/
unsigned int ReadTemperature(void)
{
Init_DS18B20(); //初始化,調用初始化函數
WriteOneChar(0xcc); //跳過讀序列號的操作,調用寫函數,寫0xcc指令碼(跳過讀序列號)
WriteOneChar(0x44); //啟動溫度轉換,調用寫函數,寫0x44指令碼(啟動溫度轉換)
DS18_delay(125); //轉換需要一點時間,延時
Init_DS18B20(); //初始化,調用初始化函數
WriteOneChar(0xcc); //跳過讀序列號的操作,調用寫函數,寫0xcc指令碼(跳過讀序列號?
WriteOneChar(0xbe); //調用寫函數,寫0xbe指令碼,讀溫度寄存器(頭兩個值分別為溫度的低位和高位)
tempL=ReadOneChar(); //讀出溫度的低位LSB
tempH=ReadOneChar(); //讀出溫度的高位MSB
//tempH&=0x0f;//高字節和0f"與"運算,留住后4位有用值,賦給tempH
tempa=((tempH*256)+tempL)*0.0625; //溫度轉換,把高低位做相應的運算轉化為實際溫度,使用DS18B20溫度傳感器手冊規定的公式,結果是十進制數值
DS18_delay(20);
return(tempa);//運算結果返回到函數 :ReadTemperature()調用時需要采用i=ReadTemperature(),然后再對i(任意uchar型變量)進行操作
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -