一、概念和原理
说明:1.这个32.768K是晶振。2.重点关注读取日历时钟寄存器。
说明:1.是一块物理单元,但因为我们读写指令不同,所以分开俩种寄存器加以区分;
2.第八位读写保护位只有一位有效,记住0和1的效果,0允许,1禁止;
这个很好理解,指令不同,分俩组,指令和数据不同,分三组。 这里第三个数组可以自定义设置。咱们实验使用的是23年12月31日23时59分55秒。
提一下这个是因为,客观题会考,是比较特殊的点,写时上升沿有效,读是下降沿有效。
然后这个蓝桥杯比赛会提供ds1302底层驱动程序给你,完善头文件和引脚定义就行,而且这种本身带了一根时钟线的,与单片机独立开来,不管是12T还是1T都没影响,不用改。
不管考什么,都是建立在这两个基本操作上进行(可以独立按键挑时间和数码管显示)
二、题目
额初始时间咱们设置成(23年)周7,12月31日23时59分55秒吧,这样方便检验时钟模块能不能用。
三、手写代码
一、框架
二、 重头戏ds1302
复制粘贴大赛给的底层驱动代码就不说了,重点是撰写这个读取和写入的两个函数,位操作大家不会的话可以仿照小蜜蜂的写法,我这种很简洁但是你要知道为什么,是跟国一学长学得。
切记:(坑了笔者不小啊)这个原理图上面就是AT24C02芯片的原理图,但是AT24C02中SDA是P21引脚,我们的DS1302是P23,就是那个I/O对应的引脚。
为什么:直接定义一个数组,里面放上我们的时间数据。但是给写字节函数的是BCD码也就是二进制,那就可以通过移位和|的操作将十进制转换成BCD,读取就是将BCD转成十进制,右移四位得到的是十位上的数字,乘10加上个位上的数字就可以得到十进制数了,至于写读寄存器地址,是有规律的增加的,就可以一并用i来解决,而不是再定义俩个数组。
说明:1.这个打印的话作者试过了,打到周几就没啥问题除了一些常见的不稳定,如果多打年份的话,秒数那里就会错误。
三、uart文件
记住重新定义那个putchar函数,不然还真没法用printf。
四、结尾
实验现象里面的??不管,正常的不稳定现象,会有完整数据的打印的。