|
/*
參照濟南市日出日落時刻表。
小ARM菜菜
2013年4月20日
日照高科園
濟南市日出日落時刻表,參考百度www.baidu.com
*/
TYP_Sunrise_set_tab code Sunrise_set_map[12]=
{
7,25,17,7,
7,25,17,16,
7,22,17,26,
7,15,17,37,
7,5,17,48,
6,54,17,58,
6,44,18,6,
6,3,18,16,
6,15,18,24,
5,59,18,34,
5,45,18,43,
5,31,18,51,
5,19,19,0,
5,9,19,9,
5,1,19,17,
4,55,19,25,
4,53,19,31,
4,53,19,34,
4,57,19,35,
5,2,19,33,
5,9,19,28,
5,17,19,19,
5,26,19,8,
5,34,18,56,
5,43,18,41,
5,51,18,26,
5,59,18,11,
6,7,17,56,
6,15,17,42,
6,25,17,29,
6,35,17,16,
6,45,17,6,
6,56,17,0,
7,5,16,56,
7,14,16,56,
7,21,17,0,
};
/*
時間調(diào)度
*/
uint8_t Day(uint8_t hour,uint8_t minute,uint8_t month,uint8_t day)
{
month-=1;
//0-12點
if(( 0<=hour)&&(hour<=12 ))
{
if(hour>Sunrise_set_map[month].Sunrise_Sunset_time[day].Sunrise.hour)
{ //當前時間大于日出小時
return 0; //關(guān)燈
}
else
if(hour==Sunrise_set_map[month].Sunrise_Sunset_time[day].Sunrise.hour)
{
//當前時間和日出小時相等要判定分鐘
if(minute>=Sunrise_set_map[month].Sunrise_Sunset_time[day].Sunrise.minute)
{
//當前分鐘超出日出分鐘或相等,那么
return 0; //關(guān)燈
}
else
{
return 1;//開燈
}
}
return 1;
}
else
//13點到無窮大呵呵怎么可能嫩
if((12<hour)){
if(hour>Sunrise_set_map[month].Sunrise_Sunset_time[day].Sunset.hour)
{ //當前時間大于落小時
return 1;//開燈
}
else
if(hour==Sunrise_set_map[month].Sunrise_Sunset_time[day].Sunset.hour)
{
//當前時間和日落小時相等要判定分鐘
if(minute>=Sunrise_set_map[month].Sunrise_Sunset_time[day].Sunset.minute)
{
//當前分鐘超出日落分鐘或相等,那么
return 1; //開燈
}
else
{
return 0;//關(guān)燈
}
}
else
{
return 0;
}
}
else
{
return 0xfa; //異常情況
}
}
uint8_t CHCK(uint8_t month,uint8_t hour,uint8_t minute,uint8_t day )
{
if((1<=day)&&(day<=11))
{
return Day(hour,minute,month,0);
} /*如果是1號到11號*/
else
if ((11<day)&&(day<=21))
{
return Day(hour,minute,month,1);
}/*如果是11號到21號*/
else
{
return Day(hour,minute,month,2);
} /*其他*/
}
uint8_t Process_cal_scheduling_information(unsigned char month,unsigned char day,unsigned char hour ,unsigned char minute )
{
switch (month)
{
case 1:{
return CHCK(month,hour, minute,day );
break;}
case 2:{
return CHCK(month,hour, minute,day );
break;}
case 3:{
return CHCK(month,hour, minute,day );
break;}
case 4:{
return CHCK(month,hour, minute,day );
break;}
case 5:{
return CHCK(month,hour, minute,day );
break;}
case 6:{
return CHCK(month,hour, minute,day );
break;}
case 7:{
return CHCK(month,hour, minute,day );
break;}
case 8:{
return CHCK(month,hour, minute,day );
break;}
case 9:{
return CHCK(month,hour, minute,day );
break;}
case 10:{
return CHCK(month,hour, minute,day );
break;}
case 11:{
return CHCK(month,hour, minute,day );
break;}
case 12:{
return CHCK(month,hour, minute,day );
break;}
}
}
unsigned char DecimaltoBcd(unsigned char Decimal )
{
uint8_t l,m;
m= Decimal/10;
l=Decimal%10;
m=(m&0x0f)<<4;
return (m+l);
}
unsigned char BcdtoDecimal(unsigned char bcd)
{
uint8_t l,m;
l=(bcd&0x0f);
m=(bcd&0xf0)>>4;
return ((m*10)+l);
}
/*
時刻調(diào)度法調(diào)度器
*/
unsigned char Timetable_scheduling_switch_lights()
{
uint8_t xdata year,month,day,week,hour,minute,second,l,m;
year = Read_RTC_Data(Year_Register);
month = Read_RTC_Data(Month_Register);
day = Read_RTC_Data(Day_Register );
week = Read_RTC_Data(Week_Register); //lode new time
hour = Read_RTC_Data(Hour_Register);
minute = Read_RTC_Data(Minute_Register);
second = Read_RTC_Data(Second_Register);
l= hour ;
m= minute;
month=BcdtoDecimal(month);
day=BcdtoDecimal(day);
hour=BcdtoDecimal(hour);
minute=BcdtoDecimal(minute);
// SendOneByte(month) ;
// SendOneByte(day) ;
SendOneByte(((l&0xf0)>>4)+0x30 );
SendOneByte((l&0x0f)+0x30) ;
SendOneByte(0x3a) ;
SendOneByte(((m&0xf0)>>4)+0x30) ;
SendOneByte((m&0x0f)+0x30) ;
return Process_cal_scheduling_information(month,day,hour,minute );
}
void printf_time()
{
SendOneByte(Read_RTC_Data(Year_Register));
SendOneByte(Read_RTC_Data(Month_Register));
SendOneByte(Read_RTC_Data(Day_Register ));
SendOneByte(Read_RTC_Data(Week_Register));
SendOneByte(Read_RTC_Data(Hour_Register));
SendOneByte(Read_RTC_Data(Minute_Register));
SendOneByte(Read_RTC_Data(Second_Register));
}
void Write_RTC( uint8_t Year,uint8_t Month,uint8_t Day,uint8_t Hour,uint8_t Minute,uint8_t Second,uint8_t Week)
{
EXT_CTRL= EXT_CTRL|0x80;
//關(guān)閉寫保護 ]
Year = DecimaltoBcd(Year ) ;
Month = DecimaltoBcd(Month ) ;
Day = DecimaltoBcd(Day ) ;
Hour = DecimaltoBcd(Hour ) ;
Minute = DecimaltoBcd(Minute ) ;
Second = DecimaltoBcd(Second ) ;
Week = DecimaltoBcd(Week ) ;
EXT_ADR = Write_Protect_Register;
EXT_DAT = 0xff;
EXT_ADR = Time_Adjust_Register;
EXT_DAT = 0;
//日期
EXT_ADR = Year_Register;
EXT_DAT = Year;
EXT_ADR = Month_Register;
EXT_DAT = Month;
EXT_ADR = Day_Register;
EXT_DAT = Day;
EXT_ADR = Week_Register;
EXT_DAT = Week;
//時間
EXT_ADR = Hour_Register;
EXT_DAT = Hour;
EXT_ADR = Minute_Register;
EXT_DAT = Minute;
EXT_ADR = Second_Register;
EXT_DAT = Second;
//寫保護
EXT_ADR = Write_Protect_Register;
EXT_DAT = 0;
}
//讀取RTC數(shù)據(jù)
uint8_t Read_RTC_Data(uint8_t addr)
{
uint8_t temp=0;
EXT_ADR = addr;
temp=EXT_DAT;
return temp;
}
|
|