當前位置:編程學習大全網 - 編程語言 - 請教單片機的溫度控制程序

請教單片機的溫度控制程序

我在10做過壹個類似的,也是報警控制的。請從中吸取教訓:

軟件設計:

有兩個文件,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繼電器,可以直接控制妳的電機。?

兩個電路圖差不多,但是我的有幾個調節按鈕,報警溫度可以調節。您可以在您的電路中使用該程序。

  • 上一篇:2021安徽省合肥市廬江縣城區高中面向高校招聘22名教師公告 ?
  • 下一篇:簡單的木馬怎麽編寫啊?
  • copyright 2024編程學習大全網