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

📄 sd2403.c

📁 SD2403驱动程序
💻 C
字号:

#include <stdio.h>
#include <intrins.h>
#include "stc89c52.h"
#include "sd2403.h"
#include "12232.h"
#include "main.h"

//SDA	P36
//SCL	P37


sbit	SDA=P3^6;
sbit	SCL=P3^7;

/*********I2C延时***********/
void I2CWait(void)
{	
	_nop_();_nop_();_nop_();_nop_();
}


/********开启SD2400的I2C总线********/
bit I2CStart(void)
{
	SDA=1;
	SCL=1;
	I2CWait();
	if(!SDA)return false;//SDA线为低电平则总线忙,退出
	SDA=0;
	I2CWait();
	while(SDA)return false;//SDA线为高电平则总线出错,退出
	SCL=0;
	I2CWait();
	return true;
}


/********关闭SD2400的I2C总线*******/
void I2CStop(void)
{
	SDA=0;
	SCL=0;
	I2CWait();
	SCL=1;
	I2CWait();
	SDA=1;
}


/*********发送 ACK*********/
void I2CAck(void)
{	
	SDA=0;
	SCL=0;
	I2CWait();
	SCL=1;
	I2CWait();
	SCL=0;
}


/*********发送NO ACK*********/
void I2CNoAck(void)
{	
	SDA=1;
	SCL=0;
	I2CWait();
	SCL=1;
	I2CWait();
	SCL=0;
}


/*********读取ACK信号*********/
bit I2CWaitAck(void)  //返回为:1=有ACK,0=无ACK
{
	uchar errtime=255;
	SCL=0;
	SDA=1;
	I2CWait();
	SCL=1;
	I2CWait();
	while(SDA)
	{
		errtime--;
		if(!errtime)
		SCL=0;
		return false;
	}
	SCL=0;
	return true;
}


/************MCU向SD2400发送一个字节*************/
void I2CSendByte(uchar demand) //数据从高位到低位//
{
	uchar i=8;                       
	                                 
	
		while(i--)
		{
			SCL=0;
			_nop_();
			SDA=(bit)(demand&0x80);
			demand<<=1;
			I2CWait();
			SCL=1;
			I2CWait();
		}
		SCL=0;
}


/*********MCU从SD2400读入一字节*********/
uchar I2CReceiveByte(void)  //数据从高位到低位//
{
	uchar i=8;
	uchar ddata=0;
	SDA=1;
	while(i--)
	{
		ddata<<=1;          //数据从高位开始读取
		SCL=0;
		I2CWait();
		SCL=1;
		I2CWait();	   //从高位开始 ddata|=SDA;ddata<<=1
		if(SDA)
		{
			ddata|=0x01;
		}
	}
	SCL=0;
	return ddata;
}


/******读SD2400实时数据寄存器******/
extern void I2CReadDate(void)
{
	uchar n;
	I2CStart();
	I2CSendByte(0x65); 
	I2CWaitAck();
	for(n=0;n<7;n++)
	{
		date[n]=I2CReceiveByte();
		if (n!=6)         //最后一个数据不应答
		{
			I2CAck();
		}
	}
	I2CNoAck();
	I2CStop();
}

/******写SD2400实时数据寄存器******/
void TXI2CWriteDate(unsigned char a,unsigned char b,unsigned char c,unsigned char d,unsigned char e,unsigned char f)
{		
    
    

    WriteTimeOn();

	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
    I2CSendByte(0x00);//设置写起始地址      
	I2CWaitAck();	
	I2CSendByte(f);// second     
	I2CWaitAck();	
	I2CSendByte(e);//minute      
	I2CWaitAck();	
	I2CSendByte(d);//hour ,二十四小时制  A2  xor 80=22
	I2CWaitAck();	
	I2CSendByte(0x03);//week      
	I2CWaitAck();	
	I2CSendByte(c);//day      
	I2CWaitAck();	
	I2CSendByte(b);//month      
	I2CWaitAck();	
	I2CSendByte(a);//year      
	I2CWaitAck();	
	I2CStop();

	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
    I2CSendByte(0x12);//设置写起始地址      
	I2CWaitAck();		
    I2CSendByte(0x00);//清零数字调整寄存器      
	I2CWaitAck();        
	I2CStop();  
	
	WriteTimeOff();    
}


