×
单片机 > 单片机程序设计 > 详情

实时时钟芯片 DS12887 接口驱动程序

发布时间:2020-05-27 发布时间:
|
**************************************************************************************** 
源程序文件名:      RTC_DS12887.C 
源程序名称:        实时时钟芯片 DS12887 接口驱动的源程序文件 
程序版本:        1.0 
程序功能:           
    本程序是用 ATmega16 控制实时时钟芯片 DS12887 接口驱动的源程序文件。 
程序说明: 
     
函数入口参数:       
函数出口参数:       

编译工具软件:      CodeVision AVR C 版本:1.24.6 以上 
链接子程序文件:     

编作者:            磊元 
编作者 E-Mail:     PTZSW@163.COM 
编制日期:          2005年5月22日 
------------------------------------------------------------------------------ 
适用器件芯片类型:   Atmel 公司生产的8位 RISC 单片机 
器件芯片时钟频率:    
存储器模式:        小存储器模式 
外部扩展存储器大小:0 【字节】 
数据堆栈大小:      256 【字节】 
------------------------------------------------------------------------------ 
源程序版本历史: 
2005年5月22日 -------- 版本 1.0 :发行版本 
**************************************************************************************** 
*/ 


/*====================================================================================== 
              本源程序包括的头部文件 
======================================================================================*/ 
#include "LCDM_Day_Time.h"            /* 包含在液晶上显示日期和时间信息的头部文件 */ 
#include "RTC_DS12887.h"              /* 本程序的头部文件 */ 


/*====================================================================================== 
                              程序指令代码清单 
======================================================================================*/ 
/*---------------------------------------------------------------------------- 
全局静态变量定义: 
----------------------------------------------------------------------------*/ 
static volatile Uchar8 tasks_time=0;             /* 时间消息的任务变量 */ 
/* 时间消息的任务变量的各位定义如下: 
  ┏━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┳━━━━┓ 
  ┃  BIT7  ┃  BIT6  ┃  BIT5  ┃  BIT4  ┃  BIT3  ┃  BIT2  ┃  BIT1  ┃  BIT0  ┃ 
  ┣━━━━╋━━━━╋━━━━╋━━━━╋━━━━╋━━━━╋━━━━╋━━━━┫ 
  ┃  保留  ┃  保留  ┃  保留  ┃  保留  ┃  保留  ┃蜂鸣声响┃闹钟告警┃时间更新┃ 
  ┗━━━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━━┻━━━━┛ 
*/ 
static volatile Uint16 buzzer_alarm_counter=0;   /* 蜂鸣器发出声响次数 */ 
static volatile BCD_TIME time=BCD_TIME_defaults; /* 系统时间结构变量 */ 


/*---------------------------------------------------------------------------- 
函数功能:    本函数用于控制蜂鸣器发出声响告警的操作,设定蜂鸣器频率为 2000Hz 。
备注:        蜂鸣器设置为相应的控制引脚高电平时,蜂鸣器发出声响。 
----------------------------------------------------------------------------*/ 
void Buzzer(void) 

  Buzzer_DDR |= Buzzer_PINNum;        /* 设置蜂鸣器控制端口为输出引脚 */ 
  Buzzer_PORT |= Buzzer_PINNum;       /* 打开蜂鸣器 */   
  delay_us(500);                      /* 延时 500us */ 
  Buzzer_PORT &= ~Buzzer_PINNum;      /* 关闭蜂鸣器 */ 


