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

📄 wdi2c.c

📁 温度与转速数据采集和控制
💻 C
字号:
#include <reg52.h>

#include<intrins.h>

#define uint unsigned int
#define uchar unsigned char


sbit sda= P1^4;
sbit scl= P1^5;

sbit ac0=ACC^0;			/*定义ACC的位,利用ACC操作速度最快*/
sbit ac1=ACC^1;
sbit ac2=ACC^2;
sbit ac3=ACC^3;
sbit ac4=ACC^4;
sbit ac5=ACC^5;
sbit ac6=ACC^6;
sbit ac7=ACC^7;



void delay();



void i2c_start(void);    /*起始*/
void i2c_stop(void);     /*停止*/
bit wait_ack(void);     /*等待24c02应答*/
void send_ack(void);     /*向24c02发送应答*/
void sendnot_ack(void);    /*向24c02发送非应答*/
void i2c_sendbyte(uchar ch);/*写发送移位*/
uint i2c_readbyte(void);    /*读移位*/

uint i2c_read(uchar address);
bit i2c_write(uchar address,uint fb);



 void i2c_start(void)
{
  
  sda=1;
  scl=1;
  delay();
  sda=0;
  delay();
  scl=0;
  delay();
  }



void i2c_stop(void)
{
   scl=0;
	_nop_();
	sda=0;
	delay();
	scl=1;
	delay();
	sda=1;
    
	}


bit wait_ack(void)
{
   uchar i;
	scl=0;
	_nop_();
	_nop_();
   sda=1;
	delay();
	scl=1;
	delay();
  	while(sda)
	         {
				  for(i=0;i<=5;i++)
				             {
								    if(!sda)
									    {
										  scl=0;
 										  return(0);
										  }
								  }
				  
				  return(1);
				  }
       scl=0;
		 return(0);
  }

void send_ack(void)
{
   sda=0;
	delay();
	scl=1;
	delay();
	scl=0;
 }


void sendnot_ack(void)
{
    sda=1;
	 delay();
	 scl=1;
	 delay();
	 scl=0;
}


void i2c_sendbyte(uchar ch)
{
   	ACC=ch;   
			
	    sda=ac7;_nop_();scl=1;delay();scl=0;delay();
	    sda=ac6;_nop_();scl=1;delay();scl=0;delay();
	    sda=ac5;_nop_();scl=1;delay();scl=0;delay();
	    sda=ac4;_nop_();scl=1;delay();scl=0;delay();
        sda=ac3;_nop_();scl=1;delay();scl=0;delay();
        sda=ac2;_nop_();scl=1;delay();scl=0;delay();
	    sda=ac1;_nop_();scl=1;delay();scl=0;delay();
	    sda=ac0;_nop_();scl=1;delay();scl=0;delay();
}


uint i2c_readbyte(void)
{
       uint sf;
      	sda=1;_nop_();_nop_();
	scl=1;delay();ac7=sda;scl=0;delay();
	scl=1;delay();ac6=sda;scl=0;delay();
	scl=1;delay();ac5=sda;scl=0;delay();
	scl=1;delay();ac4=sda;scl=0;delay();
	scl=1;delay();ac3=sda;scl=0;delay();
	scl=1;delay();ac2=sda;scl=0;delay();
	scl=1;delay();ac1=sda;scl=0;delay();
	scl=1;delay();ac0=sda;scl=0;delay();
	sf=ACC;
	return(sf);
}



void delay()
{
   _nop_();
	_nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();

 
  
  
 
}



uint i2c_read(uchar address)
{
     uchar dd=0xa0;
	  uchar dc=0xa1;
	  uint ae;
	  uint ar;
     i2c_start();
	  i2c_sendbyte(dd);
     if(wait_ack())
              {
               i2c_stop();
             return(0);
               }
	  i2c_sendbyte(address);
	  if(wait_ack())
            {
               i2c_stop();
             return(0);
               }
     	i2c_stop();
		delay();
      i2c_start();
		i2c_sendbyte(dc);
      if(wait_ack())
            {
               i2c_stop();
             return(0);
               }
      ae=i2c_readbyte();
		send_ack();
	  ar=i2c_readbyte();
		sendnot_ack();
		i2c_stop();
		ar=ar<<8;
      return(ar+ae);
 }


 bit i2c_write(uchar address,uint fb)
 {
      uchar dd=0xa0;
	  uchar ae;
	  uchar ar;
     ae=(uchar)fb;
     fb=(fb>>8);
     ar=(uchar)fb;
     i2c_start();
	  i2c_sendbyte(dd);
     if(wait_ack())
            {
               i2c_stop();
             return(0);
               }
	  i2c_sendbyte(address);
	  if(wait_ack())
            {
               i2c_stop();
             return(0);
               }
      i2c_sendbyte(ae);
	  if(wait_ack())
             {
               i2c_stop();
             return(0);
               }
      i2c_sendbyte(ar);
	  if(wait_ack())
            {
               i2c_stop();
             return(0);
               }
      i2c_stop();
    return(1);
}


⌨️ 快捷键说明

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