新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > #單片機#ds18b20 單位轉(zhuǎn)換 30度報警

#單片機#ds18b20 單位轉(zhuǎn)換 30度報警

作者: 時間:2016-11-27 來源:網(wǎng)絡 收藏
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit DSPORT=P3^7;
sbit key3 = P3^2;
sbit beep = P1^0;
uchar flag;
int tmp;
float t;
uint warn_d = 300; //溫度上限值,溫度為乘10之后的值
uchar code table[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void Delay1ms(unsigned int y)
{
unsigned int x;
for(y;y>0;y--)
for(x=110;x>0;x--);
}
unsigned char Ds18b20Init()
{
unsigned int i;
DSPORT=0; //將總線拉低480us~960us
i=70;
while(i--);//延時642us
DSPORT=1;//然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低
i=0;
while(DSPORT)//等待DS18B20拉低總線
{
i ;
if(i>5000)//等待>5MS
return 0;//初始化失敗
}
return 1;//初始化成功
}
void Ds18b20WriteByte(unsigned char dat)
{
unsigned int i,j;
for(j=0;j<8;j )
{
DSPORT=0;//每寫入一位數(shù)據(jù)之前先把總線拉低1us
i ;
DSPORT=dat&0x01; //然后寫入一個數(shù)據(jù),從最低位開始
i=6;
while(i--); //延時68us,持續(xù)時間最少60us
DSPORT=1;//然后釋放總線,至少1us給總線恢復時間才能接著寫入第二個數(shù)值
dat>>=1;
}
}
unsigned char Ds18b20ReadByte()
{
unsigned char byte,bi;
unsigned int i,j;
for(j=8;j>0;j--)
{
DSPORT=0;//先將總線拉低1us
i ;
DSPORT=1;//然后釋放總線
i ;
i ;//延時6us等待數(shù)據(jù)穩(wěn)定
bi=DSPORT; //讀取數(shù)據(jù),從最低位開始讀取
byte=(byte>>1)|(bi<<7);
i=4;//讀取完之后等待48us再接著讀取下一個數(shù)
while(i--);
}
return byte;
}
void Ds18b20ChangTemp()
{
Ds18b20Init();
Delay1ms(1);
Ds18b20WriteByte(0xcc);//跳過ROM操作命令
Ds18b20WriteByte(0x44); //溫度轉(zhuǎn)換命令
}
void Ds18b20ReadTempCom()
{
Ds18b20Init();
Delay1ms(1);
Ds18b20WriteByte(0xcc); //跳過ROM操作命令
Ds18b20WriteByte(0xbe); //發(fā)送讀取溫度命令
}
int Ds18b20ReadTemp()
{
int temp=0;
unsigned char tmh,tml;
Ds18b20ChangTemp(); //先寫入轉(zhuǎn)換命令
Ds18b20ReadTempCom();//然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
tml=Ds18b20ReadByte();//讀取溫度值共16位,先讀低字節(jié)
tmh=Ds18b20ReadByte();//再讀高字節(jié)
temp=tmh;
temp<<=8;
temp|=tml;
return temp;
}
void Display(int temp) //顯示
{
unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
float tp;
if(temp< 0)//當溫度值為負數(shù)
{
//因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*10 0.5;
//留兩個小數(shù)點就*100, 0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
//后面的數(shù)自動去掉,不管是否大于0.5,而 0.5之后大于0.5的就是進1了,小于0.5的就
//算加上0.5,還是在小數(shù)點后面。
}
else
{
tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
//如果溫度是正的那么,那么正數(shù)的原碼就是補碼它本身
temp=tp*0.0625*10 0.5;
//留兩個小數(shù)點就*100, 0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
//后面的數(shù)自動去掉,不管是否大于0.5,而 0.5之后大于0.5的就是進1了,小于0.5的就
//算加上0.5,還是在小數(shù)點后面。
}
datas[0] = temp / 100;
datas= temp % 100 / 10;
datas= temp % 10;
P0=0xff;
P0 = table[datas[0]];
P2 = 0xfd;
Delay1ms(1);
P0=0xff;
P0 = table[datas] & 0x7f;
P2 = 0xfb;
Delay1ms(1);
P0=0xff;
P0 = table[datas];
P2 = 0xf7;
Delay1ms(1);
}
void Exter_Init()
{
EX0=1; //打開外部中斷
EA=1; //打開總中斷
IT0=0; //低電平觸發(fā)
EX0 = 1;
IT0 = 1;
}
void main()
{
Exter_Init();
beep = 1;
while(1)
{
if(flag%2 == 1)//奇數(shù)次按鍵,顯示華氏度
{
t = Ds18b20ReadTemp(); //華氏度=(攝氏度*9)/5 32
t = t*0.0625*10 0.5;
tmp = t*1.8 320;
P0=0xff;
P0 = table[15];
P2 = 0xfe;
Delay1ms(1);
P0=0xff;
P0 = table[tmp/100];
P2 = 0xfd;
Delay1ms(1);
P0=0xff;
P0 = table[tmp0/10] & 0x7f;
P2 = 0xfb;
Delay1ms(1);
P0=0xff;
P0 = table[tmp];
P2 = 0xf7;
Delay1ms(1);
}
else //偶數(shù)次按鍵,顯示攝氏度
{
t = Ds18b20ReadTemp();
tmp = t*0.0625*10 0.5;
Display(Ds18b20ReadTemp());
if(tmp >= warn_d)//若溫度超限,蜂鳴器報警
{
beep = 0;
Delay1ms(1);
beep = 1;
Delay1ms(1);
}
else beep = 1;
}
}
}
void exter0() interrupt 0
{
Delay1ms(5);//消抖
while(!key3);
flag ;
}


評論


技術專區(qū)

關閉