本文已参与「新人创作礼」活动,一起开启掘金创作之路。
这是纽扣电池座,焊接后,放上纽扣电池,可作为备用电源,当主电源断点,DS1302会继续走时,继续工作,如果没有,那么断点后,就不会继续走时,会停止。
静态RAM,掉电后数据不会丢失。突发模式是一种工作模式,要工作在这种个情况下,要对寄存器进行配置。
秒寄存器的bit6~bit0是秒的数据。
若小时寄存器bit7=1,12小时模式,bit5=0是AM上午,1是PM是下午。若为24小时模式,那么这一位是小时数据。
突发模式:
例如我们要读取,发81读取秒,再发83读取分钟.....
发BF工作突发模式,然后就会连续把7个数据读出来。(秒分时日月周年)
上升沿写数据,下降沿读数据。
编程
数码管显示,时分秒
读的频率太高了,我们让先显示1s再读,当然因为是动态显示,所以不能再后面加上delay,不然你会看到最后一位亮,前面几位比较弱,因此需要这样
1 #include <reg52.h>
2
3 #define uchar unsigned char
4 #define uint unsigned int
5
6 sbit TSCLK = P1^0; //时钟
7 sbit TIO = P1^1; //数据
8 sbit TRST = P1^2; //使能
9
10 void DS1302_W_Byte(uchar dat);//写一字节
11 uchar DS1302_R_Byte();//读一字节
12 void DS1302_W_DAT(uchar cmd, uchar dat);//写数据,先写cmd,再写数据
13 uchar DS1302_R_DAT(uchar cmd);//读数据,先写cmd,再读数据
14 uchar Dat_Chg_BCD(uchar dat);//数据转BCD
15 uchar BCD_Chg_Dat(uchar dat);//BCD转数据
16 void DS1302_Clear_WP();//关闭写保护
17 void DS1302_Set_WP();//打开写保护
18
19 void main()
20 {
21 DS1302_Clear_WP();
22 DS1302_W_DAT(0x80,Dat_Chg_BCD(30));//写入30s
23 DS1302_W_DAT(0x82,Dat_Chg_BCD(15));//写15分钟
24 DS1302_W_DAT(0x84,Dat_Chg_BCD(19));//写19时
25 DS1302_Set_WP();
26 while(1)
27 {
28
29 }
30 }
31
32 void DS1302_W_Byte(uchar dat)//写一字节
33 {
34 uchar i;
35 for(i = 0; i < 8; i++) //每次写1bit,写8次
36 {
37 TSCLK = 0; //拉低时钟总线
38 TIO = dat & 0x01; //从一字节最低位开始写
39 TSCLK = 1; //拉高时钟总线,DS1302把数据读走
40 dat >>= 1; //数据右移一位
41 }
42 }
43
44 uchar DS1302_R_Byte()//读一字节
45 {
46 uchar i, dat;
47 for(i = 0; i < 8; i++) //每次写1bit,写8次
48 {
49 TSCLK = 0; //拉低时钟总线,DS1302把数据放到数据总线上
50 dat >>= 1; //数据右移一位,数据从最低位开始读
51 if(TIO) dat |= 0x80;//读取数据
52 TSCLK = 1; //拉高时钟总线
53 }
54 return dat; //返回读取的数据
55 }
56
57 void DS1302_W_DAT(uchar cmd, uchar dat)//写数据,先写cmd,再写数据
58 {
59 TRST = 0; //拉低使能端
60 TSCLK = 0; //拉低数据总线
61 TRST = 1; //拉高使能端,开始写数据
62 DS1302_W_Byte(cmd); //写命令
63 DS1302_W_Byte(dat); //写数据
64 }
65
66 uchar DS1302_R_DAT(uchar cmd)//读数据,先写cmd,再读数据
67 {
68 uchar dat;
69 TRST = 0; //拉低使能端
70 TSCLK = 0; //拉低数据总线
71 TRST = 1; //拉高使能端,开始写数据
72 DS1302_W_Byte(cmd); //写命令
73 dat = DS1302_R_Byte(); //读出数据
74 return dat; //返回读出数据
75 }
76
77 uchar Dat_Chg_BCD(uchar dat)//数据转BCD
78 {
79 uchar dat1,dat2;
80 dat1=dat/10;
81 dat2=dat%10;
82 dat2=dat2+dat1*16;
83 return dat2;
84 }
85
86 uchar BCD_Chg_Dat(uchar dat)//BCD转数据
87 {
88 uchar dat1,dat2;
89 dat1=dat/16;
90 dat2=dat%16;
91 dat2=dat2+dat1*10;
92 return dat2;
93 }
94
95 void DS1302_Clear_WP()//关闭写保护
96 {
97 DS1302_W_DAT(0x8e,0x00); //把控制寄存器WP位置0
98 }
99
100 void DS1302_Set_WP()//打开写保护
101 {
102 DS1302_W_DAT(0x8e,0x80); //把控制寄存器WP位置1
103 TRST = 0; //拉低使能端
104 TSCLK = 0; //拉低数据总线
105 }