數字式溫度計的設計DS18B20整體設計?

數字式溫度計的設計DS18B20整體設計

一、設計任務與指標

1.用DS18B20設計一款能夠顯示當前溫度值的溫度計;

2.通過切換按鈕可以切換華氏度和攝氏度顯示;

3.通過按鍵設定上限和下限溫度值,超限後聲音報警;

二、元件要求

1、利用數字溫度感測器DS18B20與微控制器結合來測量溫度。

2、利用數字溫度感測器DS18B20

3、測量溫度訊號,計算後在LED數碼管上顯示相應的溫度值。

三、溫度測量範圍

1、其溫度測量範圍為−55℃~125℃,精確到0.5℃;

2、實現超限報警。

四、實驗程式

#include

#defineuint unsigned int

#defineuchar unsigned char//必須的標頭檔案

sbitDQ=P3^7;

sbitbeep=P3^6;

sbitdn=P1^7; //小數點

sbitk=P3^0; //攝氏度與華氏度轉換

sbitshang=P3^1;//上限溫度調節

sbitxia=P3^5; //下限溫度調節

sbitm=P3^2; //溫度加

sbitn=P3^3; //溫度減

sbitdanwei=P2^0;

sbitxshuwei=P2^1;

sbitgewei=P2^2;

sbitshiwei=P2^3;

sbitbaiwei=P2^4;

sbitfuwei=P2^5;

sbitled1=P0^0;

sbitled2=P0^1;

sbitled3=P0^2;

uinttemp;

ucharbai,shi,ge,xshu,y,x;

uintmin=100,max=300,fu;

ucharcode table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

voiddelay_ms(uint z)

{

uchar i,j;

for(;z>0;z--)

for(i=142;i>0;i--)

for(j=2;j>0;j--);

}

voiddelay1(uint u)

{

while(u--);

}

voidbeepfun() //蜂鳴器

{

beep=0;

}

voidds18b20_init() //18b20初始化

{

uchar presence;

DQ=1;

delay1(8);

DQ=0;

delay1(80);

DQ=1;

delay1(8);

presence=DQ;

delay1(4);

DQ=1;

}

voidwrite_byte(uchar date) //寫一個位元組

{

uchar i;

for(i=8;i>0;i--)

{

DQ=0;

DQ=date&0x01;//送最低位的數

delay1(4);

DQ=1;

date>>=1;//資料右移

}

delay1(4);

}

ucharread_byte() //讀一個位元組

{

uchar i,value;

for(i=8;i>0;i--)

{

DQ=0;

value>>=1;//資料右移,放在這延時

DQ=1;

if(DQ) //開始讀資料

value=value 0x80;

delay1(4);

}

return value;

}

ucharreadtemperature() //讀出溫度

{

uchar a,b,c,tt;

ds18b20_init();

write_byte(0xcc);//跳過rom

write_byte(0x44);//啟動18b20

delay_ms(10);

ds18b20_init();

write_byte(0xcc);

write_byte(0xbe);

a=read_byte();

b=read_byte();

b<<=4 ;

b+=(a&0xf0)>>4;

c=b;

tt=a&0x08;

if((b&0x80)==0x80)//負數取反加一

{

fu=1;

c=0xff-c;

tt=0xff-tt;

tt=tt+1;

}

else fu=0;

if(tt<8)x=0;

else x=5 ;

temp=c*10;

if(fu)if(tt<8)x=5;

else x=0 ;

return temp;

}

voiddisplay()

{

if(k==0)delay_ms(5);

if(!k)

{ if(fu)temp=(320-(temp)*1.8)/10;

else temp=(temp*1.8+320)/10;//攝氏度與華氏度轉換

bai=table[temp/100];

shi=table[temp/10%10];

ge=table[temp%10];

xshu=table[x];

danwei=0;

P1=0x71;//顯示單位 F

delay_ms(5);

danwei=1;

xshuwei=0;

P1=xshu;

delay_ms(5);

xshuwei=1;

gewei=0;

P1=ge;

dn=1;

delay_ms(5);

gewei=1;

shiwei=0;

P1=shi;

delay_ms(5);

shiwei=1;

if(bai!=0x3f)

{

baiwei=0;

P1=bai;

delay_ms(5);

baiwei=1;

}

else {;}

if(fu)

{

fuwei=0;

P1=0x40;

delay_ms(5);

fuwei=1;

}

}

if(k)

{

bai=table[temp/1000];

shi=table[temp/100%10];

ge=table[temp/10%10];

xshu=table[x];

danwei=0;//顯示單位 C

P1=0x39;

delay_ms(5);

danwei=1;

xshuwei=0;

P1=xshu;

delay_ms(5);

xshuwei=1;

gewei=0;

P1=ge;

dn=1;

delay_ms(5);

gewei=1;

if(shi!=0x3f)

{

shiwei=0;

P1=shi;

delay_ms(5);

shiwei=1;

}

else{;}

if(bai!=0x3f)

{

baiwei=0;

P1=bai;

delay_ms(5);

baiwei=1;

}

if(fu)

{

if(bai==0x3f) baiwei=0;

if(shi==0x3f) shiwei=0;

if(bai!=0x3f) fuwei=0;

P1=0x40;

delay_ms(5);

baiwei=1;

fuwei=1;

shiwei=1;

}

}

}

voidtiaojie()

{

uint i=100;

while(i--)

{

if(shang==0)temp=max;

if(xia==0)temp=min;

display();

}

}

voidINT_0() interrupt 0

{

EX0=0;

delay_ms(20);

EX0=1;

if(shang==0)max=max+10;

if(xia==0)min=min+10;

}

voidINT_1() interrupt 2

{

EX1=0;

delay_ms(20);

EX1=1;

if(shang==0)max=max-10;

if(xia==0)min=min-10;

}

voidmain()

{

EA=1;

EX0=1;

EX1=1;

IT0=1;

IT1=1;

P1=0;

while(1)

{

if((shang==0) (xia==0))tiaojie();

if(shang!=0&&xia!=0)

{

readtemperature();

if((temp max))

{

if(!fu)beep=0;

if(temp

if(temp>max){led3=1;led1=0;led2=1;}

}

else { beep=1;

led3=1;led1=1;led2=0; }

display();

}

}

}

相關問題答案