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

📄 1302驱动.c

📁 51单片机ds1302驱动程序
💻 C
字号:
void RTCInByte(INT8U ucDa)
{
   INT8U i;

   RTC_DIO = 0;
   RTC_SCK= 0;
   for(i=8; i>0; i--)
   {
      if(ucDa&0x01)
         RTC_DIO = 1;
      else
         RTC_DIO = 0;
      RTC_SCK = 1;

      RTC_SCK = 0;

      ucDa>>= 1;
   }
}
/********************************************************************
* 功能: 从DS1302读取1Byte数据
***********************************************************************/
INT8U RTCOutByte(void)
{
   INT8U i,temp = 0;
   RTC_DIO = 1;
   for(i=0;i<2;i++);
   for(i=8; i>0; i--)
   {
      temp >>= 1;
      if(RTC_DIO)
         temp |= B1000_0000;
      else
         temp &= B0111_1111;
      RTC_SCK = 1;

      RTC_SCK = 0;

   }
   return(temp);
}
/********************************************************************
* 说明: 先写地址,后写命令/数据
* 功能: 往DS1302写入数据
* 调用: RTCInByte()
* 输入: ucAddr: DS1302地址, ucDa: 要写的数据
***********************************************************************/
void WriteRtc(INT8U ucAddr, INT8U ucDa)
{

   RTC_SCK = 0;
   iRTC_RST = 1;   CTL_CK0 = iCTL_CK0;
   RTCInByte(ucAddr); /* 地址,命令 */
 //  ucDa&=0x7f;
   RTCInByte(ucDa); /* 写1Byte数据*/

   iRTC_RST = 0;   CTL_CK0 = iCTL_CK0;
}

/********************************************************************
* 功能: 读取DS1302某地址的数据
* 调用: RTCInByte() , RTCOutByte()
* 输入: ucAddr: DS1302地址
* 返回值: ucDa :读取的数据
***********************************************************************/
INT8U ReadRtc(INT8U ucAddr)
{
   INT8U ucDa;
   RTC_SCK = 0;

   iRTC_RST = 1;   CTL_CK0 = iCTL_CK0;
   RTCInByte(ucAddr); /* 地址,命令 */
   ucDa = RTCOutByte(); /* 读1Byte数据 */

   iRTC_RST = 0;   CTL_CK0 = iCTL_CK0;
   return(ucDa);
}
/***********************************************************************
*功能:读写DS1302RAM
*入参:读写标志,起始地址,数据长度,缓冲区首址
       地址:0x00-0x1e  共31字节
*************************************************************************/
void fnRtcRam(bit rdwr,INT8U addr,INT8U len,INT8U *pdat)
{
    INT8U i,tempadr;

	iIC_EN = 0; iSAM_EN = 0; CTL_CK0 = iCTL_CK0;      //禁止IC卡

    if(rdwr)
    {
        WriteRtc(0x8e,0x00); /* 控制命令,WP=0,写操作*/
        tempadr = (addr*2)|0xc0;
        for(i=0;i<len;i++)
        {
           WriteRtc(tempadr,*pdat);
           tempadr+=2;  pdat+=1;
        }
        WriteRtc(0x8e,0x80); /* 控制命令,WP=1,写保护*/
     }
     else{
             tempadr = (addr*2)|0xc1;
             for(i=0;i<len;i++)
             {
                *pdat = ReadRtc(tempadr);
                pdat+=1; tempadr+=2;
              }
          }
}
/********************************************************************
* 说明: 先写地址,后写数据(寄存器多字节方式)
* 功能: 往DS1302寄存器数写入数据(多字节方式)
* 调用: RTCInByte()
* 输入: pReDa: 寄存器数据地址
* 返回值: 无
***********************************************************************/
void WriteRtcReg(INT8U *pReDa,INT8U len)
{
   INT8U i;
   WriteRtc(0x8e,0x00); /* 控制命令,WP=0,写操作*/

   RTC_SCK = 0;
   iRTC_RST = 1;    CTL_CK0 = iCTL_CK0;
   RTCInByte(0xfe); /* 0xbe:RAM多字节写命令 */
   for (i=len;i>0;i--) /*31Byte 寄存器数据 */
   {
      RTCInByte(*pReDa); /* 写1Byte数据*/
      pReDa++;
   }

   iRTC_RST = 0;    CTL_CK0 = iCTL_CK0;
   WriteRtc(0x8e,0x80); /* 控制命令,WP=1,写保护*/
}
/********************************************************************
* 说明: 先写地址,后读命令/数据(寄存器多字节方式)
* 功能: 读取DS1302寄存器数据
* 调用: RTCInByte() , RTCOutByte()
* 输入: pReDa: 寄存器数据地址
* 返回值: 无
***********************************************************************/
void ReadRtcReg(INT8U *pReDa,INT8U len)
{
   INT8U i;

   RTC_SCK = 0;
   iRTC_RST = 1;    CTL_CK0 = iCTL_CK0;
   RTCInByte(0xff); /* 0xff:多字节读命令 */
   for (i=len; i>0; i--) /*31Byte 寄存器数据 */
   {
      *pReDa = RTCOutByte(); /* 读1Byte数据 */
       pReDa++;
   }

   iRTC_RST = 0;    CTL_CK0 = iCTL_CK0;
}

/*************************************************************************************
设置日期
入口: 储存日期的BCD码数组首址;
返回: TRUE--设置成功;  FALSE--设置不成功;
数据格式: 日期以3个字节的压缩BCD码表示, 年在前.  例如2003年4月15日, 表示成030415
*****************************************************************************************/
void  fnSetDate(BCD *pDate)
{
   INT8U i;
   INT8U ucAddr = 0x8c;

   iIC_EN = 0; iSAM_EN = 0;CTL_CK0 = iCTL_CK0;       //禁止IC卡

   WriteRtc(0x8e,0x00); /* 控制命令,WP=0,写操作*/

      *pDate&=0x7f;
      WriteRtc(ucAddr,*pDate);
      pDate++;
      ucAddr -=4;
      for(i =2;i>0;i--)
      {
         *pDate&=0x7f;
          WriteRtc(ucAddr,*pDate);
          pDate++;
          ucAddr -=2;
      }
      WriteRtc(0x8e,0x80); /* 控制命令,WP=1,写保护*/

}
/*****************************************************************************************
设置时间
入口: 储存时间的BCD码数组首址;
返回: TRUE--设置成功;  FALSE--设置不成功;
数据格式: 时间以3个字节的压缩BCD码表示, 24小时制, 小时在前.  例如14点23分56秒, 表示成142356.
***********************************************************************************************/
void  fnSetTime(BCD *pTime)
{
   INT8U i;
   INT8U ucAddr = 0x84;

   iIC_EN = 0; iSAM_EN = 0;  CTL_CK0 = iCTL_CK0;   //禁止IC卡

   WriteRtc(0x8e,0x00); /* 控制命令,WP=0,写操作*/

      for(i =3;i>0;i--)
      {
         *pTime&=0x7f;
          WriteRtc(ucAddr,*pTime);
          pTime++;
          ucAddr -=2;
      }
      WriteRtc(0x8e,0x80); /* 控制命令,WP=1,写保护*/

}
/**********************************************************************************************
读取日期和时间
入口: 储存日期和时间的BCD码数组首址;
返回: TRUE--读取成功;  FALSE--读取不成功;
数据格式: 时间以6个字节的压缩BCD码表示, 24小时制, 年在前.  例如2003年4月15日14点23分56秒, 表示成030415142356.
*******************************************************************************************/
void  fnGetDateTime(BCD *pDataTime)
{

   INT8U i,ucAddr = 0x8d;

   iIC_EN = 0; iSAM_EN = 0;  CTL_CK0 = iCTL_CK0;   //禁止IC卡

      *pDataTime = ReadRtc(ucAddr);
      ucAddr -= 4;
      pDataTime+=1;
      for (i=0;i<5;i++)
      {
        *pDataTime = ReadRtc(ucAddr);
         ucAddr -= 2;
         pDataTime+=1;
      }

}

⌨️ 快捷键说明

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