軟件設計:
有兩個文件,DS18B20.c和DS18B20。只需將這兩個文件添加到項目中。
DS18B20.c:
/******************************************************************
程序名稱:DS18B20溫度測量及報警系統
描述:DS18B20溫度計,溫度測量範圍是0~99.9攝氏度。
可以設置上限報警溫度和下限報警溫度。
即高於上限或低於下限時蜂鳴器報警。
默認報警溫度上限為32℃,默認報警溫度下限為10℃
報警值可在範圍內設置:最低報警上限值等於當前報警下限值。
最大和最小報警值等於當前最大報警值。
當下限報警值設置為0時,關閉下限報警功能。
******************************************************************/
#包含?& ltAT89X52.h & gt
#包含?“DS18B20.h”?
#定義?uint?未簽名?(同Internationalorganizations)國際組織
#定義?烏恰爾?未簽名?夏爾?//宏定義
#定義?SETP3_1//定義調節鍵。
#定義?DECP3_2//定義減少鍵
#定義?ADDP3_3//定義添加鍵。
#定義?嗶?P3_7//定義蜂鳴器
#定義?JDQ?P3_5?
比特?山碩_ st//閃爍的間隔標記
比特?beep _ st?//蜂鳴器間隔符號
sbit?典?=?p2^7;//小數點
烏恰爾?x = 0;//計數器
簽了?夏爾?m;?//溫度值全局變量
烏恰爾?n;//溫度值全局變量
烏恰爾?set _ ST = 0;?//狀態標誌
簽了?夏爾?上弦= 70;//報警溫度上限,默認值為70。
簽了?夏爾?夏縣= 0;?//報警溫度下限,默認值為0。
烏恰爾?codeLEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x ff };
/* * * *延遲子程序* * * *
作廢?延遲(uint?數字)
{
而(?- num?);
}
作廢?shortdelay()(void)?//錯誤?0我們
{
未簽名?夏爾?甲、乙、丙;
for(c = 165;c & gt0;c -)
for(b = 100;b & gt0;b -)
for(a = 150;a & gt0;a-);
_ nop _//如果?凱爾,要求什麽?使用?intrins.h
_ nop _//如果?凱爾,要求什麽?使用?intrins.h
}
/* * * *初始化定時器0 * * * */
作廢?InitTimer(void)
{
TMOD = 0x 1;
TH0 = 0x3c
TL0 = 0xb0?//50毫秒(晶體振蕩器12M)
}
/* * * *定時器0中斷服務程序* * * */
作廢?定時器0(void)?打斷?1
{
TH0 = 0x3c
TL0 = 0xb0
x++;
}
/* * * *外部中斷0服務程序* * * */
作廢?int0(void)?打斷?0
{
EX0 = 0;//關閉外部中斷0
if(DEC = = 0 & amp;& ampset_st==1)
{
尚賢-;
如果(尚賢& lt夏縣)尚縣=夏縣;
}
不然呢?if(DEC = = 0 & amp;& ampset_st==2)
{
夏縣-;
如果(夏縣& lt0)夏縣= 0;
}
}
/* * * *外部中斷1服務程序* * * */
作廢?int1(void)?打斷?2
{
ex 1 = 0;//關閉外部中斷1
if(ADD = = 0 & amp;& ampset_st==1)
{
尚賢++;
如果(尚賢& gt99)上弦= 99;
}
不然呢?if(ADD = = 0 & amp;& ampset_st==2)
{
夏縣++;
if(夏縣& gt尚賢)夏賢=尚賢;
}
}
/* * * *讀數溫度* * * */
作廢?支票_杜文(無效)
{
uint?甲、乙、丙;
c = read temperature()-5;//獲取溫度值,減去DS18B20的溫漂誤差。
a = c/100;?//計算得到十位數。
b = c/10-a * 10;//計算得到個位數。
m = c/10;//計算得到整數位。
n = c-a * 100-b * 10;//計算得到小數位
如果(m & lt0){ m = 0;n = 0;}?//設置溫度顯示的上限
如果(m & gt99){ m = 99;n = 9;}?//設置溫度顯示的上限
}
/* * * * * *顯示啟動初始化等待屏幕* * * */
Disp_init()
{
P2?=?0xbf//顯示-
P1?=?0xf7
延遲(200);
P1?=?0xfb
延遲(200);?
P1?=?0xfd
延遲(200);
P1?=?0xfe
延遲(200);
P1?=?0xff?//關閉顯示器
}
/* * * *顯示溫度子程序* * * */
Disp_Temperature()?//顯示溫度
{
P2?= 0xc6//顯示c
P1?=?0xf7
延遲(300);
P2?= led data[n];//顯示單位
P1?=?0xfb
延遲(300);
P2?= led data[m % 10];//顯示十位數
典?=?0;?//顯示小數點
P1?=?0xfd
延遲(300);
P2?= led data[m/10];//顯示百位數
P1?=?0xfe
延遲(300);
P1?=?0xff?//關閉顯示器
}
/* * * *顯示報警溫度子程序* * * */
Disp_alarm(uchar?保靖)
{
P2?= 0xc6//顯示c
P1?=?0xf7
延遲(200);
P2?= led data[保靖% 10];?//顯示十位數
P1?=?0xfb
延遲(200);
P2?= led data[Bao Jing/10];?//顯示百位數
P1?=?0xfd
延遲(200);
if(set_st==1)P2?= 0x89
不然呢?如果(set_st==2)P2?= 0xc7?//標註上限H和下限L。
P1?=?0xfe
延遲(200);
P1?=?0xff?//關閉顯示器
}
/* * * *報警子程序* * * *
作廢?警報()
{
if(x & gt;= 10){ beep _ ST = ~ beep _ ST;x = 0;}
如果((m & gt=尚賢& amp& ampbeep _ ST = = 1)| |(m & lt;夏縣& amp& ampBEEP _ ST = = 1))BEEP = 0;
不然呢?嗶聲= 1;
如果((m & gt=尚賢)| |(m & lt;夏縣))
{ short delay()();
JDQ = 0;}
不然呢?JDQ = 1;
}
/* * * *主要功能* * * */
作廢?主要(無效)
{
uint?z;
init timer();//初始化計時器
EA = 1;//全局中斷開關
TR0 = 1;
ET0 = 1;//啟動定時器0
IT0 = 1;
it 1 = 1;
檢查_杜文();
檢查_杜文();
for(z = 0;z & lt300;z++)
{
disp _ init();
}
while(1)
{
if(SET==0)
{
延遲(2000年);
do { } while(SET = = 0);
set _ st++;x = 0;山朔_ ST = 1;
if(set _ ST & gt;2)set _ ST = 0;
}
if(set_st==0)
{
EX0 = 0;//關閉外部中斷0
ex 1 = 0;//關閉外部中斷1
檢查_杜文();
disp _ Temperature();
alarm();?//報警檢測
}
不然呢?if(set_st==1)
{
嗶聲= 1;//關閉蜂鳴器
EX0 = 1;//打開外部中斷0
ex 1 = 1;//打開外部中斷1
if(x & gt;= 10){山朔_ st = ~山朔_ ST;x = 0;}
if(山碩_st)?{Disp_alarm(尚賢);}
}
不然呢?if(set_st==2)
{
嗶聲= 1;//關閉蜂鳴器
EX0 = 1;//打開外部中斷0
ex 1 = 1;//打開外部中斷1
if(x & gt;= 10){山朔_ st = ~山朔_ ST;x = 0;}
if(山碩_st)?{Disp_alarm(夏縣);}
}
}
}
/* * * * * *結束*****/
DS18B20.h:
#包含?& ltAT89X52.h & gt
#defineDQP3_6?//定義DS18B20總線I/O。
/* * * *延遲子程序* * * *
作廢?Delay_DS18B20(int?數字)
{
while(num -)?;
}
/* * * * * *初始化DS18B20*****/ * * */
作廢?Init_DS18B20(void)
{
未簽名?夏爾?x = 0;
DQ?=?1;?//DQ復位
delay _ ds 18b 20(8);//有點延遲
DQ?=?0;?//單片機拉低DQ。
delay _ ds 18b 20(80);?//精確延遲,大於480us
DQ?=?1;?//拉高總線
delay _ ds 18b 20(14);
x?=?DQ;?//稍微延遲後,如果x=0,初始化成功,如果x=1,初始化失敗。
delay _ ds 18b 20(20);
}
/* * * *讀取壹個字節* * * */
未簽名?夏爾?ReadOneChar(void)
{
未簽名?夏爾?I = 0;
未簽名?夏爾?dat?=?0;
為了什麽?(I = 8;我& gt0;我-)
{
DQ?=?0;?//?脈沖信號
dat & gt& gt=1;
DQ?=?1;?//?脈沖信號
if(DQ)
dat | = 0x80
delay _ ds 18b 20(4);
}
return(dat);
}
/* * * *寫壹個字節* * * */
作廢?WriteOneChar(無符號?夏爾?dat)
{
未簽名?夏爾?I = 0;
為了什麽?(I = 8;?我& gt0;?我-)
{
DQ?=?0;
DQ?=?dat & amp0x 01;
delay _ ds 18b 20(5);
DQ?=?1;
dat & gt& gt=1;
}
}
/* * * *讀數溫度* * * */
未簽名?int?讀取溫度(無效)
{
未簽名?夏爾?a = 0;
未簽名?夏爾?b = 0;
未簽名?int?t = 0;
浮動?TT = 0;
init _ ds 18b 20();
WriteOneChar(0x cc);//跳過讀取序列號和列號。
WriteOneChar(0x 44);//開始溫度轉換
init _ ds 18b 20();
WriteOneChar(0x cc);//跳過讀取序列號和列號。
WriteOneChar(0x be);//讀取溫度寄存器
a = ReadOneChar();?//讀取低8位
b = ReadOneChar();//讀取高8位
t = b;
t & lt& lt=8;
t = t | a;
TT = t * 0.0625;
t=?TT * 10+0.5;?//將輸出放大10倍,四舍五入。
返回(t);
}
/* * * * * *結束*****/
在控制部分,我用的是5V繼電器,可以直接控制妳的電機。?
兩個電路圖差不多,但是我的有幾個調節按鈕,報警溫度可以調節。您可以在您的電路中使用該程序。