一、DS1302概述
DALLAS公司推出的高性能、低功耗的实时时钟。
采用SPI三线接口与MCU进行同步通信,并可采用突发方式一次传送多个字节的时钟参数和RAM数据。附加31字节的静态RAM。
简单来说,DS1302可以理解为一个电子手表,里面带有一个31字节的RAM内存。
在DS1302中有两块存储器:日历时钟寄存器和静态RAM存储器。前者用于记录实时时间,后者用于记录其他数据
二、电路图
三、日历时钟寄存器
控制字格式:
整体代码:
#include "reg52.h"
#include "ds1302.h"
#include "smg.h"
//首先是ds1302的读写地址,再定义一个时间的数组
unsigned char Write_ds1302_adrr[7] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char Read_ds1302_adrr[7] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
//20年4月18日,周六,23点59分24秒
unsigned char Time[7] = {0x24,0x59,0x23,0x18,0x04,0x06,0x20};
void DS1302_Config() //初始化DS1302,写它的每一位
{
char i;
Write_Ds1302_Byte(0x8e,0x00);
//第八个地址是一个写保护位,0可以写,1不可以写
for(i=0;i<7;i++)
{
Write_Ds1302_Byte( Write_ds1302_adrr[i],Time[i]);
//第一个参数是往哪个地址去写,第二个参数是写什么内容
}
Write_Ds1302_Byte(0x8e,0x80); //写完之后,给它关闭
}
void Read_Ds1302_Timer() //读是不需要写它的保护,只有写需要
{
char i;
for(i=0;i<7;i++)
{
Time[i] = Read_Ds1302_Byte(Read_ds1302_adrr[i]);
//参数是写到哪个地址
}
}
void Dispaly_Ds1302()
{
displaysmg_bit(0,smgnodot_ca[Time[2]/16]);
delaysmg(100);
displaysmg_bit(1,smgnodot_ca[Time[2]%16]);
delaysmg(100);
displaysmg_bit(2,0xbf);
delaysmg(100);
displaysmg_bit(3,smgnodot_ca[Time[1]/16]);
delaysmg(100);
displaysmg_bit(4,smgnodot_ca[Time[1]%16]);
delaysmg(100);
displaysmg_bit(5,0xbf);
delaysmg(100);
displaysmg_bit(6,smgnodot_ca[Time[0]/16]);
delaysmg(100);
displaysmg_bit(7,smgnodot_ca[Time[0]%16]);
delaysmg(100);
display_all(0xff);
}
void main()
{
DS1302_Config();
while (1)
{
Read_Ds1302_Timer();
Dispaly_Ds1302();
}
}