783 字
4 分钟
DS1302相关功能
-
底层代码及调用
-
注意引脚的设置
-
时钟定义数组理解
例: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码为无效数值;
-
注意数码管显示时
要注意/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; -
底层代码
#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;}
-
-
常见考法
-
在采集到某一数据时,顺便读取此时的时钟时间
一般处理方法: 定义unsigned char Save_Rtc[3] = {0,0,0}; 需要调用时:Read_Rtc(Save_Rtc);即可
-
按下某一按键时,要调整时钟的值(第八届省赛题着重考的这点,可以着重看一下)
//键盘处理函数的功能void Key_Proc(){switch(Key_Down){case 5:ucRtc[0]++;if(ucRtc[0] % 16 == 0x0a) //BCD码需要手动进行十进制进位(避免无效数值)ucRtc[0] += 6; //例如从0x09跳到0x10if(ucRtc[0] == 0x24) //设置上限ucRtc[0] = 0x23;Set_Rtc(ucRtc);break;case 6:ucRtc[1]++;if(ucRtc[1] % 16 == 0x0a) //BCD码需要手动进行十进制进位(避免无效数值)ucRtc[1] += 6; //例如从0x09跳到0x10if(ucRtc[1] == 0x60) //设置上限ucRtc[1] = 0x59;Set_Rtc(ucRtc);break;case 7:ucRtc[0]--;if(ucRtc[0] % 16 == 0x0f)ucRtc[0] -= 6; //例如从0x10跳到0x09if(ucRtc[0] == 0xf9) //设置下限,0x00-1是0xf9,这是BCD码中的无效数值ucRtc[0] = 0x00;//所以在检测到为0xf9后,重置为0x00,并保持Set_Rtc(ucRtc);break;}}
-
-
DS1302的底层解释
-
DS1302寄存器


因此:
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,开启写保护,此时不能再改数据 -
部分信息可能已经过时














