关于I2c总线的编程无法实现
这是程序代码 求帮忙 指出错误!#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay()
{ ; ; }
bit write=0;
sbit sda=P2^0;
sbit scl=P2^1;
void init()
{
scl=1;
sda=1;
}
void start()
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop()
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void respons()
{
uchar i=0;
scl=1;
delay();
while((sda==1)&&(i<255))
i++;
scl=0;
delay();
}
void delay1(uint xsm)
{
uint i,j;
for(i=xsm;i>0;i--)
for(j=110;j>0;j--);
}
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
sda=CY;
scl=1;
delay();
scl=0;
delay();
}
scl=0;
delay();
sda=1;
delay();
}
uchar read_byte()
{
uchar i,k;
for(i=0;i<8;i++)
{
k=(k<<1)|sda;
delay();
scl=1;
delay();
scl=0;
delay();
}
delay();
return k;
}
void main()
{ uchar a;
init();
start();
write_byte(0xa0);
respons();
write_byte(0xaa);
respons();
write_byte(0xaa);
respons();
stop();
delay1(100);
start();
write_byte(0xa0);
respons();
write_byte(0xaa);
respons();
start();
write_byte(0xa1);
respons();
write_byte(0xaa);
a=read_byte();
a=P1;
stop();
while(1);
} **下去你一定能有所突破,老实说大部分人智力都差不多。。
I2C使用的关键是时序,按技术资料的时序写没问题,范例中都有,重在调试。
a=read_byte();
a=P1;
stop();
while(1);
}
后面那句反了吧,改为P1=a; 买个便宜的逻辑分析仪,照着时序很容易调试的。
时钟线SCL高电平期间,数据线SDA的电平不能变化,否则,将被认为是一个起始信号S或终止信号P,引起出错
若需改变数据线SDA的电平,必须先拉低时钟线SCL电平。
启动信号通用子程序STAT
voidSTAT ( ){ //启动信号子函数STAT
SCL=0;SDA=1; //时钟线低电平期间,改变SDA电平(高电平)
SCL=1; //时钟线发出时钟脉冲
SDA=0; //在时钟线高电平期间,SDA下跳变(启动信号规定动作)
SCL=0;} //SCL低电平复位,与SCL=1组成时钟脉冲 应该是你上传的程序少了一句SCL=0,使得时序出错。
上述程序少了4us延时,用于proteus仿真没问题,用于实例最好加4us延时吧。
用逻辑分析仪,挂上,看看如何。
好的,我明天去单位试一下,多谢各位大侠了哈
页:
[1]