51单片机程序 24c02 iic总线 程序不正确 求错误原因 由于字数上限,求各位帮忙,就这点钱了!

voidmain(){unsignedchari;wrnb(0x00,1,scdate);IIC_stop();delay();delay();delay();renb(... void main()
{
unsigned char i;
wrnb(0x00,1,scdate);
IIC_stop();
delay();
delay();
delay();
renb(0x00,1,redate);
IIC_stop();
while(1)
{
for(i=0;i<1;i++)
{
P1=redate[i];
delay();
}
}
}
void delay()
{
unsigned char i,j;
for(i=0;i<8;i++)
{
for(j=0;j<125;j++) ;
}
}

//-----------写N个字节-------------
void wrnb(unsigned char adre,unsigned char n,unsigned char *p)
{
unsigned char i=0;
IIC_start();
IIC_sdbyte(0xa0);
IIC_readanswer();
IIC_sdbyte(adre);
IIC_readanswer();
for(;i<n;i++)
{
IIC_sdbyte(*p);
IIC_readanswer();
p++;
}
}

//-----------读N个字节------------
void renb(unsigned char adre,unsigned char n,unsigned char *ap)
{
unsigned char j;
IIC_start();
IIC_sdbyte(0xa0);
IIC_readanswer();
IIC_sdbyte(adre);
IIC_readanswer();
IIC_start();
IIC_sdbyte(0xa1);
IIC_readanswer();
for(j=0;j<n;j++)
{
*ap=IIC_rebyte();
ap++;
if(j<n-1) IIC_answer();
else IIC_noanswer();
}
}
//---------发送起始信号---------
void IIC_start()
{
sda=1;
scl=1;
sda=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
//---------发送终止信号----------
void IIC_stop()
{
sda=0;
scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
sda=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
//--------发送一个字节-------------
void IIC_sdbyte(unsigned char com)
{
unsigned char i=0;
for(;i<8;i++)
{
scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
sda=(bit)(com&0x80);
com=com<<1;
scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
}
//---------接收一个字节----------
unsigned char IIC_rebyte()
{
unsigned char j=0,rdate=0;
for(;j<8;j++)
{
sda=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
rdate=rdate<<1;
if(sda) rdate=rdate|sda;
}
return rdate;
}
//-----------写应答---------
void IIC_answer()
{
sda=0;
scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
scl=0;
sda=1;
}
//-----------写非应答------------
void IIC_noanswer()
{
sda=1;
scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
scl=0;
sda=0;
}
//-----------读应答------------
void IIC_readanswer()
{
unsigned char answer;
sda=1;
scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
scl=1;
answer=sda;
_nop_();_nop_();_nop_();_nop_();_nop_();
scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
展开
 我来答
ATF144X
2011-10-15 · TA获得超过1.2万个赞
知道大有可为答主
回答量:5344
采纳率:77%
帮助的人:4641万
展开全部
这是STC提供的程序包,读写24C04的,和24C02一样的用法,你对比看看吧。
http://www.stcmcu.com/datasheet/stc/STC-USER-CODE/STCMCU-AT24C04.rar
生活如歌_
2011-10-16 · TA获得超过1.5万个赞
知道大有可为答主
回答量:7398
采纳率:78%
帮助的人:2156万
展开全部
留下个邮箱我给你发一个PROTEUS仿真,你在线试一下。
追问
hongshangren@163.com
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
卡幺四
推荐于2016-02-09 · TA获得超过1203个赞
知道大有可为答主
回答量:1571
采纳率:0%
帮助的人:2484万
展开全部
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P1^5;
sbit SDA=P3^6;
//微秒级延时
void delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
//毫秒级延时
void delay_ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//开始信号
void start()
{
SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
SCL=0;
}
//结束信号
void stop()
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}
//应答信号
void ack()
{
uchar i;
SCL=1;
delay();
while((SDA==1)&&(i<250)) i++;
SCL=0;
delay();
}
//初始化
void init()
{
SCL=1;
delay();
SDA=1;
delay();
}
//按位写1个字节 ,并且在第九个脉冲把SDA置高 (SDA置低是为了应答自动置高)
void write_byte(uchar temp)
{
uchar i;
for(i=0;i<8;i++)
{
SCL=0;
delay();
if((temp&0x80)!=0) SDA=1;
else SDA=0;
SCL=1;
delay();
temp<<=1;
}
SCL=0;
delay();
SDA=1;
delay();
}
//按位读1个字节
uchar read_byte()
{
uchar temp=0;
uchar i;
for(i=0;i<8;i++)
{
temp<<=1;
SCL=1;
delay();
if(SDA==1) temp+=1;
SCL=0;
delay();
}
return temp;
}
//写数据
void write_date(uchar add,uchar temp)
{
start();
write_byte(0xa0);
ack();
write_byte(add);
ack();
write_byte(temp);
ack();
stop();
}
//读数据
uchar read_date(uchar add)
{
uchar i;
start();
write_byte(0xa0);
ack();
write_byte(add);
ack();
start();
write_byte(0xa1);
ack();
i=read_byte();
stop();
return i;
}
//主程序
void main()
{
init();
write_date(15,0x01);
delay_ms(100);
P0=read_date(15);
while(1);
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
rose001080
2011-10-21
知道答主
回答量:4
采纳率:0%
帮助的人:6673
展开全部
void IIC_sdbyte(unsigned char com)
{
unsigned char i=0;
for(;i<8;i++)
{
scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
sda=(bit)(com&0x80);
com=com<<1;
scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
} 这里发送8位以后应该把sda置高,以便于写应答时候自动置低,正确的应该是下面:
void IIC_sdbyte(unsigned char com)
{
unsigned char i=0;
for(;i<8;i++)
{
scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
sda=(bit)(com&0x80);
com=com<<1;
scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
sda=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
你写的应答信号好像也不对,下面是我以前写的完整的程序,应该相对简单点,你可以试着操作一下。那个非应答信号可以不写,数据读回来之后不写应答信号即为非应答。
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P1^5;
sbit SDA=P3^6;
//微秒级延时
void delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
//毫秒级延时
void delay_ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//开始信号
void start()
{
SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
SCL=0;
}
//结束信号
void stop()
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}
//应答信号
void ack()
{
uchar i;
SCL=1;
delay();
while((SDA==1)&&(i<250)) i++;
SCL=0;
delay();
}
//初始化
void init()
{
SCL=1;
delay();
SDA=1;
delay();
}
//按位写1个字节 ,并且在第九个脉冲把SDA置高 (SDA置低是为了应答自动置高)
void write_byte(uchar temp)
{
uchar i;
for(i=0;i<8;i++)
{
SCL=0;
delay();
if((temp&0x80)!=0) SDA=1;
else SDA=0;
SCL=1;
delay();
temp<<=1;
}
SCL=0;
delay();
SDA=1;
delay();
}
//按位读1个字节
uchar read_byte()
{
uchar temp=0;
uchar i;
for(i=0;i<8;i++)
{
temp<<=1;
SCL=1;
delay();
if(SDA==1) temp+=1;
SCL=0;
delay();
}
return temp;
}
//写数据
void write_date(uchar add,uchar temp)
{
start();
write_byte(0xa0);
ack();
write_byte(add);
ack();
write_byte(temp);
ack();
stop();
}
//读数据
uchar read_date(uchar add)
{
uchar i;
start();
write_byte(0xa0);
ack();
write_byte(add);
ack();
start();
write_byte(0xa1);
ack();
i=read_byte();
stop();
return i;
}
//主程序
void main()
{
init();
write_date(15,0x01);
delay_ms(100);
P0=read_date(15);
while(1);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式