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

📄 rtc_ds12887.c

📁 本程序是用 ATmega16 控制实时时钟芯片 DS12887 接口驱动的源程序文件。
💻 C
📖 第 1 页 / 共 2 页
字号:
  temp = DS12887_REG_C;                       // 清零 DS12887 寄存器C所有标志位
  DS12887_REG_A = 0x20;                       // 启动晶体振荡器,关闭周期中断方波输出
  temp = DS12887_REG_B;                       // 芯片处于正常工作状态、允许更新周期结束中断、
  temp &= 0x32;                                 // 闹钟中断保持原设置状态、
  temp |= 0x12;                                 // 关闭周期中断、关闭方波输出、
  DS12887_REG_B = temp;                         // 采用 BCD 码数据格式和 24 小时制模式
  temp = DS12887_REG_D;                       // 检查内置电池能量状态?
  if ((temp&BIT7)==0)
  {
    Buzzer();                                 // 如果电池耗尽,系统将进行告警
  }
  DS12887_Year_H = 0x20;                      // 写入年前两位数据为 20
  temp = DS12887_REG_C;                       // 清零 DS12887 寄存器C所有标志位
#endif                                        // "MCU_No_ExtendedParallelBus" 条件编译结束
  DS12887_CS_PORT |= DS12887_CS_PINNum;       // 置 DS12887 片选控制引脚为H
}

/*==========================================================================================
函数功能:    本函数用于修改设置 DS12887 各个时标寄存器的时间数值(BCD 码)操作。
函数入口参数:SET_BCD_Year_H ------ 设置的年前两位时间数值(BCD码)。
              SET_BCD_Year -------- 设置的年时间数值(BCD码)。
              SET_BCD_Month ------- 设置的月份时间数值(BCD码)。
              SET_BCD_Date -------- 设置的日期时间数值(BCD码)。
              SET_BCD_Hour -------- 设置的小时时间数值(BCD码)。
              SET_BCD_Minute ------ 设置的分钟时间数值(BCD码)。
              SET_BCD_Second ------ 设置的秒时间数值(BCD码)。
              SET_BCD_Week -------- 设置的星期时间数值(BCD码)。
备注:
==========================================================================================*/
void SET_DS12887_TimeRegister(volatile unsigned char SET_BCD_Year_H,  // 年前两位
                              volatile unsigned char SET_BCD_Year,    // 年
                              volatile unsigned char SET_BCD_Month,   // 月份
                              volatile unsigned char SET_BCD_Date,    // 日期
                              volatile unsigned char SET_BCD_Hour,    // 小时
                              volatile unsigned char SET_BCD_Minute,  // 分钟
                              volatile unsigned char SET_BCD_Second,  // 秒
                              volatile unsigned char SET_BCD_Week)    // 星期
{
  register unsigned char temp;                // 临时寄存器变量
  register unsigned char temp2;               // 临时寄存器变量2
  SREG &= ~BIT7;                              // 关闭全局中断
  DS12887_CS_PORT &= ~DS12887_CS_PINNum;      // 置 DS12887 片选控制引脚为L
#ifdef MCU_No_ExtendedParallelBus             // 无扩展并行总线结构单片机的条件编译
  temp2 = VEPB_ReadData(DS12887_REG_B);       // 使芯片处于禁止更新状态、其他设置保持原来状态
  temp = VEPB_ReadData(DS12887_REG_B);
  temp |= BIT7;
  VEPB_WriteData(DS12887_REG_B, temp);
  VEPB_WriteData(DS12887_Year_H, SET_BCD_Year_H);  // 写入年前两位数据
  VEPB_WriteData(DS12887_Year, SET_BCD_Year);      // 写入年数据
  VEPB_WriteData(DS12887_Month, SET_BCD_Month);    // 写入月份数据
  VEPB_WriteData(DS12887_Date, SET_BCD_Date);      // 写入日期数据
  VEPB_WriteData(DS12887_Hour, SET_BCD_Hour);      // 写入小时数据
  VEPB_WriteData(DS12887_Minute, SET_BCD_Minute);  // 写入分钟数据
  VEPB_WriteData(DS12887_Second, SET_BCD_Second);  // 写入秒数据
  VEPB_WriteData(DS12887_Week, SET_BCD_Week);      // 写入星期数据
  temp = VEPB_ReadData(DS12887_REG_C);        // 清零 DS12887 寄存器C所有标志位
  temp2 &= ~BIT7;                             // 使芯片处于正常工作状态、其他设置保持原来状态
  VEPB_WriteData(DS12887_REG_B, temp2);
#else
  temp2 = DS12887_REG_B;                      // 使芯片处于禁止更新状态、其他设置保持原来状态
  temp = DS12887_REG_B;
  temp |= BIT7;
  DS12887_REG_B = temp;
  DS12887_Year_H = SET_BCD_Year_H;            // 写入年前两位数据
  DS12887_Year = SET_BCD_Year;                // 写入年数据
  DS12887_Month = SET_BCD_Month;              // 写入月份数据
  DS12887_Date = SET_BCD_Date;                // 写入日期数据
  DS12887_Hour = SET_BCD_Hour;                // 写入小时数据
  DS12887_Minute = SET_BCD_Minute;            // 写入分钟数据
  DS12887_Second = SET_BCD_Second;            // 写入秒数据
  DS12887_Week = SET_BCD_Week;                // 写入星期数据
  temp = DS12887_REG_C;                       // 清零 DS12887 寄存器C所有标志位
  temp2 &= ~BIT7;                             // 使芯片处于正常工作状态、其他设置保持原来状态
  DS12887_REG_B = temp2;
#endif                                        // "MCU_No_ExtendedParallelBus" 条件编译结束
  DS12887_CS_PORT |= DS12887_CS_PINNum;       // 置 DS12887 片选控制引脚为H
  SREG |= BIT7;                               // 使能全局中断
}

