蓝桥杯单片机CT107D ds1302驱动

蓝桥杯单片机CTD107 ds13020
比赛时官方提供用驱动函数,但是不能直接使用,需要修改相应的.c和.h文件,
第一步:修改包含的头文件
将.c文件包含的头文件 #include <reg52.h> 和 #include <intrins.h> 改为 #include “ds1302.h”
在.h文件添加 #include “common.h”
第二步:添加内容 写地址和读地址,初始化时间
uint8 write_addr[]={0x84,0x82,0x80}; //写时分秒
uint8 read_addr[]={0x85,0x83,0x81}; //读时分秒
uint8 time[3]={0x00,0x00,0x00}; //初始化时间
第三步:写ds1302_init() 和 ds1302_readtime()

void ds1302_init() 
{
	uint8 i;
	Write_Ds1302(0x8E, 0x00); //关掉写保护
	for(i=0;i<3;i++)
	{
		Write_Ds1302(write_addr[i], time[i]);
	}
	Write_Ds1302(0x8E, 0x80);  //打开写保护
}

void ds1302_readtime() 
{
	for(i=0;i<3;i++)
	{
		time[i]=Read_Ds1302(read_addr[i]);
	}
}

以下为完整的.h文件

#ifndef __DS1302_H
#define __DS1302_H

#include "common.h"

extern uint8 time[3];

void Write_Ds1302_Byte(unsigned  char temp);
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address );

void ds1302_init();
void ds1302_readtime();

#endif

以下为完整的.c文件

#include "ds1302.h"

sbit SCK=P1^7;		
sbit SDA=P2^3;		
sbit RST = P1^3; 	

//以下为自己添加部分
uint8 write_addr[]={0x84,0x82,0x80};	
uint8 read_addr[]={0x85,0x83,0x81};	
uint8 time[3]={0x12,0x30,0x00}; 		

void ds1302_init() 
{
	uint8 i;
	Write_Ds1302(0x8E, 0x00);
	for(i=0;i<3;i++)
	{
		Write_Ds1302(write_addr[i], time[i]);
	}
	Write_Ds1302(0x8E, 0x80);
}

void ds1302_readtime() 
{
	uint8 i;
	for(i=0;i<3;i++)
	{
		time[i]=Read_Ds1302(read_addr[i]);
	}
}
//以上为自己添加部分

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);			
}

猜你喜欢

转载自blog.csdn.net/qq_41676952/article/details/87727145
今日推荐