/* * * * * * * * * DS18B20延遲子功能(晶體振蕩器12Mhz) * * * * * */
# include & ltreg 51 . h & gt;
sbit dq=p1^2;
#定義uchar無符號字符
void delay_18B20(無符號整數I)
{
while(I-);
}
/* * * * * * * * * * ds 18b 20初始化功能* * * * * * * * * * * * * * * * * *
void Init_DS18B20(void)
{
無符號字符x = 0;
DQ = 1;//DQ復位
delay _ 18b 20(8);//有點延遲
DQ = 0;//單片機拉低DQ。
delay _ 18b 20(80);//精確延時大於480us。
DQ = 1;//拉高總線
delay _ 18b 20(4);
x = DQ;//稍微延遲後,如果x=0,初始化成功;如果x=1,初始化失敗。
delay _ 18b 20(20);
}
/* * * * * * * * DS 18b 20讀取壹個字節* * * * * * * * * * *
無符號字符ReadOneChar(void)
{
uchar I = 0;
uchar dat = 0;
for(I = 8;我& gt0;我-)
{
DQ = 0;//給出脈沖信號
dat & gt& gt=1;
DQ = 1;//給出脈沖信號
if(DQ)
dat | = 0x80
delay _ 18b 20(4);
}
return(dat);
}
/* * * * * * * * * * ds 18b 20寫壹個字節* * * * * * * * * * * *
void WriteOneChar(uchar dat)
{
無符號字符I = 0;
for(I = 8;我& gt0;我-)
{
DQ = 0;
DQ =日期與時間;0x 01;
delay _ 18b 20(5);
DQ = 1;
dat & gt& gt=1;
}
}
/* * * * * * * * * * * *讀取ds18b20的當前溫度* * * * * * * *
讀取溫度(void)
{ float val
uchar temp_value,value;
無符號字符a = 0;
無符號字符b = 0;
無符號字符t = 0;
init _ ds 18b 20();
WriteOneChar(0x cc);//跳過讀取序列號和列號。
WriteOneChar(0x 44);//開始溫度轉換
delay _ 18b 20(100);//這個消息非常重要
init _ ds 18b 20();
WriteOneChar(0x cc);//跳過讀取序列號和列號。
WriteOneChar(0x be);//讀取溫度寄存器(* * *可以讀取9個寄存器),前兩個是溫度。
delay _ 18b 20(100);
a = ReadOneChar();//讀取低溫值
b = ReadOneChar();//讀取高溫值
temp_value=b<& lt4;
temp _ value+=(a & amp;0xf0)>& gt4;
價值= a & amp0x0f
val =臨時值+值;
返回(val);
}
以上是DS18B20的驅動。然後直接在主程序中調用函數。
以上是主程序中的調用,看看關於溫度的就知道了。
#包含" reg51.h "
#包含“18b20.h”
#定義uchar無符號字符
#定義uint無符號整數
uchar碼表[]= "歡迎光臨";//初始化日期和星期
uchar碼表1[]= "我們的系統!";//初始化時間
uchar代碼table2[]= "溫度為:";//初始化時間
//下面三個是定義LCD的管腳。
sbit lcden=p2^2;
sbit lcdwrite=p2^1;
sbit lcdrs=p2^0;
夏爾·杜文;
//延遲程序
無效延遲(單位z)
{ uint x,y;
for(x = z;x & gt0;x -)
for(y = 110;y & gt0;y-);
}
//lcd的寫指令
void write_com(uchar com)
{
LCD RS = 0;
LC den = 0;
P0 = com
延遲(5);
LC den = 1;
延遲(5);
LC den = 0;
}
//寫入//lcd的數據
void write_data(uchar da)
{ lcdrs = 1;
LC den = 0;
P0 = da
延遲(5);
LC den = 1;
延遲(5);
LC den = 0;
}
//初始化
void初始化()
{
uchar編號;
LCD write = 0;
LC den = 0;
write _ com(0x 38);//16*2顯示,5*7點陣,8位數據
write _ com(0x0c);//打開和關閉顯示光標。
write _ com(0x 06);//移動光標
write _ com(0x 01);//清除LCD的顯示內容。
write _ com(0x 80);
for(num = 0;num & lt10;num++)
{
write _ data(table[num]);
延遲(5);
}
write _ com(0x 80+0x 40);
for(num = 0;num & lt11;num++)
{
write _ data(table 1[num]);
延遲(5);
}
}
無效寫入_杜文(uchar add,char da)
{
烏恰爾史、葛;
石= da/10;
ge = da % 10;
write _ com(0x 80+0x 40+add);
write _ data(0x 30+Shi);
write _ data(0x 30+ge);
}
//主函數
void main()
{
uchar編號;
init();
延遲(2000年);
延遲(2000年);
延遲(2000年);
write _ com(0x 01);//清除LCD的顯示內容。
while(1)
{
write _ com(0x 80);
for(num = 0;num & lt15;num++)
{
write _ data(table 2[num]);
延遲(5);
}
杜文= ReadTemp();
寫_杜文(2,杜文);
}
}