EEPROM存储器 AT24C02的C语言程序设计

合集下载

I2C总线芯片AT24C02程序设计

I2C总线芯片AT24C02程序设计

I2C总线芯片AT24C02程序设计I2C总线芯片AT24C02是一种常用的存储器芯片,在嵌入式系统中广泛应用。

本文将介绍如何使用AT24C02进行程序设计,包括芯片初始化、读取数据和写入数据等操作。

为了简化整个流程,本文将只介绍关键的代码部分。

首先,我们需要了解AT24C02芯片的连接方式和寄存器地址。

AT24C02通过I2C总线连接到控制器,其中使用两根信号线SCL和SDA进行通信。

芯片的I2C地址为0xA0,并且有256个存储器单元,每个单元8位,总共可以存储2KB的数据。

接下来,我们需要进行芯片的初始化。

初始化过程包括初始化I2C总线、设置AT24C02的I2C地址和其他必要的配置。

以下是AT24C02初始化的代码示例:```c#include <Wire.h>#define AT24C02_ADDRESS 0xA0 // AT24C02芯片的I2C地址void setupWire.begin(; // 初始化I2C总线void loop//主程序代码```在进行读取数据之前,我们需要指定要读取的存储器单元的地址,并将其发送给AT24C02芯片。

以下是读取数据的代码示例:```c#include <Wire.h>#define AT24C02_ADDRESS 0xA0 // AT24C02芯片的I2C地址#define MEMORY_ADDRESS 0x00 // 要读取的存储器单元的地址void setupWire.begin(; // 初始化I2C总线Wire.beginTransmission(AT24C02_ADDRESS); // 开始I2C通信Wire.write(MEMORY_ADDRESS); // 发送存储器单元的地址Wire.endTransmission(; // 结束I2C通信void loop//主程序代码```在进行写入数据之前,我们需要指定要写入的存储器单元的地址,并将数据发送给AT24C02芯片。

24C02 EEPROM存储器的C语言操作

24C02 EEPROM存储器的C语言操作

#include 〈reg51.h〉#ifndef false#define false 0#endif#ifndef true#define true 1#endif#define WriteDeviceAddress 0xa0#define ReadDviceAddress 0xa1sbit SDA = P3 ^ 5;//根据实际连接的管脚定义sbit SCL = P3 ^ 4;sbit led = P1^0;sbit led2 = P1^1;unsigned char code Num[21]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x89};unsigned char code Disdigit[4]= {0x7F,0xBF,0xDF,0xEF};unsigned char Disbuf[4];unsigned char code write_data[5] = {5,2,5,1,8 };unsigned char read_data[5];//————-—-—-——-——--————--—-————-—--————----——-——-—--———---—-——-————---———-——-void Delayus(unsigned int number){for(;number!=0;number—-){}}//——————-——-—--————-——-—-——-——-——————-——————-—--—--—---—--————--—-—-—-—————-void DelayMs(unsigned int number){unsigned char temp;for(;number!=0;number——){for(temp=112;temp!=0;temp—-){}}}//—--——-———-—-————-——-———————--—-—-—--——-————-—-—-————————--——-—-—-———--———-void Start(){SDA=1;Delayus(4);SCL=1;Delayus(4);SDA=0;Delayus(4);SCL=0;Delayus(4);}//-———-—-——-———---——-—-——--——-—--——-—-————-———-———-———-————-———-—-———--————-void Stop(){SCL=0;Delayus(4);SDA=0;Delayus(4);SCL=1;Delayus(4);SDA=1;Delayus(4);}//————-—-——-————--————-———--—-———--—--——--—-———-—-—--—-———---————-—---—-————void Ack(){SDA=0;Delayus(4);SCL=1;Delayus(4);SCL=0;Delayus(4);Delayus(4);}//-—--—---—------————————-—-—-—-—-—--——--————---————-—-—-—-———--———--——--———void NoAck(){SDA=1;Delayus(4);SCL=1;Delayus(4);SCL=0;Delayus(4);SDA=0; //}//—-—-—--—---——————-————-——--———--—--—---—————-———-——--——————--—------——-—--bit TestAck(){bit ErrorBit;SDA=1;Delayus(4);SCL=1;Delayus(4);ErrorBit=SDA;Delayus(4);SCL=0;return(ErrorBit);}//—-—-——————————-————--—-——-——————-————-——-————————-—-———-———-———------—---—void Write8Bit(unsigned char input){unsigned char temp;for(temp=8;temp!=0;temp—-){SDA=(bit)(input&0x80);Delayus(4);Delayus(4);SCL=0;Delayus(4);input=input〈〈1;}}//-—-———————---—---—-------——--------—--—————————-———————-———-———-—-——-——-——unsigned char Read8Bit(){unsigned char temp,rbyte=0;for(temp=8;temp!=0;temp-—){SCL=1;Delayus(4);rbyte=rbyte<〈1;rbyte=rbyte|((unsigned char)(SDA));SCL=0;}return(rbyte);}void Write24c02(unsigned char *Wdata,unsigned char RomAddress,unsigned char number){Start();Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(RomAddress);TestAck();for(;number!=0;number--){Write8Bit(*Wdata);TestAck();Wdata++;}Stop();DelayMs(10);}void Read24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes){Start();Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(RomAddress);TestAck();Start();Write8Bit(ReadDviceAddress);TestAck();while(bytes!=1){*RamAddress=Read8Bit();Ack();RamAddress++;bytes—-;}*RamAddress=Read8Bit();NoAck();Stop();}void Display(void)//显示{unsigned int i = 0;unsigned int temp,count;temp = Disdigit[count];P2 =temp;temp = Disbuf[count];temp = Num[temp];P0 =temp;count++;if (count==4)count=0;}void time1() interrupt 3 using 2{Display();TH1 = (65535 — 2000)/256;TL1 = (65535 — 2000)%256;}void main(){TMOD = 0x15;TR1 = 1;EA = 1;ET1 = 1;Write24c02(write_data,0x00,3); DelayMs(200);Read24c02(read_data,0x00,4); while(1){Disbuf[0]= read_data[0]; Disbuf[1] = read_data[1];Disbuf[2] = read_data[2];Disbuf[3]= read_data[3];}}。

