24C02读写程序

合集下载

24C02读写C程序

24C02读写C程序

//选择性读操作,从 address 地址中读出 1 个字节 uchar Read24c02(uchar address) {
uchar ch; //伪写操作 Start(); Write8Bit(WriteDeviceAddress); //发送从器件地址,且方式为写。 while(TestAck()); Write8Bit(address); while(TestAck());
}
//从 24c02 中读出 8 个 bit uchar Read8Bit() {
unsigned char temp,rbyte=0; for(temp=8;temp!=0;temp--) {
SCL=1; rbyte=rbyte<<1; rbyte=rbyte|((unsigned char)(SDA)); SCL=0; } return(rbyte); }
#define WriteDeviceAddress 0xa0 #define ReadDeviceAddress 0xa1 sbit SCL=P2^7; sbit SDA=P2^6;
//定义器件在 IIC 总线中的地址,且方式为写 //定义器件在 IIC 总线中的地址,且方式为读
sbit P10=P1Stop();
//主机产
生停止信号 return(ch);
}
//本课试验写入一个字节到 24c02 并读出来
void main(void) // 主程序 {
uchar c1,c2; c1=Read24c02(0x02);
//从 24c02 中读出 1 个字节
Write24c02(0x88,0x03); c2=Read24c02(0x03); P3=c2;
24C02读写C程序

24c02读写程序大全

24c02读写程序大全
SETB SDA24
CLR SCLK24
CALL START24;启动
MOV A,#0A0H
CALL SHIFT8;移位
CALL ACK;响应
POP ACC
>SETB;应答毕,SDA置1
>RET
>程序中多处调用了DELAY子程序(仅两条NOP指令),这是为了满足I2C总线上数据传
送速率的要求,只有当SDA数据线上的数据稳定下来之后才能进行读写(即SCL线发出正
脉冲)。另外,在读最后一数据字节时,置应答信号为“1”,表示读操作即将完成。
>
>下面是本人编写的源程序,已经调试成功,下载就可以使用,程序编写的不是很规范
>ACALL SUBS
>MORE: ACALL SUBR
>MOV@R1,A
>INCR1
>DJNZ R7,MORE
>CLR
>ACALL DELAY
>SETB
>ACALL DELAY
>SETB;送停止信号
>RET
>SUBR: MOVR0,#08H ;接受单字节子程序
>LOOP2: SETB
>ACALL DELAY
TT2:MOV30H,A
MOVCA,@A+DPTR
CLR;开数码管
MOVP0,A;送显示
MOVA,30H
INCA
MOVB,A
MOVA,#00H
LCALLWT24
AJMP$
TAB:DB28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60H
RD24: PUSH ACC;读24C02子程序。

24c02读写程序