void I2CWriteDate(void) // ,unsigned char A2,unsigned char A3,unsigned char A4,unsigned char A5)
{		
    
    

    WriteTimeOn();

	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
    I2CSendByte(0x00);//设置写起始地址      
	I2CWaitAck();	
	I2CSendByte(0x00);// second     
	I2CWaitAck();	
	I2CSendByte(0x00);//minute      
	I2CWaitAck();	
	I2CSendByte(0x00);//hour ,二十四小时制  A2  xor 80=22
	I2CWaitAck();	
	I2CSendByte(0x03);//week      
	I2CWaitAck();	
	I2CSendByte(0x00);//day      
	I2CWaitAck();	
	I2CSendByte(0x00);//month      
	I2CWaitAck();	
	I2CSendByte(0x00);//year      
	I2CWaitAck();	
	I2CStop();

	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
    I2CSendByte(0x12);//设置写起始地址      
	I2CWaitAck();		
    I2CSendByte(0x00);//清零数字调整寄存器      
	I2CWaitAck();        
	I2CStop();  
	
	WriteTimeOff();    
}


/******写SD2400实时数据寄存器******/
void I2CWriteDate1(unsigned char A1) // ,unsigned char A2,unsigned char A3,unsigned char A4,unsigned char A5)
{		
    
    

    WriteTimeOn();

	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
    I2CSendByte(0x06);//设置写起始地址      
	I2CWaitAck();	
	//I2CSendByte(0x00);// second     
	//I2CWaitAck();	
	//I2CSendByte(A5);//minute      
	//I2CWaitAck();	
	//I2CSendByte(A4);//hour ,二十四小时制  A2  xor 80=22
	//I2CWaitAck();	
	//I2CSendByte(0x03);//week      
	//I2CWaitAck();	
	//I2CSendByte(A3);//day      
	//I2CWaitAck();	
	//I2CSendByte(A2);//month      
	//I2CWaitAck();	
	I2CSendByte(A1);//year      
	I2CWaitAck();	
	I2CStop();

	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
    I2CSendByte(0x12);//设置写起始地址      
	I2CWaitAck();		
    I2CSendByte(0x00);//清零数字调整寄存器      
	I2CWaitAck();        
	I2CStop();  
	
	WriteTimeOff();    
}


/******写SD2400实时数据寄存器******/
void I2CWriteDate2(unsigned char A1) // ,unsigned char A2,unsigned char A3,unsigned char A4,unsigned char A5)
{		
    
    

    WriteTimeOn();

	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
    I2CSendByte(0x05);//设置写起始地址      
	I2CWaitAck();	
	//I2CSendByte(0x00);// second     
	//I2CWaitAck();	
	//I2CSendByte(A5);//minute      
	//I2CWaitAck();	
	//I2CSendByte(A4);//hour ,二十四小时制  A2  xor 80=22
	//I2CWaitAck();	
	//I2CSendByte(0x03);//week      
	//I2CWaitAck();	
	//I2CSendByte(A3);//day      
	//I2CWaitAck();	
	//I2CSendByte(A2);//month      
	//I2CWaitAck();	
	I2CSendByte(A1);//year      
	I2CWaitAck();	
	I2CStop();

	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
    I2CSendByte(0x12);//设置写起始地址      
	I2CWaitAck();		
    I2CSendByte(0x00);//清零数字调整寄存器      
	I2CWaitAck();        
	I2CStop();  
	
	WriteTimeOff();    
}

/******写SD2400实时数据寄存器******/
void I2CWriteDate3(unsigned char A1) // ,unsigned char A2,unsigned char A3,unsigned char A4,unsigned char A5)
{		
    
    

    WriteTimeOn();

	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
    I2CSendByte(0x04);//设置写起始地址      
	I2CWaitAck();	
	//I2CSendByte(0x00);// second     
	//I2CWaitAck();	
	//I2CSendByte(A5);//minute      
	//I2CWaitAck();	
	//I2CSendByte(A4);//hour ,二十四小时制  A2  xor 80=22
	//I2CWaitAck();	
	//I2CSendByte(0x03);//week      
	//I2CWaitAck();	
	//I2CSendByte(A3);//day      
	//I2CWaitAck();	
	//I2CSendByte(A2);//month      
	//I2CWaitAck();	
	I2CSendByte(A1);//year      
	I2CWaitAck();	
	I2CStop();

	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
    I2CSendByte(0x12);//设置写起始地址      
	I2CWaitAck();		
    I2CSendByte(0x00);//清零数字调整寄存器      
	I2CWaitAck();        
	I2CStop();  
	
	WriteTimeOff();    
}

