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

📄 i2c.c

📁 2051数字频率计源码,运行在AT892051上
💻 C
字号:


//#pragma src

#include "paramac.h"

/* 全局符号定义 */
#define HIGH 1
#define LOW 0
#define FALSE 0
#define TRUE 1
#define function
#define end_if
#define end_for
#define byte unsigned char


/****************************************************************************
*    函数原型: void function delay(void);
*    功    能: 本函数实际上只有一条返回指令, 在具体应用中可视具体要求增加延时 
*              指令。
****************************************************************************/
void function delay( void ) {
	;
 }

/****************************************************************************
*    函数原型: void function I_start(void);
*    功    能: 提供I2C总线工作时序中的起始位。                              
****************************************************************************/
void function I_start( void ) {
	SCL = HIGH ;
	delay() ;
	SDA = LOW ;
	delay() ;
	SCL = LOW ;
	delay() ;
 }

/****************************************************************************
*    函数原型: void function I_stop(void);
*    功    能: 提供I2C总线工作时序中的停止位。
****************************************************************************/
void function I_stop( void ) {
	SDA = LOW ;
	delay() ;
	SCL = HIGH ;
	delay() ;
	SDA = HIGH ;
	delay() ;
	SCL = LOW ;
	delay() ;
 }

/****************************************************************************
*    函数原型: void function I_init(void);
*    功    能: I2C总线初始化。在main()函数中应首先调用本函数, 然后再调用
*              其它函数。 
****************************************************************************/
void function I_init( void ) {
	SCL = LOW ;
	I_stop() ;
}

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

/****************************************************************************
*    函数原型: bit function I_send(byte I_data);
*    功    能: 向I2C总线发送8位数据, 并请求一个应答信号ACK。如果收到ACK应答
*              则返回1(TRUE), 否则返回0(FALSE)。 
****************************************************************************/
bit function I_send( byte I_data ) {
	register byte i ;
	/* 发送8位数据 */
	for ( i=0 ; i<8 ; i++ ) {
		SDA = (bit)( I_data & 0x80 ) ;
		I_data = I_data << 1 ;
		I_clock() ;
	end_for}
	/* 请求应答信号ACK */
	SDA = HIGH ;
	return ( ~I_clock() ) ;
  }

/****************************************************************************
*    函数原型: byte function I_receive(void);
*    功    能: 从I2C总线上接收8位数据信号, 并将接收到8位数据作为一个字节
*              返回, 不回送应答信号ACK。主函数在调用本函数之前应保证SDA信
*              号线处于浮置状态, 即使8051的P1.7脚置1。 
****************************************************************************/
byte function I_receive( void ) {
	byte I_data = 0 ;
	register byte i ;
	for ( i=0 ; i<8 ; i++ ) {
		I_data *= 2 ;
		if ( I_clock() )
			I_data++ ;
		end_if
	end_for }
	return ( I_data ) ;
}

/****************************************************************************
*    函数原型: void function I_Ack(void);
*    功    能: 向I2C总线发送一个应答信号ACK, 一般用于连续数据读取时。
*****************************************************************************/
//void function I_Ack( void ) {
//	SDA = LOW ;
//	I_clock() ;
//	SDA = HIGH ;
//}


/* =========================================================================
* 
*     上面给出的是I2C总线基本操作函数, 下面给出的是几个对I2C总线接口器件
*      24C04操作的函数。
* =========================================================================*/

⌨️ 快捷键说明

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