这是纽扣电池座,焊接后,放上纽扣电池,可作为备用电源,当主电源断点,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 }