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

📄 ds3231.c

📁 keil C 编译 可以选择max372或者ds3231时钟芯片
💻 C
字号:
#pragma DEBUG CODE
#include	<reg51.h>
#include	"clock.h"
#include <intrins.h>

sbit	CLK_SDA=P3^4;
sbit	CLK_SCL=P3^5;
extern unsigned char code MonthTable[13];
unsigned char xdata buf_clk[18];
Ststruct xdata Time_R;
Ststruct xdata Time_W;
extern unsigned int UseCount;

/********************************************/

void IIC_Start(void)
{ 	CLK_SDA=1;
	CLK_SCL=1;

	CLK_SDA=0;
	CLK_SCL=0;

}
/********************************************/
void IIC_Stop(void)
{	CLK_SDA=0;
	CLK_SCL=0;
    CLK_SCL=1;
    CLK_SDA=1;

}
/********************************************/
void IIC_Ack_S(bit ack)           //确认接收
{ 
	CLK_SDA=ack;
    CLK_SCL=1;
 	CLK_SCL=0;
}
bit IIC_Ack_R(void)           
{bit ack=0;
    CLK_SCL=1;
	if(CLK_SDA)
		ack=1;
	CLK_SCL=0;
	return ack;
}
void IIC_Byte_S(unsigned char bytedata)          //传送一个字节数据
{    unsigned char i=8;
	do{
		CLK_SDA=bytedata&0x80;
		CLK_SCL=1;
		bytedata<<=1;
		CLK_SCL=0;
    	}while(--i);
}
unsigned char IIC_Byte_R(void)             				//接收一个字节数据
{	unsigned char x,i=8;
	CLK_SDA=1;
	do
	{	CLK_SCL=1;
		x<<=1;
		if(CLK_SDA) 
			x++;
		CLK_SCL=0;
	}while(--i);
	return(x);
}
unsigned char IIC_Muti_W(unsigned char xdata *p,unsigned char address,unsigned char i)
{
	unsigned char sign=0;
	IIC_Start();
	if(CLK_TYPE)
		IIC_Byte_S(0xd0);
	else
		IIC_Byte_S(0x64);		
	if(IIC_Ack_R())
		sign+=0x01;
	if(CLK_TYPE)
		IIC_Byte_S(address);
	else
		IIC_Byte_S(address<<4);
	if(IIC_Ack_R())
		sign+=0x02;
	while(i)
		{
		IIC_Byte_S(*p);
		if(IIC_Ack_R())
		sign+=0x04;
		p++;
		i--;
		}
	IIC_Stop();
	return(sign);
}						
unsigned char IIC_Muti_R(unsigned char xdata *p,unsigned char address,unsigned char i)
{
	unsigned char sign=0;
	IIC_Start();
	if(CLK_TYPE)
		IIC_Byte_S(0xd0);
	else
		IIC_Byte_S(0x64);		
	if(IIC_Ack_R())
		sign+=0x01;
	if(CLK_TYPE)
		IIC_Byte_S(address);
	else
		IIC_Byte_S(address<<4);
	if(IIC_Ack_R())
		sign+=0x02;
	IIC_Start();

	if(CLK_TYPE)
		IIC_Byte_S(0xd1);
	else
		IIC_Byte_S(0x65);	
	if(IIC_Ack_R())
		sign+=0x04;
	for(;;)
	{
		*p=IIC_Byte_R();
		p++;
		i--;
		if(!i) 
			break;
		IIC_Ack_S(0);
	}
	IIC_Ack_S(1);
	IIC_Stop();
    return(sign);
}

void initFreq(unsigned char x)
{
	buf_clk[0]= x;		
	if(CLK_TYPE)
		{
		IIC_Muti_W(buf_clk,16,1);
		buf_clk[0]= 0x20;
		IIC_Muti_W(buf_clk,14,1);
		}
	else
		{
		IIC_Muti_W(buf_clk,7,1);
			//tuijian 28,计时精度 老晶振为46
		}
}
void initclock(void)
{	
	unsigned char count;
	count = 10;
	do{		
		if(IIC_Muti_R(buf_clk,0x0f,1))
			{
			UseCount = 5;
			while(UseCount);
			}
		else
			{
			if (buf_clk[0] & 0x80)
				{
				buf_clk[0] = 0x00;
				buf_clk[1] = 0x00;
				buf_clk[2] = 0x12;
				buf_clk[3] = 0x00;
				buf_clk[4] = 0x01;
				buf_clk[5] = 0x09;
				buf_clk[6] = 0x04;
				IIC_Muti_W(buf_clk,0,7);
				}
			if(CLK_TYPE)
				{
				buf_clk[0] = 0x20;
				buf_clk[1] = 0x00;		// 00101000
		//		buf_clk[2] = 0x00;
				IIC_Muti_W(buf_clk,0x0e,2);
				}
			else
				{
				buf_clk[0] = 0x00;
				buf_clk[1] = 0x28;
				IIC_Muti_W(buf_clk,0x0e,2);
				}
			break;
			}
		}while(--count);
}		
/***********************************************/
unsigned char bcd2bin(unsigned char BCD)
{
	return((BCD/16)*10+BCD%16);
}
/***********************************************/
unsigned char bin2bcd(unsigned char BIN)
{	
	return((BIN/10)*16+BIN%10);
}	

/***********************************************/
unsigned char getweek(void)
{unsigned char weekdays,i,j;
		weekdays=Time_R.day+6;
		j=0;
		if(Time_R.month>6)
			{j=6;
			weekdays+=4;
			}
		for(i=j;i<Time_R.month;i++)
		{weekdays+=MonthTable[i];
		}
		weekdays=Time_R.year+Time_R.year/4+weekdays;
		if(Time_R.year%4==0&&Time_R.month<3)
		weekdays--;
		return(weekdays%7);
}
/***********************************************/
void readclock(void)
{
	unsigned char count;
	count = 10;
	do{
		if(IIC_Muti_R(buf_clk,0,7))	
			{
			UseCount = 5;
			while(UseCount);
		}
		else break;
	}while(--count);
	Time_R.second=bcd2bin(buf_clk[0]);
	Time_R.minute=bcd2bin(buf_clk[1]);
	Time_R.hour=bcd2bin(buf_clk[2]);
	Time_R.day=bcd2bin(buf_clk[4]);
	Time_R.month=bcd2bin(buf_clk[5]);
	Time_R.year=bcd2bin(buf_clk[6]);
	Time_R.century=20;
//	Time.week=getweek();
//	lunerchange();
//	hejrachange();
} 
/***********************************************/
void writeclock(void)
{
	unsigned char count;
	count = 10;
	buf_clk[0]=bin2bcd(Time_W.second);
	buf_clk[1]=bin2bcd(Time_W.minute);
	buf_clk[2]=bin2bcd(Time_W.hour);
//	buf_clk[3]=bin2bcd(Time_W.week);
	buf_clk[4]=bin2bcd(Time_W.day);
	buf_clk[5]=bin2bcd(Time_W.month);
	buf_clk[6]=bin2bcd(Time_W.year);
	do{
		if(IIC_Muti_W(buf_clk,0,7))
			{
				UseCount = 5;
			while(UseCount);
			}
		else break;
	}while(--count);
}

⌨️ 快捷键说明

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