您的位置 首页 编程

DS18B20温度检测调理程序(C代码)

#includereg52.h#includeintrins.h#includeabsacc.h#defineuintunsignedint#defineucharunsignedcharucharc

#include”reg52.h”

#include”intrins.h”
#include”absacc.h”
#define uint unsigned int
#define uchar unsigned char
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳管0~9
uchar code tab_motor_1[]={0x03,0x06,0x0c,0x09}; //电机正转 向上
uchar code tab_motor_2[]={0x09,0x0c,0x06,0x03}; //电机回转 向下

sbit ds18b20_in=P2^4; //温度传感器数据线位界说
sbit dht11=P2^2; //温湿度传感器 数据线位界说
sbit SPEAKER=P2^3; //报警器
//sbit FAN=P2^5; //电风扇
sbit HEATERS=P3^1;
sbit FAN=P3^0;
//******************全局变量界说**********************************
uchar tempL=0,tempH=0; //ds18b20读取值
uchar Set_Temp_H=30,Set_Temp_L=24;//温度鸿沟值设定值
uchar Set_Humi_H,Set_Humi_L;
uchar Set_Illu_H,Set_Illu_L;
uchar flag_judge_temp,flag_judge_humi,flag_judge_illu; //标志位界说
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;//个位+小数点
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; //发送复位脉冲
delay(85); //延时>480ms
ds18b20_in=1; //拉高数据线
delay(14); //等候15~60ms
x=ds18b20_in; //用x的值来判别初始化是否成功
//ds18b20存在的话x=0,不然x=1
delay(20);
}
/**************************读取字符子程序******************/
ReadOneChar()
{
uchar i=0; //主机数据线先从高电平拉低1ms以上,在拉高,然后发生读信号

uchar dat=0; //每个读取周期最短持续时间为60ms,各个读取周期之间必须有1ms以上的高电平康复??

for(i=8;i>0;i–) //一个字节8位
{
ds18b20_in=1;delay(1);
ds18b20_in=0;dat>>=1;ds18b20_in=1;
if(ds18b20_in)
dat|=0x80;
delay(4);
}
return(dat);
}
//****************向写一个字节子程序*********************/
WriteOneChar(uchar dat)
{
uchar i; //数据从高电平拉至低电平,发生写起始信号
for(i=8;i>0;i–)
{
ds18b20_in=0;
ds18b20_in=dat&0x01;
delay(5);
ds18b20_in=1;
dat>>=1;
}
delay(4);
}
/*********************************************************
向ds18b20度温度值
出口参数temprature
*********************************************************/
ReadTemperature()
{
init_ds18b20(); //初始化
WriteOneChar(0xcc); //越过读序列号的操作
WriteOneChar(0x44); //发动温度转化
delay(125); //转化延时
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; //零度以下
//温度转化,把高位低位做相应的运算转化为实践的温度
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();}
}
/*************电风扇敞开子程序 **************
**************由直流电机 操控 *************/
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 ) //正常范围内
{ 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;}//封闭相应调理功用
}

/*********处理**********/
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/biancheng/268268.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部