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

📄 iic_io.c

📁 FM31256实时时钟代码 FM31256为铁电公司带FLASH的时钟芯片
💻 C
字号:
#include <c8051f040.h>
#include "intrins.h"

 /**********************另外相关的定义*********************************/
 #define HIGH               1
 #define LOW                0   
 #define TURE               1
 #define  FALSE             0
 #define  uchar unsigned char
 #define  uint  unsigned int
 
 void delay_ms(uint n);

 /*********************结束***********************************************/
/***************************DS1307开始*****************************************************************/
#define    Wait1us        _nop_();
#define    Wait2us        {_nop_();_nop_();}
#define    Wait4us        {Wait2us;Wait2us;}
#define    Wait8us        {Wait4us;Wait4us;}
#define    Wait10us    {Wait8us;Wait2us;}
#define    WRITEDS1307    0xD0
#define    READDS1307    0xD1  

sbit SDA=P0^2;      //DS1307 Serial-Data Input    pin 5 
sbit SCL=P0^3;     //DS1307 Serial-Clock Input    pin 6
/************************************************************/
void I2C_start(void);//I2C start function
void I2C_stop(void);//I2C stop function
//void I2C_send_ack(void);//I2C send responsion function 
void I2C_send_noack(void);
void I2C_write_byte(unsigned char IIC_data);//I2C bus write byte function 
unsigned char I2C_read_byte(void);//I2C bus read byte function
/***********************************************************************/
void Write1307(unsigned char add,unsigned char dat);//write information to ds1307
unsigned char Read1307(unsigned char add);//read information from ds1307
void Read_RTC(void);//read RTC 
void Set_RTC(void);//set RTC 
void OSCILLATOR_Init (void);
void PORT_Init (void);
/***********************************************************************/
code unsigned char set_rtc_code[7]={0x00,0x34,0x16,0x1,0x03,0x11,0x08};
code unsigned char rtc_address[7]={0x02,0x03,0x04,0x05,0x06,0x07,0x08};//DS1307
code unsigned char *day[7]={"Mon","Tue","Wen","Thu","Fri","Sat","Sun"};
unsigned char read_rtc_code[7];
/***********************************************************************/
void Initial(void);//system initize function
/***********************************************************************/
/***********************************************************************/
void main(void)
{

	WDTCN = 0xde;                       /*关看门狗*/
   	WDTCN = 0xad;
	OSCILLATOR_Init ();                     
	
	PORT_Init ();                            // Initialize crossbar and GPIO
    Set_RTC();

	while(1)
	{  	
		Write1307(0x00,0x01);
		Read_RTC();
		Write1307(0x00,0x00);
	} 
}



void OSCILLATOR_Init (void)
{
    int i = 0;
    SFRPAGE   = CONFIG_PAGE;
    OSCXCN    = 0x77;
    for (i = 0; i < 256; i++);  // Wait 1ms for initialization
    while ((OSCXCN & 0x80) == 0);
    CLKSEL    = 0x01;                                     
}

void PORT_Init (void)
{
	SFRPAGE = CONFIG_PAGE;                 // Switch to configuration page
	XBR2    = 0x40;                     // Enable crossbar and weak pull-ups
	P0MDOUT |= 0xff;                    // enable P0 (LED) as push-pull output
	P1MDOUT |= 0xff;                    // enable P1 (LED) as push-pull output
	P4MDOUT |= 0xff;                    // enable P5 (LED) as push-pull output
	P5MDOUT |= 0xff;                    // enable P5 (LED) as push-pull output
	P6MDOUT |= 0xff;                    // enable P5 (LED) as push-pull output
	P7MDOUT |= 0xff;                    // enable P5 (LED) as push-pull output

	P4 = 0;
	P5 = 0;
	P6 = 0;
	P7 = 0;
}


/***********************************************************************/
void I2C_start(void)
{
	SDA=1;
	SCL=1;
	Wait8us;
	SDA=0;
	Wait8us;
	SCL=0;
  
}
/***********************************************************************/
void I2C_stop(void)
{
	SDA=0;
	SCL=1;
	Wait8us;
	SDA=1;
	Wait4us;
	SCL=0;
}
/***********************************************************************/
void I2C_send_ack(void)
{
	SDA=0;
	Wait2us;
	SCL=1;
	Wait4us;
	SCL=0;
	Wait2us;
}
/*************************************************************************/
void I2C_send_noack(void)
{
	SDA=1;
	Wait2us;
	SCL=1;
	Wait4us;
	SCL=0;
	Wait2us;
}

unsigned char IICCheckAcknowledge()    /*IIC总线检测从机应答位*/
{
	unsigned char IICAckFlag;
	
	SDA=1;        /*SDA=1; 线与吗?应为SDA=0?*/
	Wait2us;     
	SCL=1;
	Wait2us;
	IICAckFlag=0;
	
	if(SDA==0)     /*应答正常*/
	{
		Wait2us;
		SCL=0;
		return(IICAckFlag);
	}
	else 
	{
		IICAckFlag=1;      /*应答不正常*/
		Wait2us;
		SCL=0;
		return(IICAckFlag);
	} 
}
/***********************************************************************/
void I2C_write_byte(unsigned char IIC_data)
{
     unsigned char i;
     for(i=0;i<8;i++)
	 {
		SCL=0;
		if((IIC_data<<i) & 0x80)
		SDA=1;                   //判断发送位
		else SDA=0;
		Wait2us;
		SCL=1;
		Wait4us;
		SCL=0;
	}
    Wait4us;
    SDA=1; //发送完8bit,释放总线准备接收应答位
    Wait2us;
    SCL=1;
    Wait4us; //sda上数据即是从应答位
    SCL=0; //不考虑从应答位|但要控制好时序
 }
/***********************************************************************/
unsigned char I2C_read_byte(void)
{
	unsigned char i,dat;
	dat=0;
	SDA=1;
	for (i=0;i<8;i++)
	{
		dat=dat<<1;
		SCL=1;
		Wait2us;
		if(SDA==1)
		{
			dat++;
		}
		SCL=0;  
	}  
	return (dat); 
}
/***********************************************************************/
/******************************** DS1307 PART START  ****************/
void Write1307(unsigned char add,unsigned char dat)
{
	I2C_start();
	I2C_write_byte(WRITEDS1307);
	I2C_write_byte(add);
	I2C_write_byte(dat);
	I2C_stop();
}
  
/***********************************************************************/
unsigned char Read1307(unsigned char add)
{
	unsigned char dat;
	I2C_start();
	I2C_write_byte(WRITEDS1307);
	I2C_write_byte(add);
	I2C_start();
	I2C_write_byte(READDS1307);
	dat=I2C_read_byte(); 
	I2C_send_noack();
	I2C_stop();        
	return (dat);
}
/****************************读DS1307的寄存器*******************************************/
void Read_RTC(void)
{
	unsigned char i,*p;
	p=rtc_address;
	for(i=0;i<7;i++)
	{
		read_rtc_code[i]=Read1307(*p);
		p++;
	}
}
/***************************DS1307的初始化********************************************/
void Set_RTC(void)
{
	unsigned char i,*p;

	p=rtc_address;
	Write1307(0x00,0x02);
	for(i=0;i<7;i++)
	{
		Write1307(*p,set_rtc_code[i]);
		p++;  
	}
	Write1307(0x00,0x00);
	Write1307(0x01,0x00);

}  

⌨️ 快捷键说明

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