#include<reg52.h>
#include"DS1302.H"
#include"LCD1602.H"
#include"DHT11.C"
#define uchar unsigned char
#define uint unsigned int
#define HIGH 1
#define LOW 0
#define KEY_NO_NUM 0
#define KEY_TIM_SET_NUM 1
#define KEY_ADD_NUM 2
#define KEY_MIN_NUM 3
#define KEY_TIMING_SET_NUM 4
bit Start_flag=0;
uchar Tim_red_tab[7]={0}; //记录年月日时分秒和系统状态信息
uchar Timing_tab[3][2]={{8,30},{40,20},{40,30}}; //记录定时间
uchar SET_TIM_FLAG=0; //时间设置标志位
bit Again_flag=0;
uchar SET_TIMING_FLAG=0; //设置定时时间标志位
sbit KEY_TIM_SET=P3^0; //时间设置按键
sbit KEY_TIMING_SET=P3^1; //秒表停止
sbit KEY_ADD=P3^2; //时间设置加
sbit KEY_MIN=P3^3; //时间设置减
sbit LED1=P1^3;
sbit LED2=P1^4;
sbit Relay=P2^0;
void delayms(uint xms);
void Sys_init(void);
void Main_display(void);
void keycsan(void);
void Watch_display(void);
void Settiming_dis(void);
void Control(void);
/************************************
主程序
************************************/
void main()
{
Sys_init();
RH();
delayms(10);
RH();
delayms(10);
RH();
delayms(10);
RH();
delayms(10);
RH();
delayms(10);
while(1)
{
if(SET_TIMING_FLAG==0)
{Main_display();}
else
{Settiming_dis();}
keycsan();
Control();
RH();
}
}
/************************************
延时子程序
延时时间(xms*1)ms
*************************************/
void delayms(uint xms)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
/************************************
系统初始化
************************************/
void Sys_init(void)
{
INIT_DS1302(); //初始化DS1302
init_1602(); //初始化LCD1602
Timing_tab[0][0]=READ_DS1302(READ_DS1302_Timing_Hour1);
if(Timing_tab[0][0]>23)
Timing_tab[0][0]=0;
Timing_tab[0][1]=READ_DS1302(READ_DS1302_Timing_Min1);
if(Timing_tab[0][1]>59)
Timing_tab[0][1]=0;
Timing_tab[1][0]=READ_DS1302(READ_DS1302_Timing_Hour2);
if(Timing_tab[1][0]>99)
Timing_tab[1][0]=0;
Timing_tab[1][1]=READ_DS1302(READ_DS1302_Timing_Min2);
if(Timing_tab[1][1]>99)
Timing_tab[1][1]=0;
}
/************************************
控制子程序
************************************/
void Control(void)
{
static uchar i=0;
if(Tim_red_tab[4]==Timing_tab[0][0]&&Tim_red_tab[5]==Timing_tab[0][1]&&Tim_red_tab[6]<3)
{
if(U8RH_data_H<Timing_tab[1][0])
{
Relay=0;
}
}
else if(U8RH_data_H<Timing_tab[1][1]&&i==10)
Relay=0;
else if(U8RH_data_H>Timing_tab[1][0]-1)
Relay=1;
if(U8RH_data_H<Timing_tab[1][1])
{
if(i<10)
i++;
else
{
LED1=0;
LED2=1;
}
}
else if(U8RH_data_H>Timing_tab[1][0])
{
LED1=1;
LED2=0;
}
else
{
i=0;
LED1=1;
LED2=1;
}
}
/************************************
主界面
************************************/
void Main_display(void)
{
static uchar Year=80,Month=80,Day=80,Week=80,Hour=80,Min=80,Sec=80;
static uchar i;
if(Again_flag)
{
Again_flag=0;
Year=80;Month=80;Day=80;Hour=80;Min=80;Sec=80;Week=80;
}
if(SET_TIM_FLAG==0)
{
Tim_red_tab[0]=READ_DS1302(READ_DS1302_YEAR);
Tim_red_tab[1]=READ_DS1302(READ_DS1302_MONTH);
Tim_red_tab[2]=READ_DS1302(READ_DS1302_DAY);
Tim_red_tab[3]=READ_DS1302(READ_DS1302_WEEK);
Tim_red_tab[4]=READ_DS1302(READ_DS1302_HOUR);
Tim_red_tab[5]=READ_DS1302(READ_DS1302_MINUTE);
Tim_red_tab[6]=READ_DS1302(READ_DS1302_SECOND);
if(Year!=Tim_red_tab[0])
{
Year=Tim_red_tab[0];
WRITE_LCD1602_COM(0x80+2); //指定显示字符的地址
WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[0]/10]); //年
WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[0]%10]); //年
}
if(Month!=Tim_red_tab[1])
{
Month=Tim_red_tab[1];
WRITE_LCD1602_COM(0x80+5); //指定显示字符的地址
WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[1]/10]); //月
WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[1]%10]); //月
}
if(Day!=Tim_red_tab[2])
{
Day=Tim_red_tab[2];
WRITE_LCD1602_COM(0x80+8); //指定显示字符的地址
WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[2]/10]); //日
WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[2]%10]); //日
}
if(Week!=Tim_red_tab[3])
{
Week=Tim_red_tab[3];
WRITE_LCD1602_COM(0x80+12); //指定显示字符的地址
switch(Week)
{
case 0:
WRITE_LCD1602_DAT('S');
WRITE_LCD1602_DAT('U');
WRITE_LCD1602_DAT('N');
break;
case 1:
WRITE_LCD1602_DAT('M');
WRITE_LCD1602_DAT('O');
WRITE_LCD1602_DAT('N');
break;
case 2:
WRITE_LCD1602_DAT('T');
WRITE_LCD1602_DAT('U');
WRITE_LCD1602_DAT('E');
break;
case 3:
WRITE_LCD1602_DAT('W');
WRITE_LCD1602_DAT('E');
WRITE_LCD1602_DAT('D');
break;
case 4:
WRITE_LCD1602_DAT('T');
WRITE_LCD1602_DAT('H');
WRITE_LCD1602_DAT('U');
break;
case 5:
WRITE_LCD1602_DAT('F');
WRITE_LCD1602_DAT('I');
WRITE_LCD1602_DAT('R');
break;
case 6:
WRITE_LCD1602_DAT('S');
WRITE_LCD1602_DAT('A');
WRITE_LCD1602_DAT('T');
break;
default:
WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_NO); //禁止写保护
WRITE_DS1302(WRITE_DS1302_WEEK,0); //星期
WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_OFF); //允许写保护
break;
}
}
if(Hour!=Tim_red_tab[4])
{
Hour=Tim_red_tab[4];
WRITE_LCD1602_COM(0x80+0x40); //指定显示字符的地址
WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[4]/10]); //时
WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[4]%10]); //时
}
if(Min!=Tim_red_tab[5])
{
Min=Tim_red_tab[5];
WRITE_LCD1602_COM(0x80+0x40+3); //指定显示字符的地址
WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[5]/10]); //分
WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[5]%10]); //分
}
Sec=Tim_red_tab[6];
WRITE_LCD1602_COM(0x80+0x40+6); //指定显示字符的地址
WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[6]/10]); //秒
WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[6]%10]); //秒
}
else
{
i++;
if(i>10)
i=0;
WRITE_LCD1602_COM(0x80+2); //指定显示字符的地址
if(i<5&&SET_TIM_FLAG==1){WRITE_LCD1602_DAT(' ');WRITE_LCD1602_DAT(' ');}
else{WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[0]/10]);WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[0]%10]);}
WRITE_LCD1602_COM(0x80+5); //指定显示字符的地址
if(i<5&&SET_TIM_FLAG==2){WRITE_LCD1602_DAT(' ');WRITE_LCD1602_DAT(' ');}
else{WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[1]/10]);WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[1]%10]);}
WRITE_LCD1602_COM(0x80+8); //指定显示字符的地址
if(i<5&&SET_TIM_FLAG==3){WRITE_LCD1602_DAT(' ');WRITE_LCD1602_DAT(' ');}
else{WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[2]/10]);WRITE_LCD1602_DAT(LCD1602_Table[Tim_red_tab[2]%10]);}
WRITE_LCD1602_COM(0x80+12); //指定显示字符的地址
if(i<5&&SET_TIM_FLAG==4){WRITE_LCD1602_DAT(' ');WRITE_LCD1602_DAT(' ');WRITE_LCD1602_DAT(' ');}
else
{
switch(Tim_red_tab[3])
{
case 0:
WRITE_LCD1602_DAT('S');
WRITE_LCD1602_DAT('U');
WRITE_LCD1602_DAT('N');
break;
case 1:
WRITE_LCD1602_DAT('M');
WRITE_LCD1602_DAT('O');
WRITE_LCD1602_DAT('N');
break;
case 2:
WRITE_LCD1602_DAT('T');
WRITE_LCD1602_DAT('U');
WRITE_LCD1602_DAT('E');
break;
case 3:
WRITE_LCD1602_DAT('W');
WRITE_LCD1602_DAT('E');
WRITE_LCD1602_DAT('D');
break;
case 4:
WRITE_LCD1602_DAT('T');
WRITE_LCD1602_DAT('H');
WRITE_LCD1602_DAT('U');
break;
case 5:
WRITE_LCD1602_DAT('F');
WRITE_LCD1602_DAT('I');
WRITE_LCD1602_DAT('R');
break;
case 6:
WRITE_LCD1602_DAT('S');
WRITE_LCD1602_DAT('A');
WRITE_LCD1602_DAT('T');
break;
defau