/*==========================================================================================
函数功能:    本函数用于控制 DS12887 闹钟打开/关闭的操作。
函数入口参数:AC_status ------ 仅可取二个值 ON 或 OFF 中的一个。
==========================================================================================*/
void DS12887_AlarmClock(unsigned char AC_status)
{
  register unsigned char temp;                // 临时寄存器变量
  if (AC_status == ON)
  {
    SREG &= ~BIT7;                            // 关闭全局中断
    DS12887_CS_PORT &= ~DS12887_CS_PINNum;    // 置 DS12887 片选控制引脚为L
#ifdef MCU_No_ExtendedParallelBus             // 无扩展并行总线结构单片机的条件编译
    temp = VEPB_ReadData(DS12887_REG_B);      // 设置允许闹钟中断、其他设置保持原来状态
    temp |= BIT5;
    VEPB_WriteData(DS12887_REG_B, temp);
#else
    temp = DS12887_REG_B;                     // 设置允许闹钟中断、其他设置保持原来状态
    temp |= BIT5;
    DS12887_REG_B = temp;
#endif                                        // "MCU_No_ExtendedParallelBus" 条件编译结束
    DS12887_CS_PORT |= DS12887_CS_PINNum;     // 置 DS12887 片选控制引脚为H
    SREG |= BIT7;                             // 使能全局中断
  }
  if (AC_status == OFF)
  {
    SREG &= ~BIT7;                            // 关闭全局中断
    DS12887_CS_PORT &= ~DS12887_CS_PINNum;    // 置 DS12887 片选控制引脚为L
#ifdef MCU_No_ExtendedParallelBus             // 无扩展并行总线结构单片机的条件编译
    temp = VEPB_ReadData(DS12887_REG_B);      // 设置禁止闹钟中断、其他设置保持原来状态
    temp &= ~BIT5;
    VEPB_WriteData(DS12887_REG_B, temp);
#else
    temp = DS12887_REG_B;                     // 设置禁止闹钟中断、其他设置保持原来状态
    temp &= ~BIT5;
    DS12887_REG_B = temp;
#endif                                        // "MCU_No_ExtendedParallelBus" 条件编译结束
    DS12887_CS_PORT |= DS12887_CS_PINNum;     // 置 DS12887 片选控制引脚为H
    SREG |= BIT7;                             // 使能全局中断
  }

}

/*==========================================================================================
函数功能:    本函数用于设置 DS12887 闹钟各个时标寄存器的时间数值(BCD 码)操作。
函数入口参数:SET_BCD_HouAlm ------ 设置的分钟闹钟时间数值(BCD码)。
              SET_BCD_MinAlm ------ 设置的小时闹钟时间数值(BCD码)。
备注:        ①.设置 DS12887 闹钟各个时标寄存器的时间数值后,将打开闹钟告警中断。
              ②.本函数将秒闹钟时间数值自动设置为0秒。
==========================================================================================*/
void SET_DS12887_AlarmClock(unsigned char SET_BCD_HouAlm, unsigned char SET_BCD_MinAlm)
{
  SREG &= ~BIT7;                              // 关闭全局中断
  DS12887_CS_PORT &= ~DS12887_CS_PINNum;      // 置 DS12887 片选控制引脚为L
#ifdef MCU_No_ExtendedParallelBus             // 无扩展并行总线结构单片机的条件编译
  VEPB_WriteData(DS12887_HouAlm, SET_BCD_HouAlm);  // 写入小时闹钟数据
  VEPB_WriteData(DS12887_MinAlm, SET_BCD_MinAlm);  // 写入分钟闹钟数据
  VEPB_WriteData(DS12887_SecAlm, 0x00);            // 写入秒闹钟数据
#else
  DS12887_HouAlm = SET_BCD_HouAlm;            // 写入小时闹钟数据
  DS12887_MinAlm = SET_BCD_MinAlm;            // 写入分钟闹钟数据
  DS12887_SecAlm = 0x00;                      // 写入秒闹钟数据
#endif                                        // "MCU_No_ExtendedParallelBus" 条件编译结束
  DS12887_CS_PORT |= DS12887_CS_PINNum;       // 置 DS12887 片选控制引脚为H
  DS12887_AlarmClock(ON);                     // 打开闹钟告警中断
  SREG |= BIT7;                               // 使能全局中断
}

