手把手教会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();
}
/***************************************************************************/
}
/***************************************************************************/
  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 中。

相关文档
最新文档