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

📄 iic.c

📁 DS1307实时时钟器件的驱动
💻 C
字号:
#include "include.H"

//I2C基本操作函数由8个函数组成,程序清单如下:
/*******************************************************************************
*	函数原型:void function_delay(void);
*	功    能:本函数实际上只有一条返回指令,在具体应用中可视具体要求增加延时指令.
*******************************************************************************/
void function_delay(void)
{
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
//	;
}

/*******************************************************************************
*	函数原型:void function_I2C_start(void);
*	功    能:提供I2C总线工作时序中的起始位.
*******************************************************************************/
void function_I2C_start(void)
{
	SDA=1;
	function_delay();
	function_delay();
	function_delay();
	SCL=1;
	function_delay();
	function_delay();
	function_delay();
	SDA=0;
	function_delay();
	SCL=0;
	function_delay();
}

/*******************************************************************************
*	函数原型:void function_I2C_stop(void);
*	功    能:提供I2C总线工作时序中的停止位.
*******************************************************************************/
void function_I2C_stop(void)
{
	SDA=0;
	function_delay();
	SCL=1;
	function_delay();
	SDA=1;
	function_delay();
//	SCL=0;
//	function_delay();
//	SCL=1;
}

/*******************************************************************************
*	函数原型:void function_I2C_init(void);
*	功    能:I2C总线初始化.在main()函数中应首先调用本函数,然后再调用其他函数.
*******************************************************************************/
void function_I2C_init(void)
{
	SCL=0;
	function_I2C_stop();
}

/*******************************************************************************
*	函数原型:bit function_I2C_clock(void);
*	功    能:提供I2C总线的时钟信号,并返回在时钟电平为高期间SDA信号线上状态.
*			 本函数可以用于数据发送,也可用于数据接收.
*******************************************************************************/
bit function_I2C_clock(void)
{
	bit sample;
	SCL=1;
	sample=SDA;
	function_delay();
 	SCL=0;
//	function_delay();
	return(sample);
}

/*******************************************************************************
*	函数原型:bit function_I2C_send(unsigned char I2C_data);
*	功    能:向I2C总线发送8位数据,并请求一个应答信号ACK.如果收到ACK应答,则返回
*			 1(TURE),否则返回0(FALSE).
*******************************************************************************/
bit function_I2C_send(unsigned char I2C_data)
{
	register unsigned char i;
	/* 发送8位数据 */
	for(i=0;i<8;i++)
	{
		SDA=(bit)(I2C_data&0x80);
		I2C_data<<=1;
		function_I2C_clock();
	}
	function_delay();
	/* 请求应答信号ACK */
	SDA=1;
	return(~function_I2C_clock());
}

/*******************************************************************************
*	函数原型:unsigned char function_I2C_receive(void);
*	功    能:从I2C总线接收8位数据信号,并将接收到的8位数据作为一个字节返回,不回
*			 送应答信号ACK.主函数在调用本函数之前应保证SDA信号线处于浮置状态,即
*			 使8051的引脚置1.
*******************************************************************************/
unsigned char function_I2C_receive(void)
{
	unsigned char I2C_data;
	register unsigned char i;
	for(i=0;i<8;i++)
	{
		I2C_data<<=1;
		if(function_I2C_clock())
			I2C_data|=0x01;
	}
	return(I2C_data);
}

/*******************************************************************************
*	函数原型:void function_I2C_Ack(void);
*	功    能:向I2C总线发送一个应答信号ACK,一般用于连续数据读取时.
*******************************************************************************/
void function_I2C_Ack(void)
{
	SDA=0;
	SCL=1;
	function_delay();
	SCL=0;
	function_delay();
	SDA=1;
}

⌨️ 快捷键说明

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