首页>>科技 >>内容

ds1302时钟芯片外部电路图,介绍DS1302时钟芯片的电路和程序

发布时间:2023-08-04 08:02:40编辑:温柔的背包来源:

很多朋友对ds1302时钟芯片外部电路图,介绍DS1302时钟芯片的电路和程序不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

ds1302时钟芯片外部电路图,介绍DS1302时钟芯片的电路和程序

DS1302是美国DALLAS公司推出的具有涓流充电能力的低功耗实时时钟芯片。可对年、月、日、周、时、分、秒进行计时,并具有闰年补偿等多种功能。

:1、参考电路

以下参考电路经过实践验证,可以正常工作。

其中,PU151PU153对应DS1302的SCLK、IO、RST引脚,需要连接微处理器(如单片机)的相关引脚。

第8脚加一颗3V备用纽扣电池,主电路断电时时钟仍能继续运行。

:2、参考方案

实践证明,以下两个程序任意一个都可以运行。

2.1 参考流程1

//DS1302设置子程序

#include 'ds1302.h'

sbit sclk=P3^3;//DS1302设置

sbit rst=P3^5;

sbit io=P3^4; //DS1302三引脚定义

unsigned char xdata time[7]={23,1,3,20,5,6,7};//0年1周2月3日4点05分6秒,有符号

unsigned char write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//DS1302写入时间寄存器地址

unsigned char read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//读取

void write_ds1302_byte(unsigned char dat) //DS1302写字节函数

{

无符号字符i;

for(i=0;i8;i++)

{

slk=0; //下降沿数据有效

io=dat0x01;

数据=数据1;

slk=1;

}

}

void write_ds1302(无符号字符添加,无符号字符数据)

{

首先=0;

诺普();

slk=0;

诺普();

首先=1;

诺普();

write_ds1302_byte(添加);

write_ds1302_byte(dat);//发送地址后立即发送数据,不暂停

首先=0;

诺普();

slk=1;

io=1;

}

无符号字符read_ds1302(无符号字符添加)

{

无符号字符i,dat=0;

首先=0;

诺普();

slk=0;

诺普();

首先=1;

诺普();

write_ds1302_byte(add);//DS1302发送地址后立即发送数据

for(i=0;i8;i++)

{

数据=数据1;

slk=0;

如果(io)

数据=数据|0x80;

slk=1;

}

首先=0;

诺普();

slk=0;

诺普();

slk=1;

io=0; //223-3-20,将1改为0后即可保存数据

返回数据;

}

无效ds1302_init()

