#include <reg51.h>
/* 全局符号定义 */
#define HIGH 1
#define LOW 0
#define FALSE 0
#define TRUE ~FALSE
#define function
#define end_if
#define end_for
#define byte unsigned char
sbit SCL = 0x96 ;
sbit SDA = 0x97 ;
/****************************************************************************
* 函数原型: 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操作的函数。
* =========================================================================*/
#define WRITE 0xA0 /* 定义24C04的器件地址SLA和方向位W */
#define READ 0xA1 /* 定义24C04的器件地址SLA和方向位R */
#define BLOCK_SIZE 32 /* 定义指定字节个数 */
extern xdata byte EAROMImage[BLOCK_SIZE];/* 在外部RAM中定义存储映象单元 */
/****************************************************************************
* 函数原型: bit function E_address(byte Address);
* 功 能: 向24C04写入器件地址和一个指定的字节地址。
*****************************************************************************/
bit function E_address( byte Address ) {
I_start() ;
if ( I_send( WRITE ) )
return ( I_send( Address ) ) ;
else
return ( FALSE ) ;
end_if
}
/****************************************************************************
* 函数原型: bit function E_read_block(void);
* 功 能: 从24C04中读取BLOCK_SIZE个字节的数据并转存于外部RAM存储映象
* 单元, 采用序列读操作方式从片内0地址开始连续读取数据。如果
* 24C04不接受指定的地址则返回0(FALSE)。
*****************************************************************************/
bit function E_read_block( void ) {
register byte i ;
/* 从地址0开始读取数据 */
if ( E_address( 0 ) ) {
/* 发送重复启动信号 */
I_start() ;
if ( I_send( READ ) ) {
for ( i=0 ; i<=BLOCK_SIZE ; i++ ) {
EAROMImage[i] = ( I_receive() ) ;
if ( i != BLOCK_SIZE )
I_Ack() ;
else {
I_clock() ;
I_stop() ;
end_if }
end_for }
return ( TRUE ) ;
}
else {
I_stop() ;
return ( FALSE ) ;
end_if }
}
else
I_stop() ;
return ( FALSE ) ;
end_if
}
/****************************************************************************
* 函数原型: void function wait_5ms(void);
* 功 能: 提供5ms延时(时钟频率为12MHz)。
****************************************************************************/
void function wait_5ms( void ) {
register int i ;
for ( i=0 ; i<1000 ; i++ )
;
end_for
}
/****************************************************************************
* 函数原型: bit function E_write_block(void);
* 功 能: 将外部RAM存储映象单元中的数据写入到24C04的头BLOCK_SIZE个字节。
* 采用字节写操作方式, 每次写入时都需要指定片内地址。如果24C04
* 不接受指定的地址或某个传送的字节未收到应答信号ACK, 则返回0
* (FALSE)。
*****************************************************************************/
bit function E_write_block( void ) {
register byte i ;
for ( i=0 ; i<=BLOCK_SIZE ; i++ ) {
if ( E_address(i) && I_send( EAROMImage[i] ) ) {
I_stop() ;
wait_5ms();
}
else
return ( FALSE ) ;
end_if
end_for }
return ( TRUE ) ;
}
I2C.rar_24c04
版权申诉
107 浏览量
2022-09-20
14:10:48
上传
评论
收藏 2KB RAR 举报
邓凌佳
- 粉丝: 65
- 资源: 1万+
最新资源
- 冯璐阳 42105650—祝福.docx
- 基于多种算法及改进算法实现的移动机器人路径规划matlab源码(含A星算法+PRM+RRT的改进等).zip
- 布里斯托尔纸细分市场、总体规模、先进性、市占率行业分析报告2024年.docx
- Obi绳子插件,好用的很 6.5.4版本
- openjfx-22.0.1-windows-x64-bin-sdk.zip
- 基于ros和stm32f1的小车代码(含串口通信)+项目说明.zip
- 人体姿态估计-基于Tensorflow实现的人体姿态估计算法-附项目源码-优质项目分享.zip
- java实现所有算法大全
- JDBC DAO模式 (复习)
- Proteus仿真AT89C51电子密码锁
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