ds18b20 c语言代码,DS18B20温度检测调节程序(C代码)

原标题:DS18B20温度检测调节程序(C代码)

#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 _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; //ds读取值

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,rire 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;}//关闭相应调节功能

}

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

}

}

责任编辑:

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值