#include"reg52.h"
#include<intrins.h>
#include<24c02.h> //24c02
#define uchar unsigned char
#define uint unsigned int
#define Time_Method 24 // 时间制
bit C02_Store_Flag=0;
uchar C02_Write_Select=0;
/******************************/
/*********** 数码定义 ********/
/******************************/
sbit P26=P2^6;
sbit P27=P2^7;
uchar code option[]={0xff,0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7}; //the Option of Showing Led
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00,0x76,0x37,0x6d,0x58,0x5c,0x30};
/**************************************/ //10\'-',11\'0',12\'H',13\'N',14\"s',15\'c',16\'o',17\'|'
/********** 正常时间变量定义 *********/
/**************************************/
uchar Led_Select=0;
uint Second_Count=0;
uchar Second=0;
uchar Minite=0;
uchar Hour=0;
uchar Show_Select=0;
bit flash_led=0;
/*******************************/
/*********** 按键定义 *********/
/*******************************/
sbit Time_Config=P2^2;
bit Time_Config_Flag=0;
sbit Time_Add=P2^4;
sbit Time_Dec=P2^3;
uchar Four_Led_Select=0;
uchar temp;
uchar F_Led;
uchar S_Led;
/****************************************/
/*********** 继电器时间变量定义 ********/
/****************************************/
uchar Relay_Open_Hour=0;
uchar Relay_Open_Minite=0;
uchar Relay_Open_Second=0;
uchar Relay_Close_Hour=0;
uchar Relay_Close_Minite=2;
uchar Relay_Close_Second=59;
sbit Relay_Key=P1^0;
/***********************************/
/*********** 串口接收定义 *********/
/***********************************/
uchar Time_Buffer[8]={0,0}; // 不能用 code 定义
bit Com_Flag=0;
uchar Five_Led_Select;
uchar Five_Led;
void Show_Led(uchar Select_Led,uchar Led_Data) //选择一个需要显示的LED数码
{
P27=1;
P0=option[Select_Led];
P27=0;
P26=1;
P0=table[Led_Data];
P26=0;
}
void Show_Eight_Led() //正常时间LED显示!
{
if(Led_Select>0x07) Led_Select=0x00;
switch(Led_Select)
{
case 0x00: Show_Led(1,Hour/10);break;
case 0x01: Show_Led(2,Hour%10);break;
case 0x02: Show_Led(3,10); break;
case 0x03: Show_Led(4,Minite/10);break;
case 0x04: Show_Led(5,Minite%10);break;
case 0x05: if(flash_led==1) Show_Led(6,10);
else Show_Led(6,11);
break;
case 0x06: Show_Led(7,Second/10);break;
case 0x07: Show_Led(8,Second%10);break;
}
}
void Show_Four_Led() //four led is showing
{
Four_Led_Select++;
if(Four_Led_Select>4) Four_Led_Select=1;
switch(Four_Led_Select)
{
case 1: Show_Led(3,F_Led); break;
case 2: Show_Led(4,S_Led); break;
case 3: Show_Led(7,temp/10); break;
case 4: Show_Led(8,temp%10); break;
default: break;
}
}
void Relay_Work() // 继电器动作时间处理
{ if( Relay_Open_Hour<=Hour && Hour<=Relay_Close_Hour )
{
if( Relay_Open_Hour==Hour || Hour==Relay_Close_Hour )
{
if( Relay_Open_Hour==Hour)
{
if(Relay_Open_Minite <= Minite )
{
if(Relay_Open_Minite == Minite )
{
if (Relay_Open_Second<Second ) Relay_Key=0;
else Relay_Key=1;
}
else Relay_Key=0;
}
else Relay_Key=1;
}
if( Hour==Relay_Close_Hour)
{
if( Minite<= Relay_Close_Minite )
{
if( Minite==Relay_Close_Minite)
{
if ( Second<Relay_Close_Second) Relay_Key=0;
else Relay_Key=1;
}
else Relay_Key=0;
}
else Relay_Key=1;
}
}
else Relay_Key=0;
}
else Relay_Key=1;
}
void Delay_nms(uchar ms) //delay ms function
{
uint i;
while(ms--)
{
for(i = 0; i < 500; i++);
}
}
void C02_Storedata() // 0.33s Store Data
{
if(C02_Write_Select==3) C02_Write_Select=0;
switch(C02_Write_Select)
{
case 0:C02_Write_Address(0x00,Hour);break;
case 1:C02_Write_Address(0x01,Minite);break;
case 2:C02_Write_Address(0x02,Second);break;
default: break;
}
}
void Show_Five_Led() //five led is showing
{
Five_Led_Select++;
if(Five_Led_Select>5) Five_Led_Select=1;
switch(Five_Led_Select)
{
case 1: Show_Led(4,Five_Led); break;
case 2: Show_Led(5,Five_Led); break;
case 3: Show_Led(6,Five_Led); break;
case 4: Show_Led(7,Five_Led); break;
case 5: Show_Led(8,Five_Led);break;
default: break;
}
}
void Time_0() interrupt 1 using 1 //Time0
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
Second_Count++;
Led_Select++;
if(Second_Count==300 && Second_Count==600) C02_Store_Flag=1;
if(Second_Count==1000) //second workout
{ flash_led=~flash_led;
Second_Count=0;
Second++;
if(Second>59)
{
Second=0;
Minite++;
if(Minite>=60)
{
Minite=0;
Hour++;
if(Hour>=Time_Method)
{
Hour=0;
}
}
}
C02_Store_Flag=1;
}
switch(Show_Select) // 显示模式
{
case 0:Relay_Work(); Show_Eight_Led(); break;
case 1: temp=Hour;F_Led=12;S_Led=11;Show_Four_Led(); break;
case 2: temp=Minite;F_Led=13;S_Led=11;Show_Four_Led(); break;
case 3: temp=Second;F_Led=14;S_Led=11;Show_Four_Led(); break;
case 4: temp=Relay_Open_Hour;F_Led=12;S_Led=16;Show_Four_Led(); break;
case 5: temp=Relay_Open_Minite;F_Led=13;S_Led=16;Show_Four_Led(); break;
case 6: temp=Relay_Open_Second;F_Led=14;S_Led=16;Show_Four_Led(); break;
case 7: temp=Relay_Close_Hour;F_Led=12;S_Led=15;Show_Four_Led(); break;
case 8: temp=Relay_Close_Minite;F_Led=13;S_Led=15;Show_Four_Led(); break;
case 9: temp=Relay_Close_Second;F_Led=14;S_Led=15;Show_Four_Led(); break;
case 10: Five_Led=17;Show_Five_Led(); break;
case 11: Five_Led=16;Show_Five_Led(); break;
case 12: Five_Led=15;Show_Five_Led(); break;
}
}
void Com_Config() interrupt 4 using 2
{
static uchar num=0;
EA=0;
if(RI==1)
{
Time_Buffer[num]=SBUF;
RI=0;
num++;
if(num==8) { Com_Flag=1;num=0; }
}
EA=1;
}
void Inite_Main() //inite main Function
{
Relay_Key=1;
/******** 24C02 init *******/
C02_Init();
Hour=C02_Read_Address(0x00);
Minite=C02_Read_Address(0x01);
Second=C02_Read_Address(0x02);
Relay_Open_Hour=C02_Read_Address(0x0c);
Relay_Open_Minite=C02_Read_Address(0x0d);
Relay_Open_Second=C02_Read_Address(0x0e);
Relay_Close_Hour=C02_Read_Address(0x18);
Relay_Close_Minite=C02_Read_Address(0x19);
Relay_Close_Second=C02_Read_Address(0x1a);
if(Hour>23 || Minite>59 || Second>59 ||
Relay_Close_Hour>23 || Relay_Close_Minite>59 || Relay_Close_Second>59 ||
Relay_Open_Hour>23 || Relay_Open_Minite>59 || Relay_Open_Second>59) // 错误处理
{
Hour=0;
Minite=0;
Second=0;
Relay_Open_Hour=0;
Relay_Open_Minite=0;
Relay_Open_Second=0;
Relay_Close_Hour=0;
Relay_Close_Minite=0;
Relay_Close_Second=0;
Relay_Key=1;
}
/********** 24C02 init ********************/
TMOD=0x21;
PCON=0x20;
SCON=0x50;
TH1=0xfd; //9600 bit/s
TL1=0xfd;
TR1=1;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TR0=1;
ET0=1;
ES=1;
EA=1;
}
void main()
{ uchar Com_Show_Temp;
Inite_Main();
while(1)
{
if(C02_Store_Flag==1)
{
C02_Store_Flag=0;
C02_Write_Select++;
C02_Storedata();
}
/************************************/
/*********** 按键 处理 ************/
/************************************/
if(Time_Config==0) //Time_Config
{
Delay_nms(10);
if(Time_Config==0)
{
Time_Config_Flag=1;
Show_Select++; //显示模式选择
if(Show_Select>=10) { Time_Config_Fl
Last_Time_Control.h.rar_C51 时间_time.h C51_时段控制_时间 继电器_时间继电器
版权申诉
111 浏览量
2022-09-24
03:30:50
上传
评论
收藏 39KB RAR 举报
朱moyimi
- 粉丝: 63
- 资源: 1万+