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