搜索
bottom↓
回复: 33

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

[复制链接]

出0入0汤圆

发表于 2005-6-1 15:04:36 | 显示全部楼层 |阅读模式
/*

****************************************************************************************

源程序文件名:      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);   

  };

}



库函数和头文件:

点击此处下载armok0151365.rar


-----此内容被LYStudio于2005-06-01,15:18:54编辑过

出0入0汤圆

发表于 2005-6-2 10:16:30 | 显示全部楼层
有这么复杂吗?

出0入0汤圆

 楼主| 发表于 2005-6-2 13:48:29 | 显示全部楼层
回一楼:

  操作DS12887程序并不复杂,但此程序包括扩展并行总线及液晶显示。故此长了一些。

    另外,能否请一楼的赐教,程序中有那些不足之处或多余的地方。欢迎你的斧正。

  这是一个讨论技术的论坛,对于技术上的错误或不足之处欢迎指正。
-----此内容被LYStudio于2005-06-02,19:13:52编辑过

出0入0汤圆

发表于 2006-4-5 20:55:51 | 显示全部楼层
我有一片,但以前用C51怎么也没成功,有没有应用资料啊?




-----此内容被hackerboygn于2006-04-05,20:57:55编辑过

出0入0汤圆

发表于 2006-4-6 10:14:55 | 显示全部楼层
相當不錯, 用來教學很詳細的說...

出0入0汤圆

发表于 2006-4-9 22:54:40 | 显示全部楼层
请问一般DS12887多少钱一片啊?

出0入0汤圆

发表于 2006-4-10 08:19:51 | 显示全部楼层
20几块左右大洋

出0入0汤圆

发表于 2006-4-10 09:51:59 | 显示全部楼层
这样的价格只能在工业中用好一点,感觉在低端的民用消费类产品中没有什么价格优势。

出0入0汤圆

发表于 2006-4-10 10:32:59 | 显示全部楼层
奉劝大家一句,在工业场合千万别用12C887,我用这东西好多年了,时钟经常乱,原版的是DS12C887 后来许多厂家除了不少仿制品,说什么防静电,抗干扰什么什么的.....其实在环境复杂场合没一点用,主要12C887操作时序太简单,功耗又很低,就像RAM操作,所以稍微干扰就可能出错....................

出0入0汤圆

发表于 2006-4-10 11:15:46 | 显示全部楼层
哈哈,我不用它,因为对我的产品来说价格实在是太高啦。

出0入0汤圆

发表于 2006-11-1 17:08:12 | 显示全部楼层
请问高人怎么不把系统的电路图贴上啊,不知道你的电路怎么连接的啊!

初学者,请勿耻笑!多谢!

出0入0汤圆

发表于 2006-11-1 18:29:52 | 显示全部楼层
我的DS12887也是经常受干扰,常常时间错乱,不知什么原因?

出0入0汤圆

发表于 2006-11-1 22:38:11 | 显示全部楼层
我的时而正常时而混乱,索性不用了!

出0入0汤圆

发表于 2006-11-2 20:37:36 | 显示全部楼层
楼主的编程的习惯和风格很好!

出0入0汤圆

发表于 2006-11-2 22:51:43 | 显示全部楼层
很好用呀,用了200来片,无一问题,不要买全新的,可以到收旧计算机主板的地方去找,绝对正宗好用。

出0入0汤圆

发表于 2006-11-3 19:17:29 | 显示全部楼层
12887时钟是比较容易乱,而且每周时间会比正常的慢几分钟,不是很精准的说

出0入0汤圆

发表于 2006-11-14 13:53:39 | 显示全部楼层
不知道哪种芯片好,我的DS1302秒针老溢出(>60)然后死机,不知道怎么办?

出0入0汤圆

发表于 2006-12-26 20:57:16 | 显示全部楼层
有不掉电功能的还有什么好的芯片介绍阿

出0入0汤圆

发表于 2008-1-29 13:58:43 | 显示全部楼层
回47楼, DS1302 秒寄存器的高位是停止/运行标志位, 每次单片机上电时应该将该位清零的(反正我是这么做的, 也不一定对), 不然它不走.

出0入0汤圆

发表于 2008-2-1 09:17:54 | 显示全部楼层
我前两天刚做的, 用M16IO真接驱动DS12C887, 下面给出读写函数, 晶振是11.059MHz, 数据口接PORTD:

#define _REG_A          0x0A
#define _REG_B          0x0B
#define _REG_C          0x0C
#define _REG_D          0x0D

#define _REG_SEC        0x00
#define _REG_SEC_ALM    0x01
#define _REG_MIN        0x02
#define _REG_MIN_ALM    0x03
#define _REG_HOUR       0x04
#define _REG_HOUR_ALM   0x05
#define _REG_WKD        0x06
#define _REG_DATE       0x07
#define _REG_MONTH      0x08
#define _REG_YEAR       0x09
#define _REG_CENTURY    0x32    //DS12887这个字节是普通数据, 只有DS12C887才是世纪寄存器

//A寄存器
// -----------------------------------------------------------------
// |  UIP  |  DV2  |  DV1  |  DV0  |  RS3  |  RS2  |  RS1  |  RS0  |
// -----------------------------------------------------------------
//UIP:是否正在更新时间
//DV2,DV1,DV0:用于打开/关闭振荡器, 复位计数链
//RS3,RS2,RS1,RS0:与方波频率有关的设置

//B寄存器
// -----------------------------------------------------------------
// |  SET  |  PIE  |  AIE  |  UIE  |  SQWE |   DM  | 24/12 |  DSE  |
// -----------------------------------------------------------------
//SET:是否进入设置状态
//PIE, AIE, UIE, SQWE, DSE: 周期中断允许, 闹铃中断允许,
//更新结束中断允许, 方波输出允许, 夏时制允许(四月份的第一个周日)
//DM:指定时间数据的格式, 1为二进制格式, 0为BCD格式
//24/12:小时的格式
   
//C寄存器
// -----------------------------------------------------------------
// | IRQF  |   PF  |   AF  |   UF  |   0   |   0   |   0   |   0   |
// -----------------------------------------------------------------
//IRQF:中断标志位
//PF:周期中断标志
//AF:闹铃中断标志
//UF:更新结束中断标志
   
//D寄存器
// -----------------------------------------------------------------
// |  VRT  |   0   |   0   |   0   |   0   |   0   |   0   |   0   |
// -----------------------------------------------------------------
//VRT:只读, 正常为1, 为0则表时数据和时钟中的数据失效, 锂电池没电了



void DS12x887_Init(void)
{
    //全部配置为输出引脚
    _DS12x887_DATA_OUT;
    _SET_BIT(_DDR(_TO_DS12x887_RW), _DS12x887_RW_PIN);
    _SET_BIT(_DDR(_TO_DS12x887_CS), _DS12x887_CS_PIN);
    _SET_BIT(_DDR(_TO_DS12x887_AS), _DS12x887_AS_PIN);
    _SET_BIT(_DDR(_TO_DS12x887_DS), _DS12x887_DS_PIN);  
   
    _DS12x887_AS_LO;
    _DS12x887_DS_LO;
    _DS12x887_RW_LO;
    _DS12x887_CS_HI;
}


void DS12x887_Write(unsigned char Add, unsigned char Data)
{   
    //
    _DS12x887_CS_LO;
    NOP();
    NOP();   
    _DS12x887_DS_HI;
    _DS12x887_RW_HI;            //给出读信号
    NOP();
    NOP();
    NOP();
    NOP();  
    _DS12x887_AS_HI;            //锁存信号高电平
    NOP();
    NOP();
    _DS12x887_DATA_OUT;         //数据口设置为输出
    NOP();
    NOP();
    _DS12x887_OUT_DATA = Add;       //给出地址
    NOP();
    NOP();
    NOP();                      //
    _DS12x887_AS_LO;            //锁存信号低电平
    NOP();
    NOP();
    NOP();
    _DS12x887_RW_LO;            //给出写信号
    NOP();
    NOP();
    NOP();
    _DS12x887_OUT_DATA = Data;  //写出数据
    NOP();
    NOP();
    NOP();
    NOP();
    _DS12x887_RW_HI;            //给出读信号
    NOP();
    NOP();
    NOP();
    _DS12x887_CS_HI;            //片选信号高电平
    NOP();
    NOP();
    _DS12x887_AS_HI;
    NOP();
    NOP();
   
    _DS12x887_AS_LO;
    _DS12x887_DS_LO;
    _DS12x887_RW_LO;
}


unsigned char DS12x887_Read(unsigned char Add)
{
    unsigned char temp = 0;

    _DS12x887_CS_LO;
    NOP();
    NOP();
    NOP();   
    _DS12x887_DS_HI;
    _DS12x887_RW_HI;            //给出读信号   
    NOP();
    NOP();
    _DS12x887_AS_HI;            //锁存信号高电平
    NOP();
    NOP();
    _DS12x887_DATA_OUT;         //数据口设置为输出
    _DS12x887_OUT_DATA = Add;       //给出地址
    NOP();
    NOP();
    _DS12x887_AS_LO;            //锁存信号低电平
    NOP();
    NOP();   
    _DS12x887_DS_LO;            //给出写信号
    NOP();
    NOP();
    _DS12x887_DATA_IN;          //端口方向设置为输入
    NOP();
    NOP();
    temp = _DS12x887_IN_DATA;   //读入数据
    NOP();
    _DS12x887_DS_HI;            //
    NOP();
    NOP();
    _DS12x887_AS_HI;
    NOP();
    NOP();   
    _DS12x887_DATA_OUT;         //端口保持输出状态
    _DS12x887_CS_HI;            //片选信号高电平
   
    _DS12x887_AS_LO;
    _DS12x887_DS_LO;
    _DS12x887_RW_LO;
   
    return temp;
}

void DS12x887_WriteData(unsigned char Add, unsigned char Data)
{
    unsigned char temp;
    while(DS12x887_Read(_REG_A) & 0x80); //先读一下A寄存器, 直到UIP位为零
   
    DS12x887_Write(Add, Data);
}

unsigned char IsDS12x887OutOfPower(void)
{
    return (DS12x887_Read(_REG_D) & 0x80 != 0x80);
}

void DS12x887_ReadInfo(void)
{
    unsigned char ret, i, regB;
    unsigned char DTIsBCD = 0;
   
    regB = DS12x887_Read(_REG_B);//先读出B寄存器中的内容, 其中的设置是不受复位影响的, 所以不能乱改
    regB |= 0x80;                //设置 SET位, 这样就可以进入设置状态
    DS12x887_Write(_REG_B, regB);//再写回去
   
    DS12x887_Write(_REG_A, 0x70);//关闭时钟振荡器和方波输出
   
    DTIsBCD = !(regB & 0x04);    //数据格式是否是BCD格式   
   
    //校验一下时间是否清空
    ret = DS12x887_Read(_REG_SEC);
   
    ret = DS12x887_Read(_REG_SEC_ALM);
   
    ret = DS12x887_Read(_REG_MIN);
   
    ret = DS12x887_Read(_REG_MIN_ALM);
   
    ret = DS12x887_Read(_REG_HOUR);
   
    ret = DS12x887_Read(_REG_HOUR_ALM);
   
    ret = DS12x887_Read(_REG_WKD);   
   
    ret = DS12x887_Read(_REG_DATE);
   
    ret = DS12x887_Read(_REG_MONTH);
   
    ret = DS12x887_Read(_REG_YEAR);
   
    for(i = _REG_YEAR + 1; i < 128; ++i)
        ret = DS12x887_Read(i);
        
    regB &= ~0x80;                  //取消息SET位
    DS12x887_Write(_REG_B, regB);   //恢复为运行状态   
}

void DS12x887_Clear(void)
{
    unsigned char temp, i, regB;
    unsigned char DTIsBCD = 0;
   
    regB = DS12x887_Read(_REG_B);//先读出B寄存器中的内容, 其中的设置是不受复位影响的, 所以不能乱改
    regB |= 0x80;                //设置 SET位, 这样就可以进入设置状态
    DS12x887_Write(_REG_B, regB);//再写回去
   
    DS12x887_Write(_REG_A, 0x70);//关闭时钟振荡器和方波输出
   
    DTIsBCD = !(regB & 0x04);    //数据格式是否是BCD格式   
   
    DS12x887_Write(_REG_SEC, 0);        //清除秒
    DS12x887_Write(_REG_SEC_ALM, 0);    //清除秒闹钟   
    DS12x887_Write(_REG_MIN, 0);        //清除分
    DS12x887_Write(_REG_MIN_ALM, 0);    //清除分
    DS12x887_Write(_REG_HOUR, 1);       //清除时
    DS12x887_Write(_REG_HOUR_ALM, 1);   //清除时
    DS12x887_Write(_REG_WKD, 2);        //清除星期, 2008年一月一日为星期二
    DS12x887_Write(_REG_DATE, 1);       //清除日期
    DS12x887_Write(_REG_MONTH, 1);      //清除月
    DS12x887_Write(_REG_YEAR, 8);       //清除年
   
    //清除数据   
    for(i = _REG_D + 1; i < 128; ++i)
        DS12x887_Write(i, 0);

    regB &= ~0x80;                  //取消息SET位
    DS12x887_Write(_REG_B, regB);   //恢复为运行状态   
}

出0入0汤圆

发表于 2008-3-15 16:31:04 | 显示全部楼层
支持,我也准备用它来做时钟

出0入0汤圆

发表于 2008-3-15 18:14:23 | 显示全部楼层
串口的RTC多了,淘汰12887吧,不仅仅是价格问题.并口扩展走线多,在不支持并口扩展的AVR系统中使用不方便,体积大,不能换电池.

你如果使用的是二手货的12887,并发现时钟出现莫名其妙的错误,一般是内部电池电压没电了.正品,新的为7年,但通常5年就差不多了.国内的一些DD连3年都抗不下来.

出0入0汤圆

发表于 2008-3-15 18:25:35 | 显示全部楼层
感觉还是用串行的RTC比较好

出0入0汤圆

发表于 2008-3-15 21:17:13 | 显示全部楼层
对于带总线扩展的片子,或扩展存储器可以。一般就不必要了。

出0入0汤圆

发表于 2009-12-12 22:55:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-17 11:49:02 | 显示全部楼层
不错,mark

出0入25汤圆

发表于 2011-1-17 21:56:05 | 显示全部楼层
Mark

出0入0汤圆

发表于 2011-1-21 13:39:18 | 显示全部楼层
回复【19楼】nicksean 不务正业
-----------------------------------------------------------------------

#include<iom16v.h>
#include<macros.h>
#define uint  unsigned int
#define uchar unsigned char
uchar year,month,date,day,hour,minute,second,num;
uchar  table[]="  2011-01-20(4)";
uchar  table1[]="   11:11:11 ";
//********ds12c887宏定义*************//
#define ds_as_CLR  PORTD &= ~(1 << PD0)  //地址选通输入
#define ds_as_SET  PORTD |= (1 << PD0)
#define ds_ds_CLR  PORTD &= ~(1 << PD1)  //数据选通
#define ds_ds_SET  PORTD |= (1 << PD1)
#define ds_rw_CLR  PORTD &= ~(1 << PD2)  //intel时序中R/W低电平有效,在此模式下此引脚与普
#define ds_rw_SET  PORTD |= (1 << PD2)                         //通RAM的写使能(WE)工作方式类似,此信号的上升沿锁存数据
#define ds_cs_CLR  PORTD &= ~(1 << PD3)  //片选信号,低电平有效
#define ds_cs_SET  PORTD |= (1 << PD3)
#define ds_irq_CLR PORTD &= ~(1 << PD4) //中断请求输出
#define ds_irq_SET PORTD |= (1 << PD4)
//**********1602宏定义************//
#define lcd_rs_CLR        PORTA &= ~(1 << PA7)
#define lcd_rs_SET        PORTA |= (1 << PA7)

