fm24c16c语言程序,单片机读写24C01~24C16程序

单片机读写24C01~24C16程序,24C02 read / write process

关键字:单片机读写24C01~24C16程序

单片机读写24C01~24C16程序

AT89S52 晶振频率为11.0592MHz 指令周期:1.0852us

功能说明:24C01-16程序,能读写:24C01、24C02、24C04、24C08、24C16

读出的数据 送 P1 口显示

#include "reg52.h"

#include "intrins.h"

#define uchar unsigned char

#define uint unsigned int

sbit sda=P3^7;//;模拟I2C 数据传送位

sbit scl=P3^6;//;模拟I2C 时钟控制状态标志

void delay1(uint z)//延时为 1ms

{

uchar x,x1;

for(;z>0;z--)

{

for(x=0;x<114;x++)

{

for(x1=0;x1<1;x1++);

}

}

}

void delay()//5us延时

{

_nop_();

_nop_();

_nop_();

}

void star()//开始

{

sda=1;

delay();//5us延时

scl=1;

delay();//5us延时

sda=0;

delay();//5us延时

}

void stop()//停止

{

sda=0;

delay();//5us延时

scl=1;

delay();//5us延时

sda=1;

delay();//5us延时

}

void ack()//应答

{ uchar z=0;

while((sda==1)&&(z<50))z++;//条件判断, sda=1,则没有应答。如果没有应答则延时:z<50,z++;后返回

scl=0;

delay();//5us延时

}

///写一个数据函数

//器件写地址 slave_write_address

//字节地址 byte_address

//待写入数据 data_data

void write(uchar slave_write_address,uchar byte_address,uchar data_data)//写一个数据

{

uchar temp,temp1,i,ii;

star();//开始

for(ii=0;ii<3;ii++)//根据 24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,数据

{

if(ii==0)

{

temp=slave_write_address;//送 器件写地址

temp1=slave_write_address;

}

else if(ii==1)

{

temp=byte_address;//送 字节地址

temp1=byte_address;

}

else if(ii==2)

{

temp=data_data;//送 数据

temp1=data_data;

}

for(i=0;i<8;i++)

{

scl=0;

delay();//5us延时

temp=temp1;

temp=temp&0x80;// 相 与 后,把不相关的位清零

if(temp==0x80)//根据前面 相 与 后,判断 temp是否等于0x80,是则该位为 1

sda=1;

else

sda=0;

delay();//5us延时

scl=1;

delay();//5us延时

scl=0;

delay();//5us延时

temp1=temp1<<1;//向左移出1位

}

sda=1;

delay();//5us延时

scl=1;

delay();//5us延时

ack();

}

stop();//停止

}

///读一个数据函数

//器件写地址 slave_write_address

//器件读地址 slave_read_address

//字节地址 byte_address

//读出的数据 data_data

read(uchar slave_write_address,uchar byte_address,uchar slave_read_address)//读一个数据

{

uchar temp,temp1,i,ii,x,data_data;

star();//开始

for(ii=0;ii<3;ii++)//根据 24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,器件读地址

{

if(ii==0)

{

temp=slave_write_address;//送 器件写地址

temp1=slave_write_address;

}

else if(ii==1)

{

temp=byte_address;//送 字节地址

temp1=byte_address;

}

else if(ii==2)

{

star();//开始

temp=slave_read_address;//送 器件读地址

temp1=slave_read_address;

}

for(i=0;i<8;i++)//开始读数据

{

scl=0;

delay();//5us延时

temp=temp1;

temp=temp&0x80;// 相 与 后,把不相关的位清零

if(temp==0x80)//根据前面 相 与 后,判断 temp是否等于0x80,是则该位为 1

sda=1;

else

sda=0;

delay();//5us延时

scl=1;

delay();//5us延时

scl=0;

delay();//5us延时

temp1=temp1<<1;//向左移出1位

}

sda=1;

delay();//5us延时

scl=1;

delay();//5us延时

ack();//应答

}

for(x=0;x<8;x++)

{

data_data=data_data<<1;//向左移入1位

sda=1;

delay();//5us延时

scl=0;

delay();//5us延时

scl=1;

delay();//5us延时

if(sda==1)//判断 数据线是否是高电平

data_data|=0x01;//把读到的数据 或 0X01

//else

//data_data|=0x00;

}

ack();//应答

stop();//停止

return data_data;//返回读到的数据

}

void main()

{

write(0xa0,0xff,0x66);//向器件写一个数据:(0xa0 是器件写地址;0xff 是字节地址;0x66 是待写入的数据)

delay1(5);//写与读的时间间隔应大于5ms,取决于器件 24C02的响应速度

//向器件读一个数据

//把读出的数据送 P1口显示

P1=read(0xa0,0xff,0xa1);//向器件读一个数据:(0xa0 是器件写地址;0xff 是字节地址;0xa1 是器件读地址)

while(1);//跳转,相当于汇编指令 JUMP $

}

//0x66==亮 灭 灭 亮 亮 灭 灭 亮

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是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` 变量中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值