马上就要比赛了,毕竟比赛不像是自己在实验室写,没有自己写好的驱动代码,不过官方会提供驱动代码的。以下就是官方的ds1302驱动的使用。
DS1302芯片了解见:https://blog.csdn.net/Xiaomo_haa/article/details/88061555
以下是官方提供的ds1302驱动代码全部。
/*
程序说明: DS1302驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台 8051,12MHz
日 期: 2011-8-9
*/
#include <reg52.h>
#include <intrins.h>
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3; // DS1302复位
void Write_Ds1302_Byte(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
}
void Write_Ds1302( unsigned char address,unsigned char dat )
{
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
Write_Ds1302_Byte(dat);
RST=0;
}
unsigned char Read_Ds1302 ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0;
_nop_();
RST=0;
SCK=0;
_nop_();
SCK=1;
_nop_();
SDA=0;
_nop_();
SDA=1;
_nop_();
return (temp);
}
我一直说蓝桥杯我们需要做的就是应付比赛,在实际的开发中,你可以参考自己之前的程序。
通过上面的程序,我们可以发现在上面的代码中已经写好了往ds1302中写和读,使用的是最简单的读写,没有使用DS1302的BURST模式。
BCD码注意事项
注意:官方程序中,ds1302读/写数据格式都是BCD码。
所以一定要注意BCD码和十进制的转换。见:https://blog.csdn.net/Xiaomo_haa/article/details/88140690
分离bcd码十位:
shiwei = bcd >> 4;
分离BCD码个位
gewei = bcd & 0x0f;
在BCD码运算中,还有很多注意事项。
比如在运算中超过10需要+6进行数值修正。
当两个BCD码相加,如果和等于或小于 1001(即十进制的9),不需要修正;
如果相加之和在 1010 到1111(即十六进制数 0AH~0FH)之间,则需加 6 进行修正;
如果相加时,本位产生了进位,也需加 6 进行修正。
这样做的原因是,机器按二进制相加,所以 4 位二进制数相加时,是按“逢十六进一”的原则进行运算的,而实质上是 2 个十进制数相加,应该按“逢十进一”的原则相加。
16 与10相差 6,所以当和超过 9或有进位时,都要加 6 进行修正。
DS1302初始化程序
我们可以写一个初始化函数,实现比赛所要求的上电之后时钟设置为多少多少
根据ds1302手册
void DS1302Init(void)
{
unsigned char timeinit[] = {0x23, 0x59, 0x55};
Write_Ds1302(0x8e, 0x00); //取消写保护
Write_Ds1302(0x84, timeinit[0]); //初始化时钟
Write_Ds1302(0x82, timeinit[1]); //初始化分钟
Write_Ds1302(0x80, timeinit[2]); //初始化秒钟
}
读取的时候我们就可以写
unsigned char hour, min, sec;
hour = Read_Ds1302(0x85);
min = Read_Ds1302(0x83);
sec = Read_Ds1302(0x81);