首页天道酬勤,

,

张世龙 05-12 23:19 92次浏览

DS1302实时时钟文章目录DS1302实时时钟1.BCD码概念2.SPI时序3 .实时时钟芯片DS13021. DS1302管脚图:2.管脚菜单3 .备用电源4.DS1302

1.BCD码概念

BCD代码也称为二进制或2-10进制代码。 用4位2进制表示1位10进制数中09减去10后的数字。 从0b00000b1001开始,显示不存在0b1010、0b1011、0b1100、0b1101、0b1110、0b1111这6个数字。 分为压缩性和非压缩型。

2.SPI序列SPI是串行外围设备接口。 高速、全双工、同步通信总线。 标准SPI也仅使用SSEL (也称为芯片选择、SCS )、SCLK )、MOSI )、MISO (主机输入从站输出) 4针。

SSEL:从机器片中选择能量信号。 如果从设备处于低电平使能状态,并按下此管脚,将选择从设备。SCLK:时钟信号。 主机发行。MOSI:主机向从机发送命令和数据的通道。MISO:主机读取从机状态和数据的通道。 SPI通信的主机(即单片机)在读写数据序列的过程中有四种模式。 要理解这四种模式,你必须先学习两个名词。

CPOL:为时钟极性。

通信的全过程分为空闲时和通信时,如果SCLK在数据发送前后的空闲状态都为高电平,则CPOL=1,如果空闲状态SCLK为低电平,则CPOL=0参照块的内容

CPHA:是时钟的相位。

同步通信的一个特点是所有数据的变化和采样都是随着时钟的边沿进行的。 也就是说,数据总是在时钟的边缘附近变化或采样。

另一方面,时钟循环中一定包含上升沿和下降沿,这由循环的定义决定,但这两个边缘的优先顺序没有规定。 另外,由于从数据发生的时刻到稳定需要时间,因此如果主机在上升沿向MOSI输出数据,则从站只能在下降沿对该数据进行采样。 相反,一方在下降沿输出数据时,另一方必须在上升沿对该数据进行采样。

CPHA=1指示数据的输出在一个时钟周期的第一个边缘,其中CPOL=1是下降沿,并且反之亦然。 数据采样当然位于第二个边缘。 CPHA=0指示数据的收集是一个循环中的第一个边缘,并由CPOL确定其是哪个边缘。 数据的输出当然在第二个边缘。 以CPOL=1/CPHA=1为例绘制时序图。

在上图中,在未发送数据和发送完成后,SCK都处于高电平,因此CPOL=1。 可以看到,在SCK的第一边,MOSI和MISO发生了变化,同时在SCK的第二边,数据稳定。 此时,采样数据集以CPHA=1为最佳。 请注意最后隐藏的SSEL芯片的选择。 这个引脚决定哪个从站和主机通信。

下面放置其他三种情况的时序图。

3 .实时时钟芯片DS1302 1. DS1302引脚图:

1针VCC2为主电源的正极端子,与5V连接。 2针X1和3针X2为晶体振动输入输出端子,4针GND为负端子,5针CE为使能端子,连接到单片机的IO端口。 6针I/O是数据传输端子,连接在单片机的IO端口上。 7针SCLK是一个通信时钟端子,连接到单片机的IO端口。 8针VCC1是备用电源端子

2 .管脚菜单

3 .备用电源关于备用电源,可以连接3V左右的电源。 也可以连接10uF的电容器。 该电容器相当于电量较少的电池,关闭电源后,可以维持DS1302g分钟左右进行工作。 如果想运行更长时间,请增大容量。 掉点后,如果不需要维持运行的话,可以直接悬浮在空中。

将DS1302用电容器用作备用电源的电路图如下。

4 .在DS1302寄存器DS1302的一个指令字节的总共8个比特中,第七比特(最高有效比特)被固定为1。 第6位是选择RAM还是CLOCK,这里主要使用时钟的功能,所以为0。 从第5位到第1位,决定寄存器的5位地址。 第0名是读写位,写0,读1。

在DS1302时钟的寄存器中,8位与时钟相关联,5位的地址分别是0b000000b00111,即0x800x91。

具体的寄存器功能如下。

寄存器0 :最高有效位CH是时钟停止标志位。 如果时钟电路有备用电源,接通电源后,我们必须首先检测到这个位。 如果该位为0,则时钟芯片指示在系统断电之后,备用电源的供应导致时钟持续正常工作; 如果此位为1,则表示时钟芯片关闭系统电源后,时钟部分不再工作。 剩下的7位的前3位是秒的10位,后4位是秒的1位。

寄存器1 :最高有效位不使用(0),其馀7位中的高3位为分之10位,低4位为分之1位。

寄存器2:bit7表示1时12小时制,0时24小时制bit6固定为0,bit5表示12小时制0表示上午,1表示下午,24小时制和bit4

一起代表了小时的十位,低 4 位代表的是小时的个位。

寄存器 3:高 2 位固定是 0,bit5 和 bit4 是日期的十位,低 4 位是日期的个位。

寄存器 4:高 3 位固定是 0,bit4 是月的十位,低 4 位是月的个位。

寄存器 5:高 5 位固定是 0,低 3 位代表了星期。

