写一段FM24C02基于51单片机的读写程序
时间: 2024-05-10 11:16:40 浏览: 7
以下是FM24C02基于51单片机的读写程序:
```c
#include <reg51.h>
#define I2C_SCL P1_0
#define I2C_SDA P1_1
// I2C延时函数
void i2c_delay() {
// 延时时间可以根据实际情况调整
int i = 10;
while (i--);
}
// I2C起始信号
void i2c_start() {
I2C_SDA = 1;
i2c_delay();
I2C_SCL = 1;
i2c_delay();
I2C_SDA = 0;
i2c_delay();
I2C_SCL = 0;
i2c_delay();
}
// I2C停止信号
void i2c_stop() {
I2C_SDA = 0;
i2c_delay();
I2C_SCL = 1;
i2c_delay();
I2C_SDA = 1;
i2c_delay();
}
// I2C发送一个字节
void i2c_send_byte(unsigned char byte) {
unsigned char i;
for (i = 0; i < 8; i++) {
if (byte & 0x80) {
I2C_SDA = 1;
} else {
I2C_SDA = 0;
}
byte <<= 1;
i2c_delay();
I2C_SCL = 1;
i2c_delay();
I2C_SCL = 0;
i2c_delay();
}
}
// I2C接收一个字节
unsigned char i2c_receive_byte() {
unsigned char i, byte = 0;
I2C_SDA = 1;
for (i = 0; i < 8; i++) {
byte <<= 1;
i2c_delay();
I2C_SCL = 1;
i2c_delay();
if (I2C_SDA) {
byte |= 0x01;
}
I2C_SCL = 0;
}
return byte;
}
// FM24C02写入一个字节
void fm24c02_write(unsigned char addr, unsigned char data) {
i2c_start();
i2c_send_byte(0xa0); // 发送器件地址
i2c_send_byte(addr); // 发送数据地址
i2c_send_byte(data); // 发送数据
i2c_stop();
}
// FM24C02读取一个字节
unsigned char fm24c02_read(unsigned char addr) {
unsigned char data;
i2c_start();
i2c_send_byte(0xa0); // 发送器件地址
i2c_send_byte(addr); // 发送数据地址
i2c_start();
i2c_send_byte(0xa1); // 发送读取命令
data = i2c_receive_byte(); // 读取数据
i2c_stop();
return data;
}
int main() {
unsigned char data;
// 写入数据
fm24c02_write(0x00, 0x11);
fm24c02_write(0x01, 0x22);
fm24c02_write(0x02, 0x33);
// 读取数据
data = fm24c02_read(0x00);
data = fm24c02_read(0x01);
data = fm24c02_read(0x02);
while (1);
return 0;
}
```
此程序中,通过定义相关的宏和函数来实现I2C通信,然后通过调用写入函数 `fm24c02_write()` 和读取函数 `fm24c02_read()` 来实现对FM24C02的读写操作。在主函数中,先写入一些数据,然后进行读取操作,并将读取的数据保存到 `data` 变量中。