做动态图网站外贸soho
做动态图网站,外贸soho,电子政务网站建设出版社,包包网站建设策划书上一节我们讲了DS1302的工作原理#xff0c;这一节我们开始代码演示。
新创建一个工程写上框架 我们需要LCD1602进行显示#xff0c;所以我们要将LCD1602调试工具那一节的LCD1602的模块化代码给添加进来 然后我们开始创建一个DS1302.c和DS1302.h 根据原理图#xff0c;为了…上一节我们讲了DS1302的工作原理这一节我们开始代码演示。
新创建一个工程写上框架 我们需要LCD1602进行显示所以我们要将LCD1602调试工具那一节的LCD1602的模块化代码给添加进来 然后我们开始创建一个DS1302.c和DS1302.h 根据原理图为了方便操作我们要在DS1302.c文件重新定义我们的三个端口 定义好之后我们操作重命名的名字就相当于操作单片机的这三个引脚。
然后我们就可以根据上节讲的工作原理模拟这个时序 首先我们要写一个函数叫做单字节写DS1302模拟这个时序 第二个函数是单字节读DS1302模拟这个时序 然后初始化DS1302 开始写字节第一步将CE置1 下一步把命令字的第0位放在IO线上 然后DS1302_SCLK置1再置0 这里置1后立马置0的话需要考虑我们芯片能够承受的时钟最快频率因为置1后立马置0的过程中可能时钟线操作的太快而时钟芯片反应不过来。
所以要看看芯片手册上支持的最快速率是多少。
比如手册上给出了这个时序上每一段的操作时间表格 还画了图表示哪里到哪里对应的是表格中的哪一个时间 比如说tDC对应的是当VCC是2V的时候操作时间最小不能小过200ns如果VCC是5V的时候时间最小是50ns。 但是由于我们51单片机的速率是比较慢的一个机器周期是1微秒所以置1到置0之间可以不用加延时。如果有的单片机的速度很快的话置1到置0之间要加一段延时等IO后完成数据交互之后再置0。 经过以上三步后我们的时序已经走完到这一步了 接下来我们接着写入命令字的第1位第2位第3位......数据保持CE1
我们可以用for循环来实现 更正图中应该是i8
这个循环完成后整个时序就进行到这个地方 最后那一半时序其实和前面一半的时序操作几乎一模一样只是它的数据不同
可以直接复制过来改一下 更正图中应该是i8
这个循环完成后我们时序已经完成到这里了 最后就是把CE给清零 更正图中应该是i8
这样单字节写的这整个时序就已经完成了。
数据写进去后我们还要让单片机读出来最后再显示出来才能看到我们写进去的数据。 接下来我们就操作单字节读的时序 操作命令字部分的时序几乎一样可以直接复制过来 更正图中应该是i8
这样整个时序就进行到这里了 但是这里有个问题当时钟来一个下降沿的时候时钟芯片就会向单片机输出数据了这就意味着如果我们直接这样写的话那进行到最后一轮for循环的时候就同时有一位数据出来了我们应该想要时序进行到这一步才对 所以得调整一下顺序先给0再给1 更正图中应该是i8
这样当第一个for循环结束后时序就不是到这里来了 而是到这里来了 最后一个for循环结束后就到这里来了 这样我们这个for循环就全部是与命令字有关的
当这一部分时序进行完之后这里单片机就要释放掉对IO口的控制然后把IO口的控制权转交给DS1302。DS1302输出数据然后单片机在这里直接读取IO口的状态。
因此接下来先给下降沿 更正图中应该是i8
那么数据就已经到了IO口的线上了所以我们直接读
所以我们再给一个上升沿 更正图中应该是i8
这个时候时序就进行到这里了 这个时候DS1302操作IO口把它想要输出的数据的D0给到IO口线上了。
然后先定义一个变量Data,然后进行循环读出数据的每一位 这样就和这个时序完全相同了
PS连续两次置1时序上的电平不会产生变化并且单字节读的时序比单字节写的时序少了一个脉冲那么我们这个地方重复置了一个1的话可以补充少了的这个脉冲。 最后别忘记CE清零 把Data返回到时候主程序里面调用这个函数的话返回值就可以打印出来了
返回值类型也要改 这里有一个重点敲黑板重点来了
读取完数据时候一定要给IO口清零 如果不写上这一句代码的话效果是这样的请看视频读出来的数据是乱码的 DS1302实时时钟2 这样读和写的两个时序已经模拟完成我们需要再DS1302.h文件里面进行声明一下这几个函数 到这里我们的读写程序基本已经完成了 BCD码
然后还需要补充一个知识BCD码
DS1302的内部寄存器不是以正常的二进制进行存储的而是以BCD码进行存储的。
BCD码Binary Coded Decimal用4位二进制数来表示1位十进制数
高四位表示十进制的十位低四位表示十进制的个位
例0001 0011表示131000 0101表示850001 1010不合法
在十六进制中的体现0x13表示130x85表示850x1A不合法
10的BCD码是0001 0000转换成正常的十进制是16
BCD码转十进制DECBCD/16把高四位提取出来*10BCD%16把低四位提取出来; 2位BCD
十进制转BCD码BCDDEC/10得到十位*16DEC%10得到个位; 2位BCD
所以我们回头这一下这张表格就能看明白了 以秒寄存器为例这张表格上写明低四位存的是秒而高位的那三位0-50就只能用到三位(0)101存的是10秒CH置为1的话秒就会停止整个时钟就会停止。CH0的话时钟时钟是运行的。 所以想要最后的结果显示成正常的十进制数的话就要将结果转换成十进制再显示。
如果还是想转换成十进制再显示的话可以利用这一个转换公式
BCD码转十进制DECBCD/16把高四位提取出来*10BCD%16把低四位提取出来; 2位BCD
设置时间时要将十进制转换成BCD码写进时钟芯片可以利用这个公式
十进制转BCD码BCDDEC/10得到十位*16DEC%10得到个位; 2位BCD
我们要将年月日时分秒星期显示在液晶屏上的话还要在DS1302.c文件中定义是个数组然后再写两个函数方便我们后续设置时间 为了方便后面不用每次都查找这个表上的地址码 我们可以把这个表格上的写入地址重定义 然后我们知道写入时的命令字最低位肯定是0读出时的命令字最低位肯定是1 所以我们在ReadByte()这里加一行这样的代码 因为这个读的命令字一定是1了将Command或0x01之后那它的最低位肯定是1也就是肯定是读然后我们给地址的时候可以直接给写的地址因为写的地址或了0x01之后就是读的地址这样我们就不需要重复定义那么多地址了。因此我们就不需要把读的地址也弄成这样了 要想获得读的地址就直接将写的这个地址|0x01就变成读的地址了
于是两个函数写完之后是这样 将这两个函数和数组都声明一下 最后DS1302.c的完整代码如下 最后我们在主程序中调用函数然后运行 运行后的效果请看视频 DS1302实时时钟1 本节的代码演示就到这里。
之后有时间再演示一个可调时钟的代码
源码放在评论区自取有什么问题可以评论区留言。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/88293.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!