Mobile wallpaper 1Mobile wallpaper 2Mobile wallpaper 3Mobile wallpaper 4
783 字
4 分钟
DS1302相关功能
  • 底层代码及调用

    1. 注意引脚的设置

    2. 时钟定义数组理解

      例:unsigned char ucRtc[3] = {0x13,0x03,0x05};

      //时钟数据存放数组 上电默认时间 13:03:05。

      //注意这里的数组顺序为 时,分,秒,因为底层写的就是这个顺序

      //要着重注意这里的0x13等不是存储的十六进制,而是存储的BCD码,是用二进制表示十进制,样子看起来像十六进制,转换也是二进制转十六进制一样的操作,但是BCD码的有效数值只是从0-9,没有A-F。

      例如:

      二进制是0100时,其十六进制是4,其BCD码为4;

      二进制是1010时,其十六进制是a,其BCD码为无效数值;

      二进制是0010 0111时,其十六进制是0x27,其BCD码为0x27;

      二进制是0010 1010时,其十六进制是0x2a,其BCD码为无效数值;

    3. 注意数码管显示时

      要注意/16和%16,而不是/10和%10

      Seg_Buf[0] = ucRtc[0] / 16;
      Seg_Buf[1] = ucRtc[0] % 16;
      Seg_Buf[2] = 11; //显示“—”符号
      Seg_Buf[3] = ucRtc[1] / 16;
      Seg_Buf[4] = ucRtc[1] % 16;
      Seg_Buf[5] = 11; //显示“—”符号
      Seg_Buf[6] = ucRtc[2] / 16;
      Seg_Buf[7] = ucRtc[2] % 16;
    4. 底层代码

      #include "ds1302.h"
      #include "intrins.h"
      sbit SDA = P2 ^ 3;
      sbit RST = P1 ^ 3;
      sbit SCK = P1 ^ 7;
      ......
      void Set_Rtc(unsigned char *ucRtc)
      {
      unsigned char i;
      Write_Ds1302_Byte(0x8e, 0x00); // 禁止写保护
      Write_Ds1302_Byte(0x80, 0x80); // 停止时钟芯片
      for (i = 0; i < 3; i++)
      {
      Write_Ds1302_Byte(0x84 - 2 * i, ucRtc[i]);
      }
      Write_Ds1302_Byte(0x8e, 0x80);
      }
      void Read_Rtc(unsigned char *ucRtc)
      {
      unsigned char i;
      unsigned temp;
      EA = 0; // 关闭总中断,防止时序错误
      for (i = 0; i < 3; i++)
      {
      ucRtc[i] = Read_Ds1302_Byte(0x85 - 2 * i);
      }
      EA = 1;
      }
  • 常见考法

    1. 在采集到某一数据时,顺便读取此时的时钟时间

      一般处理方法: 定义unsigned char Save_Rtc[3] = {0,0,0}; 需要调用时:Read_Rtc(Save_Rtc);即可

    2. 按下某一按键时,要调整时钟的值(第八届省赛题着重考的这点,可以着重看一下)

      //键盘处理函数的功能
      void Key_Proc()
      {
      switch(Key_Down)
      {
      case 5:
      ucRtc[0]++;
      if(ucRtc[0] % 16 == 0x0a) //BCD码需要手动进行十进制进位(避免无效数值)
      ucRtc[0] += 6; //例如从0x09跳到0x10
      if(ucRtc[0] == 0x24) //设置上限
      ucRtc[0] = 0x23;
      Set_Rtc(ucRtc);
      break;
      case 6:
      ucRtc[1]++;
      if(ucRtc[1] % 16 == 0x0a) //BCD码需要手动进行十进制进位(避免无效数值)
      ucRtc[1] += 6; //例如从0x09跳到0x10
      if(ucRtc[1] == 0x60) //设置上限
      ucRtc[1] = 0x59;
      Set_Rtc(ucRtc);
      break;
      case 7:
      ucRtc[0]--;
      if(ucRtc[0] % 16 == 0x0f)
      ucRtc[0] -= 6; //例如从0x10跳到0x09
      if(ucRtc[0] == 0xf9) //设置下限,0x00-1是0xf9,这是BCD码中的无效数值
      ucRtc[0] = 0x00;//所以在检测到为0xf9后,重置为0x00,并保持
      Set_Rtc(ucRtc);
      break;
      }
      }
  • DS1302的底层解释

    • DS1302寄存器

      image.webp

      image1.webp

    因此:

    1. Write_Ds1302_Byte(0x8e, 0x00); // 把写保护的WP置0,来关闭写保护,可以写入数据
    2. Write_Ds1302_Byte(0x80,0x80); //把CH置为1,停止时钟芯片的计时功能,让时钟暂停
    3. for(i = 0; i<3 ; i++){
    Write_Ds1302_Byte(0x84 - 2*i ,ucRtc[i]);
    }。//在i=2时,Write_Ds1302_Byte(0x80 ,ucRtc[2]),再重新将CH置为0,开启计时
    4. Write_Ds1302_Byte(0x8e,0x80); //把写保护的WP置1,开启写保护,此时不能再改数据
DS1302相关功能
https://mizuki.mysqil.com/posts/蓝桥杯单片机/ds1302相关功能/
作者
风过无痕
发布于
2025-11-03
许可协议
CC BY 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00