51单片机的IIC总线先测试程序
源代码在线查看: 串行写入数据控制led.c
/*先将数据0x01通过IIC写入到AT24C02中,
再将其从AT24C02中读出来付给P1口,期间
需要编写延时、写数据、读数据、应答、起始、
结束这几个子函数*/
#include
#define uchar unsigned char
sbit sda=P2^0;
sbit scl=P2^1;
uchar a;
void delay1()//短延时,用于读写操作模块内的延时。
{ ; ; }
void delay2(uchar z)//长延时用于读写模块间的延时。
{
uchar x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
void start()//根据时序图,在scl=1期间,sda有一个负跳变
{
sda=1;
delay1();
scl=1;
delay1();
sda=0;
delay1();
}
void response()//应答信号,在第九个数据后scl=1期间sda为0时即为应答。
{
uchar i;
scl=1;
delay1();
while((sda==1)&&(i scl=0;
delay1();
}
void initial()
{
sda=1;
scl=1;
}
void write_byte(uchar dat)
{
uchar i,j;
j=dat;
for(i=0;i {
j=j scl=0;
delay1();
sda=CY;
delay1();
scl=1;//写入一位数据
delay1();
// scl=0;
// delay1();
}
scl=0;
delay1();
sda=1;//释放总线,以读取应答信号
delay1();
}
uchar read_byte()
{
uchar i,j,k;
scl=0;
delay1();
sda=1;
delay1();
for(i=0;i {
scl=1;
delay1();
j=sda;//将总线的一位数据给j
k=(k delay1();
scl=0;
delay1();
}
return k;
}
void stop()
{
sda=0;
delay1();
scl=1;
delay1();
sda=1;
delay1();
}
void main()
{
initial();
start();
write_byte(0xa0);//写器件地址,高四位1010,第四位全0.
response();
write_byte(3);//写器件内部数据地址
response();
write_byte(0x55);
response();
stop();
//下面是从AT24C02中读出数据给P1口。
delay2(100);
start();
write_byte(0xa0);//写器件地址,高四位1010,第四位全0.
response();
write_byte(3);//写器件内部数据地址
response();
start();
write_byte(0xa1);
response();
a=read_byte();
stop();
P1=a;
while(1);
}