找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2050|回复: 0
打印 上一主题 下一主题
收起左侧

日出日落时刻调度器

[复制链接]
跳转到指定楼层
楼主
ID:82781 发表于 2015-6-13 16:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

/*

参照济南市日出日落时刻表。
小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,
};
/*

时间调度

*/
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; //关灯
        }
       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; //关灯
         
         }
         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;//关灯
         
          }
        }
        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);


}
/*
时刻调度法调度器


  
*/
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;
   //关闭写保护   ]
   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数据
uint8_t Read_RTC_Data(uint8_t addr)
{
  uint8_t  temp=0;
EXT_ADR  = addr;
   temp=EXT_DAT;
   
   return  temp;

}




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表