{

无符号字符i,j;

for(i=0;i7;i++)

{

j=时间[i]/10;

时间[i]=时间[i]%10;

时间[i]=时间[i]+j*16; //转换为BCD码

}

write_ds1302(0x8e,0x00);//解除写保护

for(i=0;i7;i++)

{

write_ds1302(write_add[i],时间[i]);

}

write_ds1302(0x8e,0x80);//添加写保护}

void read_time()//读取时间

{

无符号字符i;

for(i=0;i8;i++)

{

时间[i]=read_ds1302(read_add[i]);

time[i]=time[i]/16*10+time[i]%16;//将BCD码转换为十进制

}

如果(时间[4]23)时间[4]=23;

如果(时间[5]59)时间[5]=59;

如果(时间[6]59)时间[6]=59;

}

阐明:

如果要读取时间,调用read_time()子程序,将读取到的时钟数据存入time[]数组中;

如果要设置时间,调用ds1302_init()子程序,将要设置的时钟数据预先存放在time[]数组中;

ds1302_init()子程序不能每次开机都运行,只有修改时间时才需要运行。

2.2 参考方案2

#include 'DS1302.h'

#定义uchar无符号字符

#定义uint 无符号整型

//DS1302宏定义部分

#define WRITE_SECOND0x80 //写入第二个地址

#define WRITE_MINUTE0x82 //写入子地址

#define WRITE_HOUR0x84 //写入时的地址

#define WRITE_DATE0x86 //写入日期地址

#define WRITE_MONTH0x88 //写入月份地址

#define WRITE_WEEK0x8A //写入周地址

#define WRITE_YEAR0x8C //写入年份地址

#define WRITE_PROTECT0x8E //写保护

#define READ_SECOND0x81 //倒计时地址

#define READ_MINUTE0x83 //读取地址

#define READ_HOUR0x85 //读取时的地址

#define READ_DATE0x87 //读取日期地址

#define READ_MONTH0x89 //读取月份地址

#define READ_WEEK0x8B //读取周地址

#define READ_YEAR0x8D //读取年份地址

sbit ACC_7=ACC^7; //位寻址寄存器定义

sbit SCLK=P3^3; //DS1302时钟信号引脚6

sbit DIO=P3^4; //DS1302数据信号引脚5

sbit CE=P3^5; //DS1302片选引脚7

uchar xdata time[7]={23,1,3,2,5,6,7}; //依次存储年、月、日、周、时、分、秒,以十进制表示,第2周,2023年1月3日5:6:7

//地址,数据发送子程序

void Write1302(无符号字符地址,dat)

{

无符号字符i,临时; CE=0; //CE引脚为低电平,数据传输暂停SCLK=0; //清除时钟总线CE=1; //CE引脚为高电平,逻辑控制有效//发送地址for ( i=8; i 0; i-- ) //周期8个移位{ SCLK=0;温度=地址; DIO=(位)(temp0x01); //每次传输低字节addr=1; //右移一位SCLK=1; } //发送数据for ( i=8; i 0; i-- ) { SCLK=0;温度=数据; DIO=(位)(temp0x01); //每次发送低字节dat=1; //右移一位SCLK=1; } CE=0; }

//数据读取子程序

无符号字符Read1302(无符号字符地址)

{

无符号字符i,temp,dat1,dat2; CE=0; SCLK=0; CE=1; //发送地址for ( i=8; i 0; i-- ) //周期8 移位{ SCLK=0 ;温度=地址; DIO=(位)(temp0x01); //每次传输低字节addr=1; //右移一位SCLK=1; } //读取数据for ( i=8; i 0 ; i-- ) { ACC_7=DIO; SCLK=1; ACC=1; SCLK=0; }CE=0;数据1=ACC;数据2=数据1/16; //数据转换dat1=dat1%16; //十六进制转十进制dat1=dat1+dat2*10;返回(dat1);}

//初始化DS1302

无效初始DS1302(无效)

{

//初始化为2013年4月24日23:27:56。注意Write1302函数的第二个参数是十六进制,需要从十进制转换为十六进制。比如参数中:秒0X56表示56秒,0X12表示12月,0x23表示23点等等,以下都已转码。

写1302(WRITE_PROTECT,0X00); //禁止写保护Write1302(WRITE_SECOND,time[6]/10*16+time[6]%10); //第二位初始化Write1302(WRITE_MINUTE,time[5]/10*16 +time[5]%10); //分钟初始化Write1302 (WRITE_HOUR,time[4]/10*16+time[4]%10); //小时初始化Write1302(WRITE_YEAR,time[0]/10* 16+time[0]%10); //年份数字初始化Write1302(WRITE_MONTH,time[1]/10*16+time[1]%10); //月份数字初始化

Write1302(WRITE_DATE,时间[2]/10*16+时间[2]%10); //日仓位初始化

Write1302(WRITE_WEEK,时间[3]/10*16+时间[3]%10); //周位初始化

Write1302(WRITE_PROTECT,0x80); //允许写保护}

//读取年、月、日、周、时、分、秒

无效读取时间(无效)

{

时间[0]=Read1302(READ_YEAR); //获取年份

时间[1]=Read1302(READ_MONTH); //获取月份

时间[2]=Read1302(READ_DATE); //获取日期

时间[3]=Read1302(READ_WEEK); //获取星期

时间[4]=Read1302(READ_HOUR); //获取时间

时间[5]=Read1302(READ_MINUTE); //取积分

时间[6]=Read1302(READ_SECOND); //拿

}

////运行read_nyrsfm() 子函数读取数组time[] 并显示它

阐明:

如果要读取时间,调用read_time()子程序,将读取到的时钟数据存入time[]数组中;

如果要设置时间,请调用InitialDS1302()子程序,并将要设置的时钟数据预先存储在time[]数组中。

InitialDS1302()子程序不能每次开机都运行,只有在修改时间时才需要运行。

以上电路和程序已经过实践验证,可以正常运行。

以上知识分享希望能够帮助到大家!