微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 24C02的存储与读取

24C02的存储与读取

时间:11-18 来源:互联网 点击:
/*

------24C02存储与读取-----------
1、用24C02来保存一个数组的内容,然后再把它读出来;
2、应熟练掌握IIC总线的操作方法;
3、启动信号、停止信号,应答与非应答信号、测忙信号
从当前位置读一个字节数据子程序,从当前位置写一个字节子程序,
从指定位置读一个字节数据子程序,从指定位置写一个字节子程序。

4、各种信号的操作时序;
5、该程序也可作为IIC的通用子程序使用;
6、该程序在普中单片机实训箱上通过测试;

*/

#include
#include
#define uint unsigned int
#define uchar unsigned char
unsigned char code dula[] = {0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
uchar wula[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
sbit sda=P2^1; //定义串行数据口
sbit scl=P2^0; //定义串行时钟口
void delay(uint z);
void start();
void stop();
void ack(bit aa);
uchar iic_readbyte();
void iic_writebyte(uchar date1);
void checkack();
uchar iic_addr_read(uchar addr);
void iic_addr_write(uchar addr,uchar date1);
void iic_addr_readn(uchar addr,uchar *s,uchar n);
void iic_addr_writen(uchar addr,uchar *s,uchar n);
void disp();
void nop5();
uchar write1[]={1,2,10,0,0,10,4,8,9,3};
uchar read1[]={0,0,0,0,0,0,0,0,0,0};
bit ack1;
uchar temp3;
//uchar flag1,flag2,num1,num2;
void main()
{
/* 第一种方法从24C02中读取和写入多个字节
uchar jj;
for(jj=0;jj<8;jj++)
{
iic_addr_write(jj+5,write1[jj]);
delay(10);//此延时很重要;
}

delay(10);
for(jj=0;jj<8;jj++)
{
read1[jj]=iic_addr_read(jj+5);
delay(10);//此延时很重要;
} */
//
//第二种方法从24C02中读取和写入多个字节
iic_addr_writen(8,write1,8);
delay(50);
iic_addr_readn(8,read1,8);

while(1)
{disp();
}
}

//-----5US的延时子程序--------------
void nop5()
{
_nop_();_nop_();_nop_();_nop_();_nop_();
}
//-------XMS延时子程序----------------
void delay(uint z)
{
uint x,y;
for(x=0;xfor(y=0;y<112;y++);
}

//-------启动信号-----------
void start()
{
sda=1;
nop5();
scl=1;
nop5();
sda=0;
nop5();
scl=0;
nop5();
}
//-------停止信号-----------
void stop()
{
sda=0;
nop5();
scl=1;
nop5();
sda=1;
nop5();
scl=1;
nop5();
}
//=------应答与非应答信号---------
void ack(bit aa)
{
scl=0;
nop5();
if(aa==1)
sda=1;
else
sda=0;
scl=1;
nop5();
scl=0;
nop5();
}
//-------测忙信号------------
void checkack()
{ uchar i;
sda=1;
scl=0;
nop5();
scl=1;
nop5();
while((sda==1)&&(i<250))
{i++;}
scl=0;
nop5();
}
//-------从当前位置读一个字节数据子程序---------------

uchar iic_readbyte()
{
uchar i,temp;
sda=1;
scl=0;
nop5();
for(i=0;i<8;i++)
{
temp=temp<1;
scl=1;
nop5();
temp=temp|sda;
scl=0;
// nop5();
// nop5();
}
scl=0;
nop5();
return(temp);
}
//-----从当前位置写一个字节子程序-------------
void iic_writebyte(uchar date1 )
{
uchar i,temp;
temp=date1;
for(i=0;i<8;i++)
{
temp=temp<1;
sda=CY;
scl=1;
nop5();
scl=0;
//nop5();
// nop5();
}
checkack();
delay(1);
scl=0;
nop5();
}
//---从指定位置读一个字节数据子程序-----------------
uchar iic_addr_read(uchar addr)
{ uchar k2;
start();
iic_writebyte(0xa0);
delay(1);
iic_writebyte(addr);
delay(1);
start();
delay(10);
iic_writebyte(0xa1);
delay(10);
k2=iic_readbyte();
ack(1);
stop();
return(k2);
}

//---从指定位置写一个字节子程序-------------
void iic_addr_write(uchar addr,uchar date1)
{
start();
iic_writebyte(0xa0);
delay(1);
iic_writebyte(addr);
delay(1);
iic_writebyte(date1);
delay(1);
stop();
}
//----------从指定位置写多个字节子程序-------------------
void iic_addr_writen(uchar addr,uchar *s,uchar n)
{
uchar i;
start();
iic_writebyte(0xa0);
//delay(1);
iic_writebyte(addr);
// delay(1);
for(i=0;i{
iic_writebyte(*s);
delay(20);//此延时一定要长一些,否则易出错
s++; //因为器件反应时间慢,给它留足够的时间;
}
stop();
}
//-------从指定位置读多个字节数据子程序-------------------------
void iic_addr_readn(uchar addr,uchar *s,uchar n)
{
uchar i;
start();
iic_writebyte(0xa0);
//delay(1);
iic_writebyte(addr);
//delay(10);
start();
//delay(15);
iic_writebyte(0xa1);
//delay(10);
for(i=0;i{
*s=iic_readbyte();
delay(1);
ack(0);
delay(20);//此延时一定要长一些,否则易出错
s++; //因为器件反应时间慢,给它留足够的时间;
}
*s=iic_readbyte();
ack(1);
stop();
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top