51单片机 24C02程序不知道哪里出问题,求助
现象与我所写的代码不符、、、、、、#include<reg51.h>#include<intrins.h>#defineuintunsignedint#defineuch...
现象与我所写的代码不符、、、、、、
#include<reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit sda=P2^0; //IO口定义
sbit scl=P2^1;
sbit beep=P2^3;
//延时2MS左右(一个nop()12M的晶振1MS)
void nop()
{
_nop_();
_nop_();
}
/////////24C02读写驱动程序////////////////////
void delayms(uint m)
{
uint i;
for(;m>0;m--)
for(i=110;i>0;i--);
}
void clock() //I2C总线时钟
{
unsigned char i=0;
scl=1;
nop();
while((sda==1)&&(i<255))
i++;
scl=0;
nop();
}
void init() //24c02初始化子程序
{
scl=1;
nop();
sda=1;
nop();
}
void start() //启动I2C总线
{
sda=1;
nop();
scl=1;
nop();
sda=0;
nop();
scl=0;
nop();
}
void stop() //停止I2C总线
{
sda=0;
nop();
scl=1;
nop();
sda=1;
nop();
}
void writebyte(uchar j) //写一个字节
{
unsigned char i,temp;
temp=j;
for (i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
nop();
sda=CY; //temp左移时,移出的值放入了CY中
nop();
scl=1; //待sda线上的数据稳定后,将scl拉高
nop();
}
scl=0;
nop();
sda=1;
nop();
}
uchar readbyte() //读一个字节
{
unsigned char i,j,k=0;
scl=0; nop(); sda=1;
for (i=0;i<8;i++)
{
nop();
scl=1;
nop();
if(sda==1)
j=1;
else
j=0;
k=(k<<1)|j;
scl=0;
}
nop();
return(k);
}
void writeadd (uchar add,uchar date)
{
start();
writebyte(0xa0);
clock();
writebyte(add);
clock();
writebyte(date);
clock();
stop();
}
uchar readadd (uchar add)
{
uchar date;
start();
writebyte(0xa0);
clock();
writebyte(add);
clock();
start();
writebyte(0xa1);
clock();
date=readbyte();
stop();
return date;
}
void main()
{ int i=0;
init();
while(1)
{
writeadd(2,0xaa);
i=readadd(2);
i++;
P1=readadd(2);
delayms(1000);
if(i>1)
writeadd(2,0x55);
P1=readadd(2);
delayms(1000);
}
} 展开
#include<reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit sda=P2^0; //IO口定义
sbit scl=P2^1;
sbit beep=P2^3;
//延时2MS左右(一个nop()12M的晶振1MS)
void nop()
{
_nop_();
_nop_();
}
/////////24C02读写驱动程序////////////////////
void delayms(uint m)
{
uint i;
for(;m>0;m--)
for(i=110;i>0;i--);
}
void clock() //I2C总线时钟
{
unsigned char i=0;
scl=1;
nop();
while((sda==1)&&(i<255))
i++;
scl=0;
nop();
}
void init() //24c02初始化子程序
{
scl=1;
nop();
sda=1;
nop();
}
void start() //启动I2C总线
{
sda=1;
nop();
scl=1;
nop();
sda=0;
nop();
scl=0;
nop();
}
void stop() //停止I2C总线
{
sda=0;
nop();
scl=1;
nop();
sda=1;
nop();
}
void writebyte(uchar j) //写一个字节
{
unsigned char i,temp;
temp=j;
for (i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
nop();
sda=CY; //temp左移时,移出的值放入了CY中
nop();
scl=1; //待sda线上的数据稳定后,将scl拉高
nop();
}
scl=0;
nop();
sda=1;
nop();
}
uchar readbyte() //读一个字节
{
unsigned char i,j,k=0;
scl=0; nop(); sda=1;
for (i=0;i<8;i++)
{
nop();
scl=1;
nop();
if(sda==1)
j=1;
else
j=0;
k=(k<<1)|j;
scl=0;
}
nop();
return(k);
}
void writeadd (uchar add,uchar date)
{
start();
writebyte(0xa0);
clock();
writebyte(add);
clock();
writebyte(date);
clock();
stop();
}
uchar readadd (uchar add)
{
uchar date;
start();
writebyte(0xa0);
clock();
writebyte(add);
clock();
start();
writebyte(0xa1);
clock();
date=readbyte();
stop();
return date;
}
void main()
{ int i=0;
init();
while(1)
{
writeadd(2,0xaa);
i=readadd(2);
i++;
P1=readadd(2);
delayms(1000);
if(i>1)
writeadd(2,0x55);
P1=readadd(2);
delayms(1000);
}
} 展开
4个回答
展开全部
问题出在延时语句不正确
追问
请问该怎么改呢
追答
void delay(void)
{
uint i;
for(i=100;i>0;i--)
_nop_();
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
印象中I2C总线操作时序好像至少要延时4.7uS,你的两个nop 达不到。还有注意上拉电阻选值。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-03-10
展开全部
什么问题,贴程序
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询