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

📄 wdi2ca.c

📁 温度采集显示与PID控制
💻 C
字号:
#include<w77e58.h>
#include<intrins.h>


#define uchar unsigned char
#define uint unsigned int

sbit sclk=P1^0;
sbit sda= P3^3;  //24c02
sbit scl= P3^4;
extern uchar data e2prom;

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);    /*读移位*/
uchar i2c_readbyte1(void);

uint i2c_read_int(uchar address);
//bit i2c_write_int(uchar address,int fb);

uchar i2c_read(uchar address);
bit i2c_write(uchar address,uchar fb);
//***********************************//



void delay1();


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 i2c_start(void)
{
  sda=1;
  scl=1;
  delay1();
  sda=0;
  delay1();
  scl=0;
  delay1();
  }



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


bit wait_ack(void)//=0,ok
{
   uchar i;
	scl=0;
	_nop_();
	_nop_();
    sda=1;
	delay1();
	scl=1;
	delay1();
  	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;
	delay1();
	scl=1;
	delay1();
	scl=0;
 }


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


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


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

uchar i2c_readbyte1(void)
{
       uchar sf;
      	sda=1;_nop_();_nop_();_nop_();_nop_();
	scl=1;delay1();ac7=sda;scl=0;delay1();
	scl=1;delay1();ac6=sda;scl=0;delay1();
	scl=1;delay1();ac5=sda;scl=0;delay1();
	scl=1;delay1();ac4=sda;scl=0;delay1();
	scl=1;delay1();ac3=sda;scl=0;delay1();
	scl=1;delay1();ac2=sda;scl=0;delay1();
	scl=1;delay1();ac1=sda;scl=0;delay1();
	scl=1;delay1();ac0=sda;scl=0;delay1();
	sf=ACC;
	return(sf);
}

void delay1()
{
   uint i;
   for(i=0;i<=40;i++)
   	
   _nop_();
 
}



uint i2c_read_int(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();
		delay1();
      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);
 }
uchar i2c_read(uchar address)
   {
     uchar dd=0xa0;
	  uchar dc=0xa1;
	  uchar ae;
	  
     i2c_start();
	  i2c_sendbyte(dd);
     if(wait_ack())
              {
               i2c_stop();
                return(0);                  
               }
	  i2c_sendbyte(address);
	  if(wait_ack())
              {
               i2c_stop();
                return(0);                  
               }
               
     	i2c_stop();
		delay1();
      i2c_start();
		i2c_sendbyte(dc);
      if(wait_ack())
      	{
              i2c_stop();
                return(0);                  
               }
      ae=i2c_readbyte1();
		sendnot_ack();
		i2c_stop();
	   return(ae);
}




 /*bit i2c_write_int(uchar address,int fb)
 {
     uchar dd=0xa0;
	  uchar ae;
	  uchar ar;
       char i;
     ae=(uchar)fb;
     fb=(fb>>8);
     ar=(uchar)fb;
     i2c_start();
	  i2c_sendbyte(dd);
     while(wait_ack())
              {
            for(i=0;i<=10;i++)
                {
               delay();
               
                 }
               i2c_stop();
                return(0);                  
               }
	  i2c_sendbyte(address);
	    while(wait_ack())
              {
            for(i=0;i<=10;i++)
                {
               delay();
               
                 }
               i2c_stop();
                return(0);                  
               }
      i2c_sendbyte(ae);
	  while(wait_ack())
              {
            for(i=0;i<=10;i++)
                {
               delay();
               
                 }
               i2c_stop();
                return(0);                  
               }
      i2c_sendbyte(ar);
	   while(wait_ack())
              {
            for(i=0;i<=10;i++)
                {
               delay();
               
                 }
               i2c_stop();
                return(0);                  
               }
      i2c_stop();
    
}

*/
bit i2c_write(uchar address,uchar fb)
  {
     uchar dd=0xa0;
	  
      i2c_start();
	  i2c_sendbyte(dd);
      if(wait_ack())
              {
              i2c_stop();
              
                return(0);                  
               }
	  i2c_sendbyte(address);
	  if(wait_ack())
              {
               i2c_stop();
                return(0);                  
               }
      i2c_sendbyte(fb);
	  if(wait_ack())
	     	{
               i2c_stop();
                return(0);                  
               }
     
      i2c_stop();
      return(1);
}

⌨️ 快捷键说明

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