⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1307.c

📁 一个基于51单片机的定时报警设计电路及程序
💻 C
字号:
#include"twi.h"
#include"ds1307.h"
#include"delay.h"

char g_aTimeBuf[7];//日历/时钟BCD格式缓冲区
char g_aTimeBin[7];//时钟/日历二进制格式缓冲区

/*************DS1307操作**************开始**************/
//对DS1307内存连续的写操作
unsigned char rtc_write(unsigned char addr,unsigned char *buf,unsigned char len)
{
	unsigned char i;
	
	twi_start();
	delay_nms(10);
	twi_writebyte(DS1307_ADDR|TW_WRITE);
	delay_nms(10);
	twi_writebyte(addr);//write address
	delay_nms(10);
	for(i=0;i<len;i++)
	{
		twi_writebyte(buf[i]);
		delay_nms(10);
		}
	twi_stop();
	return 0;
}

//对DS1307内存连续的读操作
unsigned char rtc_read(unsigned char addr,unsigned char *buf,unsigned char len)
{
	unsigned char i;
	
	rtc_write(addr,0,0);    //set address
	
	delay_nms(10);
	
	twi_start();
	delay_nms(10);
	twi_writebyte(DS1307_ADDR|TW_READ);
	for(i=0;i<len-1;i++)
	{
	   twi_readbyte(buf+i,TW_ACK);
	   delay_nms(10);
	}
	twi_readbyte(buf+i,TW_NACK);
	delay_nms(10);
	twi_stop();
	return 0;
}
/*************DS1307操作**************结束**************/

/*************接口部分****************开始**************/



//更新或读取DS1307日历/时间数据
unsigned char RtcUpdateData(unsigned char direction)
{
	unsigned char ret;
	if(direction)	       //读
		ret=rtc_read(0,g_aTimeBuf,7);
	else			       //写
		ret=rtc_write(0,g_aTimeBuf,7);	

	return ret;
}
//读DS1307用户RAM
unsigned char RtcReadRAM(unsigned char addr,unsigned char *buf,unsigned char len)
{
	addr+=8;
	return rtc_read(addr,buf,len);
}
//写DS1307用户RAM
unsigned char RtcWriteRAM(unsigned char addr,unsigned char *buf,unsigned char len)
{
	addr+=8;
	return rtc_write(addr,buf,len);
}

unsigned char byte_bintobcd(unsigned char bin)
{
	unsigned char ret;
	bin&=0x7f;
	bin%=100;
	ret=bin/10;
	ret <<=4;
	ret|=bin%10;
	return ret;
}
unsigned char byte_bcdtobin(unsigned char bcd)
{
	unsigned char ret;
	ret=bcd & 0x0f;
	ret+=(bcd>>4)*10;
	return ret;		
}

//将二进制格式缓冲区(g_aTimeBin)内容转换成BCD格式后保存到BCD格式缓冲区(g_aTimeBuf)
void RtcBinToBCD(void)
{
	unsigned char i;
	g_aTimeBin[0]&=0x7f;
	g_aTimeBin[1]&=0x7f;

	g_aTimeBin[2]&=0x3f;
    

	g_aTimeBin[3]&=0x07;
	

	g_aTimeBin[4]&=0x3f;
	g_aTimeBin[5]&=0x1f;	
	g_aTimeBin[6]&=0xff;
	
	for(i=0;i<7;i++)
		g_aTimeBuf[i]=byte_bintobcd(g_aTimeBin[i]);
}

//将BCD格式缓冲区(g_aTimeBuf)内容转换成二进制格式后保存到二进制格式缓冲区(g_aTimeBin)
void RtcBCDToBin(void)
{
	unsigned char i;
	for(i=0;i<7;i++)
		g_aTimeBin[i]=byte_bcdtobin(g_aTimeBuf[i]);
}

//写DS1307配置字节
void RtcSetSQWOutput(unsigned char en,unsigned char level)
{
	//en:方波输出允许 TRUE 有效 level:如果输出禁止 OUT口的逻辑电平
	unsigned char c=0;
	if(en)	//enable
	   c=0x10;
	else	//disable
	{
	   if(level)
		  c=0x80;
	}
	rtc_write(7,&c,1);
}
/*************接口部分***************结束**************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -