DS18B20溫度檢測調(diào)節(jié)程序(C代碼)
#include"intrins.h"
#include"absacc.h"
#define uint unsigned int
#define uchar unsigned char
uchar co
uchar co
uchar co
sbit ds18b20_in=P2^4; //溫度傳感器數(shù)據(jù)線位定義
sbit dht11=P2^2; //溫濕度傳感器 數(shù)據(jù)線位定義
sbit SPEAKER=P2^3; //報警器
//sbit FAN=P2^5; //電風(fēng)扇
sbit HEATERS=P3^1;
sbit FAN=P3^0;
//******************全局變量定義**********************************
uchar tempL=0,tempH=0; //ds18b20讀取值
uchar Set_Temp_H=30,Set_Temp_L=24;//溫度邊界值設(shè)定值
uchar Set_Humi_H,Set_Humi_L;
uchar Set_Illu_H,Set_Illu_L;
uchar flag_judge_temp,flag_judge_humi,flag_judge_illu; //標(biāo)志位定義
float temperature,illumination,humidity; //溫度值、光照值、濕度值?
//**********************延時子程序************************
void delay(uint time)
{
uint n=0;
while(n {n++;}
return;
}
void delay1()
{
int k;
for(k=0;k<600;k++);
}
void delay20ms(void) //誤差 0us
{
unsigned char a,b;
for(b=215;b>0;b--)
for(a=45;a>0;a--);
_nop_; //if Keil,require use intrins.h
_nop_; //if Keil,require use intrins.h
}
//*******************顯示子程序**************************
void display(float k)
{
int t;
t=k*100;
P1=0xfe;
P0=tab[t/1000];//十位
delay1();
P1=0xfd;
P0=tab[t%1000/100]-0x80;//個位+小數(shù)點
delay1();
P1=0xfb;
P0=tab[t%100/10];//十分位
delay1();
P1=0xf7;
P0=tab[t%10];//百分位
delay1();
P1=0xff;
}
//*****************ds18b20的初始化程序*********************
init_ds18b20()
{
uchar x=0;
ds18b20_in=1; //ds18b20_in先置高
delay(8);
ds18b20_in=0; //發(fā)送復(fù)位脈沖
delay(85); //延時>480ms
ds18b20_in=1; //拉高數(shù)據(jù)線
delay(14); //等待15~60ms
x=ds18b20_in; //用x的值來判斷初始化是否成功
//ds18b20存在的話x=0,否則x=1
delay(20);
}
/**************************讀取字符子程序******************/
ReadOneChar()
{
uchar i=0; //主機數(shù)據(jù)線先從高電平拉低1ms以上,在拉高,從而產(chǎn)生讀信號
uchar dat=0; //每個讀取周期最短持續(xù)時間為60ms,各個讀取周期之間必須有1ms以上的高電平恢復(fù)??
for(i=8;i>0;i--) //一個字節(jié)8位
{
ds18b20_in=1;delay(1);
ds18b20_in=0;dat>>=1;ds18b20_in=1;
if(ds18b20_in)
dat|=0x80;
delay(4);
}
return(dat);
}
//****************向?qū)懸粋€字節(jié)子程序*********************/
WriteOneChar(uchar dat)
{
uchar i; //數(shù)據(jù)從高電平拉至低電平,產(chǎn)生寫起始信號
for(i=8;i>0;i--)
{
ds18b20_in=0;
ds18b20_in=dat&0x01;
delay(5);
ds18b20_in=1;
dat>>=1;
}
delay(4);
}
/*********************************************************
向ds18b20度溫度值
出口參數(shù)temprature
*********************************************************/
ReadTemperature()
{
init_ds18b20(); //初始化
WriteOneChar(0xcc); //跳過讀序列號的操作
WriteOneChar(0x44); //啟動溫度轉(zhuǎn)換
delay(125); //轉(zhuǎn)換延時
init_ds18b20(); //初始化
WriteOneChar(0xcc); //跳過讀序列號的操作
WriteOneChar(0xbe); //讀溫度寄存器(頭兩個值分別是溫度的低位和高位)
tempL=ReadOneChar(); //讀出溫度的低位LSB
tempH=ReadOneChar(); //讀出高位的高位MSB
//tempL=0X91;tempH=0X01;
if(tempH&0x80)
temperature=(~((tempH*256)+tempL)+1)*0.0625; //零度以下
//溫度轉(zhuǎn)換,把高位低位做相應(yīng)的運算轉(zhuǎn)換為實際的溫度
else
temperature=((tempH*256)+tempL)*0.0625; //零度以上
delay(200);
return(temperature);
}
//*************************************************************************************************************************************
//**************報警子程序****************
sounder_H()
{
SPEAKER=1;
delay1();delay1();delay1();
SPEAKER=0;
}
sounder_L() //蜂鳴器 低電平響
{
SPEAKER=1;
delay1();delay1();delay1();
delay1();delay1();delay1();
delay1();delay1();delay1();
delay1();delay1();delay1();
SPEAKER=0;
}
//*************步進電機子程序**************
void motor_up()
{
int m,n;
for(m=0;m<24;m++)
for(n=0;n<4;n++)
{ P3=tab_motor_1[n];delay20ms();}
}
void motor_down()
{
int m,n;
for(m=0;m<288;m++)
for(n=0;n<4;n++)
{ P3=tab_motor_2[n];delay20ms();}
}
/*************電風(fēng)扇開啟子程序 **************
**************由直流電機 控制 *************/
void fan()
{
FAN=0; //開啟繼電器 打開電動機
}
//**************加熱器*********************
void heaters()
{
HEATERS=0;
}
/*************溫度判斷***************
正常返回“1 否則返回0?
*************************************/
judge_temp(float i)
{
int k;
k=(int)(i*100);
if( k<=Set_Temp_H*100 && k>=Set_Temp_L*100 ) //正常范圍內(nèi)
{ return 1;}
if(k
flag_judge_temp=0; return 0;}
else
{
flag_judge_temp=1; return 0;} //高于最大值
}
/*************濕度判斷***************
正常返回“1 否則返回0
*************************************/
judge_humi(float ii)
{}
/*************光照判斷***************
正常返回“1 否則返回0
*************************************/
judge_illu(float iii)
{}
//********************主程序****************
void main()
{
float i;
while(1)
{
i=ReadTemperature();
display(i);
/**********判斷******/
{
if(!judge_temp(i))
{
if(flag_judge_temp) //溫度高
{sounder_H(); fan();HEATERS=1;//motor_up();
}
else
{sounder_L(); heaters();FAN=1;//motor_down();
} //溫度低
}
else {SPEAKER=1;FAN=1;HEATERS=1;}//關(guān)閉相應(yīng)調(diào)節(jié)功能
}
/*********處理**********/
}
}
評論