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

📄 ds1307.c

📁 基于WINBOND单片机W78E516B的最小系统源代码.通过UART具有BOOTLOAD功能.开发环境为KEIL C51.
💻 C
字号:
#include "config.h"
#include <intrins.h>
#include "io.h"
#include "ds1307.h"
#include "global.h"

/* RTC读写 */
void RTCStart(void)
{
    SDA=1;
    _nop_();
    SCL=1;
    _nop_();
    _nop_();
    SDA=0;
    SCL=0;
}

void RTCStop(void)
{
    SCL=0;
    SDA=0;
    _nop_();
    SCL=1;
    _nop_();
    SDA=1;
}

void RTCNoAck(void)
{
    SDA=1;
    _nop_();
    SCL=1;
    _nop_();
    _nop_();
    SCL=0;
}

bit RTCTestAck(void)
{
    bit ErrB;

    SDA=1;
    _nop_();
    SCL=1;
    _nop_();
    ErrB=SDA;
    SCL=0;
    return(ErrB);
}

bit RTCWrite8Bit(U8 input)
{
    U8 i;

    for(i=8; i!=0; i--)
    {
        SDA = (bit)(input&0x80);
        SCL = 1;
        input = input<<1;
        SCL = 0;
    }
    return (1);
}

U8 RTCRead8Bit(void)
{
    U8 i,rbyte;

    rbyte = 0;
    for(i=8; i!=0; i--)
    {
        SCL=1;
        rbyte = rbyte<<1;
        rbyte = rbyte|((U8)(SDA));
        SCL=0;
    }
    return(rbyte);
}

void RTCWrite(U8 RTCAddress,U8 Wdata)
{
    RTCStart();
    RTCWrite8Bit(RTCWRITEADDRESS);
    RTCTestAck();
    RTCWrite8Bit(RTCAddress);
    RTCTestAck();
    RTCWrite8Bit(Wdata);
    RTCTestAck();
    RTCStop();
    delayms(10);
}

U8 RTCRead(U8 RTCAddress)
{
    U8 rbyte;

    RTCStart();
    RTCWrite8Bit(RTCWRITEADDRESS);  /* 写RTC SLAVE 地址 */
    RTCTestAck();
    RTCWrite8Bit(RTCAddress);       /* 写RTC具体地址 */
    RTCTestAck();
    RTCStart();
    RTCWrite8Bit(RTCREADADDRESS);
    RTCTestAck();
    rbyte = RTCRead8Bit();
    RTCNoAck();
    RTCStop();
    return(rbyte);
}
/* end of RTC读写 */


/* RTC操作 */
void initRTC(void)
{
    if((RTCRead(RTC_CHK1) != 0x3d) ||
        (RTCRead(RTC_CHK2) != 0x6c) ||
        (RTCRead(RTC_SECOND) & 0x80))
    {    /* RTC第一次使用或掉电后启动 */
        RTCWrite(RTC_SECOND,0);    // enable the oscillator AND set RTC_SECOND=0
        RTCWrite(RTC_MINUTE,0);
        RTCWrite(RTC_HOUR,0x12);   // 24 hours mode, set RTC_HOUR=12
        RTCWrite(RTC_DATE,1);
        RTCWrite(RTC_MONTH,1);
        RTCWrite(RTC_YEAR,0);       // set to "2000.01.01 12:00"
        RTCWrite(RTC_DAY,6);        // 2000.01.01 IS Saturday
        RTCWrite(RTC_CHK1,0x3d);
        RTCWrite(RTC_CHK2,0x6c);
    }
}

⌨️ 快捷键说明

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