您当前的位置:五五电子网电子知识单片机-工控设备AVR单片机DS1302的AVR程序(2000年~2099年的星期自动计算功能) 正文
DS1302的AVR程序(2000年~2099年的星期自动计算功能)

DS1302的AVR程序(2000年~2099年的星期自动计算功能)

点击数:7969 次   录入时间:03-04 11:58:09   整理:http://www.55dianzi.com   AVR单片机
    nop(); 
    nop(); 
    reg >>= 1; 
    } 
  clr_ds1302_io_ddr(); 
  nop(); 
  nop(); 
  for (i = 8; i > 0; i--) 
    { 
    data >>= 1; 
    if (in_ds1302_io()) 
    { 
      data |= 0x80; 
    } 
    nop(); 
    nop(); 
    set_ds1302_sclk(); 
    nop(); 
    nop(); 
    clr_ds1302_sclk(); 
    nop(); 
    nop(); 
    } 
  clr_ds1302_rst(); 
  nop(); 
  nop(); 
  return (data); 
  } 
uchar check_ds1302(void) 
  { 
  ds1302_write(ds1302_control_reg, 0x80); 
  if (ds1302_read(ds1302_control_reg) == 0x80) 
  { 
    return 1; 
  } 
  return 0; 
  } 
void ds1302_read_time(void) 
  { 
  uchar tmphour; 
  nowtime.nowyear = BcdToBin(ds1302_read(ds1302_year_reg)); ///年 
  nowtime.nowmonth = BcdToBin(ds1302_read(ds1302_month_reg)); ///月 
  nowtime.nowday = BcdToBin(ds1302_read(ds1302_date_reg)); ///日 
  nowtime.nowweek = BcdToBin(ds1302_read(ds1302_day_reg)); ///周 
  tmphour = ds1302_read(ds1302_hr_reg); ///时 
  nowtime.nowhour = (tmphour &0b00100000) / 32 * 20+(tmphour &0x10) / 16 * 10+(tmphour &0x0F); 
  nowtime.nowminute = BcdToBin(ds1302_read(ds1302_min_reg)); ///分 
  nowtime.nowsecond = BcdToBin(ds1302_read(ds1302_sec_reg)); ///秒 
  } 

const unsigned char WeekTab[] = { 
   //闰年月星期表 
  (3 << 5) + 31,///1月 
  (6 << 5) + 29,///2月 
  (0 << 5) + 31,///3月 
  (3 << 5) + 30,///4月 
  (5 << 5) + 31,//5月 
  (1 << 5) + 30,//6月 
  (3 << 5) + 31,//7月 
  (6 << 5) + 31,//8月 
  (1 << 5) + 30,//9月 
  (4 << 5) + 31,//10月 
  (0 << 5) + 30,//11月 
  (2 << 5) + 31 //12月 
}; 

/*!------------------------------------------------------------------------------ 
                                2000年~2099年星期算法 
-------------------------------------------------------------------------------*/ 
unsigned char WeekDay20(unsigned char y, unsigned char m, unsigned char d) 

unsigned char week, day; 
  day = WeekTab[m - 1];///月表 
  week = day >> 5;///月星期数 
  day &= 0x1f;//月天数 
  if ((m < 3) && (y & 0x03)) 
      {///平年 
    if (m == 2) day--;///平年月天数 
    week++;///平年月表+1 
  } 
  y = y + (y >> 2);//年+年/4 
  week = (week +  y + d + 2) % 7;///(星期=年+年/4+月表+2日)%7 
  return week;///返回星期 


void ds1302_write_time(void) 
  { 
  uchar bcdyear; 
  uchar bcdmonth; 
  uchar bcdday; 
  uchar bcdhour; 
  uchar bcdminute; 
  uchar bcdsecond; 
  uchar bcdweek; 

  bcdyear = BinToBcd(nowtime.nowyear); 
  bcdmonth = BinToBcd(nowtime.nowmonth); 
  bcdday = BinToBcd(nowtime.nowday); 
  bcdhour = BinToBcd(nowtime.nowhour); 
  bcdminute = BinToBcd(nowtime.nowminute); 
  bcdsecond = BinToBcd(nowtime.nowsecond); 
    
  nowtime.nowweek=WeekDay20(nowtime.nowyear,nowtime.nowmonth,nowtime.nowday); 
  bcdweek = BinToBcd(nowtime.nowweek); 
    
  ds1302_write(ds1302_control_reg, 0x00); ///关闭写保护 
  ds1302_write(ds1302_sec_reg, 0x80); ///暂停 
  ds1302_write(ds1302_day_reg, bcdweek); ///周    
  ds1302_write(ds1302_charger_reg, 0xa9); ///涓流充电 
  ds1302_write(ds1302_year_reg, bcdyear); ///年 
  ds1302_write(ds1302_month_reg, bcdmonth); ///月 
  ds1302_write(ds1302_date_reg, bcdday); ///日 
  ds1302_write(ds1302_hr_reg, bcdhour); ///时 
  ds1302_write(ds1302_min_reg, bcdminute); ///分 
  ds1302_write(ds1302_sec_reg, bcdsecond); ///秒 
  ds1302_write(ds1302_control_reg, 0x80); ///打开写保护 
 } 

上一页  [1] [2] 


本文关键字:程序  AVR单片机单片机-工控设备 - AVR单片机