汇编AT24C02一个字节程序段之欧阳语创编

汇编AT24C02一个字节程序段之欧阳语创编
MOVC A,@A+DPTR
MOV P0,A
CLR P1.0
CALL DELAY ;显示延时
SETB P1.0
ANL 32H,#0FH
MOV A,32H
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV P0,A
CLR P1.1
CALL DELAY ;显示延时
RET
TAB1: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H
;界说引脚
时间:2021.03.01
创作:欧阳语
SDA BIT P3.3
SCL BIT P3.2
ORG 0000H
MAIN: MOV 30H,#25H ;存想存的数字
MOV 31H,#34H
MOV R1,30H
LL: MOV B,R1
CALL W24C02 ;写入24c02
CALL R24C02 ;读出24c02
NOP
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
NACK: SETB SDA ;非应答法度段
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
NOP
RET
END
时间:2021.03.01
创作:欧阳语
CALL DISPLAY ;显示数字
INC R1
JMP LL
;**************************** 显示 *************************************************

C51编写的AT24C02详细的读写程序

C51编写的AT24C02详细的读写程序

C51_AT24C02读写程序:/*void start() //开始信号void stop() //停止信号void Ack() //发确认信号void NoAck() //发无确认信号void init()//初始化信号,拉高SDA和SCL两条总线bit write_byte(uchar date)//写一字节,将date 写入AT24C02 中uchar read_byte()//读一字节,从AT24C02 中读一字节bit busy() //应答查询,stop()后,启动A T24C02内部写周期,启动查询//初始化EEPROM子程序内容为0XFF,nPage(0~31)void Init_Flash(uchar nPage) //8 bytes/1 page init 0xFFvoid write_add(uchar address,uchar date)//向AT24C02 中写数据//从AT24C02中给定的地址nAddr起,将存放在以指针nContent开头的存储空间中的nLen 个字节数据,连续写入AT24C02void write_flash(uchar *nContent,uchar nAddr, uchar nLen)uchar read_add(uchar address)//从AT24C02 中读出数据//从AT24C02中给定的地址nAddr起,读取nLen个字节数据存放在以指针nContent开头的存储空间。

void read_flash(uchar *nContent,uchar nAddr, uchar nLen)*//*单片机P2口接74HC138(三八译码器)P2.3--74HC138:/EI、P2.2--74HC138:A2、P2.1--74HC138:A1、P2.0--74HC138:A0译码器输出Y0,Y1、Y2、Y3、Y4、Y5、Y6、Y7均低电平有效,分别选通1~8个数码管。

AT24C02EEPROM读写程序

AT24C02EEPROM读写程序

;--------------------------------------------------------------------------------------------------------------------- ;本程序是针对AT89S52单片机编制的EEPROM读写程序(2013.8.4测试通过);本程序在4MHZ、12MHZ和24MHZ分别测试通过;AT24C02的A0、A1、A2均接GND,设备地址高7位为(1010)000;WP接GND,充许对EEPROM正常读写;本程序仅作学习交流之用。

;--------------------------------------------------------------------------------------------------------------------- SCl equ P2.0 ;SCL接A T89S52的P2.0端口,作为EEPROM的串行输入时钟SDA equ P2.1 ;SDA接AT89S52的P2.1端口,作为主机与EEPROM之间信息串行传输总线WRITEDATA equ 08H;拟写入EEPROM的数据在主机中的存贮单元地址READDATA equ 09H ;从EEPROM读取的数据存放到主机存贮单元地址EPROMADDRESS equ 0AH;拟随机读写EEPROM的存贮单元地址;------------------------------------------------ORG 00HLJMP MAIN;------------------------------------------------ORG 50HMAIN: MOV SP,#20H;防止堆栈影响已用内存数据;以下为写EEPROM过程mov EPROMADDRESS,#09H;该地址可以随意输入(00H~FFH),但读和写的地址须相同MOV WRITEDA TA,#01010010B;该数字可以随意输入,并将读和写的数据进行比较;如读数正确则按将读出数据在P1口输出,可在P1口各位分别接LED灯直观显示出来。

I2C总线编程实例(k1-k4:写入、读取、加+、清零)【EEPROM-AT24C02】

I2C总线编程实例(k1-k4:写入、读取、加+、清零)【EEPROM-AT24C02】

I2C总线编程实例(k1-k4:写⼊、读取、加+、清零)【EEPROM-AT24C02】(1)AT24C02是⼀种EEPROM元器件,是⼀种只读寄存器,断电保持,可保存数据100年, 是⼀种可擦除读写的芯⽚,相当于ROM硬盘,在下⾯实验中充当从机⾓⾊;(2)51在下⾯实验中充当主机⾓⾊;(3)在IIC总线标准协议上,进⾏51单⽚机(主机)和AT24C02(从机)的相互读写数据的操作。

⼩结:51单⽚机和各种EEPROM芯⽚之间可以通过IIC总线标准协议进⾏数据交互(通信)的。

实验:四个独⽴按键对应四个不同的功能,k1:将数据写⼊单⽚机,断电保存k2:读取上次保存的数据,断电后仍可读取上次保存的数据k3:当前数据+1k4:当前数据清零------------------------------------------------------------- 采⽤多⽂件的框架模式 -------------------------------------------------------------i2c.h:/*这个⽂件进⾏宏定义:定义I2C串⾏总线的相关数据端⼝、⽅法函数,以及定义⼀些使⽤频率较⾼的元素*/#ifndef _I2C_H_ // 如果没有定义宏#define _I2C_H_ // 定义⼀个宏// 需要⽤到51单⽚机的管脚,所以需要引⼊库⽂件#include <reg52.h>// 查单⽚机原理图可知(其中,SCL是时钟线,SDA是数据线)sbit SCL=P2^1;sbit SDA=P2^0;/* 相关函数 */// I2C的起始信号函数void I2cStart();// I2C的终⽌信号函数void I2cStop();// I2C发送(写⼊)字节函数,成功返回1,失败返回0unsigned char I2cSendByte(unsigned char dat);// I2C接收(读取)字节函数,返回读取的数据unsigned char I2cReadByte();// AT24C02芯⽚的写⼊数据函数void At24c02Write(unsigned char addr, unsigned dat);// AT24C02芯⽚的读取数据函数,返回读取的数据unsigned char At24c02Read(unsigned char addr);#endif // 结束i2c.c:/* 这个⽂件专门针对I2C模块的编程,其他模块可以新建另外⼀个⽂件 */#include <i2c.h> // 引⼊I2C的库⽂件/******************************************************************************** 函数名 : Delay10us()* 函数功能 : 延时10us* 输⼊ : ⽆* 输出 : ⽆*******************************************************************************/void Delay10us() //误差 0usunsigned char a,b;for(b=1;b>0;b--)for(a=2;a>0;a--);}/******************************************************************************** 函数名 : I2cStart()* 函数功能 : 起始信号:在SCL时钟信号在⾼电平期间SDA信号产⽣⼀个下降沿* 输⼊ : ⽆* 输出 : ⽆* 备注 : 起始之后SDA和SCL都为0,表⽰总线被主机占⽤*******************************************************************************/void I2cStart(){// 根据各个单⽚机的时序图来写SDA=1;Delay10us();SCL=1;Delay10us(); // 建⽴时间是SDA保持时间>4.7usSDA=0;Delay10us(); // 保持时间是>4usSCL=0;Delay10us();}/******************************************************************************** 函数名 : I2cStop()* 函数功能 : 终⽌信号:在SCL时钟信号⾼电平期间SDA信号产⽣⼀个上升沿* 输⼊ : ⽆* 输出 : ⽆* 备注 : 结束之后保持SDA和SCL都为1;表⽰总线处于空闲状态*******************************************************************************/void I2cStop(){// 根据各个单⽚机的时序图来写SDA=0;Delay10us();SCL=1;Delay10us(); // 建⽴时间是SDA保持时间>4.7usSDA=1;Delay10us(); // 保持时间是>4us}/******************************************************************************** 函数名 : I2cSendByte(unsigned char dat)* 函数功能 : 通过I2C发送⼀个字节。

