谁帮忙看看我的iic程序有什么问题(89c52单片机)
时间:10-02
整理:3721RD
点击:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//sbit diola=P2^5;
sbit scl=P2^1;
sbit sda=P2^0;
void delay_us(uchar xus)
{
uchar i;
for(i=xus;i>0;i--)
{
_nop_();
}
}
void delay(uint cnt)
{
uchar n;
uint m;
for(m=cnt;m>0;m--)
for(n=110;n>0;n--);
}
void iic_start()
{
sda=1;
delay_us(5);
scl=1;
delay_us(5);
sda=0;
delay_us(5);
}
void iic_stop()
{
sda=0;
delay_us(5);
scl=1;
delay_us(5);
sda=1;
delay_us(5);
}
void iic_ack()
{
uchar i;
scl=1;
delay_us(5);
while((sda==1)&&(i<250)) i++;
scl=0;
delay_us(5);
}
void iic_sbyte(uchar dat) //发送字节
{
uchar i,temp;
temp=dat;
for(i=0;i<8;i++)
{ temp<<=1;
scl=0;
delay_us(5);
sda=CY;
delay_us(5);
scl=1;
delay_us(5);
}
scl=0;
delay_us(5);
sda=1;
delay_us(5);
}
uchar iic_rbyte() //接收字节
{
uchar i,t;
scl=0;
delay_us(5);
sda=1;
delay_us(5);
for(i=0;i<8;i++)
{
scl=1;
delay_us(5);
t=(t<<1)|sda;
delay_us(5);
scl=0;
delay_us(5);
}
// delay_us(5);
return t;
}
void iic_sproc(uchar add,uchar sdat)
{
iic_start();
iic_sbyte(0xa0);
iic_ack();
iic_sbyte(add);
iic_ack();
iic_sbyte(sdat);
iic_ack();
iic_stop();
// delay(10);
}
uchar iic_rproc(uchar addr)
{
uchar date;
iic_start();
iic_sbyte(0xa0);
iic_ack();
iic_sbyte(addr);
iic_ack();
iic_start();
iic_sbyte(0xa1);
iic_ack();
date=iic_rbyte();
iic_stop();
// delay(10);
return date;
}
iic_init()
{
scl=1;
delay_us(6);
sda=1;
delay_us(6);
}
void main()
{
iic_init();
iic_sproc(3,0x30);
delay(100);
P1=iic_rproc(3); //led灯亮
while(1);
}
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//sbit diola=P2^5;
sbit scl=P2^1;
sbit sda=P2^0;
void delay_us(uchar xus)
{
uchar i;
for(i=xus;i>0;i--)
{
_nop_();
}
}
void delay(uint cnt)
{
uchar n;
uint m;
for(m=cnt;m>0;m--)
for(n=110;n>0;n--);
}
void iic_start()
{
sda=1;
delay_us(5);
scl=1;
delay_us(5);
sda=0;
delay_us(5);
}
void iic_stop()
{
sda=0;
delay_us(5);
scl=1;
delay_us(5);
sda=1;
delay_us(5);
}
void iic_ack()
{
uchar i;
scl=1;
delay_us(5);
while((sda==1)&&(i<250)) i++;
scl=0;
delay_us(5);
}
void iic_sbyte(uchar dat) //发送字节
{
uchar i,temp;
temp=dat;
for(i=0;i<8;i++)
{ temp<<=1;
scl=0;
delay_us(5);
sda=CY;
delay_us(5);
scl=1;
delay_us(5);
}
scl=0;
delay_us(5);
sda=1;
delay_us(5);
}
uchar iic_rbyte() //接收字节
{
uchar i,t;
scl=0;
delay_us(5);
sda=1;
delay_us(5);
for(i=0;i<8;i++)
{
scl=1;
delay_us(5);
t=(t<<1)|sda;
delay_us(5);
scl=0;
delay_us(5);
}
// delay_us(5);
return t;
}
void iic_sproc(uchar add,uchar sdat)
{
iic_start();
iic_sbyte(0xa0);
iic_ack();
iic_sbyte(add);
iic_ack();
iic_sbyte(sdat);
iic_ack();
iic_stop();
// delay(10);
}
uchar iic_rproc(uchar addr)
{
uchar date;
iic_start();
iic_sbyte(0xa0);
iic_ack();
iic_sbyte(addr);
iic_ack();
iic_start();
iic_sbyte(0xa1);
iic_ack();
date=iic_rbyte();
iic_stop();
// delay(10);
return date;
}
iic_init()
{
scl=1;
delay_us(6);
sda=1;
delay_us(6);
}
void main()
{
iic_init();
iic_sproc(3,0x30);
delay(100);
P1=iic_rproc(3); //led灯亮
while(1);
}