51单片机eeprom读写程序
时间: 2023-08-13 09:07:45 浏览: 85
以下是51单片机EEPROM读写程序的基本框架:
```c
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA=P2^0; //定义SDA引脚
sbit SCL=P2^1; //定义SCL引脚
void delay_5us() //延时函数
{
_nop_();
}
void start() //I2C起始信号
{
SDA=1;
SCL=1;
delay_5us();
SDA=0;
delay_5us();
SCL=0;
delay_5us();
}
void stop() //I2C停止信号
{
SDA=0;
SCL=1;
delay_5us();
SDA=1;
delay_5us();
}
void ack() //I2C应答信号
{
SDA=0;
SCL=1;
delay_5us();
SCL=0;
delay_5us();
}
void no_ack() //I2C非应答信号
{
SDA=1;
SCL=1;
delay_5us();
SCL=0;
delay_5us();
}
uchar read_byte() //I2C读取一个字节
{
uchar i,data;
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
delay_5us();
data<<=1;
data|=SDA;
SCL=0;
delay_5us();
}
return data;
}
void write_byte(uchar data) //I2C写入一个字节
{
uchar i;
for(i=0;i<8;i++)
{
SDA=data&0x80;
SCL=1;
delay_5us();
SCL=0;
delay_5us();
data<<=1;
}
}
void write_eeprom(uchar addr,uchar data) //写入EEPROM
{
start(); //起始信号
write_byte(0xa0); //写入器件地址,0xa0代表写入模式
ack(); //等待应答
write_byte(addr); //写入存储地址
ack(); //等待应答
write_byte(data); //写入数据
ack(); //等待应答
stop(); //停止信号
}
uchar read_eeprom(uchar addr) //读取EEPROM
{
uchar data;
start(); //起始信号
write_byte(0xa0); //写入器件地址,0xa0代表写入模式
ack(); //等待应答
write_byte(addr); //写入存储地址
ack(); //等待应答
start(); //起始信号
write_byte(0xa1); //写入器件地址,0xa1代表读取模式
ack(); //等待应答
data=read_byte(); //读取数据
no_ack(); //发送非应答信号
stop(); //停止信号
return data;
}
void main()
{
uchar addr=0x01; //定义存储地址
uchar data=0x55; //定义写入数据
uchar read_data; //定义读取数据
write_eeprom(addr,data); //写入EEPROM
read_data=read_eeprom(addr); //读取EEPROM
while(1);
}
```
以上程序通过I2C总线实现了对51单片机的EEPROM进行读写操作。程序中的read_eeprom和write_eeprom函数分别对EEPROM进行读取和写入操作,其中的0xa0和0xa1是器件地址,表示写入和读取模式,具体的地址需要根据实际情况进行修改。
阅读全文