该用户从未签到
论坛元老
- 最后登录
- 2021-2-27
|
发表于 2018-8-11 00:35:06
|
显示全部楼层
楼上大家也说了这么多了,那我给你提供一个参考。
#include<reg52.h>
//---------------------------------------------------------
#define uchar unsigned char
#define SDA P3_6
#define SCL P3_7
//-----------------------------------------------------------------------
void delay_100us();
void delay_1s();
void i2c_start();
void i2c_stop();
void get_ack();
void i2c_send_byte(uchar mydata);
void i2c_write_byte(uchar dev_addr_wr,uchar word_addr,uchar mydata);
uchar i2c_read_byte(uchar dev_addr_wr,uchar dev_addr2_rd,uchar word_addr);
//------------------------------------------------------------------------
/*void main()
{
uchar temp;
while(1)
{
i2c_write_byte(0xa2,0x00,0x00);
temp=i2c_read_byte(0xa2,0xa3,0x02);
delay_1s();
P1= temp;
}
}*/
//----------------------------------------- //here are the functions
void delay_100us()
{
unsigned char i;
for(i=5;i>0;i--)
{;}
}
//-----------------------------------------
void delay_1s()
{
unsigned char i,j,k;
for(i=100;i>0;i--)
for(j=50;j>0;j--)
for(k=100;k>0;k--)
{;}
}
//------------------------------------------
void i2c_start()
{
SCL=0;
delay_100us();
SDA=1; //a falling edge of sda when scl is high
delay_100us();
SCL=1;
delay_100us();
SDA=0;
delay_100us();
SCL=0; //keep the SDA and SCL low;
delay_100us();
}
//---------------------------------------
void i2c_stop()
{
SCL=0; //a upper edge of sda when scl is high
delay_100us();
SDA=0;
delay_100us();
SCL=1;
delay_100us();
SDA=1;
delay_100us();
SDA=0;
delay_100us();
SCL=0; //keep the SDA and SCL low;
}
//---------------------------------------
void get_ack()
{
do
{
SCL=0;
delay_100us();
SDA=1;
delay_100us();
SCL=1;
delay_100us();
}
while(SDA);
}
//----------------------------------------
void i2c_send_byte(uchar byte)
{
uchar i;
for(i=0;i<8;i++)
{
SCL=0;
delay_100us();
SDA=byte&0x80;
delay_100us();
SCL=1;
delay_100us();
SCL=0;
delay_100us();
byte=byte<<1;
}
get_ack();
}
//----------------------------------------
void i2c_write_byte(uchar dev_addr_wr,uchar word_addr,uchar mydata)
{
i2c_start();
i2c_send_byte(dev_addr_wr);
i2c_send_byte(word_addr);
i2c_send_byte(mydata);
i2c_stop();
}
//----------------------------------------
uchar i2c_read_byte(uchar dev_addr_wr,uchar dev_addr_rd,uchar word_addr)
{
uchar temp,i;
temp=0xff;
//---------------
i2c_start();
i2c_send_byte(dev_addr_wr);
i2c_send_byte(word_addr);
i2c_stop(); //inital the address of device and word
//-------------------------------------------------------------------------
i2c_start();
i2c_send_byte(dev_addr_rd);
for(i=0;i<8;i++)
{
SCL=0;
delay_100us();
SDA=1;
delay_100us();
SCL=1;
delay_100us();
if(SDA)
{
temp|=0x01;
}
else
{
temp&=0xfe;
}
delay_100us();
SCL=0;
delay_100us();
temp=temp<<1;
}
SCL=0;
SDA=1;
SCL=1;
SCL=0; //read data from device
//-----------------------------------------------------------------------
i2c_stop(); //stop the device
return temp;
}
|
评分
-
查看全部评分
|