/********************************************************************************************
*标题:冰箱温度控制系统 *
*作者:张凌浩 *
*时间:2013/05/08 *
*********************************************************************************************
* 部件: 89C51、DS18B20、1602、L298N、直流电机、按键*3、LED*3 *
* 晶振:12MHZ *
* *
* 描述:1602第一行显示实时温度,第二行显示温度限定值 *
* DS18B20采集实时温度,温度超过限定值时启动电机降温 *
* 电机停机后3分钟后才可重新启动(为演示方便设定时间约为15S) *
* K1模拟模拟冰箱门开关状态,按下K1约5S后LED1~LED3循环闪烁 *
* K2~K3设定温度限定值,K2升高,K3降低 *
* *
********************************************************************************************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^7; //DS18B20
sbit lcd_rs=P2^0; //1602
sbit lcd_rw=P2^1;
sbit lcd_en=P2^2;
sbit K1=P3^4; //按键
sbit K2=P3^5;
sbit K3=P3^6;
sbit LED1=P2^5; //LED
sbit LED2=P2^6;
sbit LED3=P2^7;
sbit IN1=P1^0; //L298N
sbit IN2=P1^1;
sbit ENA=P3^0;
unsigned char code str1[]={"temp.now: C "};
unsigned char code str2[]={"temp.max: C"};
uchar data disdata[6]; //1602显示数组
uint value; //温度值
uint temp_ys; //预设报警温度值
uchar flag; //正负标志
uint motor_c; //电机启停标志
uchar motor_t; //电机停机后时间
uchar door_c; //冰箱门常开报警
uchar door_t; //冰箱门打开时间
uchar LED_c; //LED闪烁标志位
/*************************延时程序1MS**************************/
void delay1ms(unsigned int ms)//延时1毫秒
{
unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<100;j++);
}
/*************************lcd1602写指令*************************/
void write_com(unsigned char com)
{
delay1ms(1);
lcd_rs=0;
lcd_rw=0;
lcd_en=0;
P0=com;
delay1ms(1);
lcd_en=1;
delay1ms(1);
lcd_en=0;
}
/*************************lcd1602写数据*************************/
void write_dat(unsigned char dat)
{
delay1ms(1);;
lcd_rs=1;
lcd_rw=0;
lcd_en=0;
P0=dat;
delay1ms(1);
lcd_en=1;
delay1ms(1);
lcd_en=0;
}
/*************************lcd1602初始化*************************/
void lcd_init()
{
write_com(0x38);delay1ms(5);
write_com(0x08);delay1ms(5);
write_com(0x01);delay1ms(5);
write_com(0x06);delay1ms(5);
write_com(0x0c);delay1ms(5);
}
/************************lcd1602显示字符*************************/
void display(unsigned char *p)//显示//
{
while(*p!='\0')
{
write_dat(*p);
p++;
delay1ms(1);
}
}
/***********************lcd1602显示初始化************************/
init_play()//初始化显示
{
lcd_init();
write_com(0x80);
display(str1);
write_com(0xc0);
display(str2);
}
/*************************DS18B20延时程序*************************/
void delay_18B20(unsigned int i)
{
while(i--);//延时1微秒
}
/*************************DS18B20复位程序*************************/
void ds1820rst()
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //DQ拉高
delay_18B20(40);
}
/*************************DS18B20读取数据*************************/
uchar ds1820rd()
{
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_18B20(10);
}
return(dat);
}
/*************************DS18B20写入数据*************************/
void ds1820wr(uchar wdata)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}
/*************************读取温度值及转换*************************/
read_temp()
{
uchar a,b;
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
value=b;
value<<=8;
value=value|a;
if(value<0x0fff) flag=0;
else
{
value=~value+1;
flag=1;
}
value=value*(0.625);//温度值扩大10倍,精确到1位小数
return(value);
}
/*************************温度及参数显示程序**********************/
void ds1820disp()//温度值显示
{
uchar flagdat;
disdata[0]=value/1000+0x30; //百位数
disdata[1]=value%1000/100+0x30; //十位数
disdata[2]=value%100/10+0x30; //个位数
// disdata[3]=value%10+0x30; //小数位,本程序未使用
disdata[4]=temp_ys/100+0x30; //报警温度值十位
disdata[5]=temp_ys%100/10+0x30; //报警温度值个位
if(flag==0)
flagdat=0x20; //正温度不显示符号
else
flagdat=0x2d; //负温度显示负号:-
if(disdata[0]==0x30)
{
disdata[0]=0x20; //如果百位为0,不显示
if(disdata[1]==0x30)
{
disdata[1]=0x20; //如果百位为0,十位为0也不显示
}
}
write_com(0x89);
write_dat(flagdat); //显示符号位
write_com(0x8a);
write_dat(disdata[1]); //显示十位
write_com(0x8b);
write_dat(disdata[2]); //显示个位
write_com(0x8c);
write_dat(0xdf); //显示上标圆圈
write_com(0xca);
write_dat(disdata[4]); //显示报警值十位
write_com(0xcb);
write_dat(disdata[5]); //显示报警值个位
write_com(0xcc);
write_dat(0xdf); //显示上标圆圈
}
/********************LED闪烁**********************************/
void LED_ring(uchar LED_X)
{
switch(LED_X%3)
{
case 0:LED1=0;LED2=1;LED3=1;break;
case 1:LED1=1;LED2=0;LED3=1;break;
case 2:LED1=1;LED2=1;LED3=0;break;
}
delay1ms(100);
}
/********************主程序***********************************/
void main()
{
/***************定时器设定***************/
TMOD = 0x11;
TH0 = (65535-50000)/256;
TL0 = (65535-50000)%256;
TH1 = (65535-50000)/256;
TL1 = (65535-50000)%256;
IE = 0x8A; //
init_play();//初始化显示
/***********引脚及预设值初始化***********/
IN1=0;IN2=0;ENA=0;
K1=0;K2=0;K3=0;
LED1=1;LED2=1;LED3=1;
temp_ys=200; //温度报警值预设为20摄氏度
LED_c=0;
/****************主函数****************/
while(1)
{
read_temp(); //读取温度
ds1820disp(); //显示参数
if(K1==1) TR1=1; //K1按下,启动定时器
if(K1==0) {TR1=0;door_c=0;LED1=1;LED2=1;LED3=1;} //K1松开,关闭定时器,恢复LED初始状态
if(door_c==1) {LED_ring(LED_c);LED_c++;} //定时器计时达到设定时间,启动报警
if(K2==1) //温度上限+1
{
delay1ms(100);
if(K2==1){temp_ys=temp_ys+10;}
}
if(K3==1) //温度上限-1
{
delay1ms(100);
if(K3==1){temp_ys=temp_ys-10;}
}
if(value>=temp_ys&&motor_c==0) //采集温度超限且电机未处于停机延时内,启动电机
{IN1=1;IN2=0;ENA=1; motor_c=1;}
if(value<temp_ys) //采集温度小于限定值
{
IN1=0;IN2=0;ENA=0; //电机停机
if(motor_c==1){TR0=1;} //检测电机是否为刚刚停机,是则启动延时启动
}
}
}
/*********************定时器1,电机停机延时启动************************/
void Time0() interrupt 1
{
uchar Count;
TH0 = (65535-50000)/256;
TL0 = (65535-50000)%256;
if(++Count !=2) return;
Count = 0;
motor_t++;
if(motor_t>=100) //设定时间大概为15秒
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
部件: 89C51、DS18B20、1602、L298N、直流电机、按键*3、LED*3 晶振:12MHZ 描述:1602第一行显示实时温度,第二行显示温度限定值 DS18B20采集实时温度,温度超过限定值时启动电机降温 电机停机后3分钟后才可重新启动(为演示方便设定时间约为15S) K1模拟模拟冰箱门开关状态,按下K1约5S后LED1~LED3循环闪烁 K2~K3设定温度限定值,K2升高,K3降低
资源推荐
资源详情
资源评论
收起资源包目录
Temp_Control.rar (19个子文件)
Temp_Control
CODE
Temp_Control.hex 5KB
KEIL
Temp_Control.OBJ 16KB
Temp_Control.hex 5KB
Temp_Control 15KB
Temp_Control.lnp 57B
Temp_Control_uvproj.bak 0B
STARTUP.OBJ 749B
Temp_Control.M51 21KB
Temp_Control.uvopt 54KB
Temp_Control_uvopt.bak 54KB
Temp_Control.plg 209B
Temp_Control.LST 16KB
STARTUP.A51 6KB
Temp_Control.uvproj 13KB
STARTUP.LST 14KB
Temp_Control.c 8KB
Simulation
Temp_Control.DSN 135KB
Last Loaded Temp_Control.DBK 135KB
Temp_Control.PWI 1KB
共 19 条
- 1
资源评论
yz857613436
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功