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

📄 i2c

📁 i2c总线读写字节程序
💻
字号:
//#include<stdio.h>
 #include<reg51.h>
 #include<INTRINS.H>
 void _nop_(void);
 void  some_nop(void);
 sbit  C=PSW^6;
 sbit  scl=P1^6;      //iic时钟
 sbit  sda=P1^7;	  //iic数据
 sbit  reset=P1^4;	  //复位引脚

void delay(unsigned int i)
      {
	  unsigned int wTemp;
      while (i--) 
	      {
	      wTemp = 1000/6;        // one loop below takes about 11 us
          while (wTemp--);
          }
	  }
//MCU_initial
void MCU_initial(void)
      {
	  EA = 0;
	  ET1=1;
	  TMOD=0x10;
	  }
//initialilze sub
void initial()
      {
	  reset=0;
	  delay(300);
	  reset=1;
	  delay(100);
	  }

 /*void some_nop(void)
       {
	   _nop_();
	   _nop_();
	   _nop_();
	   _nop_();
	   }*/
  /*i2c start sub*/
 void  iic_start(void)       
       {
	   sda=1;
	   scl=1;									   
	   _nop_();
	   _nop_();
	   sda=0;
	   _nop_();
	   _nop_();
	   scl=0;
	   }
/*i2c  end sub*/ 
void   iic_stop(void)
       {
	   sda=0;
	   _nop_();
	   _nop_();
	   scl=1;
       _nop_();
	   _nop_();
	   sda=1;
	   }
/*i2c  write a byte*/	
void iic_write(unsigned int send_data)      //写一个8位的数据
       {
	   unsigned int i=0;
	   for(i;i<8;i++)
	        {
			sda=(bit)(send_data & 0x80);
			send_data<<=1;
			_nop_();
			_nop_();
			scl=1;
			_nop_();
	        _nop_();
			scl=0;
			_nop_();
	        _nop_();
			}
	   }
 
//i2c  read a byte //
unsigned int iic_read(void)	               //读一个8位的数据
       {
	   unsigned int i;
	   unsigned int read_data=0x00;
	   sda=1;
	   for(i=0;i<8;i++)
	        {
			scl=1;
	   	    _nop_();
	        _nop_();
	        read_data<<=1;
			if(sda==1)
	        read_data|=0x01;
			scl=0;
			_nop_();
	        _nop_();
		    }
		return read_data;
		}
//i2c  get ack	//
void get_ack(bit ack)		           //主机应答  1:no ack  0:ack
		{
		sda=ack;
		_nop_();
	    _nop_();	
		scl=1;
		_nop_();
	    _nop_();
		scl=0;
		}
//i2c  send  ack//
bit send_ack(void)                     //从机应答
        {
	    bit ACK;
	    sda = 1;
		_nop_();
	    _nop_();
	    scl = 1;
	    _nop_();
	    _nop_();
	    ACK = sda;
	    scl = 0;
	    _nop_();
	    _nop_();
	    return ACK;
		}
//write  
void write_onebyte(unsigned int slave,unsigned int data_addr,unsigned int count)
        {
		iic_start();
		iic_write(slave);
		if(!send_ack())
              {
			  iic_write(data_addr);
			  if(!send_ack())
			       {
				   iic_write(count);
				   send_ack();
				   }
			  }		 
		iic_stop();
		}

//read
unsigned int read_onebyte(unsigned int slave,unsigned int data_addr)
        {
		unsigned int n;
		bit  abit=1;		  	
		iic_start();
		iic_write(slave);
		abit=send_ack();
		iic_write(data_addr);
		abit|=send_ack();
		iic_start();
		iic_write(0x55);
		abit|=send_ack();
		n=iic_read();
		get_ack(1);
	    iic_stop();
		if(abit)
		n=0xff;
		return n;		 
		}

⌨️ 快捷键说明

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