基于DS18B20的51单片机控制恒温箱.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include"reg51.h"
sbit DQ =P1^4; //定义通信端口
sbit add_le=P1^0;//显示地址锁存
sbit data_le=P1^1;//显示数据锁存
sbit led_key = P1^3;//指示当前显示温度状态亮表示为按键灭表示为当前 sbit light_ctrl = P1^5; //AC灯控制
unsigned char inrup=0x00;
char dis[6];
code unsigned char table[16] = {0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0xff,0x00,
0xff,0x00,0xff,0xbf};
char key_data = 25;
char temp_now ;
//延时函数
void delay(unsigned int i)
{
while(i--);
}
//初始化函数
Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时大于 480us
DQ = 1; //拉高总线
delay(14);
x=DQ; //稍做延时后如果x=0则初始化成功 x=1则初始化失败 delay(20); }
//读一个字节
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
//写一个字节
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
}
//读取温度
ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0.0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
//t= tt*10+0.5; //放大10倍输出并四舍五入---此行没用
return(t);
}
void int_it0(void) interrupt 0
{
delay(1500);
light_ctrl = 0;
key_data++;
if(key_data>125)
key_data = 125;
led_key = 1;
inrup=0xff;
}
void int_it1(void) interrupt 2
{
delay(1500);
light_ctrl = 0;
key_data--;
if(key_data < -50)
key_data = -50;
led_key = 1;
inrup=0xff;
}
void display(void )
{
unsigned char n;
unsigned char m;
m = 0x10;
for(n=0;n<4;n++)
{
P3 = P3&0x0f;
P3 = P3|m;
delay(1);
P2 = table[dis[n]];
m=m<<1;
delay(500);
}
}
void main()
{
unsigned int a;
int temp0;
EX0 = 1; //允许外部中断0中断 IT0 = 1; EX1 = 1;
IT1 = 1;
EA =1; //开总中断
led_key = 0;
light_ctrl = 0;
add_le = 0;
data_le = 0;
DQ = 0;
while(1)
{
temp0=ReadTemperature();//读温度 temp_now = temp0*0.0625;
if(temp_now<=key_data)
light_ctrl = 1;
else
light_ctrl = 0;
if(temp_now>=0)
{
dis[0]=14;
dis[1]=temp_now/100%10; dis[2]=(temp_now/10)%10; dis[3]=temp_now%10; } else
{
// dis[0] = 15;
dis[1] = 15;
dis[3]=(0-temp_now)%10;
dis[2]=(0-temp_now) /10%10;
}
for(a=0;a<10;a++)
display();
if(led_key == 1)
{
a=0;
for(;a<200;)
{
inrup=0x00;
if(key_data >= 0)
{
dis[0]=14;
dis[1]=key_data/100%10;
dis[2]=(key_data /10)%10;
dis[3]=key_data%10;
}
else
{
// dis[0] = 15;
dis[1] = 15;
dis[3]=(0-key_data)%10;
dis[2]=(0-key_data) /10%10;
}
for(a=0;(inrup!=0xff)&&(a<200);a++)
{
display();
}
}
led_key = 0;
}
}
}总体描述:
数码管显示当前温度和设定温度
当按键按下时,触犯中断。
进行设定温度的加减,同时断开继电器的触发。
此时数码管上显示的温度为设定温度。
发光二极管D4亮,指示当前显示的为设定温度。
一段时间不按键时,程序自动跳转回去(否则一直显示当前温度),显示当前温度,指示发光二极管D4灭,并开始控制。
由于51驱动能力有限,故用两个三极管驱动继电器。
具体描述:
温度传感器 DS18B20 仿真方式:
打开:显示当前温度。
如下DS18B20显示温度为24度
按键设置要稳定的温度
当按键按下后,指示灯亮,表示现在显示的是设置温度,假设将温度设置为30度
因为30度大于当前温度所以在延时一定时间后继电器打开。