/*==========================================================================================
函数功能:    本函数用于闹钟告警中断的任务时间消息处理操作。
函数入口参数:BAC_number ------ 蜂鸣器发出声响次数值。
              本函数还将在函数体中检查隐含的全局静态变量参数变量 tasks_time
              (时间消息的任务)位1的布尔值而执行发出声响告警操作。
备注:        ①.本函数需要放在主函数的不间断循环体中运行。
              ②.本函数在执行过程中将修改 tasks_time(时间消息的任务)变量的位1
                  和位2,与 buzzer_alarm_counte(蜂鸣器发出声响次数)变量的数值。
==========================================================================================*/
void Tasks_AlarmClock(unsigned int BAC_number)
{
  register unsigned char temp;                // 临时寄存器变量
  register unsigned int temp_2;               // 临时双寄存器变量
  temp = tasks_time;
  if ((temp&BIT1) == BIT1)                    // 如果闹钟告警消息任务位置位,将发出声响告警
  {
    temp = tasks_time;
    if ((temp&BIT2) == BIT2)
    {
      temp_2 = buzzer_alarm_counter;
      if (temp_2 > 0x0000)
      {
        Buzzer();                             // 蜂鸣器发出一响声
        buzzer_alarm_counter = buzzer_alarm_counter-1; // 蜂鸣器发出声响次数-1
LCDM_BackgroundLight(ON);
        delay_ms(2);
        Buzzer();
        delay_ms(100);
        Buzzer();
        delay_ms(8);
LCDM_BackgroundLight(OFF);
        Buzzer();
        delay_ms(300);
      }
      else
      {
        tasks_time &= ~BIT2;                  // 蜂鸣声响消息任务位清零
        tasks_time &= ~BIT1;                  // 闹钟告警消息任务位清零
      }
    }
    else
    {
      buzzer_alarm_counter = BAC_number;      // 置蜂鸣器发出声响次数值
      tasks_time |= BIT2;                     // 蜂鸣声响消息任务位置位
    }
  }
}

/*==========================================================================================
函数功能:    本函数用于时间更新中断的任务时间消息处理操作。
函数入口参数:LCDM_ShowMode --- 在液晶上显示日期和时间的点阵字符样式选择值。
                                共有下列两种选择值和点阵字符样式供选择:
                                入口参数= 8  :8×16点阵字符样式。
                                入口参数= 16 :16×16点阵字符样式。
              本函数还将在函数体中检查隐含的全局静态变量参数变量 tasks_time
              (时间消息的任务)位0的布尔值而执行时间更新操作。
备注:        ①.本函数需要放在主函数的不间断循环体中运行。
              ②.本函数在执行过程中将修改 tasks_time(时间消息的任务)变量的位0。
==========================================================================================*/
void Tasks_TimeUpdate(unsigned char LCDM_ShowMode)
{
  register unsigned char temp;                // 临时寄存器变量
  temp = tasks_time;
  if ((temp&BIT0)==BIT0)                      // 更新中断消息任务位是否置位?
  {
    switch (LCDM_ShowMode)
    {
      case 8:
        LCDM_DayTime_Show_8_16(&time);        // 在液晶上显示8×16字符的日期和时间
        break;
      case 16:
        LCDM_DayTime_Show_16_16(&time);       // 在液晶上显示16×16字符的日期和时间
        break;
      default:
        LCDM_DayTime_Show_8_16(&time);        // 在液晶上显示8×16字符的日期和时间
    }
    tasks_time &= ~BIT0;                      // 时间更新消息任务位清零
  }
}



/*
********************************************************************************************
                                 本C语言源程序文件到此结束
********************************************************************************************
*/

⌨️ 快捷键说明

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