?? ds18b20.c
字號:
/*********************************************************************/
//讀取DS18B20溫度,通過數(shù)碼管顯示,在溫度超過35度時繼電器吸合
/*********************************************************************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar a,b,c;
sbit DQ = P2^7;
void delay(uint x)
{
while(x--);
}
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ復(fù)位
delay(8); //稍做延時
DQ = 0; //單片機(jī)將DQ拉低
delay(80); //精確延時 大于 480us
DQ = 1; //拉高總線
delay(14);
x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
delay(20);
}
/******************************從18B20中讀一個字節(jié)****************************/
uchar Read_OneChar(void)
{
uchar i = 0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat >>= 1;
DQ = 1; // 給脈沖信號
if(DQ)
dat |= 0x80;
delay(8);
}
return(dat);
}
/******************************向18B20中寫一個字節(jié)****************************/
void Write_OneChar(uchar dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(10);
DQ = 1;
dat >>= 1;
}
delay(8);
}
/***********************************讀取溫度**********************************/
uchar Read_Temperature(void)
{
uchar i = 0,t = 0;
Init_DS18B20();
Write_OneChar(0xcc); // 跳過讀序號列號的操作
Write_OneChar(0x44); // 啟動溫度轉(zhuǎn)換
Init_DS18B20();
Write_OneChar(0xcc); //跳過讀序號列號的操作
Write_OneChar(0xbe); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
a = Read_OneChar(); //讀取溫度值低位
b = Read_OneChar(); //讀取溫度值高位
c = 0x0f & a; //得到小數(shù)部分
a = a >> 4; //低位右移4位
b = b << 4; //高位左移4位
t = a | b; //得到8位溫度的整數(shù)部分,最高為符號位
return(t);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -