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

发布者:幸福自在最新更新时间:2016-10-29 来源: eefocus关键字:实时时钟  DS12887  驱动程序 手机看文章 扫描二维码
随时随地手机看文章
**************************************************************************************** 
源程序文件名:      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  驱动程序 引用地址:实时时钟芯片 DS12887 接口驱动程序

上一篇:用atmega8做简单的红外线报警器
下一篇:PID应用于电机闭环调速系统

推荐阅读最新更新时间:2024-03-16 15:18

STM32系列之LCD驱动接口与驱动程序介绍
STM32F103系列是没有内置LCD控制器接口的,如果要驱动LCD,需要一颗LCD图形驱动IC。STM32和LCD驱动IC的接口在STM32端是FSMC,FSMC接口提供各种存储器驱动信号也提供了驱动LCD驱动IC的各种信号。 一、FSMC简介 FSMC概览 如下图可以看到FSMC支持的存储器类型及提供的各种读写控制信号。 图1 2.FSMC 框图 图2 3.FSMC 内存地址空间分配 图3 二、LCD 接口 1.8080和6800接口 这两种接口类型是典型的LCD并行接口。接口信号分为:数据信号和控制信号。 数据信号支持8,9,16,18,24位等。 控制信号用来区分读、写及区分是向LCD寻址命令寄存器还是写L
[单片机]
STM32系列之LCD驱动接口与<font color='red'>驱动程序</font>介绍
液晶显示AT89C52单片机DS1302实时时钟程序
#include'reg52.h' //包含单片机寄存器的头文件 #include'intrins.h' //包含_nop_()的头文件 sbit RS=P2^0; //LCD读写选择位 sbit RW=P2^1; //LCD读写选择位 sbit E=P2^2; //LCD使能端 sbit BF=P0^7; //忙信号 sbit SCLK=P1^0; //1302时钟输出端 sbit DATA=P1^1; //1302数据端 sbit RST=P1^2; //1302复位端 unsigned char code digit = 0123456789 ; void
[单片机]
ARM和WinCE6.0下nRF24L01的驱动设计
引言 nRF24L01是一款工作在2.4~2.5 GHz世界通用ISM频段的单片无线收发器芯片。它在无线数据通讯、无线门禁、遥感勘测、工业传感器和玩具中都有应用。 随着测控技术的发展,nRF24L01与单片机组成的系统进行无线测控的实例已经有很多,如基于nRF24L01的无线温度监测系统、基于nRF24 L01的近距离无线数据传输系统等等。近年来,随着ARM和嵌入式WinCE系统的迅速发展,由于在WinCE系统下nRF24L01和ARM的通信缺乏驱动,致使两者之间不能直接通信,一般的解决方法是借助于第三方单片机的串行口来进行两者的通信。这种方式的不足之处在于,由于要借助于第三方单片机,使得成本增加且通信速度下降。nRF24
[电源管理]
ARM和WinCE6.0下nRF24L01的驱动设计
S3C2440 RTC实时时钟 驱动分析以及使用(三十)
RTC驱动分析总结: driversrtcrtc-s3c.c s3c_rtc_init platform_driver_register s3c_rtc_probe rtc_device_register( s3c , &pdev- dev, &s3c_rtcops, THIS_MODULE) rtc_dev_prepare cdev_init(&rtc- char_dev, &rtc_dev_fops); rtc_dev_add_device cdev_add linux中的rtc驱动位于drivers/rtc下,里面包含了许多开发平台的RTC驱动,我们这里是以S3C24XX为主,所以它的RTC驱
[单片机]
S3C2440 RTC<font color='red'>实时时钟</font> 驱动分析以及使用(三十)
STM32基于固件库学习笔记(11)RTC实时时钟
实时时钟(RTC) 小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。 中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。 大容量产品是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103xx微控制器。 互联型产品是指STM32F105xx和STM32F107xx微控制器。 主要特性 ● 可编程的预分频系数:分频系数最高为20 。 ● 32位的可编程计数器,可用于较长时间段的测量。 ● 2个分离的时钟:用于APB1接口的PC
[单片机]
STM8的实时时钟PCF8563与红外进出门提醒器
目录: 总体设计 1.基础硬件DIY设计 1)整体原理图 2)外部RTC 电路 3)PCB电路 4)3D_PCB 2.单片机程序设计 1)PCF8563 I2C通信程序 2)main函数逻辑 3.效果展示 1)实物电路顶层图 2)实物电路底层图 3).防水盒内部图 4)整体效果图 用到的工具有: 程序 IAR编译器环境 altium designer 原理图 altium designer PCB 实现的小功能有: ①能通过外部两个红外对管记人数并在OLED上显示 粗略计数人数 ②能通过外部两个红外对 判断人进入或出去,并发出语音提示 ag:人进门: 欢迎光临;人出门: 谢谢惠顾 ③语音整点报时 ④OLED上
[单片机]
STM8的<font color='red'>实时时钟</font>PCF8563与红外进出门提醒器
字符设备驱动程序之poll机制
驱动源码: #include linux/module.h #include linux/kernel.h #include linux/fs.h #include linux/init.h #include linux/delay.h #include linux/irq.h #include asm/uaccess.h #include asm/irq.h #include asm/io.h #include asm/arch/regs-gpio.h #include asm/hardware.h #include linux/poll.h int major = 0; st
[单片机]
字符设备<font color='red'>驱动程序</font>之poll机制
基于TMS320C6713控制的USB数据存储系统设计
1 引言   全球定位系统(Global Positioning System,简称GPS)的反射信号(GPS—R)接收机根据海面的反射信号,结合电波对海面、海浪的散射理论,可获得海面平均高度、浪高、海面风力等信息,还可监测和分析高纬地区的冰层厚度、海洋盐度等参数,因此,GPS-R是近十多年来迅速发展的一种空基海洋遥感技术,具有广泛的应用前景。在设计GPS-R接收机时,为了减少重量.在机载和星载条件下不允许有显示设备,而高纬地区一20℃的温度会使液晶显示器失效,这些都要求将采集、压缩后的数据存储到U盘或硬盘中,并带回基站进一步处理。   Texas Instruments(简称TI)公司的DSP具有高速运算性能,在数据采集与
[嵌入式]
基于TMS320C6713控制的USB数据存储系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved