手把手教会24C02

合集下载

24C02数据读写

24C02数据读写

sbit wei1=P1^0;
sbit wei2=P1^1;
/************24C02 数据和时钟端口定义*****************/
sbit sda=P2^7;
sbit scl=P2^6;
/***************八段共阳 LED 编码***********************/ uchar code table[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90,0x40};
//---实现功能:
//---开始时从 24C02 中读取秒表信息
//
//---每一秒向 24C02 中写一次信息
//---断电或复位重启后从断点前的那一秒开始计数
//
/****************************************************/
/**************包含头文件****************************/
void respons() //应答 {
uchar i; scl=1; delay(); while((sda==1)&&(i<250))i++; scl=0; delay(); } /************IIC 初始化****************************/ void init() { sda=1;
寻址。 1.总线上数据的有效性
IIC 总线是以串行方式传输数据,从数据字节的最高位开始传送,每一个数据位在 SCL 上都有一个时钟脉冲相对应。 在时钟线高电平期间数据线上必须保持稳定 的逻辑电平状态,高电平为数据 1,低电平为数据 0。只有在时钟线为 低电平时,才允许数据线上的电平状态变化,如图 11-2 所示。 2.总线上的信号 IIC 总线在传送数据过程中共有四种类型信号,它们分别是:开始信号、停止信号、重新开始信号和应答信号。

51单片机IIC总线操作及24c02指定地址的读写

51单片机IIC总线操作及24c02指定地址的读写

51单片机IIC总线操作及24c02指定地址的读写51单片机IIC总线操作及24c02指定地址的读写(单片机用STC89C58RD+)//24c02数据读写操作。

程序实现每一秒钟往24c02的指定地址内写入数据(既每一秒钟保存一次当前值)。

//共计时100秒,计时同步显示到数码管上,同时由8个led灯指示十位数的编码值。

//两个按键:单片机上电后按key6按键读取上次关机时存储到24c02内的数据,接着此数据继续计时显示。

//按key5按键计时停止。

#include#include#define uchar unsigned char#define sda P20 //24c02数据接到P2.0口#define scl P21 //24c02时钟接到P2.1口//sbit sda=P2^0;//sbit scl=P2^1;sbit key6=P3^7;sbit key5=P3^6;uchar cont=0;uchar write=0; //标志位uchar code table[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0};void delay(){_nop_();_nop_();_nop_();}void delay1(uchar x){uchar a,b;for(a=x;a>0;a--)for(b=100;b>0;b--);}/***以下为24c02的IIC总线操作及读写数据的通用程序,IIC总线部分的程序可以用在其他IIC器件中参考郭天祥新概念51c语言***/void start() //开始{sda=1;delay();scl=1;delay();sda=0;delay();}void stop() //停止{sda=0;delay();scl=1;delay();sda=1;delay();}void respons() //应答{uchar i;delay();while((sda==1)&&(i<250))i++; scl=0;delay();}void init(){sda=1;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;delay();sda=CY;delay();scl=1;delay();// scl=0;// delay();}scl=0;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();}return k;}void write_add(uchar address,uchar date) //24c02任一地址写入数据{start();write_byte(0xa0);respons();write_byte(address);respons();write_byte(date);respons();}uchar read_add(uchar address) //24c02任一地址读取数据{uchar date;start();write_byte(0xa0);respons();write_byte(address);respons();start();write_byte(0xa1);respons();date=read_byte();stop();return date;}/***以上为24c02的IIC总线操作及读写数据的通用程序,IIC总线部分的程序可以用在其他IIC器件中参考郭天祥新概念51c语言***/void display(uchar shi,uchar ge) //显示子程序,P0口为数码管段{P0=table[shi];P27=0;delay1(5);P27=1;P0=table[ge];P26=0;delay1(5);P1=table[shi]; //led指示灯按十位数变化相应亮灭}void main(){uchar keyscan;init();cont=read_add(36);if(cont==100)cont=0;TMOD=0X01; //ding shi qi gong zuo zai fang shi 1.EA=1;ET0=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1; //启动定时器0P3=P3|0xfc; //11111100 置位按键位,p3口除p3.0和p3.1外接有6个按键keyscan=P3;switch(keyscan|0x03){case 0x7f: //如果key6被按下{while(key5!=0){display(cont/10,cont%10); //分解为十位数和个位数if(write==1){write=0;write_add(36,cont); //每1s写入数据cont到36地址处(地址0~255可任选)}}break;}case 0xbf: //如果key5被按下{while(key6!=0){TR0=0; //停止定时器read_add(36); //读取36号地址处数据静态显示display(cont/10,cont%10);}break;}}}void timer0() interrupt 1{uchar temp;TH0=(65536-50000)/256; //50ms中断初值,晶振12MHzTL0=(65536-50000)%256;temp++;if(temp==20) //temp每中断20次为1s(50ms*20=1000ms=1s) {temp=0;cont++; //每1s时间到cont加一write=1; //到1s时标志位置一,开始往24c02里写入数据if(cont==100)cont=0; //100s时间到从00重新开始计时} }。

外部存储器24c02的读写操作..

外部存储器24c02的读写操作..

/*------51单片机-----------------------名称:外部存储器24c02..芯片:STC89C51..邮箱:MG_TCCX@QQ:2424488418编写:C.ROOKIE日期:2012.9.13 (21:31)内容:定义一个数组,把数组的数据写入24c02存储,然后清楚数组,把24c02的数据读取到数组里,然后显示在数码管上..--------------------------------------*/#include<reg52.h>#include<intrins.h> //这个文件里有空操作指令..#define _Nop() _nop_() //定义空操作指令..unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~Funsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码sbit SCL=P2^0; //模拟IIC总线时钟控制位。

sbit SDA=P2^1; //模拟IIC总线数据传送位。

sbit LATCH1=P2^2; //数码管段选。

sbit LATCH2=P2^3; //数码管位选。

bit ack; //模拟应答标志位。

//声明延时程序。

void DelayUs(unsigned char);void DelayMs(unsigned char);//定义延时程序。

void DelayUs(unsigned char t){while(--t){}}void DelayMs(unsigned char t){while(--t){DelayUs(245);DelayUs(245);}}//启动IIC总线..void Start_IIC(){SDA=1; //SCL=1的情况下,SDA从高电平到低电平就能启动IIC总线.. _Nop();SCL=1; //起始条件建立的时间大概4.7us .._Nop();_Nop();_Nop();_Nop();_Nop();SDA=0; //已经启动IIC总线.._Nop(); //起始条件锁定时间大概4.7us .._Nop();_Nop();_Nop();_Nop();SCL=0; //钳住IIC总线。

读写24c02

读写24c02

24C02作用:保存数据,避免掉电丢失。

IIC总线工作原理
开始信号:当SCL(时钟信号)为高电平的时候,SDA从高电平突然跳变为低电平那一瞬间,24C02就认为那是一个开始信号。

停止信号:当SCL为高电平的时候,SDA从低电平突然跳变为高电平那一瞬间。

应答信号:当单片机向24C02发送了一帧8位的数据之后,将SCL置1,然后读取SDA是否为0,如果为0则证明24C02已经返回了
应答信号,如果一段时间之后SDA仍然不为0,就自动认为已正确接收到数据。

据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。

ATMEL 24c02使用详解(汇编及C程序都有)

ATMEL 24c02使用详解(汇编及C程序都有)

ATMEL 24c02使用详解原文地址: /Blog/cns!2FEAB5F0F11F7A67!296.entryATMEL 24c02使用详解I2C总线是一种用于IC器件之间连接的二线制总线。

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

1.I2C总线的基本结构采用I2C总线标准的单片机或IC器件,其内部不仅有I2C 接口电路,而且将内部各单元电路按功能划分为若干相对独立的模块,通过软件寻址实现片选,减少了器件片选线的连接。

CPU不仅能通过指令将某个功能单元电路挂*或摘离总线,还可对该单元的工作状况进行检测,从而实现对硬件系统的既简单又灵活的扩展与控制。

I2C总线接口电路结构如图1所示。

2.双向传输的接口特性传统的单片机串行接口的发送和接收一般都各用一条线,如MCS51系列的TXD和RXD,而I2C总线则根据器件的功能通过软件程序使其可工作于发送或接收方式。

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

主器件用于启动总线上传送数据并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。

I2C总线的控制完全由挂接在总线上的主器件送出的地址和数据决定。

在总线上,既没有中心机,也没有优先机。

总线上主和从(即发送和接收)的关系不是一成不变的,而是取决于此时数据传送的方向。

SDA和SCL均为双向I/O线,通过上拉电阻接正电源。

当总线空闲时,两根线都是高电平。

连接总线的器件的输出级必须是集电极或漏极开路,以具有线“与”功能。

I2C总线的数据传送速率在标准工作方式下为100kbit/s,在快速方式下,最高传送速率可达400kbit/s。

3.I2C总线上的时钟信号在I2C总线上传送信息时的时钟同步信号是由挂接在SCL 时钟线上的所有器件的逻辑“与”完成的。

24c02写入字符串程序 及管脚说明

24c02写入字符串程序 及管脚说明
}
//测试ACK
bit testack()
{
bitack;
sda=1;
scl=1;
ack=sda;
scl=0;
return(ack);
}
//写入8个bit到24c02
void write_bit(uchar input)
{
uchar temp;
for(temp=8;temp!=0;temp--)
{
sda=(bit)(input&0x80);
testack();
write_bit(ch);
testack();
stop_IIC();
delayms(10);
}
void main(void) //主程序
{
uchar i;
for(i=0;str[i]!=0;i++)
{
write24c02(str[i],i);//逐个写入到24c02的中
}
write24c02(0x00,i); //写入最后一个0
include52头文件defineucharunsignedchar定义变量类型方便使用defineuintunsignedintdefinewritedeviceaddress0xae定义器件在iic总线中的地址最后一位看你a2a1a0所接电平definereaddviceaddress0xafucharcodestryouarebest
{
uchari,j;
for(;number!=0;number--)
{
for(temp=110;temp!=temp--) ;
}
}
//开始
void start_IIC()

24c02引脚功能24c02用在什么地方?具体作用?

24c02引脚功能24c02用在什么地方?具体作用?

24c02引脚功能24c02用在什么地方?具体作用? ​1、24c02用在什么地方?具体作用?串行E2PROM是基于I2C-BUS 的存储器件,遵循二线制协议,由于其具有接口方便,体积小,数据掉电不挥发等特点,在仪器仪表及工业自动化控制中得到大量的应用。

随着世界上各公司对该器件的开发,市场上推出了许多牌号的24C02器件,甚至还有一些冒牌的24C02器件,这样就使批量生产的单片机控制系统的质量出现时好时坏的问题。

笔者经过大量的设计实践和试验摸索找出了24C02在应用中之所以出现数据被冲掉的原因,并总结了一套保护24C02数据安全的软硬件设计方法。

1. 不同牌号24C02的性能区别24C02与单片机的接口非常简单,如图1所示。

A0、A1、A2为器件地址线,WP为写保护引脚,SCL、SDA为二线串行接口,符合I2C总线协议。

在一般单片机系统中,24C02 数据受到干扰的情况是很少的,但是随着单片机抗干扰性能的变差,以及恶劣工业环境中单片机系统的应用,一些智能单片机控制系统相继出现24C02数据被冲掉的问题,而且随着单片机的牌号以及24C02的牌号不同而出现不同程度的干扰现象。

以前通过简单的器件之间替换比较,发现不同牌号的24C02其抗干扰性能是不一样的,于是就认定24C02器件存在"质量"好坏的问题。

后来在一次偶然的机会里,发现有些24C02的WP引脚并不起到保护作用,也就是说将 WP引脚与CPU输出引脚断开并保持高电平的情况下,CPU仍然能够对24C02中的数据进行修改写入!在惊讶之余,笔者收集了许多不同牌号的24C02 进行试验,除了基本的读写功能外,还对地址功能以及WP引脚保护功能进行了全面的检测,发现一种ATMEL(激光印字)以及XICOR牌号的24C02具有全面的符合I2C总线协议的功能,而有些牌号24C02要么没有WP引脚保护功能,要么没有器件地址功能(即2 片24C02不能共用一个I2C总线),有些甚至两种功能均无。

c51写的24c02的读写程序

c51写的24c02的读写程序
#define WriteDeviceAddress 0xa0
#define ReadDviceAddress 0xa1
/***************************************************************************/
sbit SCL=P1^4;
sbit SDA=P1^3;
sbit DOG=P3^7;
/***************************************************************************/
void DelayMs(unsigned int number) {
unsigned char temp;
bit TestAck() {
bit ErrorBit;
SDA=1;
SCL=1;
ErrorBit=SDA;
SCL=0;
return(ErrorBit);
}
/***************************************************************************/
RamAddress++;
bytes--;
}
*RamAddress=Read8Bit();
NoAck();
Stop();
}
/***************************************************************************/
}
/***************************************************************************/