寄存器 6:高 4 位代表了年的十位,低 4 位代表了年的个位。请特别注意,这里的 00~99 指的是 2000 年~2099 年。

寄存器 7:最高位一个写保护位,如果这一位是 1,那么是禁止给任何其它寄存器或者那 31 个字节的 RAM 写数据的。因此在写数据之前,这一位必须先写成 0。

5.DS1302的变异SPI通信方式

DS1302单字写入操作:


与CPOL=0/CPHA=0情况下的SPI操作时序对比,其中CE和SSEL的使能控制是相反的。对于SPI通信写数据都是在SCK的上升沿从机进行采样,下降沿主机发送数据。DS1302 的时序里,单片机要预先写一个字节指令,指明要写入的寄存器的地址以及后续的操作是写操作,然后再写入一个字节的数据。

单字节读操作:

6.DS1302的BURST模式

当写指令到DS1302的时候,只要将要写的5位地址全写1,即读操作用0XBF,写操作用0XBE,这样的指令送到DS1302之后,它会自动识别出来是burst模式,马上把所有的 8 个字节同时锁存到另外的 8 个字节的寄存器缓冲区内,这样时钟继续走,而我们读数据是从另外一个缓冲区内读取的。

要注意的是,不管是读还是写,只要使用时钟的 burst 模式,则必须一次性读写 8 个寄存器,要把时钟的寄存器完全读出来或者完全写进去。

在这里补充一点IO口自己迷惑过的地方:

具有上拉的准双向IO口,如果要正常读取外部信号的状态,必须首先保证自己内部输出的是1,如果输出0,则无论外部信号是1还是0,这个引脚读进来都会0。

相关代码如下:

#include<reg52.h>typedef unsigned char u8;typedef unsigned int u16;typedef unsigned long u32;sbit DS1302_CE = P2^3;//自己做的实物中的IO端口sbit DS1302_IO = P2^2;sbit DS1302_CK = P2^1;/* 发送一个字节到DS1302通信总线上 */void DS1302ByteWrite(u8 dat){u8 mask;for(mask=0x01; mask!=0; mask<<=1)//从低位向高位写,逐位移出{if((mask&dat) != 0)//mask&dat=1,相与低位是1,相当于写1DS1302_IO = 1;else //mask&dat=0,相与低位是0,相当于写0DS1302_IO = 0;DS1302_CK = 1; //拉高时钟DS1302_CK = 0; //再拉低时钟,完成一个位操作}DS1302_IO = 1;//释放IO口}/* 由DS1302通信总线上读取一个字节 */u8 DS1302ByteRead(){u8 mask;u8 dat = 0;for(mask=0x01; mask!=0; mask<<=1){if(DS1302_IO != 0)//先判断IO口状态,为高方可读入{dat |= mask; //将mask逐位读入dat}DS1302_CK = 1; //拉高时钟DS1302_CK = 0; //再拉低时钟,完成一个位操作}return dat;//最后返回读到的字节数据}/* 用单次写操作向某一寄存器写入一个字节 */void DS1302SingleWrite(u8 reg,u8 dat){DS1302_CE = 1;//使能片选信号,读写DS1302都必须为高电平DS1302ByteWrite((reg<<1)|0x80);//发送写寄存器的指令DS1302ByteWrite(dat);//写入字节数据DS1302_CE = 0;//除能片选信号}/* 用单词读操作向寄存器读取一个字节 */u8 DS1302SingleRead(u8 reg){u8 dat;DS1302_CE = 1;DS1302ByteWrite((reg<<1)|0x81);//寄存器左移一位,最低位或上1,则固定为1。发送读寄存器指令dat = DS1302ByteRead();//读取字节数据DS1302_CE = 0;return dat;}/* 用突发模式连续写入8个寄存器数据 */void DS1302BurstWrite(u8 *dat){u8 i;DS1302_CE = 1;DS1302ByteWrite(0xBE);//发送突发写寄存器指令for(i=0; i<8; i++)//连续写8个字节{DS1302ByteWrite(dat[i]);//相当于读地址*(dat+i)}DS1302_CE = 0;}/* 用突发模式连续读取8个寄存器的数据 */void DS1302BurstRead(u8 *dat){u8 i;DS1302_CE = 1;DS1302ByteWrite(0xBF);for(i=0; i<8; i++){dat[i] = DS1302ByteRead();}DS1302_CE = 0;}/* DS1302初始化,如发生掉电则重新设置初始时间 */void InitDS1302(){u8 dat;u8 code InitTime[] = {0x00,0x00,0x12,0x21,0x08,0x02,0x18};//2018年8月21日 星期二 12:00:00DS1302_CE = 0;//引脚默认为低电平DS1302_CK = 0;dat = DS1302SingleRead(0); //读取秒寄存器if((dat&0x80) != 0) //由秒寄存器最高位CH的值判断 //DS1302是否已停止。为1,则需要初始化{DS1302SingleWrite(7,0x00); //撤销写保护以允许写入数据DS1302BurstWrite(InitTime); //设置DS1302为默认的初试时间}}
时钟模块ds1302的使用,ds1302时钟芯片手册 ds1302时钟芯片与51单片机,51单片机ds1302数码管时钟