24C02读写C语言程序

24C02读写C语言程序-下面是本人编写的源程
2010-09-01 10:08
>下面是本人编写的源程序,已经调试成功,下载就可以使用,程序编写的不是很规范
,希望各位读者批评指正!!!
>/***********************************************************
> for(i=0;i<n;i++)//写入8字节数据
> {
> SendData(s);
> Test_Ack();
> if(flag==0) return(0);
> }
> I2C_Stop();
> return(1);
>}
>/*************************************************************
> SCL=0;
> delay();
> SDA=0;
> delay();
>}
>/********************************************************
>**名称:Test_Ack()
>**功能:检测应答位
>*********************************************************/
>void Ack()
>{
> SDA=0;
> delay();
> SCL=1;
> delay();

AT240C02中EEPROM保存数据

I2C 总线控制 ***********************/ void delay() {;;} void delay_1ms(uint z) { uint x,y; for(x=z;x>0;x--) { for(y=0;y<=110;y++) { } } } void i2cinit() { sda=1;
write_byte(AT024C02); respons(); write_byte(address); respons();
start(); write_byte(AT024C02+1); respons(); date=read_byte(பைடு நூலகம்; stop(); return date; } /***********************
delay(); } scl=0; delay(); sda=1; delay(); } uchar read_byte() { uchar i,k; scl=0; delay(); sda=1; delay(); for(i=0;i<8;i++) { scl=1; delay(); k=(k<<1)|sda; delay(); scl=0; delay(); } scl=0; delay(); sda=1; delay(); return k; } void write_address(uchar address,uchar date) { start(); write_byte(AT024C02); respons(); write_byte(address); respons(); write_byte(date); respons(); stop(); } uchar read_address(uchar address) { uchar date; start();

单片机程序设计实践教程_第17章_EEPROM器件AT24C02读写

单片机程序设计实践教程_第17章_EEPROM器件AT24C02
读写
本章主要介绍了如何使用单片机与EEPROM器件AT24C02进行读写操作。

EEPROM是一种非易失性存储器,可以在电源关闭后保持数据的存储,适用于存储一些关键的配置信息或数据。

首先,需要连接单片机与AT24C02,常见的连接方式有两根数据线(SDA和SCL),两根线分别连接到单片机的I2C总线接口上。

在进行读写操作之前,需要进行初始化,设置相关的参数,如器件地址、时钟频率等。

然后,可以使用相应的读写函数对AT24C02进行读写操作。

对于读操作,需要指定读取的地址和数据长度。

可以使用一个循环来
连续读取多个数据,也可以单独读取一些地址上的数据。

读取的数据保存
在单片机的缓存中,可以根据需要进行处理或显示。

对于写操作,同样需要指定写入的地址和数据。

可以通过循环连续写
入多个数据,也可以单独写入一些地址上的数据。

写入操作完成后,要记
得进行等待,等待数据写入完成。

需要注意的是,AT24C02有一定的写入周期,写入速度较慢。

因此,
在进行连续写入操作时,需要考虑到写入速度,避免写入过快导致数据丢
失或写入错误。

本章还介绍了一些常见的应用场景,如存储温度、湿度等传感器数据,存储用户配置信息等。

总的来说,本章介绍了如何使用单片机与EEPROM器件AT24C02进行读写操作。

通过实践这些内容,可以更好地掌握EEPROM的应用和使用方法,为后续的项目实践提供参考。

I2C总线芯片AT24C02程序设计

I2C总线芯片AT24C02程序设计AT24C02是一种常见的I2C总线芯片,具有2K字节的存储空间。

在程序设计方面,主要需要考虑以下几个方面:初始化、读取数据、写入数据。

首先,需要考虑的是初始化芯片。

在初始化过程中,主要有两个关键的步骤,一个是设置I2C总线的速率,另一个则是设置芯片地址。

以下是AT24C02初始化的伪代码:```void init_AT24C0//设置I2C总线速率i2c_set_speed(I2C_SPEED);//设置AT24C02芯片地址i2c_write_byte(AT24C02_ADDR);if (!i2c_check_ack()//错误处理机制}```在初始化完成后,就可以进行数据的读取和写入。

以下是读取数据的伪代码:```uint8_t read_AT24C02(uint16_t addr)//发送开始信号i2c_start(;//发送芯片地址和写入模式i2c_write_byte(AT24C02_ADDR , I2C_WRITE); if (!i2c_check_ack()//错误处理机制}//发送要读取的地址高位和低位i2c_write_byte(addr >> 8);if (!i2c_check_ack()//错误处理机制}i2c_write_byte(addr & 0xFF);if (!i2c_check_ack()//错误处理机制}//发送重新开始信号i2c_restart(;//发送芯片地址和读取模式i2c_write_byte(AT24C02_ADDR , I2C_READ);if (!i2c_check_ack()//错误处理机制}//读取数据uint8_t data = i2c_read_byte(;//发送停止信号i2c_stop(;//返回读取到的数据return data;```以上是读取数据的伪代码,对应地,写入数据的伪代码如下:```void write_AT24C02(uint16_t addr, uint8_t data)//发送开始信号i2c_start(;//发送芯片地址和写入模式i2c_write_byte(AT24C02_ADDR , I2C_WRITE);if (!i2c_check_ack()//错误处理机制}//发送要写入的地址高位和低位i2c_write_byte(addr >> 8);if (!i2c_check_ack()//错误处理机制}i2c_write_byte(addr & 0xFF); if (!i2c_check_ack()//错误处理机制}//写入数据i2c_write_byte(data);if (!i2c_check_ack()//错误处理机制}//发送停止信号i2c_stop(;```需要注意的是,在读取或写入数据之前,必须实现I2C总线的相关函数,如设置速率、发送信号、写入数据等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Scl=0;
NoAck();
Stop();
}
}
Scl=0;
}
/*------------------------------------------------
应答IIC总线
------------------------------------------------*/
void Ack(void)
{
Sda=0;
_nop_();_nop_();_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=0;
_nop_();_nop_();
}
/*------------------------------------------------
非应答IIC总线
------------------------------------------------*/
发送一个字节
------------------------------------------------*/
void Send(unsigned char Data)
{
unsigned char BitCounter=8;
unsigned char temp;
do
{
temp=Data;
Scl=0;
Send(AddWr); //写入芯片地址
Ack();
Send(Address+i);//写入存储地址
Ack();
Send(*(PData+i));//写数据
Ack();
Stop();
mDelay(20);
}
}
/*------------------------------------------------
PData=Data;
for(i=0;i<Num;i++)
{
Start(); //写入芯片地址
Send(AddWr);
Ack();
Send(Address+i);//写入存储地址
Ack();
Start();
Send(AddRd); //读入地址
Ack();
*(PData+i)=Read();//读数据
void NoAck(void)
{
Sda=1;
_nop_();_nop_();_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=0;
_nop_();_nop_();
}
/*------------------------------------------------
{
temp1=temp<<1;
temp=temp1;
}
BitCounter--;
}
while(BitCounter);
return(temp);
}
/*------------------------------------------------
写入数据
------------------------------------------------*/
停止IIC总线
------------------------------------------------*/
void Stop(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Sda=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
if((temp&0x80)==0x80)
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;
Data=temp;
BitCounter--;
}
while(BitCounter);
Scl=0;
}
/*------------------------------------------------
Sda=1;
do
{
Scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
if(Sda)
temp=temp|0x01;
else
temp=temp&0xfe;
if(BitCounter-1)
_nop_();_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Sda=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=0;
}
/*------------------------------------------------
{
for(i=0;i<125;i++)
{;}
}
}
/*------------------------------------------------
启动IIC总线
------------------------------------------------*/
void Start(void)
{
Sda---------------------------------------*/
unsigned char Read(void)
{
unsigned char temp=0;
unsigned char temp1=0;
unsigned char BitCounter=8;
读出数据
------------------------------------------------*/
void RdFromROM(unsigned char Data[],unsigned char Address,unsigned char Num)
{
unsigned char i;
unsigned char *PData;
void WrToROM(unsigned char Data[],unsigned char Address,unsigned char Num)
{
unsigned char i;
unsigned char *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start();
//at24c02头文件,基于IIC接口
#define AddWr 0xae //写数据地址,需要参考24c02芯片文档
#define AddRd 0xaf //读数据地址
sbit Sda=P2^5; //定义总线连接端口
sbit Scl=P2^4;
sbit WP=P2^0; //写保护,这里不使用
/*------------------------------------------------
延时程序
------------------------------------------------*/
void mDelay(unsigned char j)
{
unsigned int i;
for(;j>0;j--)
相关文档
最新文档