#include "reg51.h"
#include "intrins.h"
#include "DHT11.h"
#include "1602.h"
#define uchar unsigned char
#define uint unsigned int
sbit led1=P2^2;//指示灯
sbit led2=P2^3;
sbit led3=P2^4;
sbit led7=P3^6; //预约
sbit led8=P3^5; //快慢炖切换
sbit led9=P3^7; //保温
sbit led10=P3^4; //工作指示灯
sbit heat=P2^1;//加热器
sbit beep=P2^0;//蜂鸣器
sbit shaogan=P3^3;//烧干检测
sbit CLK= P3^0;//时钟,初始状态为0
sbit DI= P3^1;//数据输入
sbit DO= P3^1;// 数据输出
sbit CS= P2^5;
uint current=0;//存储电流
uint time=0;
uchar pwm=0;//输出功率控制
uchar mode=0;//模式
uchar shi1=0,fen1=1,shi2=0,fen2=1,miao=0;//煮饭时间+预约时间
uint sec=0;
uchar start=0;
uchar key=0,num=0;
uint k_flag;
bit flag;
uchar wendu,shidu;//温度、湿度值
//延时
void delay(uint i)
{
while(i--);
}
//ms延时
void delay_ms(uint i)
{
while(i--)
delay(110);
}
/*********************************************
读取ADC
**********************************************/
uchar ADC()//通道ch0
{
uchar temp0,temp1,i;
CS=0;
temp0=0;
temp1=0;
_nop_();
_nop_();
DI=1;//开始位
_nop_();
_nop_();
CLK=1;
_nop_();
_nop_();
CLK=0;
_nop_();
_nop_();
DI=0;
_nop_();
_nop_();
//选择通道0
DI=1;
_nop_();
CLK=1;//上升沿DI=1
_nop_();
CLK=0;//1个下降沿DI=1
_nop_();
DI=0;
_nop_();
CLK=1;
_nop_();
CLK=0;//第3个上升沿DI=0
_nop_();
DI=1;
///********通道选择结束开始读取转换后的二进制数****
//下降沿读数,一下进行判断和处理,共8次
for(i=0;i<8;i++)
{
temp0=temp0<<1;
CLK=1;
if(DO)
temp0++;
_nop_();
CLK=0;
}
for(i=0;i<8;i++)
{
temp1=temp1>>1;
CLK=1;
if(DO)
temp1=temp1 +0x80;
_nop_();
CLK=0;
}
CS=1;
return temp0;
}
//蜂鸣器
void buzzr()
{
beep=0;
delay_ms(500);
beep=1;
delay_ms(500);
beep=0;
delay_ms(500);
beep=1;
delay_ms(500);
beep=0;
delay_ms(500);
beep=1;
delay_ms(500);
beep=0;
delay_ms(500);
beep=1;
}
//按键检测
uchar key_scan()
{
uchar i,j;
i=0;
j=0;
P1=0x0f;
if(P1!=0x0f) //检测有无按下
{
switch(P1)//检测行
{
case 0x0e:
i=1;
break;
case 0x0d:
i=5;
break;
case 0x0b:
i=9;
break;
case 0x07:
i=13;
}
P1=0xf0;
switch(P1)//检测列
{
case 0xe0:
j=0;
break;
case 0xd0:
j=1;
break;
case 0xb0:
j=2;
break;
case 0x70:
j=3;
}
}
if(i+j !=key)
{
key=i+j;
return i+j;
}
else
return 0;
}
//主函数
void main()
{
uchar i;
TMOD|=0X01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
LCD_Initial();
while(1)
{
while(current>110)//过流
{
heat=1;
beep=~beep;
}
if(current<50) //解除报警
{
beep=1;
}
// LCD_SramChar(13,2,current/100%10+0x30); //显示电流
// LCD_SramChar(14,2,current/10%10+0x30);
// LCD_SramChar(15,2,current%10+0x30);
//点亮指示灯
switch(mode/2)
{
case 5:
led1=0;
led2=0;
led3=1;
break;
case 4:
led1=0;
led2=1;
led3=0;
break;
case 3:
led1=0;
led2=1;
led3=1;
break;
case 2:
led1=1;
led2=0;
led3=0;
break;
case 1:
led1=1;
led2=0;
led3=1;
break;
case 0:
led1=1;
led2=1;
led3=0;
}
//显示
if(led7==0) //yuyue
{
LCD_WriteString(0,1,"Yu Yue:");
LCD_SramChar(8,1,shi2/10+0x30); //初始设定的时间
LCD_SramChar(9,1,shi2%10+0x30);
LCD_SramChar(10,1,':');
LCD_SramChar(11,1,fen2/10%10+0x30); //初始设定的时间
LCD_SramChar(12,1,fen2%10+0x30);
LCD_SramChar(13,1,':');
LCD_SramChar(14,1,miao/10+0x30); //初始设定的时间
LCD_SramChar(15,1,miao%10+0x30);
}
else
{
if(led10==0)
{
LCD_WriteString(0,1,"ShiJian:");
LCD_SramChar(8,1,shi1/10+0x30); //初始设定的时间
LCD_SramChar(9,1,shi1%10+0x30);
LCD_SramChar(10,1,':');
LCD_SramChar(11,1,fen1/10%10+0x30); //初始设定的时间
LCD_SramChar(12,1,fen1%10+0x30);
LCD_SramChar(13,1,':');
LCD_SramChar(14,1,miao/10+0x30); //初始设定的时间
LCD_SramChar(15,1,miao%10+0x30);
}
else
{
LCD_WriteString(0,1," dianfanguo");
}
}
LCD_WriteString(0,2,"WD:");
LCD_SramChar(3,2,wendu/10+0x30); //显示温度
LCD_SramChar(4,2,wendu%10+0x30);
LCD_WriteString(7,2,"SD:");
LCD_SramChar(10,2,shidu/10+0x30); //显示湿度
LCD_SramChar(11,2,shidu%10+0x30);
i=key_scan();//按键检测
if((i<7)&&(i>0)) //选择
{
if(led8==1)//慢炖
{
mode=(i-1)*2;
}
else
{
mode=(i-1)*2+1;
}
}
if(i==7)//快炖
{
led8=0;
if(mode%2==0)
mode++;
}
if(i==8)//慢炖
{
led8=1;
if(mode%2==1)
mode--;
}
if(i==9)//保温
{
led9=!led9;
}
if(i==10)//预约
{
led7=!led7;
}
if(i==11)//启动
{
start=1;
led10=0;
}
if(i==12)//停止
{
start=0;
led9=1;
led10=1;
shi1=0;
fen1=1;
shi2=0;
fen2=0;
miao=0;
beep=1;
}
if(shaogan==0)//烧干
beep=0;
else
{
beep=1;
}
//设置
if(led7==0)
{
if(i==13)//小时
{
if(shi2<23)
shi2++;
}
if(i==14)
{
if(shi2>0)
shi2--;
}
if(i==15)//分钟
{
if(fen2<59)
fen2++;
}
if(i==16)
{
if(fen2>0)
fen2--;
}
else
{
if(i==13)//小时
{
if(shi1<23)
shi1++;
}
if(i==14)
{
if(shi1>0)
shi1--;
}
if(i==15)//分钟
{
if(fen1<59)
fen1++;
}
if(i==16)
{
if(fen1>0)
fen1--;
}
}
}
}
//定时器中断
void Timer0() interrupt 1
{
if(start)//启动
{
if(led7)//正常模式
{
if(led9)
{
if(sec<500)//1s
sec++;
else
{
sec=0;
if(miao>0)//倒计时
miao--;
else
{
miao=59;
if(fen1>0)
fen1--;
else
{
fen1=59;
if(shi1>0)
shi1--;
else
{
shi1=0;//结束
fen1=0;
miao=0;
led7=1;
buzzr();
led8=1;
led9=0;
}
}
}
}
}
//输出控制
if(time<14)
time++;
else
{
time=0;
}
if(time<pwm)//占空比控制功率
heat=0;
else
heat=1;
//输出值设置
if(!led8)
pwm=1;
else
{
pwm=mode+2;
}
}
else//预约模式
{
heat=1;
if(sec<500)//1s
sec++;
else
{
sec=0;
if(miao>0)//倒计时
miao--;
else
{
miao=59;
if(fen2>=0)
fen2--;
else
{
fen2=59;
if(shi2>0)
shi2--;
else
{
shi2=0;//结束
fen2=0;
miao=0;//启动
led7=1;
led9=0;
}
}
}
}
}
}
else//停止
{
heat=1;
led10=1;
}
if(num<200) //测温
num++;
else
{
num=0;
dht11_recive();
wendu=dht11_dat[2];
shidu=dht11_dat[0];
current=ADC();//电流检测
// current = current*2;//电流修正,电路测试环节可以修改
}
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
}
#include "intrins.h"
#include "DHT11.h"
#include "1602.h"
#define uchar unsigned char
#define uint unsigned int
sbit led1=P2^2;//指示灯
sbit led2=P2^3;
sbit led3=P2^4;
sbit led7=P3^6; //预约
sbit led8=P3^5; //快慢炖切换
sbit led9=P3^7; //保温
sbit led10=P3^4; //工作指示灯
sbit heat=P2^1;//加热器
sbit beep=P2^0;//蜂鸣器
sbit shaogan=P3^3;//烧干检测
sbit CLK= P3^0;//时钟,初始状态为0
sbit DI= P3^1;//数据输入
sbit DO= P3^1;// 数据输出
sbit CS= P2^5;
uint current=0;//存储电流
uint time=0;
uchar pwm=0;//输出功率控制
uchar mode=0;//模式
uchar shi1=0,fen1=1,shi2=0,fen2=1,miao=0;//煮饭时间+预约时间
uint sec=0;
uchar start=0;
uchar key=0,num=0;
uint k_flag;
bit flag;
uchar wendu,shidu;//温度、湿度值
//延时
void delay(uint i)
{
while(i--);
}
//ms延时
void delay_ms(uint i)
{
while(i--)
delay(110);
}
/*********************************************
读取ADC
**********************************************/
uchar ADC()//通道ch0
{
uchar temp0,temp1,i;
CS=0;
temp0=0;
temp1=0;
_nop_();
_nop_();
DI=1;//开始位
_nop_();
_nop_();
CLK=1;
_nop_();
_nop_();
CLK=0;
_nop_();
_nop_();
DI=0;
_nop_();
_nop_();
//选择通道0
DI=1;
_nop_();
CLK=1;//上升沿DI=1
_nop_();
CLK=0;//1个下降沿DI=1
_nop_();
DI=0;
_nop_();
CLK=1;
_nop_();
CLK=0;//第3个上升沿DI=0
_nop_();
DI=1;
///********通道选择结束开始读取转换后的二进制数****
//下降沿读数,一下进行判断和处理,共8次
for(i=0;i<8;i++)
{
temp0=temp0<<1;
CLK=1;
if(DO)
temp0++;
_nop_();
CLK=0;
}
for(i=0;i<8;i++)
{
temp1=temp1>>1;
CLK=1;
if(DO)
temp1=temp1 +0x80;
_nop_();
CLK=0;
}
CS=1;
return temp0;
}
//蜂鸣器
void buzzr()
{
beep=0;
delay_ms(500);
beep=1;
delay_ms(500);
beep=0;
delay_ms(500);
beep=1;
delay_ms(500);
beep=0;
delay_ms(500);
beep=1;
delay_ms(500);
beep=0;
delay_ms(500);
beep=1;
}
//按键检测
uchar key_scan()
{
uchar i,j;
i=0;
j=0;
P1=0x0f;
if(P1!=0x0f) //检测有无按下
{
switch(P1)//检测行
{
case 0x0e:
i=1;
break;
case 0x0d:
i=5;
break;
case 0x0b:
i=9;
break;
case 0x07:
i=13;
}
P1=0xf0;
switch(P1)//检测列
{
case 0xe0:
j=0;
break;
case 0xd0:
j=1;
break;
case 0xb0:
j=2;
break;
case 0x70:
j=3;
}
}
if(i+j !=key)
{
key=i+j;
return i+j;
}
else
return 0;
}
//主函数
void main()
{
uchar i;
TMOD|=0X01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
LCD_Initial();
while(1)
{
while(current>110)//过流
{
heat=1;
beep=~beep;
}
if(current<50) //解除报警
{
beep=1;
}
// LCD_SramChar(13,2,current/100%10+0x30); //显示电流
// LCD_SramChar(14,2,current/10%10+0x30);
// LCD_SramChar(15,2,current%10+0x30);
//点亮指示灯
switch(mode/2)
{
case 5:
led1=0;
led2=0;
led3=1;
break;
case 4:
led1=0;
led2=1;
led3=0;
break;
case 3:
led1=0;
led2=1;
led3=1;
break;
case 2:
led1=1;
led2=0;
led3=0;
break;
case 1:
led1=1;
led2=0;
led3=1;
break;
case 0:
led1=1;
led2=1;
led3=0;
}
//显示
if(led7==0) //yuyue
{
LCD_WriteString(0,1,"Yu Yue:");
LCD_SramChar(8,1,shi2/10+0x30); //初始设定的时间
LCD_SramChar(9,1,shi2%10+0x30);
LCD_SramChar(10,1,':');
LCD_SramChar(11,1,fen2/10%10+0x30); //初始设定的时间
LCD_SramChar(12,1,fen2%10+0x30);
LCD_SramChar(13,1,':');
LCD_SramChar(14,1,miao/10+0x30); //初始设定的时间
LCD_SramChar(15,1,miao%10+0x30);
}
else
{
if(led10==0)
{
LCD_WriteString(0,1,"ShiJian:");
LCD_SramChar(8,1,shi1/10+0x30); //初始设定的时间
LCD_SramChar(9,1,shi1%10+0x30);
LCD_SramChar(10,1,':');
LCD_SramChar(11,1,fen1/10%10+0x30); //初始设定的时间
LCD_SramChar(12,1,fen1%10+0x30);
LCD_SramChar(13,1,':');
LCD_SramChar(14,1,miao/10+0x30); //初始设定的时间
LCD_SramChar(15,1,miao%10+0x30);
}
else
{
LCD_WriteString(0,1," dianfanguo");
}
}
LCD_WriteString(0,2,"WD:");
LCD_SramChar(3,2,wendu/10+0x30); //显示温度
LCD_SramChar(4,2,wendu%10+0x30);
LCD_WriteString(7,2,"SD:");
LCD_SramChar(10,2,shidu/10+0x30); //显示湿度
LCD_SramChar(11,2,shidu%10+0x30);
i=key_scan();//按键检测
if((i<7)&&(i>0)) //选择
{
if(led8==1)//慢炖
{
mode=(i-1)*2;
}
else
{
mode=(i-1)*2+1;
}
}
if(i==7)//快炖
{
led8=0;
if(mode%2==0)
mode++;
}
if(i==8)//慢炖
{
led8=1;
if(mode%2==1)
mode--;
}
if(i==9)//保温
{
led9=!led9;
}
if(i==10)//预约
{
led7=!led7;
}
if(i==11)//启动
{
start=1;
led10=0;
}
if(i==12)//停止
{
start=0;
led9=1;
led10=1;
shi1=0;
fen1=1;
shi2=0;
fen2=0;
miao=0;
beep=1;
}
if(shaogan==0)//烧干
beep=0;
else
{
beep=1;
}
//设置
if(led7==0)
{
if(i==13)//小时
{
if(shi2<23)
shi2++;
}
if(i==14)
{
if(shi2>0)
shi2--;
}
if(i==15)//分钟
{
if(fen2<59)
fen2++;
}
if(i==16)
{
if(fen2>0)
fen2--;
}
else
{
if(i==13)//小时
{
if(shi1<23)
shi1++;
}
if(i==14)
{
if(shi1>0)
shi1--;
}
if(i==15)//分钟
{
if(fen1<59)
fen1++;
}
if(i==16)
{
if(fen1>0)
fen1--;
}
}
}
}
//定时器中断
void Timer0() interrupt 1
{
if(start)//启动
{
if(led7)//正常模式
{
if(led9)
{
if(sec<500)//1s
sec++;
else
{
sec=0;
if(miao>0)//倒计时
miao--;
else
{
miao=59;
if(fen1>0)
fen1--;
else
{
fen1=59;
if(shi1>0)
shi1--;
else
{
shi1=0;//结束
fen1=0;
miao=0;
led7=1;
buzzr();
led8=1;
led9=0;
}
}
}
}
}
//输出控制
if(time<14)
time++;
else
{
time=0;
}
if(time<pwm)//占空比控制功率
heat=0;
else
heat=1;
//输出值设置
if(!led8)
pwm=1;
else
{
pwm=mode+2;
}
}
else//预约模式
{
heat=1;
if(sec<500)//1s
sec++;
else
{
sec=0;
if(miao>0)//倒计时
miao--;
else
{
miao=59;
if(fen2>=0)
fen2--;
else
{
fen2=59;
if(shi2>0)
shi2--;
else
{
shi2=0;//结束
fen2=0;
miao=0;//启动
led7=1;
led9=0;
}
}
}
}
}
}
else//停止
{
heat=1;
led10=1;
}
if(num<200) //测温
num++;
else
{
num=0;
dht11_recive();
wendu=dht11_dat[2];
shidu=dht11_dat[0];
current=ADC();//电流检测
// current = current*2;//电流修正,电路测试环节可以修改
}
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
}