|
#include <reg51.h>#include <intrins.h>
//****************************頭文件聲明***************************
typedef unsigned char uint8;
typedef unsigned int uint16;
//****************************I/O口線聲明****************************
#define SEG_CODE_PORT P0 //數(shù)碼管段選
#define BIT_CODE_PORT P2 //數(shù)碼管位選
Sbit DS18B20_DATA=P3^7; //18B20數(shù)據(jù)口
sbit BUZZ=P1^0; //蜂鳴器定義
sbit key1=P3^2; // 按鍵定義
sbit key2=P3^4;
//************************常量數(shù)組(段碼表)聲明*********************
uint8 code SegCodeTable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//****************************全局變量聲明***************************
int t=0x0248; //定義報(bào)警溫度
int Temperature; //
int a= 0x0180; //報(bào)警溫度
//****************************函數(shù)原型聲明**************************
void DS18B20Init();
void DS18B20BitWrite(bit Bit);
bit DS18B20BitRead();
void DS18B20ByteWrite(uint8 Byte);
uint8 DS18B20ByteRead();
void GetTemperature();
void DispTemperature();
void Delay(uint16 ms);
void AlarmCheck()
{
uint8 i;
if(Temperature>a ) //溫度大于a蜂鳴器報(bào)警
{
for(i=0;i<50;i++)
{
BUZZ=~BUZZ ;
Delay(1); //延時(shí)50ms
}
}
}
void key()
{
uint8 key1,key2;
Delay (5);
if( key1 ==0);
{Delay(5);} //消抖
if(key1==0)
{t=t+0x0008;} //溫度加0.5
while(!key1);
Delay(5);
if (key2==0)
{
Delay(5);} //消抖
if (key2==0)
{t=t-0x0008;} //溫度減0.5
while (!kkey2)£»
}
//******************************主函數(shù)***************************
void main()
{
while(1)
{
GetTemperature() ;
DispTemperature() ;
key();
AlarmCheck();
}
}
//*************************DS18B20初始化函數(shù)*******************
void DS18B20Init()
{
uint16 i;
while(1)
{
DS18B20_DATA=0;
i=640;
while(--i); //延時(shí)800US
DS18B20_DATA=1;
i=56;
while(--i); //延時(shí)70us
if(DS18B20_DATA==1) continue; //無響應(yīng)則重發(fā)復(fù)位脈沖
i=224;
while(--i); //??280us
if(DS18B20_DATA==1) break; //復(fù)位成功}
i=160;
while(--i);//??200us
}
//***********************DS18B20位寫函數(shù)************************
void DS18B20BitWrite(bit Bit)
{
uint16 i;
DS18B20_DATA=0;
i=4;
while(--i); //延時(shí)5us
DS18B20_DATA=Bit; //發(fā)送一位數(shù)到DS18B20
i=48;
while(--i); //延時(shí)60us
DS18B20_DATA=1;
}
//**********************DS18B20位讀操作函數(shù)*************************
bit DS18B20BitRead()
{
bit temp;
uint16 i;
DS18B20_DATA=0;
i=4;
while(--i); //延時(shí)5us
DS18B20_DATA=1;
i=4;
while(--i); //延時(shí)5us
temp=DS18B20_DATA; //讀來自DS18B20的一位數(shù)
i=48;
while(--i); //延時(shí)60us
return temp;
}
//**********************DS18B20字節(jié)寫操作函數(shù)************************
void DS18B20ByteWrite(uint8 Byte)
{
uint8 i;
for(i=0;i<8;i++) //一共發(fā)送8位
{
if(Byte&0x01==1 ) //發(fā)送最低為
DS18B20BitWrite(1); //發(fā)1
else
DS18B20BitWrite(0); //發(fā)0
Byte>>=1; //字節(jié)移位
}
}
//**********************DS18B20字節(jié)讀操作函數(shù)************************
uint8 DS18B20ByteRead()
{
uint8 i,temp=0;
for(i=0;i<8;i++) //一共讀8位
{
temp>>=1; //字節(jié)變量右移
if(DS18B20BitRead()==1) //讀取1位數(shù)據(jù)并存入臨時(shí)變量temp中
temp|=0x80; //temp最高位置1
}
return temp; //返回讀到的8位數(shù)}
//*****************************溫度采集函數(shù)**************************
void GetTemperature()
{
uint8 Buff[2],i;
DS18B20Init(); //DS18B20初始化
DS18B20ByteWrite(0xCC); //跳過ROM匹配(因?yàn)橹挥幸粋(gè)DS18B20)
DS18B20ByteWrite(0x44) ;//啟動溫度轉(zhuǎn)換
for(i=0;i<250;i++)
DispTemperature(); //等待750ms,期間不斷刷新LED顯示
DS18B20Init(); //DS18B20初始化
DS18B20ByteWrite(0xCC); //跳過ROM匹配
DS18B20ByteWrite(0xbe); // 準(zhǔn)備讀轉(zhuǎn)換結(jié)果
Buff[0]=DS18B20ByteRead(); //讀溫度值低字節(jié)
Buff[1]=DS18B20ByteRead(); //讀溫度值的高字節(jié)
Temperature= (Buff[1]<<8)+Buff[0]; //拼成16位溫度值
}
//*****************************溫度顯示函數(shù)************************
void DispTemperature()
{
uint8 temp1,temp2;
key();
temp1=(t>>4)/10; //顯示十位
if(temp1==0)
SEG_CODE_PORT=0xFF ; //十位為0則隱去
else
SEG_CODE_PORT=SegCodeTable[temp1];
BIT_CODE_PORT=0xF0; //選擇顯示位置
Delay(1);
BIT_CODE_PORT=0xFF;
SEG_CODE_PORT=SegCodeTable[(t>>4)%10]&0x7F; //Ï顯示個(gè)位
BIT_CODE_PORT=0xF1; //選擇顯示位置
Delay(1);
BIT_CODE_PORT=0xFF;
SEG_CODE_PORT=SegCodeTable[(t&0x0F)*10/16]; //顯示十分位
BIT_CODE_PORT=0xF2; //選擇顯示位置
Delay(1);
BIT_CODE_PORT=0xFF;
temp2=(Temperature>>4)/10; //顯示十位
if(temp2==0)
SEG_CODE_PORT= 0xFF;//十位為0則隱去
else
SEG_CODE_PORT=SegCodeTable[temp2];
BIT_CODE_PORT=0xF5; //選擇顯示位置
Delay(1);
BIT_CODE_PORT=0xFF;
SEG_CODE_PORT=SegCodeTable[(Temperature>>4)%10]&0x7F; //Ï顯示個(gè)位
BIT_CODE_PORT=0xF6; //選擇顯示位置
Delay(1);
BIT_CODE_PORT=0xFF;
SEG_CODE_PORT=SegCodeTable[(Temperature&0x0F)*10/16]; //顯示十分位
BIT_CODE_PORT=0xF7; //選擇顯示位置
Delay(1);
BIT_CODE_PORT=0xFF;
}
//*****************************軟件延時(shí)函數(shù)************************
void Delay(uint16 ms)
{
uint16 i;
do{
i=790;
while(--i); //延時(shí)1ms(STC12C5A60S2,11.0592MHz,代碼5級優(yōu)化)
} while(--ms);
}
|
|