本文参考该博主而写,这位博主大大写的十分详细,大家有兴趣可以去参考
我之所以再 画蛇添足 写这个是因为我想记录一下我作为小白视角如何去使用
很多同学刚开始写的时候,看到ds1302参数手册一定都是晕的,不知道怎么写,怎么办!其实我也是,我在写这篇文章的时候,依旧搞不清楚!!!但是,这不影响我参加比赛(除非规则改了),正常来说,我们能写出来就行,不用搞原理!!!如果你也是这种心态,那么就继续看下去叭。如果不是,请看上面的博客!!!
强调!有了这篇文章,你不需要再看 ds1302介绍!!!你已经可以进行时间的存放读取数据了!!!
关于这个这个传感器,我们分为两部分进行学习!
(1)改官方驱动
(2)写自己驱动
(3)串口验证
(1)改官方驱动
官方提供了三个驱动文件,我们只需要修改其中一个,也就是下面这个函数
unsigned char Read_Ds1302_Byte ( unsigned char address )
我们可以看到,修改驱动也就是直接删除原驱动的文件就行,其他部分不做改变!!
(2)写自己驱动
这里的驱动也很简单,因为不长,这边建议直接理解背下来!!!
代码已经放在下面!!,我会稍微解释一下,方便你理解记忆!!!
void DS1302_init(uchar _h, uchar _m, uchar _s){
uchar i;
_h = (_h/10%10 << 4) | _h%10;
_m = (_m/10%10 << 4) | _m%10;
_s = (_s/10%10 << 4) | _s%10;
Write_Ds1302_Byte(0x8e, 0);
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(0xbe);
Write_Ds1302(_s);
Write_Ds1302(_m);
Write_Ds1302(_h);
for(i = 0; i < 5; i++){
Write_Ds1302(0);
}
RST=0;
Write_Ds1302_Byte(0x8e, 0x80);
}
初始化函数代码解读:
1:定义循环变量 i
2:分别对 h小时,m分钟,s秒进行运算转换(把10位左移四位 和 个位 或运算)
3:打开写入功能(0x8e,0)
4:接下来三行直接复制修改官方驱动的 蓝1框
5:接下来三行写入 秒,分,时
6:写入0xbe直接背住!!!
6:接下来 for 循环是对 日,周,月等写入
7:RST=0复位
8:关闭写入功能(0x8e,0x80)
简单总结:(1)对写入数据进行格式转换
(2)开启写入
(3)模板1
(4)0xbe
(5)写入数据:3个单独写,5个循环
(6)RST=0+关闭写入
void DS1302_Read(){
Write_Ds1302_Byte(0x8e, 0);
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(0xbf);
time[0] = Read();
time[1] = Read();
time[2] = Read();
time[0] = (time[0] >> 4)*10 + (time[0] & 0x0f);
time[1] = (time[1] >> 4)*10 + (time[1] & 0x0f);
time[2] = (time[2] >> 4)*10 + (time[2] & 0x0f);
RST=0; _nop_();
SCK=0; _nop_();
SCK=1; _nop_();
SDA=0; _nop_();
SDA=1; _nop_();
Write_Ds1302_Byte(0x8e, 0x80);
}
读取函数代码解读:
1.打开写入功能(0x8e,0)
2:接下来三行直接复制修改官方驱动的 蓝1框
3:写入0xbf直接背住!!!
4:数组前三位依次读取read函数
5:发该数组三位先截取高位后变换加上低位
6:接下来三行直接复制修改官方驱动的 蓝2框
7:关闭写入功能(0x8e,0x80)
简单总结:(1)开启写入
(2)模板1
(3)0xbf
(4)读取数据+格式转换
(5)模板2
(6)关闭写入
注意事项:(1)这里是BCD码,我们的高位是十位,低位是个位
(3)串口验证
这里的话,就是把读取的数据放到串口上进行打印,方便我们在测试的时候用!
使用:bu格式进行打印输出