/******写SD2400允许程序******/
void WriteTimeOn(void)
{		
	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
    I2CSendByte(0x10);//设置写地址10H      
	I2CWaitAck();	
	I2CSendByte(0x80);//置WRTC1=1      
	I2CWaitAck();
	I2CStop(); 
	
	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
    I2CSendByte(0x0F);//设置写地址0FH      
	I2CWaitAck();	
	I2CSendByte(0x84);//置WRTC2,WRTC3=1      
	I2CWaitAck();
	I2CStop(); 
	
}


/******写SD2400禁止程序******/
void WriteTimeOff(void)
{		
	
	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
    I2CSendByte(0x0F);//设置写地址0FH      
	I2CWaitAck();	
	I2CSendByte(0x0) ;//置WRTC2,WRTC3=0      
	I2CWaitAck();

	I2CSendByte(0x0) ;//置WRTC1=0(10H地址)      
	I2CWaitAck();
	I2CStop(); 
}

/*

void Delay(uint nn)
{
   while(nn--);
}
*/

extern void Run2403()

{

	I2CReadDate();

	//delay2043(4500);
	//delay2043(4500);
	
	
	/*date[6]=year,date[5]=month,date[4]=day,date[3]=week,date[2]=hour,date[1]=minute,date[0]=second*/
    NowY[0]=date[6];
    NowM[0]=date[5]; 
    NowD[0]=date[4]; 
    NowHH[0]=date[2]^0x80; 
    NowMM[0]=date[1]; 
    NowSS[0]=date[0]; 
      

            //时间IC工作  结束
    //sprintf(Temp1,"日期:2008-11-15");
	//sprintf(Humi1,"时间:23:27");

}

/*********延时子程序*********/
void delay2043(unsigned int  nn)
{
   while(nn--);
   }



/******写SD2400实时数据寄存器******/
void I2CWriteDate4(unsigned char A1) // ,unsigned char A2,unsigned char A3,unsigned char A4,unsigned char A5)
{		
    
    

    WriteTimeOn();

	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
    I2CSendByte(0x02);//设置写起始地址      
	I2CWaitAck();	
	//I2CSendByte(0x00);// second     
	//I2CWaitAck();	
	//I2CSendByte(A5);//minute      
	//I2CWaitAck();	
	//I2CSendByte(A4);//hour ,二十四小时制  A2  xor 80=22
	//I2CWaitAck();	
	//I2CSendByte(0x03);//week      
	//I2CWaitAck();	
	//I2CSendByte(A3);//day      
	//I2CWaitAck();	
	//I2CSendByte(A2);//month      
	//I2CWaitAck();	
	I2CSendByte(A1);//year      
	I2CWaitAck();	
	I2CStop();

	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
    I2CSendByte(0x12);//设置写起始地址      
	I2CWaitAck();		
    I2CSendByte(0x00);//清零数字调整寄存器      
	I2CWaitAck();        
	I2CStop();  
	
	WriteTimeOff();    
}
/******写SD2400实时数据寄存器******/
void I2CWriteDate5(unsigned char A1) // ,unsigned char A2,unsigned char A3,unsigned char A4,unsigned char A5)
{		
    
    

    WriteTimeOn();

	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
    I2CSendByte(0x01);//设置写起始地址      
	I2CWaitAck();	
	//I2CSendByte(0x00);// second     
	//I2CWaitAck();	
	//I2CSendByte(A5);//minute      
	//I2CWaitAck();	
	//I2CSendByte(A4);//hour ,二十四小时制  A2  xor 80=22
	//I2CWaitAck();	
	//I2CSendByte(0x03);//week      
	//I2CWaitAck();	
	//I2CSendByte(A3);//day      
	//I2CWaitAck();	
	//I2CSendByte(A2);//month      
	//I2CWaitAck();	
	I2CSendByte(A1);//year      
	I2CWaitAck();	
	I2CStop();

	I2CStart();
	I2CSendByte(0x64);      
	I2CWaitAck();   
    I2CSendByte(0x12);//设置写起始地址      
	I2CWaitAck();		
    I2CSendByte(0x00);//清零数字调整寄存器      
	I2CWaitAck();        
	I2CStop();  
	
	WriteTimeOff();    
}

⌨️ 快捷键说明

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