24c02读写程序
}
//===================================================================//
//==========================================================
i=readx(); stop();
delay1(10);
return(i);
}
void x24c02_write(uchar address,uchar info)
{
EA=0;
start(); writex(0xa0);
clock(); writex(address);
clock(); writex(info);
clock(); stop();
EA=1;
delay1(50);
}
//====================================================================//
main (){
}
uchar readx()
{
uchar i,j,k=0;
scl=0; flash(); sda=1;
for (i=0;i<8;i++){
flash(); scl=1; flash();
if (sda==1) j=1;
else j=0;
uchar x24c02_read(uchar address); //从24c02的地址address中读取一个字节数据
void x24c02_write(uchar address,uchar info);

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灯直观显示出来。

24c02读写实验c程序

24c02读写实验c程序
{ucharRomDat[4];
Init();//初始化
DispBuf[2]=Hidden;
DispBuf[3]=Hidden;
for(;;)
{
Calc(RecBuf[1],RomDat[0]);//分别显示地址和数据
if(Rec)//接收到数据
{Rec=0;//清除标志
if(RecBuf[0]==0)//第一种功能,写入
TR1=1;
}
void Calc(uchar Dat1,uchar Dat2)//第一个参数放在第1、2位,第二个参数放入第5、6位
{DispBuf[0]=Dat1/16;
DispBuf[1]=Dat1%16;
DispBuf[4]=Dat2/16;
DispBuf[5]=Dat2%16;
}
void main()
/**************************************************
24C02.C
功能描述:
PC端发送3个数据n0,n1,n2.
n0=0,写,将n1写入n2地址中
n0=1,读,读出n1地址中的数据,n2不起作用,但必须有
收到一个字节后,将其地址值显示在数码管第1、2位上,数值显示在第5、6位上
sbit we=P2^7;
sbit du=P2^6;
uchar code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar code disptab[]={0x3f,0x6,0x5b,0x4f,0x66,
0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
Rec=1;//置位标志

24C02数据读写

24C02数据读写

delay(); sda=CY; delay(); scl=1; 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; scl=0; delay();
delay(); scl=1; delay(); } /*************写一个字节*************************/ void write_byte(uchar date) { uchar i,temp; temp=date; for(i=0;i<8;i++) {
temp=temp<<1; scl=0;
void respons() //应答 {
uchar i; scl=1; delay(); while((sda==1)&&(i<250))i++; scl=0; delay(); } /************IIC 初始化****************************/ void init() { sda=1;
IIC 时序 24C02 的操作
一、认识 IIC 总线的工作方式 这是最常用、最典型的 IIC 总线连接方式。
物理结构上,IIC 系统由一条串行数据线 SDA 和一条串行时钟线 SCL 组成。主机按一定的通信协议向从机寻址和进 行信息 传输。在数据传输时,由主机初始化一次数据传输,主机使数据在 SDA 线上传输的同时还通过 SCL 线传输 时钟。信息传输的对象和方向以及信息传输的开始和终 止均由主机决定。 每个器件都有一个唯一的地址,而且可以是单接收的器件(例如:LCD 驱动器)或者可以接收也可以发送的器件(例 如:存储器)。发送器或接收器可以在主模式或从模式下操作,这取决于芯片是否必须启动数据的传输还是仅仅被

E2PROM芯片24C02的读写程序

E2PROM芯片24C02的读写程序

E2PROM芯片24C02的读写程序一、实验目的:给24C02的内部RAM写入一组数据,数据从24C02内部RAM的01h开始存放。

然后再把这组数据读出来,检验写入和读出是否正确。

在这里我们给24C02中写入0、1、2的段码,然后把它读出来,送到数码管显示。

二、理论知识准备:上面两个实验主要学习的是利用单片机的串口进行通讯,本实验要介绍的是基于I2C总线的串行通讯方法,下面我们先介绍一下I2C总线的相关理论知识。

(一)、I2C总线概念I2C总线是一种双向二线制总线,它的结构简单,可靠性和抗干扰性能好。

目前很多公司都推出了基于I2C总线的外围器件,例如我们学习板上的24C02芯片,就是一个带有I2C总线接口的E2PROM存储器,具有掉电记忆的功能,方便进行数据的长期保存。

(二)、I2C总线结构I2C总线结构很简单,只有两条线,包括一条数据线(SDA)和一条串行时钟线(SCL)。

具有I2C接口的器件可以通过这两根线接到总线上,进行相互之间的信息传递。

连接到总线的器件具有不同的地址,CPU根据不同的地址进行识别,从而实现对硬件系统简单灵活的控制。

一个典型的I2C总线应用系统的组成结构如下图所示(假设图中的微控制器、LCD驱动、E2PROM、ADC各器件都是具有I2C总线接口的器件):我们知道单片机串行通讯的发送和接收一般都各用一条线TXD和RXD,而I2C总线的数据线既可以发送也可以接受,工作方式可以通过软件设置。

所以,I2C总线结构的硬件结构非常简洁。

当某器件向总线上发送信息时,它就是发送器,而当其从总线上接收信息时,又成为接收器。

(三)、I2C总线上的数据传送下面我们看看I2C总线是如何进行数据传送的。

我们知道,在一根数据线上传送数据时必须一位一位的进行,所以我们首先研究位传送。

1、位传输I2C总线每传送一位数据必须有一个时钟脉冲。

被传送的数据在时钟SCL的高电平期间保持稳定,只有在SCL低电平期间才能够改变,示意图如下图所示,在标准模式下,高低电平宽度必须不小于4.7us。

24c02读写程序

24c02读写程序

E2PROM芯片24C02的读写程序一、实验目的:给24C02的内部RAM写入一组数据,数据从24C02内部RAM的01h开始存放。

然后再把这组数据读出来,检验写入和读出是否正确。

在这里我们给24C02中写入0、1、2的段码,然后把它读出来,送到数码管显示。

二、理论知识准备:上面两个实验主要学习的是利用单片机的串口进行通讯,本实验要介绍的是基于I2C总线的串行通讯方法,下面我们先介绍一下I2C总线的相关理论知识。

(一)、I2C总线概念I2C总线是一种双向二线制总线,它的结构简单,可靠性和抗干扰性能好。

目前很多公司都推出了基于I2C总线的外围器件,例如我们学习板上的24C02芯片,就是一个带有I2C总线接口的E2PROM存储器,具有掉电记忆的功能,方便进行数据的长期保存。

(二)、I2C总线结构I2C总线结构很简单,只有两条线,包括一条数据线(SDA)和一条串行时钟线(SCL)。

具有I2C接口的器件可以通过这两根线接到总线上,进行相互之间的信息传递。

连接到总线的器件具有不同的地址,CPU根据不同的地址进行识别,从而实现对硬件系统简单灵活的控制。

一个典型的I2C总线应用系统的组成结构如下图所示(假设图中的微控制器、LCD驱动、E2PROM、ADC各器件都是具有I2C总线接口的器件):我们知道单片机串行通讯的发送和接收一般都各用一条线TXD和RXD,而I2C总线的数据线既可以发送也可以接受,工作方式可以通过软件设置。

所以,I2C总线结构的硬件结构非常简洁。

当某器件向总线上发送信息时,它就是发送器,而当其从总线上接收信息时,又成为接收器。

(三)、I2C总线上的数据传送下面我们看看I2C总线是如何进行数据传送的。

我们知道,在一根数据线上传送数据时必须一位一位的进行,所以我们首先研究位传送。

1、位传输I2C总线每传送一位数据必须有一个时钟脉冲。

被传送的数据在时钟SCL的高电平期间保持稳定,只有在SCL低电平期间才能够改变,示意图如下图所示,在标准模式下,高低电平宽度必须不小于4.7us。

[精品]24c02的连续读写

[精品]24c02的连续读写

24c02的连续读写/**********************************************24c02驱动程序SDA=P3^6;SCL=P3^7;可以写一个字节,写一串字符(以'\n'作为结束标志)可以读一个字节,读一串字符(以'\n'作为结束标志)**********************************************/#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define W24C02 0xA0 //存储器的写地址#define R24C02 0xA1 //存储器的读地址/********************/sbit SDA=P3^6; //AT24C02串行数据5脚sbit SCL=P3^7; //AT24C02串行时钟6脚void start_24c02(); //开始void stop_24c02(); //停止void response_24c02(bit); //应答void write_8bit(uchar); //写8位void write_byte(uchar,uchar); //写一字节void write_list(uchar, uchar *); //写*指向的数据(以'\n'作结束)uchar read_8bit(); //读8位uchar read_byte(uchar); //从某一地址读1字节void read_list(uchar,uchar *); //从某一地址开始连续读,存到*所指位置/********************开始,在读\写前调用********************/void start_24c02(){SDA=1;_nop_();_nop_();SCL=1;_nop_();_nop_();SDA=0;_nop_();_nop_();}/********************结束,在读\写完后调用********************/void stop_24c02(){SDA=0;_nop_();_nop_();SCL=1;_nop_();_nop_();SDA=1;_nop_();_nop_();}/********************应答当单片机写时,ack=1,为等待24c02的应答信号当单片机读时,ack=0,为向24c02发送应答信号********************/void respons_24c02(bit ack) //ak为1则单片机接收24c02的应答信号;ak为0则24c02接收单片机的应答信号{uchar i=0;SDA=ack;while(i<250&&SDA==1)i++;SCL=1;_nop_();_nop_();SCL=0;_nop_();SDA=1;}/********************向24c02写入一字节(8位)的数据********************/void write_8bit(uchar dat) {uchar i;SCL=0;for(i=0;i<8;i++){dat=dat<<1;SDA=CY;SCL=1;_nop_();_nop_();SCL=0;_nop_();_nop_();}}/********************从24c02读取一字节(8位)的数据********************/ uchar read_8bit(){uchar i,k;for(i=0;i<8;i++){SCL=1;_nop_();_nop_();k=(k<<1)|SDA;SCL=0;_nop_();_nop_();}return k;}/********************向地址addr写入数据dat********************/void write_byte(uchar addr,uchar dat){start_24c02();write_8bit(W24C02);respons_24c02(1);write_8bit(addr);respons_24c02(1);write_8bit(dat);respons_24c02(1);stop_24c02();}/********************从地址addr形如连续写入list中的数据,以'\n'为结束标志********************/void write_list(uchar addr, uchar *list) {uchar i=0;start_24c02();write_8bit(W24C02);respons_24c02(1);write_8bit(addr);respons_24c02(1);do{if(i==0||i%8!=0) //判断是否到了页的边缘{write_8bit(list[i]);respons_24c02(1);}else{stop_24c02(); //写完一页,则进入启动内部写周期do{start_24c02();write_8bit(W24C02);SDA=1;//delay(2);}while(SDA==1); //等待24c02完成写周期发出的应答信号,从而继续下一个读写操作SCL=1;_nop_();_nop_();SCL=0; //应答write_8bit(i);respons_24c02(1);write_8bit(list[i]);respons_24c02(1);}}while(list[i++]!='\n');stop_24c02();}/********************从addr中读取一字节数据返回dat********************/uchar read_byte(uchar addr){uchar dat;start_24c02();write_8bit(W24C02);respons_24c02(1);write_8bit(addr);respons_24c02(1);start_24c02();write_8bit(R24C02);respons_24c02(1);dat=read_8bit(); //读取一字节后若发送停止指令,则结束并返回datstop_24c02();return dat;}/********************从地址addr开始连续读取数据,并存入list中以'\n'为结束********************/void read_list(uchar addr,uchar *list){uchar i=0;start_24c02();write_8bit(W24C02);respons_24c02(1);write_8bit(addr);respons_24c02(1);start_24c02();write_8bit(R24C02);respons_24c02(1);do{list[i]=read_8bit(); //读取1字节后,若其不为结束标志,则发送应答信号,继续读下一个if(list[i]!='\n')respons_24c02(0);}while(list[i++]!='\n');stop_24c02();}。

STM32-24C02读写程序(亲自编写测试可用)

STM32-24C02读写程序(亲自编写测试可用)

本文档内容为在STM32条件下的24C02读写程序。

全文共分四部分,第一部分24C02的C程序,第二部分为24C02的.h程序,第三部分为端口与时钟配置函数,第四部分为主函数。

下面分别进行介绍。

第一部分:24C02的.c函数******************************************************************************/ #include "stm32f10x.h"#include "system_config.h"#include "24C02.h"u8 savedata[10]={10,9,8,7,6,5,4,3,2,1};/****************************************************************************** ** Function Name : AT24C02_SDA_IO_SET(uchar io_set)* Description : SDA方向控制* Input : None* Output : None* Return : None******************************************************************************* /void AT24C02_SDA_IO_SET(unsigned char io_set){GPIO_InitTypeDef GPIO_InitStructure;if(io_set){GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 ;//SDA 设置为输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);}else{GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 ;//SDA 设置为输入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB, &GPIO_InitStructure);}}/****************************************************************************** ** Function Name : delay2* Description : 延时函数* Input : None* Output : None* Return : None******************************************************************************* /void delay2(u8 x){u8 i;for(i=0;i<x;i++);}/****************************************************************************** ** Function Name : delay2* Description : 延时函数* Input : None* Output : None* Return : None******************************************************************************* /void delay_nop(void){uint8_t i=10;//延时1.5uswhile(i--);}/****************************************************************************** ** Function Name : 24C02_init()* Description : 初始化函数* Input : None* Output : None* Return : None******************************************************************************* /void I2C_init(void){//SCL=1SCL_H;delay_nop();//SDA=1SDA_H;delay_nop();}/****************************************************************************** ** Function Name : I2C_start()* Description : 开始信号* Input : None* Output : None* Return : None******************************************************************************* /void I2C_start(){SDA_H;delay_nop();SCL_H;delay_nop();SDA_L;delay_nop();SCL_L;delay_nop();}/****************************************************************************** ** Function Name : I2C_stop()* Description : 开始信号* Input : None* Output : None* Return : None******************************************************************************* /void I2C_stop(){SDA_L;delay_nop();SCL_H;delay_nop();SDA_H;delay_nop();}/****************************************************************************** ** Function Name : I2C_write_bit()* Description : 开始信号* Input : None* Output : None* Return : None******************************************************************************* /void I2C_write_bit(int j){int i,temp,temp1;temp=j;//AT24C02_SDA_IO_SET(1);//发送数据for(i=0;i<8;i++){temp1=temp&0x80;//高位在前相与temp=temp<<1;SCL_L;//时钟线设为低delay_nop();if(temp1==0x80)//发送数据到SDA线上{SDA_H;delay_nop();}else{SDA_L;delay_nop();}SCL_H;//时钟线设为高,开始传输数据delay_nop();}SCL_L;//一个字节发送完成delay_nop();SDA_H;delay_nop();}/****************************************************************************** ** Function Name : I2C_read_bit()* Description : 读取一个字节数据* Input : None* Output : None* Return : None******************************************************************************* /u8 I2C_read_bit(){u8 i,j,k=0;SCL_L;delay_nop();SDA_H;delay_nop();A T24C02_SDA_IO_SET(0);//SDA设置为输入for(i=0;i<8;i++){delay_nop();SCL_H;delay_nop();if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==1)j=1;elsej=0;k=(k<<1)|j;SCL_L;delay_nop();}A T24C02_SDA_IO_SET(1);//SDA设置为输出delay_nop();return(k);}/****************************************************************************** ** Function Name : I2C_reply()* Description : 读取应答信号* Input : None* Output : None* Return : None******************************************************************************* /void I2C_reply(){u16 i=0;A T24C02_SDA_IO_SET(0);//SDA设置为输入SCL_H;delay_nop();while((GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==1)&&(i<5000))i++;SCL_L;delay_nop();A T24C02_SDA_IO_SET(1);//SDA设置为输出}/****************************************************************************** ** Function Name : I2C_write_addr()* Description : 指定地址写* Input : None* Output : None* Return : None******************************************************************************* /void I2C_write_addr(u8 addr,u8 data){I2C_start();//开始信号I2C_write_bit(0xa0);//发送写命令I2C_reply();//等待应答I2C_write_bit(addr);//发送写地址I2C_reply();//等待应答I2C_write_bit(data);//发送写数据I2C_reply();//等待应答I2C_stop();//停止信号delay2(250);}/****************************************************************************** ** Function Name : I2C_read_addr()* Description : 指定地址读* Input : None* Output : None* Return : None******************************************************************************* /int I2C_read_addr(int addr){int i=0;I2C_start();//开始信号I2C_write_bit(0xa0);//发送写命令因为要先写入要读的地址I2C_reply();//等待应答I2C_write_bit(addr);//发送读地址I2C_reply();//等待应答I2C_start();//开始信号I2C_write_bit(0xa1);//发送读命令I2C_reply();//等待应答i=I2C_read_bit();I2C_stop();//停止信号delay2(250);return(i);}第二部分:24C02的.h函数#define SCL_H GPIO_SetBits(GPIOB,GPIO_Pin_6)#define SCL_L GPIO_ResetBits(GPIOB,GPIO_Pin_6)#define SDA_H GPIO_SetBits(GPIOB,GPIO_Pin_7)#define SDA_L GPIO_ResetBits(GPIOB,GPIO_Pin_7)#define Write_able GPIO_ResetBits(GPIOB,GPIO_Pin_5)//24C02写使能控制引脚void AT24C02_SDA_IO_SET(unsigned char io_set);void delay2(u8 x) ;void delay_nop(void);void I2C_init(void);void I2C_start();void I2C_stop();void I2C_write_bit(int j);u8 I2C_read_bit();void I2C_reply();void I2C_write_addr(u8 addr,u8 data) ;int I2C_read_addr(int addr) ;第三部分:端口与时钟配置函数由于我们使用的是PB6作为时钟线,PB7作为数据线,所以端口配置PB6,PB7就可以了。

最好的24C02储存开机次数实验 读写程序

最好的24C02储存开机次数实验 读写程序

24C02储存开机次数实验24C02是2K字节的串行EEPROM, 内部含有256个8位字节,该器件通过总线操作,并有专门的写保护功能。

串行EEPROM简称I2C总线式串行器件。

串行器件不仅占用很少的资源和I/O 线,而且体积大大缩小,同时具有工作电源宽、抗干扰能力强、功耗低、数据不易丢失和支持在线编程等特点。

I2C总线是一种用于IC器件之间连接的二线制总线。

它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:不管是单片机、存储器、LCD驱动器还是键盘接口。

我们通过一个实验来了解24C02的读写操作过程:该实验功能是单片机复位一次,自动从24C02中读取数据,然后加1,最终数码管中的数据就是开机的次数,具有一定的实用意义。

相关原理:程序运行的照片:接线方法:1、接8位数码管的数据线。

将数码管部份的数据口 JP5接到CPU部份的P0口JP51.2、接8位数码管的显示位线。

将数码管部份的显示位口 JP8接到CPU部份的P2口JP52.3、用一根2PIN数据线一端插入CPU部份JP53(P3口)的P3.6,P3.7另外一端插入24C02部份的控制端JP38。

烧写后用手按复位键可以看到数码管每按一下加一。

程序流程图:汇编语言参考程序: SDA24 EQU P3.7 SCLK24 EQU P3.6 ORG 0000HAJMP MAINORG 0080HMAIN:CLR P3.7 ;打开写保护MOV DPTR,#TABMOV A,#00H ;读地址LCALL RD24CJNE A,#10,TTTT: JNC TT1AJMP TT2TT1: MOV A,#00TT2: MOV 30H,AMOVC A,@A+DPTRCLR P2.6 ;开数码管MOV P0,A ;送显示MOV A,30HINC AMOV B,AMOV A,#00HLCALL WT24AJMP $TAB: DB 28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60HRD24: PUSH ACC ;读24C02子程序。

24C02(IIC)读写操作

24C02(IIC)读写操作

1. AT24C02写操作首先我们来看一下写AT24C02。

一般步骤是:1) 发送起始信号2) 发送写器件地址3) 等待应答4) 发送要写入的24C02 的地址5) 等待应答6) 发送要写入的数据7) 等待应答8) 发送数据结束发送结束信号具体程序如下:/****************************************************************************** ** 函数名: AT24Cxx_WriteOneByte* 函数功能: 24c02写一个字节地址数据* 输入: addr dt* 输出: 无********************************************/void AT24Cxx_WriteOneByte(u16 addr,u8 dt){I2C_Start();if(EE_TYPE>AT24C16){I2C_Send_Byte(0xA0);I2C_Wait_Ack();I2C_Send_Byte(addr>>8); //发送数据地址高位}else{I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址+数据地址}I2C_Wait_Ack();I2C_Send_Byte(addr%256);//双字节是数据地址低位//单字节是数据地址低位I2C_Wait_Ack();I2C_Send_Byte(dt);I2C_Wait_Ack();I2C_Stop();delay_ms(10);}2. AT24C02读操作那么读取AT24C02 的步骤是:1)发送起始信号2) 发送写器件地址3) 等待应答4) 发送要读取的AT24C02 的地址5) 等待应答6) 再发送其实信号7) 发送读器件地址8) 等待应答9) 接收数据10) 如果没有接收完数据,发送应答11) 接收数据12) 直到接收完数据,发送非应答13) 发送结束信号/****************************************************************************** ** 函数名: AT24Cxx_ReadOneByte* 函数功能: 24c02读一个字节地址数据* 输入: addr* 输出: 返回值temp*****************************************************************************/ u8 AT24Cxx_ReadOneByte(u16 addr){u8 temp=0;I2C_Start();if(EE_TYPE>AT24C16){I2C_Send_Byte(0xA0);I2C_Wait_Ack();I2C_Send_Byte(addr>>8); //发送数据地址高位}else{I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址+数据地址}I2C_Wait_Ack();I2C_Send_Byte(addr%256);//双字节是数据地址低位//单字节是数据地址低位I2C_Wait_Ack();I2C_Start();I2C_Send_Byte(0xA1);I2C_Wait_Ack();temp=I2C_Read_Byte(0); // 0 代表NAC I2C_NAck();I2C_Stop();return temp;}。

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个数码管。

单片机对存储器AT24C02页读,写程序

单片机对存储器AT24C02页读,写程序

/****************************************************************************** 定义控制存储器操作的程序******************************************************************************/ 这是自己写的程序,已经经过验证,细节要求的地方,参考一下AT24CXX数据手册即可#include <intrins.h>#include "AT89S52_reg.h"#include "Delay.h"sbit SDA = P3^6;sbit SCL = P3^7;/*********************************初始化存储器子程序*********************************/void InitMemory(void){SCL = 1;flash();SDA = 1;flash();}/*********************************I2C总线短延时子程序*********************************/static void flash(){_nop_();_nop_();_nop_();_nop_();_nop_(); /时序图要求开始建立时间tSU.STA大于4.7us,开始保持时间tHD.STA大于4us。

51中每个_nop_ ();延时1个CPU cycle,即1us}/*********************************启动I2C总线子程序*********************************/static void Start(void){SDA = 1;flash();SCL = 1;SDA = 0;flash();SCL = 0;flash();}/*********************************停止I2C总线子程序*********************************/static void Stop(void){SDA = 0;flash();SCL = 1;flash();SDA = 1;flash();}/******************************************** 写一字节子程序********************************************/ static void Mmr_SendByte(unsigned char byte){unsigned char i, temp;temp = byte;for (i=0; i<8; i++){temp <<= 1;SCL = 0;flash();SDA = CY;flash();SCL = 1;flash();}SCL = 0;flash();SDA = 1;flash();i = 0;flash();while ((SDA==1) && (i<255)){i++;}SCL = 0;flash();}/**************************************读一字节子程序**************************************/static unsigned char Mmr_GetByte(void){unsigned char i;unsigned char byte;SCL = 0;flash();SDA = 1;for (i=0; i<8; i++){byte <<= 1;flash();SCL = 1;flash();if (SDA == 1){byte |= 0x01;}SCL = 0;}flash();SDA = 0;SCL = 1;flash();SCL = 0;flash();SDA = 1;flash();return(byte);}/*********************************************************************从存储器指定地址中读取n个字节数据子程序(页读)*********************************************************************/void ReadMemory(unsigned char addr, unsigned char *p, unsigned char n) reentrant//addr 为数据开始地址*p为指向所需写入数据数组的指针n为个数,因不同存储器而不同这个可以参见数据手册{Start();Mmr_SendByte(0xA0); // 写入数据指令Mmr_SendByte(addr); // 写入读取数据的地址Start();Mmr_SendByte(0xA1); // 读取数据指令while(n--){*p = Mmr_GetByte();p++;}Stop();Delayms(2);}/**********************************************************************写存储器指定地址中写入n个字节数据子程序(页写)**********************************************************************/void WriteMemory(unsigned char addr, unsigned char *p, unsigned char n) reentrant{EA = 0;Start();Mmr_SendByte(0xA0);Mmr_SendByte(addr);while(n--){Mmr_SendByte(*p);p++;}Stop();EA = 1;Delayms(10);}。

最好的24C02储存开机次数实验 读写程序

最好的24C02储存开机次数实验 读写程序

24C02储存开机次数实验24C02是2K字节的串行EEPROM, 内部含有256个8位字节,该器件通过总线操作,并有专门的写保护功能。

串行EEPROM简称I2C总线式串行器件。

串行器件不仅占用很少的资源和I/O线,而且体积大大缩小,同时具有工作电源宽、抗干扰能力强、功耗低、数据不易丢失和支持在线编程等特点。

I2C总线是一种用于IC器件之间连接的二线制总线。

它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:不管是单片机、存储器、LCD驱动器还是键盘接口。

我们通过一个实验来了解24C02的读写操作过程:该实验功能是单片机复位一次,自动从24C02中读取数据,然后加1,最终数码管中的数据就是开机的次数,具有一定的实用意义。

相关原理:程序运行的照片:接线方法:1、接8位数码管的数据线。

将数码管部份的数据口 JP5接到CPU部份的P0口JP51.2、接8位数码管的显示位线。

将数码管部份的显示位口 JP8接到CPU部份的P2口JP52.3、用一根2PIN数据线一端插入CPU部份JP53(P3口)的P3.6,P3.7另外一端插入24C02部份的控制端JP38。

烧写后用手按复位键可以看到数码管每按一下加一。

程序流程图:汇编语言参考程序:SDA24 EQU P3.7 SCLK24 EQU P3.6 ORG 0000HAJMP MAINORG 0080HMAIN:CLR P3.7 ;打开写保护MOV DPTR,#TABMOV A,#00H ;读地址LCALL RD24CJNE A,#10,TTTT: JNC TT1AJMP TT2TT1: MOV A,#00TT2: MOV 30H,AMOVC A,@A+DPTRCLR P2.6 ;开数码管MOV P0,A ;送显示MOV A,30HINC AMOV B,AMOV A,#00HLCALL WT24AJMP $TAB: DB 28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60HRD24: PUSH ACC ;读24C02子程序。

24C02读写程序

24C02读写程序

24C02读写程序HT49 MCU系列单片机读写HT24系列的EEPROM应用范例HT49 MCU系列单片机读写HT24系列的EEPROM应用范例文件编码:HA0017s简介:HT24系列的EEPROM是通过I2C协议控制其读写的。

HT49系列单片机的接口部分是简单I/O 口,可以用来很方便地采用I2C协议控制周边器件。

HT24系列的EEPROM总共8个管脚,三个为芯片地址脚A0、A1、A2,在单片机对它进行操作时,从SDA输入A0、A1、A2数据和芯片外部A0、A1、A2所接地址需一一对应。

一个为芯片写保护脚WP,WP脚接低电平时,芯片可进行读写操作;WP脚接高时,芯片只可进行读,不可进行写。

另外两个管脚为电源脚VCC,VSS。

用单片机对HT24系列的EEPROM进行控制时,HT24系列的EEPROM的外部管脚VCC、VSS、WP、A0、A1、A2根据需要,对应接上,SDA、SCL接到单片机控制脚上。

引脚名称I/O 功能描述A0~A2 I地址输入VSS I电源负极输入SDA I/O串行数据输入/输出SCL I串行数据传送时钟信号输入WP I写保护VCC I电源正极输入HT24系列的EEPROM根据型号不同,EEPROM的容量大小不同,当EEPROM的空间大于1页(256bytes)时,即大于2048bits,则HT49 MCU需要控制A0、A1、A2来确定写HT24系列的EEPROM 的第几页,HT24系列的EEPROM空间大小如下表所示:型号引脚A0、A1及A2使用方法容量大小HT24LC02 A0、A1、A2引脚作为器件地址输入,从SDA输入A0、A1、A2数据和芯片引脚A0、A1、A2所接状态需一一对应2K(256×8)HT24LC04 A1、A2引脚作为器件地址输入,从SDA输入A1、A2数据和芯片引脚A1、A2所接状态需一一对应,A0引脚浮空4K(512×8,2pages)HT24LC08 A2引脚器件地址输入,从SDA输入A2数据和芯片引脚A2所接状态需一一对应,其余引脚浮空8K(1024×8,4pages)HT24LC16 A0、A1、A2全部浮空,不必接16K(2048×8,8pages)HT49 MCU系列单片机读写HT24系列的EEPROM应用范例程式说明:本文是以HT49R30A-1控制HT24LC04为例的。

ATMEL24c02使用详解(汇编及C程序都有)

ATMEL24c02使用详解(汇编及C程序都有)

ATMEL 24c02使用详解(汇编及C程序都有)1000字ATMEL 24c02是一种串行EEPROM存储器,具有2KB的存储容量,可通过I2C总线进行读写操作。

使用ATMEL 24c02时,需先设置I2C总线的通信速率和设备地址。

然后,可以使用汇编语言或C语言编写程序进行读写数据操作。

汇编语言程序示例:1. 设置I2C总线通信速率及设备地址```LDAA #$0 ;设置I2C总线通信速率为100kHzSTAA SCLDIVLDAA #$A0 ;设置EEPROM的设备地址为0xA0STAA SLA```2. 写入数据到EEPROM```BYTE_WRITE PROCLDAA #$00 ;设置数据的存储地址为0x00STAA DADDRLDAA #$A5 ;设置需要写入的数据为0xA5STAA DATAJSR I2C_WRITE ;调用I2C总线写入函数RTSBYTE_WRITE ENDP```3. 从EEPROM读取数据```BYTE_READ PROCLDAA #$00 ;设置数据的读取地址为0x00STAA DADDRJSR I2C_START ;发送起始信号LDAA #$A1 ;设置EEPROM的设备地址为0xA1,读操作时需要在地址末位添加1JSR I2C_SEND ;发送EEPROM设备地址LDAA #$00 ;设置要读取的数据长度为1JSR I2C_READ ;调用I2C总线读取函数LDA DATA ;将读取到的数据保存到DATA寄存器中RTSBYTE_READ ENDP```C语言程序示例:1. 在main函数中,调用I2C_Init()函数,设置I2C总线速率和设备地址。

```void main(){I2C_Init(); //设置I2C总线速率和设备地址}```2. 写入数据到EEPROM```void Write_Byte(unsigned char addr, unsigned char dat) {I2C_Start(); //发送起始信号I2C_SendByte(0xa0); //写入EEPROM的设备地址I2C_SendByte(addr); //设置存储地址I2C_SendByte(dat); //写入数据I2C_Stop(); //发送停止信号}```3. 从EEPROM读取数据```unsigned char Read_Byte(unsigned char addr){unsigned char res;I2C_Start(); //发送起始信号I2C_SendByte(0xa0); //写入EEPROM的设备地址I2C_SendByte(addr); //设置读取地址I2C_Start(); //发送起始信号I2C_SendByte(0xa1); //设置EEPROM的设备地址为读取模式 res = I2C_ReadByte(); //读取数据I2C_Stop(); //发送停止信号return res; //返回读取的数据}```即可进行EEPROM的读写操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

HT49 MCU系列单片机读写HT24系列的EEPROM应用范例HT49 MCU系列单片机读写HT24系列的EEPROM应用范例文件编码:HA0017s简介:HT24系列的EEPROM是通过I2C协议控制其读写的。

HT49系列单片机的接口部分是简单I/O 口,可以用来很方便地采用I2C协议控制周边器件。

HT24系列的EEPROM总共8个管脚,三个为芯片地址脚A0、A1、A2,在单片机对它进行操作时,从SDA输入A0、A1、A2数据和芯片外部A0、A1、A2所接地址需一一对应。

一个为芯片写保护脚WP,WP脚接低电平时,芯片可进行读写操作;WP脚接高时,芯片只可进行读,不可进行写。

另外两个管脚为电源脚VCC,VSS。

用单片机对HT24系列的EEPROM进行控制时,HT24系列的EEPROM的外部管脚VCC、VSS、WP、A0、A1、A2根据需要,对应接上,SDA、SCL接到单片机控制脚上。

引脚名称I/O 功能描述A0~A2 I地址输入VSS I电源负极输入SDA I/O串行数据输入/输出SCL I串行数据传送时钟信号输入WP I写保护VCC I电源正极输入HT24系列的EEPROM根据型号不同,EEPROM的容量大小不同,当EEPROM的空间大于1页(256bytes)时,即大于2048bits,则HT49 MCU需要控制A0、A1、A2来确定写HT24系列的EEPROM的第几页,HT24系列的EEPROM空间大小如下表所示:型号引脚A0、A1及A2使用方法容量大小HT24LC02 A0、A1、A2引脚作为器件地址输入,从SDA输入A0、A1、A2数据和芯片引脚A0、A1、A2所接状态需一一对应2K(256×8)HT24LC04 A1、A2引脚作为器件地址输入,从SDA输入A1、A2数据和芯片引脚A1、A2所接状态需一一对应,A0引脚浮空4K(512×8,2pages)HT24LC08 A2引脚器件地址输入,从SDA输入A2数据和芯片引脚A2所接状态需一一对应,其余引脚浮空8K(1024×8,4pages)HT24LC16 A0、A1、A2全部浮空,不必接16K(2048×8,8pages)HT49 MCU系列单片机读写HT24系列的EEPROM应用范例程式说明:本文是以HT49R30A-1控制HT24LC04为例的。

I2C协议只需要两根线进行控制,一根时钟线SCL,一根数据线SDA。

用单片机对HT24LC04进行控制时,HT24LC04外部管脚VCC、VSS、WP、A1、A2根据需要,对应接上(本例中是与VSS相接,即A1、A2=00),SDA、SCL接到单片机控制脚上。

在这个例程中SCL接到pa.3脚,SDA接到pa.1脚。

程序的过程是这样的:先向EEPROM 中某个地址写55H,写完后,再将EEPROM中内容读出来,并将读出数据和55H进行比较,若数据不相等程序跳到fail_out中;若相等,最后程序跳到ok_end中。

例程中只是对第0页中的特定地址进行写操作后,再将该地址的内容读出。

关于HT24系列的EEPROM其它操作只要严格按其时序要求,并注意从SDA输入A0、A1、A2数据和芯片引脚A0、A1、A2所接状态需一一对应即可。

例程:; file name: 4924_WR.asm; 作者:盛扬半导体(上海)有限公司软件部; 目的:用HT49系列单片机控制24系列EEPROM; 注意: 在mask_option中,PA0~PA3须选择NMOS有上拉电阻include ht49r30a-1.inc;----------------------------;equ定义区间pa.3 ;时钟信号引脚定义scl equpa.1 ;串行数据引脚定义sda equ[70h] ;写暂存器read_out equwrite_in equ[71h] ;读暂存器word_address equ [72h][73h]equdata_8;----------------------------;----------------------------;宏定义;延迟宏,延迟100微秒d_1 macrolocal labela,64hmovdelay,amovlabel:sdzdelaylabeljmpendmHT49 MCU系列单片机读写HT24系列的EEPROM应用范例;---------------------------;---------------------------;数据区e2prom .section 'data'?delay db;----------------------------;----------------------------;代码段eepromc .section 'code'00horgstartjmpstart:a,055h;设写入值为055Hmovwrite_in,amova,14h ;写入14H为要操作的EEPROM的地址movword_address,amovrandom_write_cycle:sdasetd_1sclsetd_1sda ;起始信号clrsclclrsda ;1setd_1setscld_1sclclrclrsda ;0sclsetd_1sclclrsda ;1setd_1setscld_1HT49 MCU系列单片机读写HT24系列的EEPROM应用范例 sclclrsda ;0clrsclsetd_1clrscl;A2,A1,A0=0sdaclrsclsetd_1sclclrsclsetd_1clrsclsclsetd_1clrsclwritemode;0sdaclrsclsetd_1clrsclack,for设为输入口,接收应答信号;1setsdad_1;read_modify_writesclsetd_1skch:sda ;应答信号szskchjmpsclclra,08hmovdata_8,a ;一个字节八位movwrite_address_in:sdaclrword_address.7szsdasetd_1sclsetd_1HT49 MCU系列单片机读写HT24系列的EEPROM应用范例clr sclrl word_addresssdz data_8jmp write_address_inset sdad_1set scld_1wdow:sdaszwdowjmpsclclra,08hmovdata_8,amovwrite_data_in:sdaclrwrite_in.7szsdasetd_1sclsetd_1sclclrwrite_inrldata_8sdzjmpwrite_data_insdaclrsclsetd_1sclclrsclsetd_1sda ;停止信号setd_1clrscl;-----------读read_random_1:setsdad_1HT49 MCU系列单片机读写HT24系列的EEPROM应用范例 sclsetd_1sda ;开始信号clrsclclrsda ;1setd_1setscld_1sclclrclrsda ;0sclsetd_1sclclrsda ;1setd_1setscld_1sclclrsda ;0clrsclsetd_1sclclrclr;A2,A1,A0=0,0,0sdasclsetd_1sclclrsclsetd_1sclclrsclsetd_1sclclrmodewriteclrsda;0HT49 MCU系列单片机读写HT24系列的EEPROM应用范例 sclsetd_1clrsclacksetsda ;ford_1sclsetd_1flel:sdaszread_random_1jmpsclclra,08hmovdata_8,amovread_address_in:sdaclrword_address.7szsetsdad_1sclsetd_1sclclrword_addressrldata_8sdzread_address_injmpack;forsetsdad_1sclsetd_1skco:sdaszskcojmpsclclrrestart:sdasetd_1sclsetd_1sda ;起始信号clrHT49 MCU系列单片机读写HT24系列的EEPROM应用范例 sclclrsda ;1setd_1sclsetd_1sclclrsda ;0clrsclsetd_1sclclrsda ;1setd_1sclsetd_1sclclrsda ;0clrsclsetd_1clrscl;A2,A1,A0=0sdaclrsclsetd_1sclclrsclsetd_1sclclrsclsetd_1sclclrmode;1readsdasetd_1sclsetd_1sclclrHT49 MCU系列单片机读写HT24系列的EEPROM应用范例ack;forsetsdad_1sclsetd_1ewfp:sdaszewfpjmpa,08hmovdata_8,amovflow_out:sclclrsda ;设定为输入口setd_1read_out.7clrsdaszsetread_out.7d_1sclsetd_1read_outrldata_8sdzflow_outjmpsclclrsdaclrsetscld_1sda ;停止信号setd_1;将读出数据与55H比较a,055hmova,read_outxorzsnzfail_outjmpok_endjmpfail_out:jmp $ ;操作失败ok_end:jmp $ ;操作成功;HT49R30A-1通过HT49 MCU系列单片机读写HT24系列的EEPROM应用范例注意事项:1、需要注意HT24系列EEPROM中A0的用法。

在HT24LC04中A0是作为地址位用的。

2、读出数据时是在下降沿,写入数据是在上升沿。

3、49系列 I/O 口为简单 I/O 口,PCB与HT24系列的EEPROM之间存在杂散电容C,PCB以及HT24系列的EEPROM与I/O之间的连线等效电阻R;因为T = RC,可能使时钟信号以及数据产生错误,所以在每次SET指令之后加一段延时。

本例适用于读写HT24系列的EEPROM第0页的特定地址操作,若要对其它页进行操作,改变相应的A0、A1、A2数据,从SDA输入即可。

相关文档
最新文档