⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtc.c

📁 基于MSP430系列单片机的软件实时时钟(RTC)代码,使用定时器B为中断源,时间变量使用字符型变量储存,便于直接输出数字
💻 C
字号:
#include "RTC.h"
#include "MSP430X16X.h"

//实时时钟变量,分别存放时间的小时十位、个位,分钟的十位、个位,秒,冒号
char Time[9]={'2','1',':','2','9',':','5','0','\0'};
//日期
char Date[11]={'2','0','0','8','.','0','5','.','2','0','\0'};


void Init_TimerB()//定时器B初始化
{
  TBCTL=TBSSEL_1+TBCLR+MC_0;  //选择时钟源为ACLK(32768Hz),定时器清除,停止计数
  TBCCTL0 = CCIE;             //允许定时器中断
  TBCCR0=32767;               //定时时间1s
  TBCTL |= MC_1;              //打开定时器
}


//-----------------Real Time Clock------------
////////////////////定时器B中断子程序
#pragma vector=TIMERB0_VECTOR
__interrupt void RealTimeClock_ISR(void)
{
  SECOND_01++;
  if(SECOND_01==':')
  {
    SECOND_01='0';
    SECOND_10++;
    if(SECOND_10=='6')
    {
      SECOND_10='0';
      if(Minute_Increase())       //分钟增加,根据返回值判断小时是否要增加
        if(Hour_Increase())       //小时增加,根据返回值判断日期是否要增加
          if(Day_Increase())      //日期增加,根据返回值判断月份是否要增加
            if(Month_Increase())  //月份增加,根据返回值判断年份是否要增加
              Year_Increase();    //年份增加
    }
  }
  
}

/////////////////////分钟增加函数,若增加满一天,返回1,否则返回0
unsigned char Minute_Increase()
{
  unsigned char result=0;
  MINUTE_01++;
  if(MINUTE_01==':')
  {
    MINUTE_01='0';
    MINUTE_10++;
    if(MINUTE_10=='6')  //小时进位
    {
      MINUTE_10='0';
      result=1;
    }
  }
  return result;
}

/////////////////////分钟减少函数
void Minute_Decrease()
{
  MINUTE_01--;
  if(MINUTE_01=='/')
  {
    MINUTE_01='9';
    MINUTE_10--;
    if(MINUTE_10=='/')
    {
      MINUTE_10='5';
    }
  }
}

//////////////小时增加函数,若增加满一天,返回1,否则返回0
unsigned char Hour_Increase()
{
  unsigned char result=0;
  HOUR_01++;
  if(HOUR_01==':' || HOUR_10=='2' && HOUR_01=='4')
  {
    if(HOUR_10=='2' && HOUR_01=='4')
    {
      HOUR_01='0';
      HOUR_10='0';
      result=1;
    }
    else
    {
      HOUR_01='0';
      HOUR_10++;
    }
  }
  return result;
}

////////////////小时减少函数
void Hour_Decrease()
{
  HOUR_01--;
  if(HOUR_01=='/')
  {
    if(HOUR_10=='0')
    {
      HOUR_01='3';
      HOUR_10='2';
    }
    else
    {
      HOUR_01='9';
      HOUR_10--;
    }
  }
}

//////////////日期增加函数,若增加满一个月,返回1,否则返回0
unsigned char Day_Increase()
{
  unsigned int year,month;          //用于记录年和月的十进制值
  unsigned char day,leap,result=0;  //用于存放日的十进制值,2月的日数和返回值
  month=MONTH_10*10+MONTH_01-528;   //把字符型的月份转化为十进制
  day=DAY_10*10+DAY_01-528;         //把字符型的日期转化为十进制
  day++;
  switch(month)
  {
    case(1):              //大月份
    case(3):
    case(5):
    case(7):
    case(8):
    case(10):
    case(12):
    {
      if(day>31)          //大约增加超过31日,转到1号
      {
        DAY_01='1';
        DAY_10='0';
        result=1;         //返回1,表示有月份进位
      }
      else
      {
        DAY_01=day%10+48; //没有进位,十进制日期转回字符
        DAY_10=day/10+48;
      }
      break;
    }
    case(2):
    {
      year=1472+YEAR_10*10+YEAR_01;   //把字符型的年份转化为十进制
      if(year%400==0 || (year%4==0 && year%100!=0)) //闰年
        leap=29;
      else
        leap=28;
      if(day>leap)        //月份增加越界,转到1号
      {
        DAY_01='1';
        DAY_10='0';
        result=1;         //返回1,表示有月份进位
      }
      else
      {
        DAY_01=day%10+48; //没有进位,十进制日期转回字符
        DAY_10=day/10+48;
      }
      break;
    }
    default:
    {
      if(day>30)          //小月,30日
      {
        DAY_01='1';
        DAY_10='0';
        result=1;
      }
      else
      {
        DAY_01=day%10+48;
        DAY_10=day/10+48;
      }
    }
  }
  return result;
}

////////////////日期减少函数,主要用于日期设定
void Day_Decrease()
{
  unsigned int year,month;
  unsigned char day,leap;
  month=MONTH_10*10+MONTH_01-528;
  day=DAY_10*10+DAY_01-528;
  day--;
  switch(month)
  {
    case(1):              //大月份
    case(3):
    case(5):
    case(7):
    case(8):
    case(10):
    case(12):
    {
      if(day==0)          //日期减少到0号时自动转为31号
      {
        DAY_01='1';
        DAY_10='3';
      }
      else
      {
        DAY_01=day%10+48;
        DAY_10=day/10+48;
      }
      break;
    }
    case(2):
    {
      year=1472+YEAR_10*10+YEAR_01;
      if(year%400==0 || (year%4==0 && year%100!=0)) //闰年
        leap=29;
      else
        leap=28;
      if(day==0 || day>leap)
        day=leap;
      DAY_01=day%10+48;
      DAY_10=day/10+48;
      break;
    }
    default:
    {
      if(day==0)
      {
        DAY_01='0';
        DAY_10='3';
      }
      else
      {
        DAY_01=day%10+48;
        DAY_10=day/10+48;
      }
    }
  }
}

//////////////月份增加函数,若增加满一年,返回1,否则返回0
unsigned char Month_Increase()
{
  unsigned char result=0;
  MONTH_01++;
  if(MONTH_01==':' || MONTH_10=='1' && MONTH_01=='3')   //个位进位或者增加到13月
  {
    if(MONTH_10=='1' && MONTH_01=='3')                  //如果是13月
    {
      MONTH_01='1';                                     //转到1月
      MONTH_10='0';
      result=1;                                         //返回1,年份进位
    }
    else
    {
      MONTH_01='1';
      MONTH_10++;
    }
  }
  return result;
}

////////////////月份减少函数
void Month_Decrease()
{
  MONTH_01--;
  if(MONTH_01=='/')
  {
    if(MONTH_10=='0')
    {
      MONTH_01='2';
      MONTH_10='1';
    }
    else
    {
      MONTH_01='9';
      MONTH_10--;
    }
  }
}

////////////////年份增加函数,年份取值为2000-2099
void Year_Increase()
{
  YEAR_01++;
  if(YEAR_01==':')
  {
    YEAR_01='0';
    YEAR_10++;
    if(YEAR_10==':')
      YEAR_10='0';
  }
}

///////////////年份减少函数
void Year_Decrease()
{
  YEAR_01--;
  if(YEAR_01=='/')
  {
    YEAR_01='9';
    YEAR_10--;
    if(YEAR_10=='/')
      YEAR_10='9';
  }
}


//-----------------Real Time Clock------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -