#include "C8051F500_defs.h" // SFR declarations
//*****************************************//实时时钟全局常量定义
#define WRITE_SECOND 0x80
#define WRITE_MINUTE 0x82
#define WRITE_HOUR 0x84
#define WRITE_DATE 0x86
#define WRITE_DAY 0x8A
#define WRITE_MONTH 0x88
#define WRITE_YEAR 0x8C
#define READ_SECOND 0x81
#define READ_MINUTE 0x83
#define READ_HOUR 0x85
#define READ_DATE 0x87
#define READ_DAY 0x8B
#define READ_MONTH 0x
#define READ_YEAR 0x8D
#define WRITE_PROTECT 0x8E
#define uchar unsigned char
sbit ACC7 = ACC^7;
sbit ACC0 = ACC^0;
static unsigned char day = 0;
static unsigned char month = 0;
static unsigned char second = 0;
static unsigned char minute = 0;
static unsigned char hour = 0;
static unsigned char y = 0;
//*****************************************//实时时钟函数声明
void DS1302writeByte(unsigned char data1);
uchar DS1302readByte(void);
void Write1302(uchar ucAddr,uchar ucDa);
uchar Read1302(uchar ucAddr);
void Initial(void);
void OSCILLATOR_Init (void);
void PORT_Init (void);
void delay(unsigned int m);
//*****************************************//实时时钟位定义
SBIT (SCLK, SFR_P3, 7); // DS1302串行时钟信号
SBIT (DIO, SFR_P3, 6); // 双向串行数据
SBIT (RST, SFR_P3, 5); // DS1302使能端,传输数据时必须为高
void main()
{
SFRPAGE = ACTIVE_PAGE; // Set for PCA0MD
PCA0MD &= ~0x40; // Disable Watchdog Timer
OSCILLATOR_Init();
PORT_Init();
Initial();
while(1)
{
day= Read1302(READ_DAY);
month= Read1302(READ_MONTH);
second = Read1302(READ_SECOND);
minute = Read1302(READ_MINUTE);
}
}
void OSCILLATOR_Init (void)
{
U8 SFRPAGE_save = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
RSTSRC = 0x04; // enable missing clock detector
OSCICN = 0x87; // Set internal oscillator divider to 1
CLKSEL = 0x00; // Select the internal osc. as
// the SYSCLK source
SFRPAGE = SFRPAGE_save;
}
void PORT_Init (void)
{
U8 SFRPAGE_save = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
P3MDOUT = 0xD0; // Make P3.7、P3.6、P3.5 push-pull
XBR2 = 0x40; // Enable the XBAR and weak pull-ups
SFRPAGE = SFRPAGE_save;
}
void delay(unsigned int m)
{
unsigned int k,j;
for(k=0;k<1;k++)
{
for(j=0;j } } void DS1302writeByte(uchar data1)//向DS1302写入一个字节 { uchar i; ACC = data1; for(i=8;i>0;i--) { DIO = ACC0; //写一位数据 SCLK = 1; //时钟信号 SCLK = 0; ACC = ACC >>1; } } uchar DS1302readByte(void)//从DS1302 读出一个字节 { unsigned char i; for(i=8;i>0;i--) { ACC = ACC >>1; ACC7 = DIO; //读一位数据 SCLK = 1; //时钟信号 SCLK = 0; } return(ACC); //返回读到的数据 } void Write1302(uchar ucAddr,uchar ucDa)//写DS1302寄存器 { RST = 0; SCLK = 0; RST = 1; DS1302writeByte(ucAddr); //地址,命令 DS1302writeByte(ucDa); //写1 Byte数据 SCLK = 1; RST = 0; } uchar Read1302(uchar ucAddr) //读DS1302的寄存器内容 { uchar ucData,data1; RST = 0; SCLK = 0; RST = 1; DS1302writeByte(ucAddr|0x01); //地址,命令 ucData = DS1302readByte(); //读 1 Byte数据 SCLK = 1; RST = 0; data1 = ucData/16; ucData = ucData%16; ucData = ucData+data1*10; return(ucData); } void Initial(void) //初始化DS1302 { Write1302(WRITE_PROTECT,0x00); //禁止写保护 Write1302(WRITE_SECOND,0x45); //秒位初始化 Write1302(WRITE_MINUTE,0x24); //分钟初始化 Write1302(WRITE_HOUR,0x09); //小时初始化 Write1302(WRITE_DATE,0x15); //日期初始化 Write1302(WRITE_DAY,0x06); //日期初始化 Write1302(WRITE_MONTH,0x05); //月初始化 Write1302(WRITE_PROTECT,0x80); //允许写保护 }