給你一個例程參考
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P2^2; //單總線端口定義
uchar flag1; //正或負標記
sbit dula=P2^6; //段選
sbit wela=P2^7; //位選
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,//0~f數組
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,//0~9帶小數點數組
0x87,0xff,0xef};
/************DS18B20操作程序聲明****************/
void dsreset(); //復位和初始化
bit tmpreadbit(); //讀1位數據
uchar tmpread(); //讀取一個字節數據
void tmpwritebyte(uchar dat); //寫一個字節
void tmpchange(); //發送操作指令
uint tmp(); //讀取溫度值
/************顯示程序聲明****************/
void display(uint temp); //數碼管顯示程序
/************延時程序聲明****************/
void delay(uchar k); //50us延時程序
void delay1ms(uint k); //1ms延時程序
/************主程序****************/
void main()
{
tmpchange(); //初始化DS18B20
delay1ms(1000); //延時1s等待穩定
while(1)
{
tmpchange(); //發送操作指令
display(tmp()); //數碼管顯示讀到的溫度數據
}
}
//初始化DS18B20
//讓DS18B20一段相對長時間低電平, 然后一段相對非常短時間高電平, 即可啟動
void dsreset() //復位和初始化
{
uint i; //用作短延時的計數變量
DS=0; //發送低電平
i=103; //賦值
while(i>0)i--; //相對長時間低電平896us
DS=1; //發送高電平
i=4; //賦值
while(i>0)i--; //相對非常短時間高電平38us
}
//向DS18B20讀取一位數據
//讀一位, 讓DS18B20一小周期低電平, 然后兩小周期高電平,
//之后DS18B20則會輸出持續一段時間的一位數據
bit tmpreadbit() //讀1位數據
{
uint i; //用作短延時的計數變量
bit dat; //位變量
DS=0; //發送低電平
i++; //少許延時
DS=1; //發送高電平
i++;i++; //執行一個i++;3.25us
dat=DS; //讀1位數據
i=8;
while(i>0)i--;//短延時
return (dat); //返回dat值
}
//讀取一個字節數據, 通過調用tmpreadbit()來實現
uchar tmpread() //讀取一個字節數據
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();//按位分8次讀取一個字節數據
//最先讀出的是最低位數據
dat=(j<<7)|(dat>>1); //讀出的數據最低位在最前面,這樣剛好一個字節在dat里
}
return(dat); //返回dat值
}
//向DS18B20寫入一個字節數據
void tmpwritebyte(uchar dat) //寫一個字節
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++) //一個字節分8次按位寫入
{
testb=dat&0x01;//把dat最低位賦值與testb
dat=dat>>1; //dat左移一位
//寫"1", 讓低電平持續2個小延時, 高電平持續8個小延時
if(testb) //寫 1
{
DS=0;
i++;i++;
DS=1;
i=8;
while(i>0)
i--;
}
else
{
DS=0; //寫 0
i=8;
while(i>0)
i--;
DS=1;
i++;i++;
}
}
}
//向DS18B20發送溫度轉換命令
void tmpchange() //發送溫度轉換命令
{
dsreset(); //復位和初始化
delay(1); //延時
tmpwritebyte(0xcc); //寫入跳過序列號命令字
tmpwritebyte(0x44); //寫入溫度轉換命令字
}
uint tmp() //讀取溫度值
{
float tt; //單精度浮點型數據變量
uint temp; //變量溫度
uchar a,b;
dsreset(); //發送復位和初始化命令
delay(1);
tmpwritebyte(0xcc); //寫入跳過序列號命令字
tmpwritebyte(0xbe); //寫入讀取數據令字
//連續讀取兩個字節數據
a=tmpread();
b=tmpread();
temp=b;
temp<<=8; //兩個字節組成一個整型變量
temp=temp|a;
//DS18B20的精確度為0.0625度, 即讀回數據的最低位代表0.0625度
tt=temp*0.0625;
//將它放大10倍, 使顯示時可顯示小數點后一位, 并對小數點后第二2進行4舍5入
//如t=11.0625, 進行計數后, 得到value = 111, 即11.1 度
temp=tt*10+0.5;
return temp; //返回3位有效數
}
//顯示當前溫度值, 精確到小數點后一位
void display(uint temp) //顯示程序
{
static uchar count=0;
switch(count)
{
case 0:
dula=0;
P0=table[temp/100]; //顯示十位
dula=1;
dula=0;
wela=0;
P0=0x7e;
wela=1;
wela=0;
count=1;
break;
case 1:
dula=0;
P0=table1[temp/10%10]; //顯示個位
dula=1;
dula=0;
wela=0;
P0=0x7d;
wela=1;
wela=0;
count=2;
break;
case 2:
P0=table[temp%10]; //顯示1/10位
dula=1;
dula=0;
P0=0x7b;
wela=1;
wela=0;
count=0;
break;
}
}
void delay(uchar k) //11.0592MHz 50us延時
{
uchar a,b;
for(b=k;b>0;b--)
for(a=43;a>0;a--);
}
void delay1ms(uint k) //11.0592MHz 1ms延時
{
uint i,j;
for(i=k;i>0;i--)
for(j=114;j>0;j--);
} |