做装修网站公司,网页开发工作室,深圳建设网站过程,中国 网站服务器 租金文章目录 引言基本特性什么是RAM#xff1f;什么是涓流充电#xff1f; 电路图和引脚说明通信协议以及工作流程寄存器控制寄存器日历/时钟寄存器 DS1302读写时序代码演示——数码管显示时分秒 引言
DS1302 是一款广泛使用的实时时钟 (RTC) 芯片#xff0c;具有低功耗、内置… 文章目录 引言基本特性什么是RAM什么是涓流充电 电路图和引脚说明通信协议以及工作流程寄存器控制寄存器日历/时钟寄存器 DS1302读写时序代码演示——数码管显示时分秒 引言
DS1302 是一款广泛使用的实时时钟 (RTC) 芯片具有低功耗、内置电池备份和串行通信接口等优点。它常用于需要精确时间保持的应用中如电子时钟、数据记录器和嵌入式系统。
基本特性
DS1302是一款高性能、低功耗的实时时钟芯片兼容TTL电平可以直接与单片机的IO口连接。以下是其主要特性
时间保持功能DS1302 可以保持秒、分、时、日、周、月、年等时间信息并能自动调整月份天数和闰年。串行通信接口使用简单的串行接口 (SPI) 进行通信仅需三根线RST复位、SCLK串行时钟和 I/O串行数据。低功耗工作电流低适合电池供电的应用。工作电压范围为2.0V至5.5V工作电流小于300nA。内置 RAM31 字节的静态 RAM用于存储用户数据。RAM数据时有两种方式单字节传送或多字节传送字符组的方式电池备份支持备用电池确保在主电源断电时继续保持时间。涓流充电当主电源关闭或电压不足时DS1302可以通过涓流充电寄存器从备用电源VCC2获取电力维持时钟的运行和RAM中的数据。
什么是RAM
RAM全称为随机存取存储器Random Access Memory是计算机中的一种重要存储器。它的主要特点是可以随时读写数据并且速度非常快。
RAM是计算机的“短期记忆”。当你打开一个程序或文件时计算机会将其数据加载到RAM中以便快速访问和处理。例如当你在编辑一篇文档时文档的内容会暂时存储在RAM中这样你可以快速进行编辑和保存。RAM是易失性存储器这意味着一旦断电存储在RAM中的数据就会丢失。这就像是你在白板上写字一旦擦掉断电字迹就消失了。RAM与CPU直接交换数据速度非常快。它是计算机运行速度的重要因素之一。更多的RAM意味着计算机可以同时处理更多的任务而不会变慢。
在DS1302时钟芯片中31字节的静态RAMSRAM是一个小型的存储区域用于存储用户数据。静态表示SRAM中的数据只要保持通电就可以一直保存不需要像动态RAMDRAM那样定期刷新。31字节表示这个SRAM可以存储31个字节的数据总共248位31 x 8 248位。 假设你有一个小笔记本每一页可以写8个字母那么31字节的SRAM就相当于这个笔记本有31页每页可以写8个字母。你可以随时在任何一页上写字或擦掉重写。 什么是涓流充电
想象一下你有一个珍贵的水晶杯需要用极细的水流来清洗以防止水流过猛导致损坏。涓流充电也是同样的道理。这是一种以非常低的电流对电池进行充电的方法目的是在电池接近充满时继续以小电流充电确保电池完全充满而不受损。
电池充电通常有三个阶段恒流充电、恒压充电和涓流充电。当电池电量接近满电时充电器会自动切换到涓流模式这时候的电流非常小就像是给电池做最后的“润色”。
在许多电子设备中如手机、笔记本电脑甚至一些特殊的芯片例如DS1302时钟芯片都采用了涓流充电技术。这些设备在主电源断电后可以依靠涓流充电来维持电池健康保证设备在关键时刻不掉链子。
电路图和引脚说明 引脚名引脚顺序作用VCC11主电源电压输入VCC28备用电源电压输入电池X1、X223外部晶振引脚GND4地SCLK7串行时钟输入串行通信I/O6串行数据输入/输出CE5控制使能
详细作用说明
VCC1 (1号引脚)这是DS1302的主电源输入引脚。在正常工作时它接收来自外部电源的电压。如果VCC1的电压高于VCC2备用电源DS1302将使用VCC1作为其电源。VCC2 (8号引脚)此引脚通常连接到一个电池作为备用电源。在主电源VCC1失效的情况下VCC2可以继续为DS1302提供电源确保时间信息不会丢失。X1、X2 (2号和3号引脚)这两个引脚需要外接一个32.768kHz的晶振。晶振为DS1302提供时钟信号确保时间的准确性。X1是输入端X2是输出端在某些应用中可能不使用。GND (4号引脚)这是DS1302的接地引脚用于建立电路的参考电位确保电路中的信号有正确的电压水平。SCLK (7号引脚)此引脚接收来自微控制器或其他控制设备的串行时钟信号。数据传输的时序由SCLK控制数据在SCLK的上升沿或下降沿被读取或写入具体取决于通信协议。I/O (6号引脚)这个双向引脚用于在DS1302和外部设备之间传输数据。在写入操作中数据通过此引脚输入到DS1302在读取操作中数据从DS1302输出到此引脚。CE (5号引脚)CE引脚用于控制DS1302的激活状态。当CE引脚被拉高即逻辑1时DS1302芯片被激活并开始工作当CE引脚被拉低即逻辑0时芯片进入低功耗状态停止工作。 通信协议以及工作流程
DS1302 通过三线接口 (SPI) 与主控设备通信。通信过程如下
启动通信将 RST 引脚置高。发送命令字节通过 SCLK 引脚发送一个命令字节指定读写操作和寄存器地址。数据传输通过 I/O 引脚进行数据读写。结束通信将 RST 引脚置低。
寄存器
对DS1302的操作就是对其内部寄存器的操作DS1302内部共有12个寄存器其中有7 个寄存器与日历、时钟相关存放的数据位为 BCD码形式。此外DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与 RAM 相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器以外的寄存器。
控制寄存器
用于存放DS1302控制命令的DS1302的RST复位引脚如果是高电平可以开始工作第一个写入的自己就是控制命令它用于对DS1302读写进行控制。格式如下
控制寄存器的字节格式中最高位D7固定为1这是命令有效的标志。第六位D6如果为0则表示存取日历时钟数据为1表示存取RAM数据。接下来的五位D5~D1是地址位用于选择将要进行读写操作的寄存器。最低位D0是读写选择位0表示写入1表示读取。
控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时数据被写入DS1302数据输入从最低位0位开始。同样在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿读出DS1302的数据读出的数据也是从最低位到最高位。
日历/时钟寄存器
DS1302时钟芯片的日历/时钟寄存器是其核心功能之一用于存储和提供当前的日期和时间信息。存放是以BCD码格式进行操作。
秒寄存器地址0x80存储秒的值格式为BCD码。低四位表示秒的个位第五位到第七位表示秒的十位。第八位CH是时钟运行标志位当CH0时时钟运行当CH1时时钟暂停。分寄存器地址0x82存储分钟的值格式为BCD码。低四位表示分钟的个位第五位到第七位表示分钟的十位。最高位第八位固定为0小时寄存器地址0x84存储小时的值格式为BCD码。低四位表示小时的个位第五位到第七位表示小时的十位。第八位12/24用于选择12小时制或24小时制。当12/240时为24小时制当12/241时为12小时制且第5位表示上午AM或下午PM。日期寄存器地址0x86存储日期的值格式为BCD码。低四位表示日期的个位第五位到第七位表示日期的十位。 月份寄存器地址0x88存储月份的值格式为BCD码。低四位表示月份第五位表示月份的十位。星期寄存器地址0x8A存储星期的值格式为BCD码。低三位表示星期几从星期一到星期日。年份寄存器地址0x8C存储年份的值格式为BCD码。低四位表示年份的个位第五位到第七位表示年份的十位。DS1302的年份是从2000年开始的因此设置年份时需要减去2000。写保护寄存器DS1302具有写保护功能低七位全部为固定0WP用于控制是否开启写保护功能WP逻辑1为开启只能读不能写如果要进行写操作将WP设置为逻辑0关闭保护进行写入。慢充电寄存器DS1302支持涓流充电当主电源关闭或电压不足时DS1302可以通过涓流充电寄存器从备用电源VCC2获取电力维持时钟的运行和RAM中的数据。通过特定的控制命令可以启用或禁用涓流充电功能。这允许用户根据需要控制充电过程以节省电力或延长备用电源的使用寿命。 BCD码所有日历/时钟寄存器中的数据都以BCD码格式存储。BCD码是一种二进制编码的十进制数每四位二进制数表示一个十进制数字0~9。 DS1302读写时序
数据是从低位开始写入三线制SPI的接口CESELK、I/O当对DS1302操作的时候CE要设置为1高电平操作完成之后对CE设置“0”低电平等待下一次操作。SCLK为上升沿的时候写入数据。当发送完一个控制命令字节。下一个下降沿开始进行数据的读取。
代码演示——数码管显示时分秒
初始化显示时间13时51分47秒。实物图SCLK连接到P36引脚IO连接到P34引脚CE连接到P35引脚具体可查看所使用的开发板电路图进行查看。关于数码管讲解请查看普中51单片机数码管显示原理与实现详解四
#include REGX52.H
#include intrins.hsbit DS1302_RST P3^5;
sbit DS1302_SCLK P3^6;
sbit DS1302_IO P3^4;//共阴极数码管显示 0~F 的段码数据
unsigned char gsmg_code[17]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void DelayXms(unsigned int xms) //12.000MHz
{unsigned char data i, j;while(xms){i 2;j 239;do{while (--j);} while (--i);xms--;}
}void Init_Port(unsigned char Location)
{ switch(Location){case 1:P2_2 0;P2_3 0;P2_4 0;break;case 2:P2_2 1;P2_3 0;P2_4 0;break;case 3:P2_2 0;P2_3 1;P2_4 0;break;case 4:P2_2 1;P2_3 1;P2_4 0;break;case 5:P2_2 0;P2_3 0;P2_4 1;break;case 6:P2_2 1;P2_3 0;P2_4 1;break;case 7:P2_2 0;P2_3 1;P2_4 1;break;case 8:P2_2 1;P2_3 1;P2_4 1;break;}
}void DS1302_write_byte(unsigned char addr,unsigned char dat)
{unsigned char i 0;DS1302_RST 0;_nop_();//延时一微秒DS1302_SCLK 0;_nop_();//延时一微秒DS1302_RST 1;//通信开始_nop_();for(i 0;i 8;i)//写入控制{DS1302_IO addr0x01;//从低位开始addr1;DS1302_SCLK 1;_nop_();//延时一微秒DS1302_SCLK 0;_nop_();}for(i 0;i 8;i)//写入数据{DS1302_IO dat0x01;//从低位开始dat1;DS1302_SCLK 1;_nop_();//延时一微秒DS1302_SCLK 0;_nop_();}DS1302_RST 0;//通信结束
}//读
unsigned char DS1302_read_byte(unsigned char addr)
{unsigned char i 0;unsigned char temp 0;unsigned char value 0;DS1302_RST 0;_nop_();//延时一微秒DS1302_SCLK 0;_nop_();//延时一微秒DS1302_RST 1;//通信开始for(i 0;i 8;i)//写入控制{DS1302_IO addr0x01;//从低位开始addr1;DS1302_SCLK 1;_nop_();//延时一微秒DS1302_SCLK 0;}for(i 0;i 8;i)//读取数据{temp DS1302_IO;//从低位开始value(temp7)|(value1);DS1302_SCLK 1;_nop_();//延时一微秒DS1302_SCLK 0;}DS1302_RST 0;_nop_(); DS1302_SCLK1;//对于实物中P3.4口没有外接上拉电阻的此处代码需要添加使数据口有一个上升沿脉冲。_nop_();DS1302_IO 0;_nop_();DS1302_IO 1;_nop_(); return value;
}//秒分时日月周年
unsigned char gWrite_rtc_addr[]{0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char gRead_rtc_addr[]{0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};unsigned char gDS1302_time[]{0x47,0x51,0x13,0x24,0x07,0x06,0x24};void Init_Ds1302(void)
{unsigned char i 0;//关闭写保护0x8e表示写保护寄存器DS1302_write_byte(0x8e,0x00);for(i 0;i 7;i){DS1302_write_byte(gWrite_rtc_addr[i],gDS1302_time[i]);}//打开写保护DS1302_write_byte(0x8e,0x80);
}void ds1302_read_time(void)
{unsigned char i 0;for(i 0;i 7;i){gDS1302_time[i] DS1302_read_byte(gRead_rtc_addr[i]);}
}void main()
{unsigned char i 0;unsigned char time_buf[8];Init_Ds1302();//设置时间 while(1){ds1302_read_time();//读取时间time_buf[0] gsmg_code[gDS1302_time[2]/16];//时 转换为数码管 16进制获取第一位time_buf[1] gsmg_code[gDS1302_time[2]0x0f];//时 转换为数码管 16进制获取第二位time_buf[2] 0x40;// -time_buf[3] gsmg_code[gDS1302_time[1]/16];//分 转换为数码管 16进制获取第一位time_buf[4] gsmg_code[gDS1302_time[1]0x0f];//分 转换为数码管 16进制获取第二位time_buf[5] 0x40;// -time_buf[6] gsmg_code[gDS1302_time[0]/16];//秒 转换为数码管 16进制获取第一位time_buf[7] gsmg_code[gDS1302_time[0]0x0f];//秒 转换为数码管 16进制获取第二位for(i 1; i 8;i){Init_Port(i);P1 time_buf[i-1];DelayXms(1);P1 0x00;//消影} }
}