EEPROM存储器 AT24C02的C语言程序设计
- 格式:docx
- 大小:25.09 KB
- 文档页数:5
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芯片。
#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];}}。
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个数码管。
;--------------------------------------------------------------------------------------------------------------------- ;本程序是针对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】(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发送⼀个字节。
单片机程序设计实践教程_第17章_EEPROM器件AT24C02
读写
本章主要介绍了如何使用单片机与EEPROM器件AT24C02进行读写操作。
EEPROM是一种非易失性存储器,可以在电源关闭后保持数据的存储,适用于存储一些关键的配置信息或数据。
首先,需要连接单片机与AT24C02,常见的连接方式有两根数据线(SDA和SCL),两根线分别连接到单片机的I2C总线接口上。
在进行读写操作之前,需要进行初始化,设置相关的参数,如器件地址、时钟频率等。
然后,可以使用相应的读写函数对AT24C02进行读写操作。
对于读操作,需要指定读取的地址和数据长度。
可以使用一个循环来
连续读取多个数据,也可以单独读取一些地址上的数据。
读取的数据保存
在单片机的缓存中,可以根据需要进行处理或显示。
对于写操作,同样需要指定写入的地址和数据。
可以通过循环连续写
入多个数据,也可以单独写入一些地址上的数据。
写入操作完成后,要记
得进行等待,等待数据写入完成。
需要注意的是,AT24C02有一定的写入周期,写入速度较慢。
因此,
在进行连续写入操作时,需要考虑到写入速度,避免写入过快导致数据丢
失或写入错误。
本章还介绍了一些常见的应用场景,如存储温度、湿度等传感器数据,存储用户配置信息等。
总的来说,本章介绍了如何使用单片机与EEPROM器件AT24C02进行读写操作。
通过实践这些内容,可以更好地掌握EEPROM的应用和使用方法,为后续的项目实践提供参考。
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总线的相关函数,如设置速率、发送信号、写入数据等。