51单片机的24c02电子时钟程序和电路图

51单片机的24c02电子时钟程序和电路图
{
fen++;
if(fen==60)fen=0;
write_sfm(shi,fen,miao);
write_cmd(0xc0+7);
write_add(2,fen);
}
if(s1num==3)
{
shi++;
if(shi==60)shi=0;
write_sfm(shi,fen,miao);
write_cmd(0xc0+4);
}
void keyscan()
{
if(s1==0)//如果功能按键1按下
{
delayms(5);//去抖动
if(s1==0)
{
while(!s1);//等待松手
s1num++;//主要还是记下次数
di();//蜂鸣器响
if(s1num==1)//按一下秒钟
{
TR0=0;
write_cmd(0xc0+10);//指针显示闪烁
sbit lcdrs=P2^4;//液晶的控制角
sbit lcdrw=P2^5;
sbit lcden=P2^6;
sbit s1=P3^0;//三个调时钟的按键
sbit s2=P3^1;
sbit s3=P3^2;
sbit beep=P2^3;//蜂鸣器
uchar count,s1num;
char miao,shi,fen;
delayms(1);
}
void write_sfm(uchar s,uchar f,uchar m)//数据在液晶显示
{
uchar ss,sg,fs,fg,ms,mg;
ss=s/10;sg=s%10;

51单片机之IIC(24C02)

51单片机之IIC(24C02)

51单片机之IIC(24C02)写了前面几篇文件,飞飞感觉51单片机没什么好写的了。

51单片机程序就是这么简单。

在接下来几篇,我提供51单片机实际常用的一些编程。

之后51单片机系列就完了。

接着,stm32单片机系列的开始。

今天,我们开始着手实际的东西。

就从IIC开始吧,对24C02进行读写。

我们从0开始,讲述一下飞飞学习51单片机 IIC控制 24C02的过程。

在大学时代,遇到一个练手项目,项目需要掉电保存数据。

掉电怎么保存数据,都没电了(请原谅我当时是这么小白)我们90以后的人,都有个特点,没事有事爱找度娘。

一查,24C02,一看百度百科,好家伙,还真的可以掉电保存数据,好吧,突然感觉项目有突破点了,起码我找到要去做什么了。

看了一下24C02的资料,发现是通过IIC控制进行读写的。

对于通信方式,我只知道IO高低电平,串口,AD,IIC又是什么鬼?(请原谅我当时是这么小白)没办法,我们90后的人,都有一个特点,没事有事爱找度娘。

什么是IIC?一查,哦,原来就是2个IO,一个叫做SDAI的IO做数据传递,另一个叫做SCL的IO做时序控制。

什么嘛,吓我一跳,原来这么简单。

那IIC到底这么通信呢?没办法,我们90后的人,都有一个特点,没事有事爱找度娘。

一查,原来一个完整的IIC通信就5个控制时序,start,send,ack,receive,stop,加上一个注意点:空闲时,二个IO都为高电平。

(1) start :就是在 SCL 高电平的时候,SDA由高拉低(2)send :在SCL低电平的时候,SDA准备好数据,然后SCL 拉高,此时从机读取SDA的电平,这样就成功传递一个bit 的数据,连续8次,完成一个byte的数据。

(3)ack:应答信号,不管是send动作,还是receive动作,在完成8个脉冲之后,第九个脉冲就是作为ack应答信号,应答时,在SCL低电平时,SDA准备好数据(低电平为应答,高电平为不应答),然后SCL拉高,读取SDA信号,如果为低电平,说明通信成功。

串行EEPROM(24C02)接口方法讲解

串行EEPROM(24C02)接口方法讲解

串行EEPROM(24C02)接口方法在新一代单片机中,无论总线型还是非总线型单片机,为了简化系统结构,提高系统的可靠性,都推出了芯片间的串行数据传输技术,设置了芯片间的串行传输接口或串行总线。

串行总线扩展接线灵活,极易形成用户的模块化结构,同时将大大简化其系统结构。

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

目前,各式各样的串行接口器件层出不穷,如:串行EEPROM,串行ADC/DAC,串行时钟芯片,串行数字电位器,串行微处理器监控芯片,串行温度传感器等等。

串行EEPROM 是在各种串行器件应用中使用较频繁的器件,和并行EEPROM 相比,串行EEPROM 的数据传送的速度较低,但是其体积较小,容量小,所含的引脚也较少。

所以,它特别适合于需要存放非挥发数据,要求速度不高,引脚少的单片机的应用。

这里绍串行EEPROM 芯片,以及它们和单片机的接口技术。

1、串行EEPROM 及其工作原理串行EEPROM 中,较为典型的有ATMEL 公司的AT24CXX 系列以及该公司生产的AT93CXX 系列,较为著名的半导体厂家,包括Microchip,国家半导体厂家等,都有AT93CXX系列EEPROM 产品。

AT24CXX 系列EEPROMAT24CXX 系列的串行电可改写及可编程只读存储器EEPROM 有10 种型号,其中典型的型号有AT24C01A/02/04/08/16 等5 种,它们的存储容量分别是1024/2048/4096/8192/16384位,也就是128/256/512/1 024/2048 字节。

这个系列一般用于低电压,低功耗的工业和商业用途,并且可以组成优化的系统。

这个系统还有多种电压级别,包括5V(4.5~5.5V),2.7V(2.7~5.5V),2.5V(2.5~5.5V),1.8V(1.8~5.5V)等4 种电压级别。

24c02

24c02

第十四篇 I2C总线2011-03-03 22:15第十四篇 I2C总线关于I2C总线的内容比较多,这里只是简单介绍,如需详细了解可以查阅相关资料。

I2C总线(Inter IC BUS)是NXP半导体公司推出的芯片间串行传输总线,它以2根连线实现了完善的双向数据传输。

如图:图中LPC2103做主机(master),其他器件做从机(slave)。

那么器件之间如何传递数据呢?这就要双方都要遵守I2C传输协议。

比如主机像从机发送n个字节:比如主机从从机接收n个字节:关于电平的具体变换情况就不介绍了,因为LPC2103有着完整的I2C接口,我们无须直接操作电平,LPC2103自动完成此操作。

下面用到:LPC2103相关I2C的寄存器有:I2C控制寄存器,其中的几个位控制LPC2103向总线发出开始、应答、停止信号、中断标志、I2C使能,该寄存器是不可见的,我们可以通过向I2C0CONSET写1来使对应位置1,向I2C0CONCLR写1来使对应位清0;I2C0DAT用来放入发送或收取的字节,和C51的SBUF同理;I2C0STAT相当一个报告,记录最近一次的传输状况,你就根据这个“报告”执行下一步该做什么,其状态代码较多,程序中注释要到的那几个。

I2C0SCLH和I2C0SCLL控制I2C位频率,位频率=PCLK/(I2C0SCLH+I2C0SCLL)。

下面以LPC2103(主机)与AT24C02(从机)的I2C传输为例。

首先注意一点:AT24C02里面有一个数据指针,每次读/写一个字节,这个指针就+1,那么如何使此指针指向我们所要的地方呢?情况是这样,在主机向总线发送AT24C02的器件地址(DEVICE ADDRESS)和写命令后(AT24C02的器件地址为0xA0,第0位用作区分读/写标志,读为2,写为0),然后AT24C02发出应答表示以被选中,然后主机向AT24C02发送的第一个字节,会被AT24C02当作自己的数据指针(WORD ADDRESS)。

24c02程序

24c02程序

按下4×4键盘任意一个键,记下数码管显示的值。

复位单片机后数码管显示刚才显示的值学习IIC接口的EEPROM读写:IIC接口的时序比较复杂,对初学者难度较大,要对照at24c02资料的时序图认真研究才明白*/#include<reg51.h>sbit speaker=P3^7;sbit led_k=P1^4;/////////////////键盘sbit v1=P2^0;sbit v2=P2^1;sbit v3=P2^2;sbit v4=P2^3;sbit h1=P2^4;sbit h2=P2^5;sbit h3=P2^6;sbit h4=P2^7;/////////////////显示sbit shu1=P1^3;/*第1位数码管共阴端*/sbit shu2=P1^2;/*第2位数码管共阴端*/sbit shu3=P1^1;/*第3位数码管共阴端*/sbit shu4=P1^0;/*第4位数码管共阴端*/////////////////24c02sbit sda=P1^6;sbit scl=P1^5;void start();void delay1();unsigned int read(unsigned int word_address);void write(unsigned int word_address,da);void delayms(unsigned int i);unsigned char yima[]={0xeb,0x88,0xb3,0xba,0xd8,0x7a,0x7b,0xa8,0xfb,0xfa};/*译码表,此表数据和硬件相关*/unsigned int b=0;/*要显示的数据*/unsigned int b_count=0;/*扫描次数*/void delayms(unsigned int i);unsigned char keyboar();void t0()interrupt 1 using 1 /*中断程序负责显示b的值*/{unsigned char a1=0,a2=0,a3=0,a4=0;static int k=0;/*数码管扫描显示*/a1=b/1000;/*取b的千位*/a2=b%1000/100;/*取b的百位*/a3=b%100/10;/*取b的十位*/a4=b%10;/*取b的个位*/if(k==0){shu4=1;shu1=0;shu2=0;shu3=0;P0=yima[a1];}else if(k==1){shu4=0;shu1=1;shu2=0;shu3=0;P0=yima[a4];}else if(k==2){shu4=0;shu1=0;shu2=1;shu3=0;P0=yima[a3];}else if(k==3){shu4=0;shu1=0;shu2=0;shu3=1;P0=yima[a2];}k++;if(k>3)k=0;TH0=240;}main(){//write(1,60);unsigned char b_tem;b=read(1); //读取eeprom地址为1的数据并赋值给b,定时中断程序把b显示在数码管speaker=0;/*关闭蜂鸣器电源,否则蜂鸣器会发热*/led_k=0;//关闭ledEA=1;/*开全局中断*/TR0=1;/*定时器0开始计数*/ET0=1;/*定时器0开中断*/TMOD=0X01;/*定时器0工作在方式1:16位计数模式*/while(0){}while(1){b_tem=keyboar();/*把按键的代表的值给b */if(b_tem<17){if(b!=b_tem) //当按下的按键与上次按下的不同时,执行写EERPOM。

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读写—相关资料AT24C02是美国Atmel公司的低功耗CMOS型E2PROM,内含256×8位存储空间,具有工作电压宽(2.5~5.5 V)、擦写次数多(大于10 000次)、写入速度快(小于10 ms)、抗干扰能力强、数据不易丢失、体积小等特点。

而且他是采用了I2C总线式进行数据读写的串行器件,占用很少的资源和I/O线,并且支持在线编程,进行数据实时的存取十分方便。

1 AT24C02的引脚功能AT24C02引脚如图1所示。

他的的1、2、3脚是3根地址线,用于确定芯片的硬件地址。

第8脚和第4脚分别为正、负电源。

第5脚SDA为串行数据输入/输出,数据通过这根双向I2C总线串行传送。

第6脚SCL为串行时钟,SDA和SCL为漏极开路端,在实际的应用当中都需要和正电源间各接一个5.1 kΩ的电阻上拉。

第7脚为WP写保护端,接地时允许芯片执行一般的读写操作;接正电源时只允许对器件进行读操作。

2 AT24C02的内部结构图2为AT24C02的内部结构图。

启动、停止逻辑单元 接收数据引脚SDA上的电平信号,判断是否进行启动和停止操作串行控制逻辑单元 根据SCL,SDA电平信号以及“启动、停止逻辑”部件发出的各种信号进行区分,并排列出有关的“寻址”、“读数据”和“写数据”等逻辑,将他们传送到相应的操作单元。

例如:当操作命令为“寻址”时候,他将通知地址计数器加1,并启动“地址比较”器进行工作。

在“读数据”时,他控制“Dout/确认逻辑”单元;在“写数据”时候,他控制“高压泵/定时”电路,以便向E2PROM电路提供编程所需要的高电压。

地址/计数器单元 产生访问E2PROM所需要的存储单元的地址,并将其分别送到X译码器进行字选,送到Y译码器进行位选。

高压泵/定时单元 由于E2PROM数据写入时候需要向电路施加编程高电压,为了解决单一电源电压的供电问题,芯片生产厂家采用了电压的片内提升电路。

电压的提升范围一般可以达12~21.5 V。

24c02编程说明

24c02编程说明

24c02编程说明1、设备地址1个字节高四位1010 (a)指所有EEPROM 设备低四位中A2、A1、A0由芯片管脚电平决定最低位读写控制:1读0写R/ !W2、写操作:字节写、页写(超过页会重复覆盖),写延时15ms(proteus)a、字节写BYTE WRITE: A write operation requires an 8-bit data word address following thedevice address word and acknowledgment. Upon receipt of this address, the EEPROM will again respond with a zero and then clock in the first 8-bit data word. Followingreceipt of the 8-bit data word, the EEPROM will output a zero and the addressing device, such as a microcontroller, must terminate the write sequence with a stop condition. At this time the EEPROM enters an internally timed write cycle, t WR, to thenonvolatile memory. All inputs are disabled during this write cycle and the EEPROM will not respond until the write is complete (refer to Figure 2).b、页写PAGE WRITE: The 1K/2K EEPROM is capable of an 8-byte page write, and the 4K, 8Kand 16K devices are capable of 16-byte page writes.A page write is initiated the same as a byte write, but the microcontroller does not senda stop condition after the first data word is clocked in. Instead, after the EEPROM acknowledges receipt of the first data word, the microcontroller can transmit up to seven(1K/2K) or fifteen (4K, 8K, 16K) more data words. The EEPROM will respond with a zeroafter each data word received. The microcontroller must terminate the page writesequence with a stop condition (refer to Figure 3).The data word address lower three (1K/2K) or four (4K, 8K, 16K) bits are internally incremented following the receipt of each data word. The higher data word address bitsare not incremented, retaining the memory page row location. When the word address, internally generated, reaches the page boundary, the following byte is placed at the beginning of the same page. If more than eight (1K/2K) or sixteen (4K, 8K, 16K) datawords are transmitted to the EEPROM, the data word address will “roll over” and previousdata will be overwritten.注意:此操作只能在page范围内,否则会发生回滚,对于24c02只能对连续8个字节写3、读操作:读当前地址、随机读和连续读(可超过页)a、读当前地址CURRENT ADDRESS READ: The internal data word address counter maintains thelast address accessed during the last read or write operation, incremented by one. This address stays valid between operations as long as the chip power is maintained. The address “roll over” during read is from the last byte of the last memory page to the firstbyte of the first page. The address “roll over” during write is from the last byte of the current page to the first byte of the same page.Once the device address with the read/write select bit set to one is clocked in and acknowledged by the EEPROM, the current address data word is serially clocked out.The microcontroller does not respond with an input zero but does generate a followingstop condition (refer to Figure 4).b、随机读RANDOM READ: A random read requires a “dummy” byte write sequence to load in thedata word address. Once the device address word and data word address are clockedin and acknowledged by the EEPROM, the microcontroller must generate another start condition. The microcontroller now initiates a current address read by sending a device address with the read/write select bit high. The EEPROM acknowledges the deviceaddress and serially clocks out the data word. The microcontroller does not respondwith a zero but does generate a following stop condition (refer to Figure 5).c、连续读SEQUENTIAL READ: Sequential reads are initiated by either a current address read or a random address read. After the microcontroller receives a data word, it responds with an acknowledge. As long as the EEPROM receives an acknowledge, it will continue to increment the data word address and serially clock out sequential data words. When the memory address limit is reached, the data word address will “roll over” and the sequential read will continue. The sequential read operation is terminated when the microcontroller does not respond with a zero but does generate a following stop condition (refer to Figure 6).24C02PAGE 文件夹页写模式24C02BYTE 文件夹字节写模式。

实战24C02读写

实战24C02读写

实战24C02读写AT24C02是美国ATMEL公司的低功耗CMOS串行EEPROM,它是内含256×8位存储空间,具有工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)等特点。

24C02与单片机的联接参见原理图 ,读写程序如下,运行此程序,可以看到其中之一数码管循环显示0,1,2,3,4,5,6,7,8,9的效果。

其根本是,先往24C02中写数据,然后,读出数据,在数码管中显示,这样直观明了,详细说明,请看程序中注解。

此程序是针对24c02的,其实,可以扩展来其他i2c的eeprom.这由你们来完成吧。

#include <at89x51.h>#include <intrins.h> //此文件中有_nop_()空操作函数#define uchar unsigned char#define uint unsigned int#define OP_READ 0xa1 // 器件地址以及读取操作#define OP_WRITE 0xa0 // 器件地址以及写入操作uchar code display[10]={0x28,0xEB,0x32,0xA2,0xE1,0xA4,0x24,0xEA,0x20,0xA0};//数码管0,1,2,3,4,5,6,7,8,9的编码sbit SDA = P2^0; //位定义sbit SCL = P2^1; //位定义void LED_display(uchar i);//数码管显示编码获取函数,例如,i=0,则P0=display[0],即显示数字“0”void start();//开始位void stop();//停止位uchar shin();//从AT24C02移入数据到MCUbit shout(uchar write_data);//从MCU移出数据到AT24C02void write_byte( uchar addr, uchar write_data); //在指定地址addr处写入数据write_datavoid fill_byte(uchar fill_size,uchar fill_data);//填充数据fill_data到EEPROM内fill_size字节void delayms(uchar ms); // 延时子程序uchar read_current(); // 在当前地址读取uchar read_random(uchar random_addr);// 在指定地址读取void LED_display(uchar i){P0 = display[i];}main(void){uchar i;uint j;SDA = 1;SCL = 1;fill_byte(11,0xff); // 将前10字节填充0xfffor(i = 0 ; i < 10; i++) //写入显示代码到AT24C02{write_byte(i, i);P2_7 = 0; //打开数码管1的显示for(i =0 ;i <10 ; i++){LED_display(read_random(i));for (j = 0; j<35000;j++);//延时}}void start()//开始位{SDA = 1;SCL = 1;_nop_();_nop_();SDA = 0;_nop_();_nop_();_nop_();_nop_();SCL = 0;}void stop()// 停止位{SDA = 0;_nop_();_nop_();SCL = 1;_nop_();_nop_();_nop_();_nop_();SDA = 1;}uchar shin()// 从AT24C02移入数据到MCU {uchar i,read_data;for(i = 0; i < 8; i++){SCL = 1;read_data <<= 1;read_data |= (uchar)SDA;SCL = 0;return(read_data);}bit shout(uchar write_data)// 从MCU移出数据到AT24C02{uchar i;bit ack_bit;for(i = 0; i < 8; i++) // 循环移入8个位{SDA = (bit)(write_data & 0x80);_nop_();SCL = 1;_nop_();_nop_();SCL = 0;write_data <<= 1;}SDA = 1; // 读取应答_nop_();_nop_();SCL = 1;_nop_();_nop_();_nop_();_nop_();ack_bit = SDA;SCL = 0;return ack_bit; // 返回AT24C02应答位}void write_byte(uchar addr, uchar write_data)// 在指定地址addr处写入数据write_data{start();shout(OP_WRITE);shout(addr);shout(write_data);stop();delayms(10); // 写入周期}void fill_byte(uchar fill_size,uchar fill_data)// 填充数据fill_data到EEPROM内fill_size字节{uchar i;for(i = 0; i < fill_size; i++){write_byte(i, fill_data);}}uchar read_current()// 在当前地址读取{uchar read_data;start();shout(OP_READ);read_data = shin();stop();return read_data;}uchar read_random(uchar random_addr) // 在指定地址读取{start();shout(OP_WRITE);shout(random_addr);return(read_current());}void delayms(uchar ms)// 延时子程序{uchar i;while(ms--){for(i = 0; i < 120; i++);}}。

手把手教会你24C02

手把手教会你24C02

简易教程第一课24c02 是一个非挥发eeprom 存储器器件,采用的IIC 总线技术。

24c02 在许多试验中都有出现。

24c02 的应用,主要在存储一些掉电后还要保存数据的场合,在上次运行时,保存的数据,在下一次运行时还能够调出。

24c02 采用的IIC 总线,是一种2 线总线,我们在试验中用IO来模拟这种总线,至于总线的时序和原理,请参考相关资料。

如果您不想研究,也没有关系,我们在程序中已经为你写好了,现在和今后您都可以只调用就是,不必花时间和精力去研究。

一块24c02 中有256 个字节的存储空间。

我们将24c02 的两条总线接在了P26 和P27 上,因此,必须先定义:sbit SCL=P2^7;sbit SDA=P2^6;在这个试验中,我们写入了一个字节数值0x88 到24c02 的0x02 的位置。

写入完成后,P10 灯会亮起,我们再在下一颗来读出这个字节来验证结果。

―――――――――――――#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned long#include <reg52.h> //包括一个52 标准内核的头文件//本课试验写入一个字节到24c02 中char code dx516[3] _at_ 0x003b;//这是为了仿真设置的#define WriteDeviceAddress 0xa0 //定义器件在IIC 总线中的地址#define ReadDviceAddress 0xa1sbit SCL=P2^7;sbit SDA=P2^6;sbit P10=P1^0;//定时函数void DelayMs(uint number){uchar temp;for(;number!=0;number--){for(temp=112;temp!=0;temp--) ; }}//开始总线void Start(){SDA=1;SCL=1;SDA=0;SCL=0;}//结束总线void Stop(){SCL=0;SDA=0;SCL=1;SDA=1;}//测试ACKbit TestAck(){bit ErrorBit;SDA=1;SCL=1;ErrorBit=SDA;SCL=0;return(ErrorBit);}//写入8 个bit 到24c02Write8Bit(uchar input){uchar temp;for(temp=8;temp!=0;temp--){SDA=(bit)(input&0x80);SCL=1;SCL=0;input=input<<1;}}//写入一个字节到24c02 中void Write24c02(uchar ch,uchar address) {Start();Write8Bit(WriteDeviceAddress); TestAck();Write8Bit(address);TestAck();Write8Bit(ch);TestAck();Stop();DelayMs(10);}//本课试验写入一个字节到24c02 中void main(void) // 主程序{Write24c02(0x88,0x02);// 将0x88 写入到24c02 的第2 个地址空间P10=0; //指示运行完毕while(1); //程序挂起}―――――――――――――――――tiankai (2010-2-04 23:16:19)【手把手教会24C02】第二课本课的程序已经包含了上一颗的内容,增加了读24c02 的函数,请看程序:―――――――――――――――――――――――――――――#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned long#include <reg52.h> //包括一个52 标准内核的头文件char code dx516[3] _at_ 0x003b;//这是为了仿真设置的#define WriteDeviceAddress 0xa0 //定义器件在IIC 总线中的地址#define ReadDviceAddress 0xa1sbit SCL=P2^7;sbit SDA=P2^6;sbit P10=P1^0;//定时函数void DelayMs(unsigned int number){unsigned char temp;for(;number!=0;number--){for(temp=112;temp!=0;temp--) ; }}//开始总线void Start(){SDA=1;SCL=1;SDA=0;SCL=0;}//结束总线void Stop(){SCL=0;SDA=0;SCL=1;SDA=1;}//发ACK0void NoAck(){SDA=1;SCL=1;SCL=0;}//测试ACKbit TestAck(){bit ErrorBit;SDA=1;SCL=1;ErrorBit=SDA;return(ErrorBit);}//写入8 个bit 到24c02Write8Bit(unsigned char input){unsigned char temp;for(temp=8;temp!=0;temp--){SDA=(bit)(input&0x80);SCL=1;SCL=0;input=input<<1;}}//写入一个字节到24c02 中void Write24c02(uchar ch,uchar address) {Start();Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(address);TestAck();Write8Bit(ch);TestAck();Stop();DelayMs(10);}//从24c02 中读出8 个bituchar Read8Bit(){unsigned char temp,rbyte=0;for(temp=8;temp!=0;temp--){rbyte=rbyte<<1;rbyte=rbyte|((unsigned char)(SDA)) SCL=0;}return(rbyte);}//从24c02 中读出1 个字节uchar Read24c02(uchar address) {uchar ch;Start();Write8Bit(WriteDeviceAddress); TestAck();Write8Bit(address);TestAck();Start();Write8Bit(ReadDviceAddress); TestAck();ch=Read8Bit();NoAck();Stop();return(ch);}//本课试验写入一个字节到24c02 并读出来void main(void) // 主程序{uchar c1,c2;c1=Read24c02(0x02);Write24c02(0x99,0x03);c2=Read24c02(0x03);P10=0;while(1); //程序挂起}――――――――――――――――在主程序中,我们将上一课写入的0x02 位置的数据读出来放在c1 中,新写了一个数据0x99 在0x03 位置中,并立即将它读出来放在c2 中。

24C02-多花样流水灯演示程序

24C02-多花样流水灯演示程序
;-----------------------------------------------------
WRITE_DATA:
MOV R0,#00H ;数据写入首地址
MOV R1,#72 ;共写入72个字节的数据
MOV DPTR,#TAB ;查表
WR_LOOP:
CLR A
MOVC A,@A+DPTR
NOP
NOP
SETB SCL
NOP
NOP
NOP
MOV C,SDA
JC WAITACK ;SDA为低电平,返回了响应信号
CLR SDA
CLR SCL
ห้องสมุดไป่ตู้RET
;----------------------------------------------------
;启动信号子程序
;----------------------------------------------------
/* */
/* ME300B单片机开发系统演示程序-多花样流水灯*/
/* */
/* LED显示*/
/* */
/*将演示数据先写入24C02芯片内,再将其数据逐个读出送P0口LED显示。*/
/* */
/*邮箱: gguoqing@ */
/*网站: */
24C02-多花样流水灯演示程序
作者:gguoqing出处:willar更新时间:2006年07月08日
将72个演示数据先写入24C02芯片内,再将其数据逐个读出送P0口LED显示。
;*******************************************************************
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【手把手教会24C02】第一课24c02 是一个非挥发eeprom 存储器器件,采用的IIC 总线技术。

24c02 在许多试验中都有出现。

24c02 的应用,主要在存储一些掉电后还要保存数据的场合,在上次运行时,保存的数据,在下一次运行时还能够调出。

24c02 采用的IIC 总线,是一种2 线总线,我们在试验中用IO来模拟这种总线,至于总线的时序和原理,请参考相关资料。

如果您不想研究,也没有关系,我们在程序中已经为你写好了,现在和今后您都可以只调用就是,不必花时间和精力去研究。

一块24c02 中有256 个字节的存储空间。

我们将24c02 的两条总线接在了P26 和P27 上,因此,必须先定义:sbit SCL=P2^7;sbit SDA=P2^6;在这个试验中,我们写入了一个字节数值0x88 到24c02 的0x02 的位置。

写入完成后,P10 灯会亮起,我们再在下一颗来读出这个字节来验证结果。

―――――――――――――#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned long#include <reg52.h> //包括一个52 标准内核的头文件//本课试验写入一个字节到24c02 中char code dx516[3] _at_ 0x003b;//这是为了仿真设置的#define WriteDeviceAddress 0xa0 //定义器件在IIC 总线中的地址#define ReadDviceAddress 0xa1sbit SCL=P2^7;sbit SDA=P2^6;sbit P10=P1^0;//定时函数void DelayMs(uint number){uchar temp;for(;number!=0;number--){for(temp=112;temp!=0;temp--) ; }}//开始总线void Start(){SDA=1;SCL=1;SDA=0;SCL=0;}//结束总线void Stop(){SCL=0;SDA=0;SCL=1;SDA=1;}//测试ACKbit TestAck(){bit ErrorBit;SDA=1;SCL=1;ErrorBit=SDA;SCL=0;return(ErrorBit);}//写入8 个bit 到24c02Write8Bit(uchar input){uchar temp;for(temp=8;temp!=0;temp--){SDA=(bit)(input&0x80);SCL=1;SCL=0;input=input<<1;}}//写入一个字节到24c02 中void Write24c02(uchar ch,uchar address) {Start();Write8Bit(WriteDeviceAddress); TestAck();Write8Bit(address);TestAck();Write8Bit(ch);TestAck();Stop();DelayMs(10);}//本课试验写入一个字节到24c02 中void main(void) // 主程序{Write24c02(0x88,0x02);// 将0x88 写入到24c02 的第2 个地址空间P10=0; //指示运行完毕while(1); //程序挂起}―――――――――――――――――tiankai (2010-2-04 23:16:19)【手把手教会24C02】第二课本课的程序已经包含了上一颗的内容,增加了读24c02 的函数,请看程序:―――――――――――――――――――――――――――――#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned long#include <reg52.h> //包括一个52 标准内核的头文件char code dx516[3] _at_ 0x003b;//这是为了仿真设置的#define WriteDeviceAddress 0xa0 //定义器件在IIC 总线中的地址#define ReadDviceAddress 0xa1sbit SCL=P2^7;sbit SDA=P2^6;sbit P10=P1^0;//定时函数void DelayMs(unsigned int number){unsigned char temp;for(;number!=0;number--){for(temp=112;temp!=0;temp--) ; }}//开始总线void Start(){SDA=1;SCL=1;SDA=0;SCL=0;}//结束总线void Stop(){SCL=0;SDA=0;SCL=1;SDA=1;}//发ACK0void NoAck(){SDA=1;SCL=1;SCL=0;}//测试ACKbit TestAck(){bit ErrorBit;SDA=1;SCL=1;ErrorBit=SDA;return(ErrorBit);}//写入8 个bit 到24c02Write8Bit(unsigned char input){unsigned char temp;for(temp=8;temp!=0;temp--){SDA=(bit)(input&0x80);SCL=1;SCL=0;input=input<<1;}}//写入一个字节到24c02 中void Write24c02(uchar ch,uchar address) {Start();Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(address);TestAck();Write8Bit(ch);TestAck();Stop();DelayMs(10);}//从24c02 中读出8 个bituchar Read8Bit(){unsigned char temp,rbyte=0;for(temp=8;temp!=0;temp--){rbyte=rbyte<<1;rbyte=rbyte|((unsigned char)(SDA)) SCL=0;}return(rbyte);}//从24c02 中读出1 个字节uchar Read24c02(uchar address) {uchar ch;Start();Write8Bit(WriteDeviceAddress); TestAck();Write8Bit(address);TestAck();Start();Write8Bit(ReadDviceAddress); TestAck();ch=Read8Bit();NoAck();Stop();return(ch);}//本课试验写入一个字节到24c02 并读出来void main(void) // 主程序{uchar c1,c2;c1=Read24c02(0x02);Write24c02(0x99,0x03);c2=Read24c02(0x03);P10=0;while(1); //程序挂起}――――――――――――――――在主程序中,我们将上一课写入的0x02 位置的数据读出来放在c1 中,新写了一个数据0x99 在0x03 位置中,并立即将它读出来放在c2 中。

tiankai (2010-2-04 23:16:39)【手把手教会24C02】第三课#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned long#include <reg52.h> //包括一个52 标准内核的头文件char code dx516[3] _at_ 0x003b;//这是为了仿真设置的#define WriteDeviceAddress 0xa0 //定义器件在IIC 总线中的地址#define ReadDviceAddress 0xa1sbit SCL=P2^7;sbit SDA=P2^6;sbit P10=P1^0;sbit K1=P3^2;//定时函数void DelayMs(unsigned int number){unsigned char temp;for(;number!=0;number--){for(temp=112;temp!=0;temp--) ;}}//开始总线void Start(){SDA=1;SCL=1;SDA=0;SCL=0;}//结束总线void Stop(){SCL=0;SDA=0;SCL=1;SDA=1;}//发ACK0void NoAck(){SDA=1;SCL=1;SCL=0;}//测试ACKbit TestAck(){bit ErrorBit;SDA=1;SCL=1;ErrorBit=SDA;SCL=0;return(ErrorBit);}//写入8 个bit 到24c02Write8Bit(unsigned char input) {unsigned char temp;for(temp=8;temp!=0;temp--){SDA=(bit)(input&0x80);SCL=1;SCL=0;input=input<<1;}}//写入一个字节到24c02 中void Write24c02(uchar ch,uchar address) {Start();Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(address);TestAck();Write8Bit(ch);TestAck();Stop();DelayMs(10);}//从24c02 中读出8 个bituchar 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);}//从24c02 中读出1 个字节uchar Read24c02(uchar address){uchar ch;Start();Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(address);TestAck();Start();Write8Bit(ReadDviceAddress);TestAck();ch=Read8Bit();NoAck();Stop();return(ch);}//写入按键次数到24c02,并读出来显示在4 个LED上void main(void) // 主程序{uchar c1,c2;while(1){c1=Read24c02(0x01); //读出24c02 第一个地址数据 P1=c1; //显示在P1 口的4 个LED上if(!K1) //按键处理{c1++; //值加1Write24c02(c1,0x01); //重新写入24c02while(!K1); //等待按键松开for(c2=0;c2<250;c2++); //松开按键去抖}}}tiankai (2010-2-04 23:16:59)【手把手教会24C02】第四课前面我们只学习过写入一个字节到24c02 中。

相关文档
最新文档