大家好,谁有时间帮我解答一下这个问题,我写了一个iic的小程序,可为什仿真时iic监视器显示有数据,而芯片AT24C02C的存储器里显示的全是FF,我程序在18号地址写的是20,是程序软件的问题吗?
#include<STC12C5A60S2.h>
#include <intrins.h>
#define uchar unsigned char
#define ui unsigned int
sbit sda=P2^1;
sbit scl=P2^0;
uchar c=20;
void delay7us() // 延时函数
{
unsigned char a;
for(a=2;a>0;a--);
}
void init()
{sda=1;
delay7us();
scl=1;
delay7us();
}
/*启动信号函数*/
void start() //启动信号函数
{ scl=1;
sda=1;
delay7us();
sda=0;
delay7us();
}
/*写一个字节的函数*/
void write_iic_byte(uchar dat)
{ uchar i;
scl=0; /*主机拉低为的是SDA数据线
可以发生变化并为SDA拉高,让
接受设备接收数据做准备*/
/*发送八位数据*/
for(i=0;i<8;i++)
{ if(dat&0X80)
sda=1;/*主机将数据1存入SDA*/
else
sda=0;/*主机将数据0存入SDA
,也可认为是存入一个
存储器*/
scl=1; /*主机将时钟数据线拉高*/
delay7us(); /*延时接收设备在此期间
自动取走*/
dat=dat<<1;/* 数据左移一位,次高位
变成发送数据位*/
scl=0;/*时钟线拉低为更改发送数据
位做准备,只有其为低数据线
上的数据才会发生改变。*/
}
sda=1;/*释放数据线*/
}
/*读一个字节的函数*/
uchar read_iic_byte()
{ uchar i,v;/*暂时为空变量,8次后
存储要保存的数据*/
sda=1;/*主机释放数据线,这数据
状态以后有发送设备决定*/
scl=0;/*主机将时钟信号线拉低,
/*SDA线上的数据才会改变*/
/*从设备发送八位数据*/
for(i=0;i<8;i++)
{ v=v<<1; /*第一次循环无意义,以后
发送用*/
scl=1; /*以后发送期间数据稳定*/
delay7us();/*延时使主机有时间取走
数据*/
if(sda) /*SDA发送从设备里最高位数据
1,第一次循环从此发送第一
位数据*/
v=v|0X01;/*把1传入变量V的最低位*/
scl=0; /*时钟线拉低发送数据由发送
设备自动改变*/
delay7us();/*延时使时钟线可靠拉低
,有充足时间数据被读走
*/
}
return v; /*被读的数据存在V中,
作为返回值/*返回*/
}
void stop()//停止信号函数
{scl=1;
sda=0;
delay7us();
sda=1;
delay7us();
}
/*产生和检测应答信号 */
uchar ack()
{uchar i;
scl=0;
sda=0;
delay7us();
scl=1;
delay7us();
while(sda==1)
{ i++;
if(i>260)
{
stop();
return 1;
}
}
return 0;
}
/* 产生非应答信号*/
void noack()
{scl=0;
sda=1;
delay7us();
scl=1;
delay7us();
scl=0;
}
void main()
{
{init();
start();
write_iic_byte(0XA0);
ack();
write_iic_byte(0X18);
ack();
write_iic_byte(c);
ack();
stop();
delay7us();
}
while(1);
}