您的位置 首页 电源

24C02的存储与读取

/*——24C02的存储与读取———–1、用24C02来保存一个数组的内容,然后再把它读出来;2、应熟练掌握IIC总线的操作方法;3、启动信号…

/*

——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();
}

//—–显现数据———-
void disp()
{uchar i;
for(i=0;i<8;i++)
{P0=dula[read1[i]];
P1=wula[i];
delay(3);
P0=0;
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/266107.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部