#ifdef MCU_No_ExtendedParallelBus     /* 无扩展并行总线结构单片机的条件编译 */ 
  /*---------------------------------------------------------------------------- 
  函数功能:    本函数用于虚拟扩展并行总线结构的向外围器件写入数据操作。 
  函数入口参数:AccessAddress ------ 访问的外围器件地址。 
                WriteData ---------- 写入的数据。 
  备注:        本函数仅可访问外围器件的地址数不超过256个。 
  ----------------------------------------------------------------------------*/ 
  void VEPB_WriteData(volatile Uchar8 AccessAddress, volatile Uchar8 WriteData) 
  { 
    VEPB_AD_DDR = 0xFF;                 /* 设置虚拟总线地址/数据总线的数据方向为输出 */ 
    VEPB_AD_PORT = AccessAddress;       /* 写入访问的外围器件地址到总线上 */ 
    VEPB_ALE_PORT |= VEPB_ALE_PINNum;   /* 地址锁存到外围器件 */ 
    VEPB_ALE_PORT &= ~VEPB_ALE_PINNum; 
    VEPB_AD_PORT = WriteData;           /* 写入数据 */ 
    VEPB_WR_PORT &= ~VEPB_WR_PINNum;    /* 使能写入数据 */ 
    VEPB_WR_PORT |= VEPB_WR_PINNum; 
  } 
  /*---------------------------------------------------------------------------- 
  函数功能:    本函数用于虚拟扩展并行总线结构的从外围器件读取数据操作。 
  函数入口参数:AccessAddress ------ 访问的外围器件地址。 
  函数出口参数:读取的数据。 
  备注:        本函数仅可访问外围器件的地址数不超过256个。 
  ----------------------------------------------------------------------------*/ 
  Uchar8 VEPB_ReadData(volatile Uchar8 AccessAddress) 
  { 
    volatile Uchar8 temp;             /* 出口参数寄存器变量 */ 
    VEPB_AD_DDR = 0xFF;                 /* 设置虚拟总线地址/数据总线的数据方向为输出 */ 
    VEPB_AD_PORT = AccessAddress;       /* 写入访问的外围器件地址到总线上 */ 
    VEPB_ALE_PORT |= VEPB_ALE_PINNum;   /* 地址锁存到外围器件 */ 
    VEPB_ALE_PORT &= ~VEPB_ALE_PINNum; 
    VEPB_AD_DDR = 0x00;                 /* 设置虚拟总线地址/数据总线的数据方向为输入 */
    VEPB_AD_PORT = 0xFF;                /* 使能虚拟总线地址/数据总线的上拉电阻 */ 
    VEPB_RD_PORT &= ~VEPB_RD_PINNum;    /* 使能读取数据 */ 
    temp = VEPB_AD_PIN;                 /* 读取数据 */ 
    temp = VEPB_AD_PIN;                 /* 加大读取数据脉冲信号的宽度 */ 
    VEPB_RD_PORT |= VEPB_RD_PINNum; 
    return (temp); 
  } 
#endif                                /* "MCU_No_ExtendedParallelBus" 条件编译结束 */ 

/*---------------------------------------------------------------------------- 
函数功能:    本函数用于外部中断请求0中断向量的初始化操作。 
备注:        ①.本函数仅在主函数中调用一次即可。 
              ②.要使能中断还必须在主程序中打开全局中断使能功能,推荐其指令如下: 
                  SREG |= BIT7;                       / * 使能全局中断 * / 
----------------------------------------------------------------------------*/ 
void external_INT0_initialization(void) 

  #ifdef _MEGA16_INCLUDED_            /* 目标器件芯片为 ATMega16 的条件编译 */ 
    MCUCR &= ~BIT0;                     /* 设置外部中断请求0的触发方式为:下降沿触发 */ 
    MCUCR |= BIT1; 
    GICR |= BIT6;                       /* 使能外部中断请求0 */ 
    GIFR |= BIT6;                       /* 外部中断请求0标志位清零 */ 
  #endif                              /* "_MEGA16_INCLUDED_" 条件编译结束 */ 

  #ifdef _MEGA128_INCLUDED_           /* 目标器件芯片为 ATMega128 的条件编译 */ 
    EICRA &= ~BIT0;                     /* 设置外部中断请求0的触发方式为:下降沿触发 */ 
    EICRA |= BIT1; 
    EIMSK |= BIT0;                      /* 使能外部中断请求0 */ 
    EIFR |= BIT6;                       /* 外部中断请求0标志位清零 */ 
  #endif                              /* "_MEGA128_INCLUDED_" 条件编译结束 */ 


/*---------------------------------------------------------------------------- 
函数功能:    本函数用于 DS12887 闹钟中断请求和更新周期结束中断请求处理的中断服务程序。 
备注:        ①.注意:由于本函数为中断函数,故在调用和返回时无法进行明式数值传递, 
                  因此将在函数体中隐式修改下面这几个全局静态变量数值。 
                  ⑴.时间消息的任务变量(tasks_time),用以通知系统执行相应的处理操作。 
                  ⑵.系统时间结构变量(time),从 DS12887 中读取更新的系统时间数值。 
              ②.本函数需在设置的 DS12887 中断请求的中断向量函数中调用。在调用之前 
                  需对该中断向量进行初始化,以使能该中断。例:如使用外部中断请求0, 
                  可使用上面提供的 external_INT0_initialization() 函数进行初始化, 
                  而将本本函数放在外部中断请求0服务程序中。 
----------------------------------------------------------------------------*/ 
void DS12887_INT_ISR(void) 

  register Uchar8 temp;             /* 临时寄存器变量 */ 
  register Uchar8 temp2;            /* 临时寄存器变量2 */ 
  DS12887_CS_PORT &= ~DS12887_CS_PINNum;/* 置 DS12887 片选控制引脚为L */ 
  #ifdef MCU_No_ExtendedParallelBus   /* 无扩展并行总线结构单片机的条件编译 */ 
    /* 读取 DS12887 寄存器C(中断标志寄存器)的内容,访问该寄存器后将自动清零所有 
       标志位,否则芯片将无法产生下一次中断请求。其次可对读取的中断标志位进行判断。 */ 
    temp = VEPB_ReadData(DS12887_REG_C); 
  #else 
    temp = DS12887_REG_C; 
  #endif                              /* "MCU_No_ExtendedParallelBus" 条件编译结束 */ 
  temp2 = temp; 
  /* 检查是否为闹钟中断?是,则通知系统对闹钟请求执行相应的处理 */ 
  if ((temp&BIT5)==BIT5) 
    { 
      tasks_time |= BIT1;                 /* 闹钟告警消息任务位置位 */ 
    } 
  /* 检查是否为更新周期结束中断?是,则通知系统对更新周期结束请求执行相应的处理 */ 
  if ((temp2&BIT4)==BIT4) 
    { 
      /* 读取 DS12887 中更新的系统时间数值 */ 
      #ifdef MCU_No_ExtendedParallelBus   /* 无扩展并行总线结构单片机的条件编译 */ 
        time.BCD_Second = VEPB_ReadData(DS12887_Second); 
        time.BCD_Minute = VEPB_ReadData(DS12887_Minute); 
        time.BCD_Hour = VEPB_ReadData(DS12887_Hour); 
        time.BCD_Date = VEPB_ReadData(DS12887_Date); 
        time.BCD_Month = VEPB_ReadData(DS12887_Month); 
        time.BCD_Year = VEPB_ReadData(DS12887_Year); 
        time.BCD_Year_H = VEPB_ReadData(DS12887_Year_H); 
        time.BCD_Week = VEPB_ReadData(DS12887_Week); 
      #else 
        time.BCD_Second = DS12887_Second; 
        time.BCD_Minute = DS12887_Minute; 
        time.BCD_Hour = DS12887_Hour; 
        time.BCD_Date = DS12887_Date; 
        time.BCD_Month = DS12887_Month; 
        time.BCD_Year = DS12887_Year; 
        time.BCD_Year_H = DS12887_Year_H; 
        time.BCD_Week = DS12887_Week; 
      #endif                              /* "MCU_No_ExtendedParallelBus" 条件编译结束 */ 
      tasks_time |= BIT0;                 /* 时间更新消息任务位置位 */ 
    } 
  DS12887_CS_PORT |= DS12887_CS_PINNum;/* 置 DS12887 片选控制引脚为H */ 


/*---------------------------------------------------------------------------- 
函数功能:    本函数用于 DS12887 的各控制输入/输出引脚定义和初始状态设置的初始化操作。 
备注:        本函数仅在主函数中调用一次即可。 
----------------------------------------------------------------------------*/ 
void RTC_DS12887_initialization(void) 

  register Uchar8 temp;             /* 临时寄存器变量 */ 
/* 下面这些语句用于设置 DS12887 的各控制引脚与MCU的连接定义和初始状态 */ 
  DS12887_CS_DDR |= DS12887_CS_PINNum;   /* 设置 DS12887 片选控制为输出引脚 */ 
  DS12887_CS_PORT |= DS12887_CS_PINNum;  /* 置 DS12887 片选控制引脚为H */ 
  DS12887_IRQ_DDR &= ~DS12887_IRQ_PINNum;/* 设置 DS12887 中断请求为输入引脚 */ 
  DS12887_IRQ_PORT |= DS12887_IRQ_PINNum;/* 使能 DS12887 中断请求引脚的上拉电阻 */ 
  #ifdef MCU_No_ExtendedParallelBus   /* 无扩展并行总线结构单片机的条件编译 */ 
    VEPB_ALE_DDR |= VEPB_ALE_PINNum;    /* 设置虚拟总线控制线地址锁存使能为输出引脚 */ 
    VEPB_ALE_PORT &= ~VEPB_ALE_PINNum;  
    VEPB_WR_DDR |= VEPB_WR_PINNum;      /* 设置虚拟总线控制线写使能信号为输出引脚 */ 
    VEPB_WR_PORT |= VEPB_WR_PINNum;   
    VEPB_RD_DDR |= VEPB_RD_PINNum;      /* 设置虚拟总线控制线读锁存信号为输出引脚 */ 
    VEPB_RD_PORT |= VEPB_RD_PINNum;  
    VEPB_AD_DDR = 0x00;                 /* 设置虚拟总线地址/数据总线的数据方向为输入 */
    VEPB_AD_PORT = 0xFF;                /* 使能虚拟总线地址/数据总线的上拉电阻 */ 
  #else 
    MCUCR |= BIT7;                      /* 使能外部存储器接口 */ 
  #endif                              /* "MCU_No_ExtendedParallelBus" 条件编译结束 */ 

