这个I2C总线程序的错误是那些,看不明白啊
#include<reg52.h>#defineucharunsignedchar#include<intrins.h>sbitsda=P1^2;sbitscl=P1^7...
#include<reg52.h>
#define uchar unsigned char
#include <intrins.h>
sbit sda=P1^2;
sbit scl=P1^7;
void delay()
{
_nop_(); //等待一个机器周期
_nop_(); //等待一个机器周期
_nop_(); //等待一个机器周期
_nop_(); //等待一个机器周期
}
void start()//开始函数
{
sda=1; //置于高电平
delay();//保持高电平,等待scl变化
scl=1; //开始数据传送时,要求SCL为高电平“1”
delay();//保持高电平,起始条件建立时间大于4.7us,延时·
sda=0; // 变为低电平,开始信号,总线在空闲状态下都是被拉为高电平的,当为低电平时表示忙
delay();// 保持低电平
scl=0;//SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
}
void stop();//终止函数
{
sda=0;//置于低电平,发送结束条件的数据信号
delay();//保持低电平
scl=1;// 结束数据传送时,要求时钟线SCL为高电平“1”
delay();//保持高电平,结束条件建立时间要大于4.7us
sda=1;//SDA的上升沿被认为是结束信号
delay();//保持高电平
}
void respons()
{
uchar i;
delay();
scl=1;
delay();
while((sda==1)&&(i<250))//两者进行或运算,当sda为0即有应答时跳出,否则进行循环等待后或运算条件成立跳出
{
i++;
}
scl=0;
delay();
}
void init()//总线初始函数
{
sda=1;//释放两条串行线
scl=1;
}
void write(uchar date)//写数据函数
{
uchar i,temp;
scl=0;//
for(i=0;i<8;i++)//逐位写入数据
{
temp=temp<<1;//左移1位并重新赋值给temp
sda=CY;//把一个字节8位中的最高位给CY;
delay();//延时保证数据稳定
scl=1;//时钟高电平期间数据稳定
delay();//保持时钟高电平
scl=0;//置于低电平
delay();//保持低电平
}
}
void read()//读数据函数
{
uchar i,j,k;
scl=0;//置时钟总线为低准备接受数据
delay();
sda=1;//置数据总线为输入方式
delay();
for(i=0;i<8;i++)//逐位取数据
{
scl=1;
delay();
j=sda;//将该位数据赋给j
k=(k<<1)|j;
scl=0;
}
return k;
}
void main()
{
init();//调用初始化
write(0xa0);//写入器件地址.q器件地址为7位,其中可变部分为3位(片选地址),第8位为读/写选择位
respons();//器件对主机应答
write(3);//写器件内部数据存储器地址
respons();//器件对主机应答
write(0xfe);
respons();//器件对主机应答
stop();//终止
start();
write(0xa1);//读器件地址
respons();//主机对器件应答
write(3);//读器件内部数据存储器地址0-256
respons();//主机对器件应答
P1=read();//将读取的值赋给P1
stop();
while(1);
} 展开
#define uchar unsigned char
#include <intrins.h>
sbit sda=P1^2;
sbit scl=P1^7;
void delay()
{
_nop_(); //等待一个机器周期
_nop_(); //等待一个机器周期
_nop_(); //等待一个机器周期
_nop_(); //等待一个机器周期
}
void start()//开始函数
{
sda=1; //置于高电平
delay();//保持高电平,等待scl变化
scl=1; //开始数据传送时,要求SCL为高电平“1”
delay();//保持高电平,起始条件建立时间大于4.7us,延时·
sda=0; // 变为低电平,开始信号,总线在空闲状态下都是被拉为高电平的,当为低电平时表示忙
delay();// 保持低电平
scl=0;//SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
}
void stop();//终止函数
{
sda=0;//置于低电平,发送结束条件的数据信号
delay();//保持低电平
scl=1;// 结束数据传送时,要求时钟线SCL为高电平“1”
delay();//保持高电平,结束条件建立时间要大于4.7us
sda=1;//SDA的上升沿被认为是结束信号
delay();//保持高电平
}
void respons()
{
uchar i;
delay();
scl=1;
delay();
while((sda==1)&&(i<250))//两者进行或运算,当sda为0即有应答时跳出,否则进行循环等待后或运算条件成立跳出
{
i++;
}
scl=0;
delay();
}
void init()//总线初始函数
{
sda=1;//释放两条串行线
scl=1;
}
void write(uchar date)//写数据函数
{
uchar i,temp;
scl=0;//
for(i=0;i<8;i++)//逐位写入数据
{
temp=temp<<1;//左移1位并重新赋值给temp
sda=CY;//把一个字节8位中的最高位给CY;
delay();//延时保证数据稳定
scl=1;//时钟高电平期间数据稳定
delay();//保持时钟高电平
scl=0;//置于低电平
delay();//保持低电平
}
}
void read()//读数据函数
{
uchar i,j,k;
scl=0;//置时钟总线为低准备接受数据
delay();
sda=1;//置数据总线为输入方式
delay();
for(i=0;i<8;i++)//逐位取数据
{
scl=1;
delay();
j=sda;//将该位数据赋给j
k=(k<<1)|j;
scl=0;
}
return k;
}
void main()
{
init();//调用初始化
write(0xa0);//写入器件地址.q器件地址为7位,其中可变部分为3位(片选地址),第8位为读/写选择位
respons();//器件对主机应答
write(3);//写器件内部数据存储器地址
respons();//器件对主机应答
write(0xfe);
respons();//器件对主机应答
stop();//终止
start();
write(0xa1);//读器件地址
respons();//主机对器件应答
write(3);//读器件内部数据存储器地址0-256
respons();//主机对器件应答
P1=read();//将读取的值赋给P1
stop();
while(1);
} 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询