⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.c

📁 c8051学习机实验程序
💻 C
字号:
#include <io.h>

#define uchar	unsigned char

//extern void delay(unsigned int n);

 //extern void delay(uchar t_ms);
///-------------------------------------------------------------------------  I2C 底层函数
//-------------------------------------------------------------------------------------

 void SomeNOP()
 {
 uchar i;
  for(i=0;i<=100;i++){;}
 }

void I2CStart(void)
 {
 EA=0;
 SDA=1; SCL=1; SomeNOP();
 SDA=0; SomeNOP();              //START
 SCL=0;
 }

 void I2CStop(void)
 {
 SCL=0; SDA=0; SomeNOP();
 SCL=1; SomeNOP(); SDA=1;             //STOP
 EA=1;
 }

bit WaitAck(void)
 {
 uchar errtime=255;                      //因故障接收方无ACK,超时值为255。
 SDA=1;SomeNOP();
 SCL=1;SomeNOP();
    while(SDA)
	{
	 errtime--;
    SomeNOP();  //add
	       if (!errtime)
	       {   I2CStop();
		       return 0;   }
	}
   SCL=0;
   return 1;
 }

 void SendAck(void)
 {
 SDA=0; SomeNOP();
 SCL=1; SomeNOP();
 SCL=0;
 }

 void SendNotAck(void)
 {
 SDA=1; SomeNOP();
 SCL=1; SomeNOP();
 SCL=0;
 }

 void I2CSendByte(uchar ch)
 {
 uchar i=8;
    while (i--)
 	{
	 SCL=0;
	 SDA=(bit)(ch&0x80); ch<<=1; SomeNOP();
	 SCL=1; SomeNOP();
	 }
 SCL=0;
 }
 
  uchar I2CReceiveByte(void)
 {
 uchar i=8;
 uchar rdata=0;
 SDA=1;
	 while (i--)
 	{
 	rdata<<=1;
 	SCL=0;SomeNOP();
 	SCL=1;SomeNOP();
 	rdata|=SDA;
 }
 SCL=0;
 return rdata;
 }
 
  /*
 void SetVoltageRef(uchar VoltageData)
 {
   I2CStart();
   I2CSendByte(0x58);
   WaitAck();
   I2CSendByte(0x00);
   WaitAck();
   I2CSendByte(VoltageData);
   WaitAck();
   I2CStop();
 }

void SetCurrentRef(uchar CurrentData)
 {
   I2CStart();
   I2CSendByte(0x58);
   WaitAck();
   I2CSendByte(0x01);
   WaitAck();
   I2CSendByte(CurrentData);
   WaitAck();
   I2CStop();
 }
    */


  void AT24C02_write(uchar excur_addr,uchar wr_data)
{    
	I2CStart();
        I2CSendByte(0xA0);
	       WaitAck();
	I2CSendByte(excur_addr);
	       WaitAck();
	I2CSendByte(wr_data);
	       WaitAck();
	I2CStop();
      // delay(20);             /////??????
}

uchar AT24C02_read(uchar excur_addr)
{   
    uchar rd_data;
    
    I2CStart();
    I2CSendByte(0xA0);
	WaitAck();
    I2CSendByte(excur_addr);
	WaitAck();
    I2CStart();
    I2CSendByte(0xA1);
	WaitAck();
    rd_data=I2CReceiveByte();
        SendNotAck();
    I2CStop();
     //delay(10);
    return rd_data;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -