數字式溫度計的設計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
{
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();
}
}
}