蓝桥杯之单片机设计与开发(32)——官方DS1302驱动的使用

马上就要比赛了,毕竟比赛不像是自己在实验室写,没有自己写好的驱动代码,不过官方会提供驱动代码的。以下就是官方的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);

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值