zoukankan      html  css  js  c++  java
  • 51单片机学习笔记(清翔版)(24)——实时时钟DS1302

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

     

  • 相关阅读:
    Error: bzip2: Compressed file ends unexpectedly; # perhaps it is corrupted?
    诡异shellbash脚本没写错运行的时候不报错也不执行
    seeksv
    常用Linux对脚本的基本操作——持续更新
    lumpy-sv
    常用linux对系统的基本操作——持续更新
    常用linux对文件的基本操作——持续更新
    css浮动与定位
    CSS知识点概要
    HTML5新手入门基础知识要点概要
  • 原文地址:https://www.cnblogs.com/IceHowe/p/10885022.html
Copyright © 2011-2022 走看看