#define lcd_rw_CLR        PORTA &= ~(1 << PA6)
#define lcd_rw_SET        PORTA |= (1 << PA6)

#define lcd_en_CLR        PORTA &= ~(1 << PA5)
#define lcd_en_SET        PORTA |= (1 << PA5)
//#define seconds      0x00

//**********延时函数************//
void delay(uchar i)         //延时
{
  for(i=0;i<100;i++);
}
//**********外部中断0初始化********//
void INT0_init(void)
{
  MCUCR &= ~BIT(0);     //置外部中断请求0的触发方式为:下降沿触发  
  MCUCR |= BIT(1);
  GICR |= BIT(6);       //使能外部中断请求0
  GIFR |= BIT(6);       //外部中断请求0标志位清零  
  SREG |= BIT(7);       //使能全局中断
}
//********mega16的端口初始化函数********//
void port_init(void)    //端口初始化
{
  DDRA=0xFF;
  PORTA=0x00;
  DDRB=0xFF;
  PORTB=0x00;
  DDRC=0xFF;
  PORTC=0x00;
  DDRD=0xFF;
  PORTD=0x00;
}
//*********lcd写命令函数**********//
void Writelcd_Com(uchar com)
{
  lcd_rs_CLR;
  lcd_rw_CLR;
  PORTC=com;
  delay(5);
  lcd_en_SET;
  delay(5);
  lcd_en_CLR;
}
//**********lcd写数据函数**********//
void Writelcd_dat(uchar date)
{
   lcd_rs_SET;
   lcd_rw_CLR;
   PORTC=date;
   delay(5);
   lcd_en_SET;
   delay(5);
   lcd_en_CLR;
}
//*********lcd初始化函数***********//
void lcd_init(void)
{
   
   Writelcd_Com(0x38);
   Writelcd_Com(0x0c);
   Writelcd_Com(0x06);
   Writelcd_Com(0x01);
   Writelcd_Com(0x80);
   for(num=0;num<15;num++)
                {
                        Writelcd_dat(table[num]);
                        delay(5);
                }
        Writelcd_Com(0x80+0x40);
        for(num=0;num<12;num++)
                {
                        Writelcd_dat(table1[num]);
                        delay(5);
                }
}
//**********lcd写时间日期************//
void Writelcd_time(uchar add,uchar date)
{
    uchar shi,ge;
        shi=date/10;
        ge=date%10;
        Writelcd_Com(0x80+0x40+add);
        Writelcd_dat(0x30+shi);
        Writelcd_dat(0x30+ge);
}
//*********ds12c887的写函数********//
void Write_ds12c887(uchar add,uchar data)//ds12cr887的写函数
{
  ds_cs_CLR;
  ds_ds_SET;
  ds_rw_SET;
  ds_as_SET;
  PORTB=add;
  ds_as_CLR;
  ds_rw_CLR;
  PORTB=data;
  ds_as_SET;
  ds_rw_SET;
  ds_cs_SET;
}
//************ds12c887的读函数********//
uchar Read_ds12c887(uchar add)//ds12c887读数据
{ uchar ds_data;
  ds_cs_CLR;
  ds_ds_SET;
  ds_rw_SET;
  ds_as_SET;
  PORTB=add;
  ds_as_CLR;
  ds_ds_CLR;
  //PORTB=0x00;
  ds_data=PORTB;
  ds_as_SET;
  ds_cs_SET;
  ds_ds_SET;
  return ds_data;
}
//**********ds12c887的初始时间设置函数********//
/*void set_ds_time(void)  //ds12c887初始时间设置
{

  Write_ds12c887(9,2011);  //写年
  Write_ds12c887(8,1);     //写月
  Write_ds12c887(7,19);    //写日
  Write_ds12c887(6,3);     //写星期
  Write_ds12c887(4,11);    //写时
  Write_ds12c887(2,30);    //写分
  
}*/
//*************main主函数**********//
void main(void)
{
  
  INT0_init();
  port_init();
  lcd_init();
  Write_ds12c887(0x0A,0x20);
  //Write_ds12c887(0x0B,0x7f);
  //Read_ds12c887(0x0c);
// set_ds_time();
  

  while(1)   
          {   
          second=Read_ds12c887(0x00);       
          minute=Read_ds12c887(0x02);
          hour=Read_ds12c887(0x04);
          Writelcd_time(9,second);
          delay(5);
          Writelcd_time(6,minute);
          delay(5);
          Writelcd_time(3,hour);
          delay(5);
         
        }         
}
#pragma interrupt_handler int0:2
void int0(void)
{
uchar c;
//flag1=1;
c=Read_ds12c887(0x0c);
}                        
这是我写的,不知是那里的问题,ds12cr887不工作,帮忙看看

出0入0汤圆

发表于 2011-1-26 13:10:41 | 显示全部楼层
//************ds12c887的读函数********//
uchar Read_ds12c887(uchar add)//ds12c887读数据
{ uchar ds_data;
  ds_cs_CLR;
  ds_ds_SET;
  ds_rw_SET;
  ds_as_SET;
  PORTB=add;
  ds_as_CLR;
  ds_ds_CLR;
  //PORTB=0x00;
  ds_data=PORTB;
  ds_as_SET;
  ds_cs_SET;
  ds_ds_SET;
  return ds_data;
}

----------
上面那个读的过程 DDRB 没设置过.

出0入0汤圆

发表于 2011-10-20 20:44:10 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-10-27 22:02:27 | 显示全部楼层
good

出0入0汤圆

发表于 2011-11-2 22:36:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-5 11:29:32 | 显示全部楼层
程序好强大,估计一时半会儿也看不完!想问一下楼主你用的DS12887 的误差是多少啊?怎么我用的DS1307做的时钟,一个月都要相差5、6分钟啊?????

出0入0汤圆

发表于 2011-11-13 21:30:29 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-7 20:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表