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

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

/*------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~F
unsigned 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总线。

准备发送或接受数据..
_Nop();
_Nop();
}
//结束IIC总线..
void Stop_IIC()
{
SDA=0; //在SCL=1的情况下,SDA从低电平到高电平就能结束IIC .. _Nop();
SCL=1; //结束条件建立也需要4.7us ..
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1; //IIC总线已经结束..
_Nop();
_Nop();
_Nop();
_Nop();
}
//字节数据传送函数..
/*将数据C发送,可以使地址,也可以是数据。

发送完一个字节就等待应答。

ack=0:表示被控器无应答或损坏..*/
void SendByte(unsigned char c)
{
unsigned char BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
if((c<<BitCnt)&0x80)
{
SDA=1;
}
else
{
SDA=0;
}
_Nop();
SCL=1; //时钟线为高,就可以被控器接受数据..
_Nop(); //时钟线电平变换周期必须大于4us ..
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0;
}
_Nop();
_Nop();
SDA=1; //一个字节传送后准备接受应答信号..
_Nop(); //应答信号是一个数据线低电平的信号..
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
if(SDA==1)
{
ack=0; //SDA=1表示没有应答。

所以ack=0 ..
}
else
{
ack=1; //SDA=0表示有应答信号..
}
SCL=0; //锁定数据总线..
_Nop();
_Nop();
}
//字节数据传送函数..
/*用来接受从器件传来的数据。

然后判断总线是否是出错..*/ unsigned char RcvByte()
{
unsigned char BitCnt;
unsigned char retc=0; //临时变量,用来保存传来的数据..
SDA=1; //置数据线为输入方式..
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop();
SCL=0; //准备接受数据..
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SCL=1; //可以接受数据..
_Nop();
_Nop();
retc=retc<<1;
if(SDA==1)
{
retc=retc+1;
}
_Nop();
_Nop();
}
SCL=0; //锁定IIC总线..
_Nop();
_Nop();
return(retc);
}
//应答子函数..
void Ack_IIC(void)
{
SDA=0;
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0; //钳住IIC总线,以便继续接受数据.. _Nop();
_Nop();
}
//非应答子程序..
void NoAck_IIC(void)
{
SDA=1;
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0;
_Nop();
_Nop();
}
//向有子地址器件发送多字节数据程序..
/*从启动总线到发送地址,子地址,数据,结束总线的全过程。

器件地址sla,
子地址suba,数据*c指向的内容,发送no字节数据..*/
bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *c,unsigned char no)
{
unsigned char i;
Start_IIC(); //启动总线..
SendByte(sla); //发送器件地址..
if(ack==0)
{
return(0); //没有应答信号就结束运行..
}
SendByte(suba); //发送器件子地址..
if(ack==0)
{
return(0); //没有应答信号就结束运行..
}
for(i=0;i<no;i++)
{
SendByte(*c); //发送数据..
if(ack==0)
{
return(0); //没有应答就结束执行..
}
c++;
}
Stop_IIC(); //结束IIC总线..
return(1);
}
//向有子地址器件读取多字节数据程序..
/*从启动总线到发送地址,子地址,读数据,结束总线的过程。

器件地址sla,
子地址suba,读出的数据保存到c指向的存储空间里,读取no个字节数据..*/
bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *c,unsigned char no) {
unsigned char i;
Start_IIC(); //启动IIC总线..
SendByte(sla); //发送器件地址..
if(ack==0)
{
return(0);
}
SendByte(suba); //发送子地址..
if(ack==0)
{
return(0); //没有应答信号就推出执行..
}
Start_IIC();
SendByte(sla+1);
if(ack==0)
{
return(0);
}
for(i=0;i<no-1;i++)
{
*c=RcvByte();
Ack_IIC(); //发送应答信号..
c++;
}
*c=RcvByte();
NoAck_IIC();
Stop_IIC(); //结束IIC总线..
}
//主函数..
void mainz(void)
{
unsigned char dofly[4]={1,2,3,4}; //显示码值..
unsigned char i;
ISendStr(0xae,4,dofly,4); //写入23c02..
DelayMs(200);
dofly[0]=0; //清楚数组数据..
dofly[1]=0;
dofly[2]=0;
dofly[3]=0;
IRcvStr(0xae,4,dofly,4); //调用存储数据.. while(1)
{
P0=dofly_WeiMa[i]; //数码管位选..
LATCH2=1;
LATCH2=0;
P0=dofly_DuanMa[dofly[i]]; //数码管段选.. LATCH1=1;
LATCH1=0;
DelayMs(200);
DelayMs(200);
i++;
if(i==4)
{
i=0;
}
}
}。

相关文档
最新文档