#include <REGX52.H>
sbit DS1302_SCLK = P3 ^ 6;
sbit DS1302_IO = P3 ^ 4;
sbit DS1302_CE = P3 ^ 5;
unsigned char DS1302_DATETIME[] = {24, 03, 16, 01, 33, 30, 6};
#define DS1302_YEAR 0X8C
#define DS1302_MONTH 0X88
#define DS1302_DATE 0X86
#define DS1302_HOUR 0X84
#define DS1302_MIN 0X82
#define DS1302_SEC 0X80
#define DS1302_DAY 0X8A
unsigned char DS1302_readByte(unsigned char cmd)
{
unsigned char i;
unsigned char result = 0x00;
cmd |= 0x01;
DS1302_CE = 1;
for (i = 0; i < 8; i++)
{
DS1302_IO = cmd & (0x01 << i); // 从低至高
DS1302_SCLK = 0;
DS1302_SCLK = 1;
}
for (i = 0; i < 8; i++)
{
DS1302_SCLK = 1;
DS1302_SCLK = 0;
if (DS1302_IO)
{
result |= (0x01 << i);
}
}
DS1302_CE = 0;
DS1302_IO = 0; // 解决数字显示混乱?
return result;
}
void DS1302_writeByte(unsigned char cmd, unsigned char content)
{
unsigned char i;
DS1302_CE = 1;
for (i = 0; i < 8; i++)
{
DS1302_IO = cmd & (0x01 << i); // 从低至高
DS1302_SCLK = 1;
DS1302_SCLK = 0;
}
for (i = 0; i < 8; i++)
{
DS1302_IO = content & (0x01 << i); // 从低至高
DS1302_SCLK = 1;
DS1302_SCLK = 0;
}
DS1302_CE = 0;
}
void DS1302_init()
{
DS1302_CE = 0;
DS1302_SCLK = 0;
DS1302_writeByte(0x8E, 0x00); // 写保护解除?
}
/**
* 将数组DS1302_DATETIME[]的信息写入时钟
*/
void DS1302_setTime()
{
DS1302_writeByte(DS1302_YEAR, DS1302_DATETIME[0] / 10 * 16 + DS1302_DATETIME[0] % 10);
DS1302_writeByte(DS1302_MONTH, DS1302_DATETIME[1] / 10 * 16 + DS1302_DATETIME[1] % 10);
DS1302_writeByte(DS1302_DATE, DS1302_DATETIME[2] / 10 * 16 + DS1302_DATETIME[2] % 10);
DS1302_writeByte(DS1302_HOUR, DS1302_DATETIME[3] / 10 * 16 + DS1302_DATETIME[3] % 10);
DS1302_writeByte(DS1302_MIN, DS1302_DATETIME[4] / 10 * 16 + DS1302_DATETIME[4] % 10);
DS1302_writeByte(DS1302_SEC, DS1302_DATETIME[5] / 10 * 16 + DS1302_DATETIME[5] % 10);
DS1302_writeByte(DS1302_DAY, DS1302_DATETIME[6] / 10 * 16 + DS1302_DATETIME[6] % 10);
}
/**
* 获取时间信息并放入数组DS1302_DATETIME[]
*/
void DS1302_getTime()
{
char tmp = 0;
tmp = DS1302_readByte(DS1302_YEAR);
DS1302_DATETIME[0] = tmp / 16 * 10 + tmp % 16;
tmp = DS1302_readByte(DS1302_MONTH);
DS1302_DATETIME[1] = tmp / 16 * 10 + tmp % 16;
tmp = DS1302_readByte(DS1302_DATE);
DS1302_DATETIME[2] = tmp / 16 * 10 + tmp % 16;
tmp = DS1302_readByte(DS1302_HOUR);
DS1302_DATETIME[3] = tmp / 16 * 10 + tmp % 16;
tmp = DS1302_readByte(DS1302_MIN);
DS1302_DATETIME[4] = tmp / 16 * 10 + tmp % 16;
tmp = DS1302_readByte(DS1302_SEC);
DS1302_DATETIME[5] = tmp / 16 * 10 + tmp % 16;
tmp = DS1302_readByte(DS1302_DAY);
DS1302_DATETIME[6] = tmp / 16 * 10 + tmp % 16;
}
11-12
1万+
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
05-01
2751
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)