DS18B20温度检测调节程序(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; //温度传感器数据线位定义
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; //开启继电器 打开
DS18B20温度检测调 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)