1.芯片简介
DS1302可以对年,月,日,周,时,分,秒进行计时,还有闰年补偿以及不同月份天数不同的功能。
单片机定时器计时缺点:
(1)精度不高
(2)占用单片机的CPU时间
(3)不能掉电继续运行,用这个芯片掉电不丢失数据,会继续运行,下次开启,是正确时间!!
(DS1302时钟芯片会带有一个备用电池,如果掉电,会自动切换到备用电池,继续进行工作)
RTC:实时时钟,是一种集成电路,通常称为时钟芯片(DS1302是其中一种)
DS3231 DS12C887
2.DS1302封装类型
(1)直插封装(DIP)直接有引脚
(2)贴片封装(SO)
3.贴片芯片引脚定义
(1)VCC2是主电源(即和单片机的电源连在一起)
注意:具有涓细电流充电功能,即在主电源VCC2有电时候,会对备用电池充电(可充电电池)
(2)VCC1是备用电源,断电时候,继续供电。连接到备用电池(电池正极接VCC1,负极接GND)
(3)GND:地(低电平)
(4)X1、X2:32.768KHz晶振(有关实时时钟的芯片,接的晶振都是32.768KHz,方便易用,精度较高)
注意:经过内部电路处理,能输出一个1Hz的标准频率(精度很高)
(5)CE:芯片使能(高电平使能)
(6)I/O:数据输入/输出
(7)SCLK:串行时钟(上升沿触发移位)
注意:利用以上三个引脚,可以将单片机内部时钟读出,从而进行显示。同理,可以进行时钟写入
(读写)
4.内部结构(31*8)
<有31个寄存器>
注意:内部有一些寄存器,寄存器里面存放的就是我们的时钟数据,通过读取显示,写入改变时钟信息
(1)内部的这些寄存器都是特殊寄存器,都有特殊功能。比如,表示秒的寄存器,就是计秒的功能,会在59的时候清零等。
CE:芯片不使能,时钟也在工作。这个引脚只控制,是否允许访问或者修改实时时钟数据
(CE使能,让我们可以读取和写入我们所需要的实时时钟数据)
注意:WP(写入使能):置1,写入操作无效。
(2)地址命令字节(在哪写入 在哪读出)
1.作用:(1)在哪写入什么 (2)在哪读取什么
在哪体现地址,写入(通过什么写入),什么:数据
例如:在秒寄存器的地址,写入我们设置的秒的数据。
在秒寄存器的地址,读取秒寄存器的数据
命令字:是一个字节有8位
最高位7:固定为1
第6位:操作RAM,置1;操作CK杠(时钟),置0
从第1位到第5位是我们要操作的寄存器的地址:要对哪个寄存器写入或者读取(秒,分,时,年等等)
秒地址是 00000。依次类推:分是00001
第0位:选择写入(置0)还是读取(置1)
想读月的数据
10 00100 1
上面的读写对应的81h 80h(秒)都是对地址命令字节8位的赋值
!!!!时序图!!!!
CE:在操作过程中要置1,操作结束置0
SCLK:时钟上升沿写入数据,时钟下降沿读出数据
(1)读取:在时钟上升沿 I/O口的数据将被写入(从而进行操作);在时钟的下降沿:DS1302会将所需要的时钟数据输出。
(2)写入:在时钟上升沿,I/O口数据写入(对具体时钟进行操作);在时钟上升沿:DS1302将我们需要写入的时钟数据写入。
注意:SPI:时钟上升沿写入数据,时钟下降沿读取数据。输入和输出分开了
通过最低位进行判断写入或者读出:置1是读出,置0是写入
注意:SCLK,CE,I/O的地址命令字节由单片机控制,输出或者输入的数据是DS1302控(D0~D7)
74HC595 进行串行输入是高位~低位
DS1302 进行串行输入是低位~高位
DS1302
(1)CE置1
(2)I/O口发R/W杠
(3)时钟上升沿
如此即可将命令字的最低位写入了数字(0/1)
注意:当读出时候,在下降沿,将I/O口释放,单片机不再操作,由DS1302来控制I/O口输出数据
单片机控制时钟,单片机给个下降沿,DS1302输出一位数据(从低到高)
当写入的时候,在上升沿,给I/O口数据,通过上升沿,来进行数据写入。
注意:在读出数据时,第一步要写入命令字节,但是我们注意到,写入命令字节时(前8个脉冲)
的最后一个脉冲下降沿结束变成了读出数据的第一个下降沿,并不希望这样;因为这样会让这里这个脉冲,分不清是在写入命令字还是读出数据。导致在写入未结束的时候,已经读出数据了
解决:我们将时钟调换位置,先给0,再给1,以上升沿为结束,这样,在写入结束时,还未开始读取。
从而在红线包裹之前结束,此时不会读取数据;然后在读取数据时候,以下降沿为结束。
5.BCD码
BCD码:是以四位二进制来表示1位十进制的;使用高四位表示十位的数,低四位表示个位的数
在DS1302内部寄存器,存储数据不是以二进制进行存储,而是以BCD码的形式进行存储
注意:在LCD 显示的数据,即为我们读取的BCD码,我们要将BCD码转变成十进制再进行表示
(BCD码的高四位和低四位,都只能表示0~9,再超出即不合法)
9变为16的原因:由于我们在读出寄存器的数据之后,显示在LCD1602上面会转成十进制(将二进制转为十进制);但是DS1302上面的寄存器不是二进制,而是BCD码,所以是将bcd码作为二进制码进行转变。
BCD码: (二进制转十进制)
9:0000 1001 (显示会将BCD码看成二进制进行转化) 9
10:0001 0000 16
在后面的LCD1602显示,以十六进制显示就正确了(不会越界出16)
由于 0000 1001的BCD码以16进制显示
0 9 十六进制
0001 0000 BCD码
1 0 十六进制
0010 0000 BCD码
2 0 十六进制
BCD码本身就是十进制的 ,所以不会超出十六进制的范围