51单片机的IIC总线和24C02驱动不了,调试发现P2口的值为0XFF不变..求大侠解析啊
#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintsbi...
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda=P1^2;
sbit scl=P1^1;
void start(void);
void stop(void);
void ack(void);
void noack(void);
void iicwr_byte(uchar dat);
uchar iicre_byte(void);
void delay(void);
void init(void);
void delay1(void);
void delay(void)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
void start(void)
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop(void)
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void ack(void)
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<200))i++;
scl=0;
delay();
}
void noack(void)
{
sda=1;
delay();
scl=1;
delay();
scl=0;
delay();
}
void init(void)
{
sda=1;
scl=1;
}
void iicwr_byte(uchar dat)
{
uchar i;
scl=0;
for(i=0;i<8;i++)
{
if(dat&&0x80)
{
sda=1;
}
else
{
sda=0;
}
dat=dat<<1;
delay();
scl=1;
delay();
scl=0;
delay();
}
sda=1;
delay();
}
uchar iicre_byte(void)
{
uchar i;
uchar dat;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay;
dat=dat<<1;
if(sda)
{
dat++;
}
scl=0;
delay();
}
return dat;
}
void delay1(void)
{
uint a=30000;
while(a--);
}
void main()
{
init();
start();
iicwr_byte(0xa0);
ack();
iicwr_byte(10);
ack();
iicwr_byte(0x55);
ack();
stop();
delay1();
init();
start();
iicwr_byte(0xa0);
ack();
iicwr_byte(10);
ack();
start();
iicwr_byte(0xa1);
ack();
P2=iicre_byte();
noack();
stop();
while(1);
}
谢谢啦~~ 展开
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda=P1^2;
sbit scl=P1^1;
void start(void);
void stop(void);
void ack(void);
void noack(void);
void iicwr_byte(uchar dat);
uchar iicre_byte(void);
void delay(void);
void init(void);
void delay1(void);
void delay(void)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
void start(void)
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop(void)
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void ack(void)
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<200))i++;
scl=0;
delay();
}
void noack(void)
{
sda=1;
delay();
scl=1;
delay();
scl=0;
delay();
}
void init(void)
{
sda=1;
scl=1;
}
void iicwr_byte(uchar dat)
{
uchar i;
scl=0;
for(i=0;i<8;i++)
{
if(dat&&0x80)
{
sda=1;
}
else
{
sda=0;
}
dat=dat<<1;
delay();
scl=1;
delay();
scl=0;
delay();
}
sda=1;
delay();
}
uchar iicre_byte(void)
{
uchar i;
uchar dat;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay;
dat=dat<<1;
if(sda)
{
dat++;
}
scl=0;
delay();
}
return dat;
}
void delay1(void)
{
uint a=30000;
while(a--);
}
void main()
{
init();
start();
iicwr_byte(0xa0);
ack();
iicwr_byte(10);
ack();
iicwr_byte(0x55);
ack();
stop();
delay1();
init();
start();
iicwr_byte(0xa0);
ack();
iicwr_byte(10);
ack();
start();
iicwr_byte(0xa1);
ack();
P2=iicre_byte();
noack();
stop();
while(1);
}
谢谢啦~~ 展开
1个回答
展开全部
void iicwr_byte(uchar dat)
这个函数里面 if(dat&&0x80) 应该是if(dat&0x80),按位与不是逻辑与并键。
void delay1(void)延时时间可能有点短,应该唯野延时10ms,多调用两次或在建个延时函数延指蔽喊时10ms都可以。
这个函数里面 if(dat&&0x80) 应该是if(dat&0x80),按位与不是逻辑与并键。
void delay1(void)延时时间可能有点短,应该唯野延时10ms,多调用两次或在建个延时函数延指蔽喊时10ms都可以。
更多追问追答
追问
还是不行~~~调试出来还是0XFF....头都大了
追答
你用的什么型号的单片机?
把写函数改一下:
void iicwr_byte(uchar dat)
{
uchar i;
scl=1;
for(i=0;i<8;i++)
{
if(dat&&0x80)
{
sda=1;
}
else
{
sda=0;
}
dat=dat<<1;
delay();
scl=0;
delay();
scl=1;
delay();
}
sda=0;
delay();
sda=1;
delay();
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询