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

📄 shishishizhong.c

📁 用51单片机实现实时时钟1308的I2C总线读写
💻 C
字号:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define Delaynop {_nop_();_nop_();_nop_();_nop_();}
sbit rs=P2^0;
sbit rw=P2^1;
sbit en=P2^2;
sbit scl=P1^0;
sbit sda=P1^1;

uchar code SetRtcCode[]={0x93,0x50,0x59,0x23,0x02,0x31,0x12,0x09};
//定义实时时钟的初始化日期
uchar code RtcAddr[]={0x07,0x00,0x01,0x02,0x03,0x04,0x05,0x06};
//地址依次为控制,秒,分,时,星期,日,月,年。
//且所有数据为十进制的,除了年和秒的最高位外其他寄存器的
//最高位没用,都为0,而秒的最高位控制晶振的运行,1表示晶振禁止
//0表示晶振使能,时的Bit6位决定了时钟的24或12运行方式。1:12模式

uchar code table0[]="  09-05-05  02  ";
uchar code table1[]="    11:59:00    ";
uchar DisplayPoint[]={0x82,0xCA,0xC7,0xC4,0x8C,0x88,0x85};
//数据指针好像有点乱,但不知这样运行才是正确的。
//有可能读出的第一个数据不是秒,而是年
uchar ReadDat[7]={0,0,0,0,0,0,0};
//定义读出的七个日期数据

void Delay(uchar c);
void Write_com(uchar com);
void Write_dat(uchar dat);
uchar ReadDS1307(uchar Raddr);
void WriteDS8bit(char dswByte);
void WriteDS1307(uchar Waddr,uchar dswdat);
void StartDS1307(void);
void StopDS1307(void);
void init(void);

void main(void)
{
	uchar tdat0=0;
	uchar tdat1=0;
	uchar temp=0;
	unsigned char i;
	init();
	i=0;
	while(1)
	{
			ReadDat[i]=ReadDS1307(RtcAddr[i+1]);
			temp=((ReadDat[i]&0x70)>>4)*10+(ReadDat[i]&0x0F);
			tdat0=temp/10+'0';
			tdat1=temp%10+'0';
			Write_com(DisplayPoint[i]);	
			Write_dat(tdat0);
			Write_dat(tdat1);
			Delay(50);
			//P3=ReadDat[i];
			i++;
			if(i>6)i=0;
	}
}
void Delay(uchar c)
{    
	uchar i,j;
	for(j=c;j>0;j--)
	   for(i=110;i>0;i--);		   	
}
void Write_com(uchar com)
{
	en=1;
	rs=0;
	rw=1;
	P0=com;	
	Delay(20);		
	rw=0;
	en=0;	
}
void Write_dat(uchar dat)
{	
	en=1;
	rs=1;
	rw=1;
	P0=dat;	
	Delay(20);		
	rw=0;
	en=0;
}
uchar ReadDS1307(uchar Raddr)
{
	uchar i;
	uchar dsrdat=0;
	StartDS1307();
	WriteDS8bit(0xD0);
	WriteDS8bit(Raddr);
	StopDS1307();
	StartDS1307();
	WriteDS8bit(0xD1);	
	for(i=0;i<8;i++)
		{	
			dsrdat<<=1;	
			scl=1;									
			if(sda==1)
			{dsrdat|=0x01;}
			else
			{dsrdat&=0xFE;}
			scl=0;					
		}
	StopDS1307();
	return(dsrdat);	
}
void WriteDS8bit(char dswByte)
{
	uchar i;
	for(i=0;i<8;i++)
		{
			sda=dswByte&0x80 ? 1:0;	
			_nop_();		
			scl=1;
			Delaynop;
			scl=0;
			dswByte<<=1;
		}
	sda=1;
	Delaynop;
	scl=1;
	Delaynop;
	//ack_bit=sda;//读取应答位,也可以不读,用延迟错过就可以
	scl=0;	
	
	
}
void WriteDS1307(uchar Waddr,uchar dswdat)
{
	StartDS1307();
	WriteDS8bit(0xD0);
	WriteDS8bit(Waddr);
	WriteDS8bit(dswdat&0x7F);
	StopDS1307();
}
void StartDS1307(void)
{
	scl=1;
	sda=1;
	Delaynop;
	sda=0;
	Delaynop;
	scl=0;
}
void StopDS1307(void)
{
	sda=0;
	Delaynop;
	scl=1;
	Delaynop;
	sda=1;
}
void init(void)
{
	uchar i=0;
	Write_com(0x38);
	Write_com(0x0c);
	Write_com(0x06);
	Write_com(0x01);
	Write_com(0x80);
	for(i=0;i<16;i++) 
	   {
  		  Write_dat(table0[i]);     
	   }
	Write_com(0x80+0x40);//指针换到下一行
	for(i=0;i<16;i++) 
	   {
  		  Write_dat(table1[i]);    
	   }		
	for(i=0;i<8;i++)
	{
		WriteDS1307(RtcAddr[i],SetRtcCode[i]);
	}
}

⌨️ 快捷键说明

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