
对iicEEPROM进行写入 *** 作时,IC内部有个自循环写时序大约10mS(不同的芯片可能略有差异),如果在这个时序尚未结束之前,执行读 *** 作,读出的数据只能是先前有效的写 *** 作记录的数据,因为单步调试 *** 作的时间远大于10mS,iic的自循环写时序已经结束,所以读出的数据是正确的。建议在写 *** 作之后延时10mS后再进行读 *** 作。
此测试程序是先写后读,已经测度通过,希望对你有用!!! /
24c02测试程序 20111201 wqz
/
#include<reg52h>
#include<intrinsh>typedef unsigned char uchar;#define delay5us() _nop_();_nop_();_nop_();_nop_();_nop_();
// _nop_();_nop_();_nop_();_nop_();_nop_(); //延时sbit SDA=P2^7; //IIC总线
sbit SCL=P2^6;
sbit IO =P1^7; //595控制信号
sbit RLK =P1^6;
sbit CLK =P1^5;void my_delay1ms(int t); //晶振频率为110592时,延时为1ms
void Start(); //起始信号
void stop(); //结束信号
void ACK(); //写应答
bit test(); //测试应答信号
void nn(); //不应答
void write_1byte(uchar num);//写一字节数据
uchar read_1byte(); //读一字节数据
uchar write_data(uchar addr,uchar Data,uchar num); //将数据写入24C02中
void write_mpage(uchar addr,uchar Data,uchar num); //页写
void read_data(uchar addr,uchar p,uchar num2); //从24C02中读出数据/
主函数
/void main()
{
uchar i,j,aa; uchar dis1[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,<br> 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0--F
uchar dis2[16]; //将dis1中的数据写入24C02后读出存在dis2中
write_mpage(0,dis1,16); //写
my_delay1ms(10);
read_data(0,dis2,16); // 读
my_delay1ms(10); while(1)
{
for(j=0;j<16;j++) //将读出的数据显示在数码管上,测试正确性
{
aa=dis2[j];
RLK=0;
for(i=0;i<8;i++)
{
aa<<=1;
IO=CY;
CLK=0;
CLK=1;
}
RLK=1;
my_delay1ms(2000);
}
}
}//void my_delay1ms(int t) //晶振频率为110592时,延时为1ms
{
uchar i,j; while(t--)
{
for(i=10;i>0;i--)
for(j=41;j>0;j--);
}
}//void Start() //起始信号
{
SDA=1;
SCL=1;
delay5us();
SDA=0;
delay5us();
SCL=0;
delay5us();
SDA=1;
}//void stop() //结束信号
{
SDA=0;
delay5us();
SCL=0;
SCL=1;
delay5us();
SDA=1;
}//void ACK() //写应答
{
SDA=0;
SCL=1;
delay5us();
SCL=0;
delay5us();
SDA=1;
}//bit test() //测试应答信号
{
bit a; SDA=1;
delay5us();
SCL=1;
a=SDA;
SCL=0;
return(a);
}//void nn() //不应答
{
SDA=1;
SCL=0;
delay5us();
SCL=1;
}//void write_1byte(uchar num)//写一字节数据
{
uchar i,date; date=num;
for(i=0;i<8;i++)
{
date<<=1;
SDA=CY;
delay5us();
SCL=1;
delay5us();
SCL=0;
}
}//uchar read_1byte() //读一字节数据
{
uchar i,tember=0; for (i=0;i<8;i++)
{
tember<<=1;
if(SDA)
tember|=0x01;
SCL=1;
delay5us();
SCL=0;
}
return tember;
}//uchar write_data(uchar addr,uchar Data,uchar num) //将数据写入24C02中
{
uchar i,diz; diz=addr;
Start();
write_1byte(0xa0);
test();
write_1byte(diz);
test();
for(i=0;i<num;)
{
write_1byte(Data++);
test();
i++;
diz++;
if((diz&0x07)==0) break;
}
stop();
return (num-i);
}//void write_mpage(uchar addr,uchar Data,uchar num) //页写
{
uchar ff; ff=num;
do
{
ff=write_data( addr+(num-ff),Data+(num-ff),ff);
my_delay1ms(10);
}
while(ff);
}//void read_data(uchar addr,uchar p,uchar num2) //从24C02中读出数据
{
uchar i; Start();
write_1byte(0xa0);
test();
write_1byte(addr);
test();
Start();
write_1byte(0xa1);
test();
for(i=0;i<num2-1;i++)
{
p++=read_1byte();
ACK();
}
p=read_1byte();
nn();
stop();
}
以上就是关于单片机用IIC读写EEPROM全部的内容,包括:单片机用IIC读写EEPROM、有没有单片机程序,是把IIC的数据读出来。是有应答的。。具体还没想到思路,还想有人执教一下、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)