微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > DS18B20温度检测调节程序(C代码)

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

时间:11-17 来源:互联网 点击:
#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; //开启继电器 打开

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top