/* 下面这些语句用于 DS12887 初始化操作 */ 
  DS12887_CS_PORT &= ~DS12887_CS_PINNum;/* 置 DS12887 片选控制引脚为L */ 
  #ifdef MCU_No_ExtendedParallelBus   /* 无扩展并行总线结构单片机的条件编译 */ 
    /* 启动晶体振荡器,关闭周期中断方波输出 */ 
    VEPB_WriteData(DS12887_REG_A, 0x20); 
    /* 芯片处于正常工作状态、允许更新周期结束中断、闹钟中断保持原设置状态、 
       关闭周期中断、关闭方波输出、采用 BCD 码数据格式和 24 小时制模式 */ 
    temp = VEPB_ReadData(DS12887_REG_B); 
    temp &= 0x32; 
    temp |= 0x12; 
    VEPB_WriteData(DS12887_REG_B, temp); 
    /* 检查内置电池能量状态?如果电池耗尽,系统将进行告警 */ 
    temp = VEPB_ReadData(DS12887_REG_D); 
    if ((temp&BIT7)==0) 
    { 
      Buzzer(); 
    } 
    /* 写入年前两位数据为 20 */ 
    VEPB_WriteData(DS12887_Year_H, 0x20); 
    /* 读取 DS12887 寄存器C(中断标志寄存器)的内容,使该寄存器清零所有标志位 */ 
    temp = VEPB_ReadData(DS12887_REG_C); 
  #else 
    /* 启动晶体振荡器,关闭周期中断方波输出 */ 
    DS12887_REG_A = 0x20; 
    /* 芯片处于正常工作状态、允许更新周期结束中断、关闭周期中断和闹钟中断、 
       关闭方波输出、采用 BCD 码数据格式和 24 小时制模式 */ 
    temp = DS12887_REG_B; 
    temp &= 0x32; 
    temp |= 0x12; 
    DS12887_REG_B = temp; 
    /* 检查内置电池能量状态?如果电池耗尽,系统将进行告警 */ 
    temp = DS12887_REG_D; 
    if ((temp&BIT7)==0) 
    { 
      Buzzer(); 
    } 
    /* 写入年前两位数据为 20 */ 
    DS12887_Year_H = 0x20; 
    /* 读取 DS12887 寄存器C(中断标志寄存器)的内容,使该寄存器清零所有标志位 */ 
    temp = DS12887_REG_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 Uchar8 SET_BCD_Year_H,   /* 年前两位 */ 
                              volatile Uchar8 SET_BCD_Year,     /* 年 */ 
                              volatile Uchar8 SET_BCD_Month,    /* 月份 */ 
                              volatile Uchar8 SET_BCD_Date,     /* 日期 */ 
                              volatile Uchar8 SET_BCD_Hour,     /* 小时 */ 
                              volatile Uchar8 SET_BCD_Minute,   /* 分钟 */ 
                              volatile Uchar8 SET_BCD_Second,   /* 秒 */ 
                              volatile Uchar8 SET_BCD_Week)     /* 星期 */ 

  register Uchar8 temp;             /* 临时寄存器变量 */ 
  register Uchar8 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);     /* 写入星期数据 */ 
    /* 读取 DS12887 寄存器C(中断标志寄存器)的内容,使该寄存器清零所有标志位 */ 
    temp = VEPB_ReadData(DS12887_REG_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;        /* 写入星期数据 */ 
    /* 读取 DS12887 寄存器C(中断标志寄存器)的内容,使该寄存器清零所有标志位 */ 
    temp = DS12887_REG_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(Uchar8 AC_status) 

  register Uchar8 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(Uchar8 SET_BCD_HouAlm, Uchar8 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(Uint16 BAC_number) 

  register Uchar8 temp;             /* 临时寄存器变量 */ 
  register Uint16 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--;         /* 蜂鸣器发出声响次数-1 */ 
LCDM_BackgroundLight(ON); 
        delay_ms(300); 
LCDM_BackgroundLight(OFF); 
        Buzzer();                       /* 蜂鸣器发出一声声响 */ 
        delay_ms(200); 
      } 
      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(Uchar8 LCDM_ShowMode) 

  register Uchar8 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语言源程序文件到此结束 
**************************************************************************************** 
*/ 


interrupt [EXT_INT0] void ext_int0_isr(void) 

  DS12887_INT_ISR(); 



void main(void) 

  LCDM_initialization(); 
  external_INT0_initialization(); 
  RTC_DS12887_initialization(); 
  SREG |= BIT7;                       /* 使能全局中断 */ 
//  SET_DS12887_TimeRegister(0x20,0x05,0x05,0x31,0x22,0x51,0x00,0x03); 
  SET_DS12887_AlarmClock(0x11, 0x12); 
  while (1) 
  { 
    Tasks_TimeUpdate(16);                 
    Tasks_AlarmClock(0x0088);    
  }; 
关键字:实时时钟  DS12887  驱动程序 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析