蓝桥杯单片机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);
}
工程模板:https://download.csdn.net/download/qq_41676952/11126460