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

📄 24c02.c

📁 数控系统的模拟系统,用SSTC51仿真单片机,仿真数控机床切割,能执行数控机床代码.
💻 C
📖 第 1 页 / 共 2 页
字号:

** 全局变量: 无

** 调用模块: IIC_Delay(),I2C_Start(),I2C_Stop(),WriteI2CByte(unsigned char b)
             Check_Acknowledge(),Send_UnAcknowledge()
             
** 输入: *buffer:读出的数据存放缓冲首地址,n:读出数据个数,addr:读出首地址

** 输出: bit-当写入正确时反回1,否则返回0。

******************************************************************************/
	  
bit Read_N_Bytes(unsigned char *buffer,unsigned char n,unsigned char addr)
{
   bit acktemp=1;
   unsigned char i=0;
   I2C_Start();
   WriteI2CByte(SLAW);          /*write the SLAW*/
   acktemp=Check_Acknowledge();
   if(!acktemp)
   {  
      I2C_Stop();
	  return(FALSE);
   }
   WriteI2CByte(addr);          /*write memory address*/
   acktemp=Check_Acknowledge();
   if(!acktemp)
   {  
      I2C_Stop();
	  return(FALSE);
   }
   I2C_Start();
   WriteI2CByte(SLAR);         /*write the SLAR*/
   acktemp=Check_Acknowledge();
   if(!acktemp)
   {  
      	I2C_Stop();
		return(FALSE);
   }
   for(i=0;i<n;i++)
   {
      *buffer=ReadI2CByte();
       buffer++;
       if(i!=n-1)
         SEND_0();                /*发送应答*/
       else
         Send_UnAcknowledge();    /*发送非应答*/
   }
   I2C_Stop();
   return(TRUE);
}
void Delay1Ms(void)
{
unsigned int TempCyc = 1000;
while(TempCyc--);
}
void SaveXYToNVRAM(void)             /*保存当前的坐标值*/
  {  
     Write_One_Byte(1,LOWBYTE(Pref_x)) ;	 
     Delay5Ms();
     Write_One_Byte(2,HIGHBYTE(Pref_x)) ;
	   Delay5Ms();
      Write_One_Byte(3,LOWBYTE(Pref_y)) ;
	    Delay5Ms();
     Write_One_Byte(4,HIGHBYTE(Pref_y)) ; 
        }
 void ReadXYFromNVRAM(void)	/*读当前的坐标值 */
 {
    
      Pref_x= (int)Read_One_Byte(2);
	 Pref_x=(Pref_x<<8)&0xff00;
	Pref_x+=(int)Read_One_Byte(1);

	  Pref_y= (int)Read_One_Byte(4);
	   Pref_y=(Pref_y<<8)&0xff00;
	Pref_y+=(int)Read_One_Byte(3);
	  
}
 void SaveGcodeToI2C(void)
{
unsigned char  i=10,k=0;
while(!(buf[k]==0xff))
{
Write_One_Byte(i++,buf[k++]);
 Delay1Ms();
}

 }	

void  ReadGcodeToI2C(void)
{
unsigned char i=10,k=0;
while(1)
{
buf[k++]=Read_One_Byte(i++);
if(buf[--k]==M02)  break;
 k++;
 Delay1Ms();
 }

}  
#endif
#if 0
   #ifndef   I2C_H   
  #define   I2C_H   
  typedef   unsigned   char   uchar;     //重新定义数据类型   
  typedef   unsigned   int     uint;   
  //************************变量声明***************************   
  //读写控制命令   
  const   uchar   WR24C02   =   0xA0;                             //EEPROM地址+写命令   
  const   uchar   RD24C02   =   0xA1;                             //EEPROM地址+读命令   
  //I/O口定义   
  sbit     I2C_SCL   =   P3^7;   
  sbit     I2C_SDA   =   P3^6;   
  //用户变量声明   
  bit   ErrorBit;                             //读写错误标志       1错误     0   正确   
  uchar   idata   ErrorCode;           //错误码   
  //************************函数声明***************************   
  void     Start(void);   
  void     Stop(void);   
  void     Ack(void);   
  void     NoAck(void);   
  void     TestAck(void);   
  void     Write_I2c(uchar   date);   
  uchar   Read_I2c(void);   
  void     DelayMs(uchar   time);   
  void     Write_Date(uchar   StartAddress,uchar   *date,uchar   bytes);   
  void     Read_Date(uchar   StartAddress,uchar   *date,uchar   bytes);   
  #endif   
  /*************************版权信息**************************   
  *CopyRight(c)       **电子有限公司   
  *All   rights   reserved   
  *   
  *文件名称:     i2c.c   
  *当前版本:     v1.0   
  *作者:             cptang   
  *完成日期:   
  *摘要:             24c02操作定义文件,注意I2C总线的数据格式   
  *                       先读写数据高位后低位   
  ************************************************************/   
  //************************头文件****************************   
  //#include   <reg51.h>   
  //#include   <intrins.h>   
  //#include   "i2c.h"   
  //***********************函数定义***************************   
  /***************************************   
  *函数名称:       void   Start(void)   
  *功能描述:       读写开始   
  *输入:               无   
  *输出:               无   
  *全局变量:       I2C_SCL,I2C_SDA   
  *调用模块:       无   
    
  ****************************************/   
  void   Start(void)   
  {   
          I2C_SDA   =   1;           //起始条件的数据信号   
          _nop_();   
          I2C_SCL   =   1;           //起始条件时钟信号   
          _nop_();                   //信号建立时间>4.7us   
          _nop_();   
          _nop_();   
          _nop_();   
          _nop_();   
          I2C_SDA   =   0;           //起始信号   
          _nop_();   
          _nop_();   
          _nop_();   
          _nop_();                   
          _nop_();   
          I2C_SCL   =   0;           //钳住I2C总线,   准备发送或者接受数据   
          _nop_();   
          _nop_();   
  }   
  /***************************************   
  *函数名称:       void   Stop(void)   
  *功能描述:       读写结束   
  *输入:               无   
  *输出:               无   
  *全局变量:       I2C_SCL,I2C_SDA   
  *调用模块:       无   
    
  ****************************************/   
  void   Stop(void)   
  {   
          I2C_SDA   =   0;             //结束条件的数据信号   
          _nop_();   
          I2C_SCL   =   1;             //结束条件的时钟信号   
          _nop_();   
          _nop_();   
          _nop_();   
          _nop_();                   
          _nop_();   
          I2C_SDA   =   1;             //结束信号   
          _nop_();   
          _nop_();   
          _nop_();   
          _nop_();                   
  }   
  /***************************************   
  *函数名称:       void   Ack(void)   
  *功能描述:       正确应答,读一个字节后必须应答   
  *输入:               无   
  *输出:               无   
  *全局变量:       I2C_SCL,I2C_SDA   
  *调用模块:       无   
    
  ****************************************/   
  void   Ack(void)   
  {   
          I2C_SDA   =   0;   
          _nop_();   
          _nop_();           
          I2C_SCL   =   1;   
          _nop_();   
          _nop_();   
          _nop_();   
          _nop_();   
          _nop_();           
          I2C_SCL   =   0;   
          _nop_();   
          _nop_();   
  }   
  /***************************************   
  *函数名称:       void   NoAck(void)   
  *功能描述:       无应答   
  *输入:               无   
  *输出:               无   
  *全局变量:       I2C_SCL,I2C_SDA   
  *调用模块:       无   
    
  ****************************************/   
  void   NoAck(void)   
  {   
          I2C_SDA   =   1;   
          _nop_();   
          _nop_();   
          I2C_SCL   =   1;   
          _nop_();   
          _nop_();   
          _nop_();   
          _nop_();   
          _nop_();   
          I2C_SCL   =   0;   
          _nop_();   
          _nop_();   
  }   
  /***************************************   
  *函数名称:       void   TestAck(void)   
  *功能描述:       读写错误测试,写一个字节应该测试应答信号   
  *输入:               无   
  *输出:               返回一个位   
  *全局变量:       I2C_SCL,I2C_SDA   
  *调用模块:       无   
    
  ****************************************/   
  void   TestAck(void)   
  {         
          I2C_SDA   =   1;   
          _nop_();   
          _nop_();   
          I2C_SCL   =   1;   
          _nop_();   
          _nop_();   
          _nop_();   
          ErrorBit   =   I2C_SDA;   
          I2C_SCL   =   0;   
          _nop_();   
          _nop_();           
  }   
  /***************************************   
  *函数名称:       void   Write_I2c(uchar   date)   
  *功能描述:       写I2C   
  *输入:               待送数据,高字节先送   
  *输出:               无   
  *全局变量:       I2C_SCL,I2C_SDA   
  *调用模块:       无   
    
  ****************************************/   
  void   Write_I2c(uchar   date)   
  {   
          uchar   i;   
          for(i   =   0;   i   <   8;   i++)   
          {   
                  I2C_SDA   =   date   &   0x80;                 //送数据到数据线上   
                  date   <<=   1;   
                  _nop_();                   
                  I2C_SCL   =   1;                                     //置时钟信号为高电平,使数据有效   
                  _nop_();   
                  _nop_();   
                  _nop_();   
                  _nop_();   
                  _nop_();           
                  I2C_SCL   =   0;   
                  _nop_();   
                  _nop_();                   
                    
          }   
  }   
  /***************************************   
  *函数名称:       uchar   Read_I2c(void)   
  *功能描述:       读I2C   
  *输入:               无   
  *输出:               返回一个字节的数据,高字节在前   
  *全局变量:       I2C_SCL,I2C_SDA   
  *调用模块:       无   
    
  ****************************************/   
  uchar   Read_I2c(void)   
  {   
          uchar   i;   
          uchar   byte   =   0;   
          for(i   =   0;   i   <   8;   i++)   
          {   
                  I2C_SCL   =   0;                       //置时钟为低电平,准备接受数据   
                  _nop_();   
                  _nop_();   
                  _nop_();   
                  _nop_();   
                  _nop_();   
                  I2C_SCL   =   1;                     //置时钟为高电平,使数据线数据有效   
                  _nop_();   
                  _nop_();   
                  byte   <<=   1;   
                  byte   |=   I2C_SDA;   
                  _nop_();   
                  _nop_();   
                  I2C_SCL   =   0;   
          }   
          return(byte);   
  }   
  /***************************************   
  *函数名称:       void   DelayMs(uchar   time)   
  *功能描述:       延时   
  *输入:               延时时间   
  *输出:               无   
  *全局变量:       无   
  *调用模块:       无   
    
  ****************************************/   
  void   DelayMs(uchar   time)   
  {   
        uchar   i;   
        do   
        {   
                  for(i   =   0;   i   <   125   ;   i++);       //*延时   8us   x   125   =   1ms   
        }   
        while   (time--);   
    
  }   
  /***************************************   
  *函数名称:       void     Write_Date(uchar   StartAddress,uchar   *date,uchar   bytes)   
  *功能描述:       写数据   
  *输入:               数据开始地址,保存数据指针,数据字节数   
  *输出:               无   
  *全局变量:       无   
  *调用模块:       Start(),Write_I2c(),Stop(),TestAck()   
  *注意事项:       调用之前,需要定义一个数组,用来存待发送的数据   
  ****************************************/   
  void   Write_Date(uchar   StartAddress,uchar   *date,uchar   bytes)   
  {   
          uchar   i   =   0;   
          Start();   
          Write_I2c(WR24C02);   
          TestAck();   
          Write_I2c(StartAddress);   
          TestAck();   
          for(i   =   0;i   <   bytes;   i++)   
          {   
                  Write_I2c(*date);   
                  TestAck();   
                  date++;   
          }   
          Stop();   
          DelayMs(20);   
  }   
  /***************************************   
  *函数名称:       void     Read_Date(uchar   StartAddress,uchar   *date,uchar   bytes)   
  *功能描述:       读数据   
  *输入:               数据开始地址,读取数据指针,数据字节数   
  *输出:               无   
  *全局变量:       无   
  *调用模块:       Start(),Write_I2c(),Read_I2c(),Ack(),NoAck(),Stop(),TestAck()   
  *注意事项:       调用之前,需要定义一个数组,用来存读取的数据   
  ****************************************/   
  void   Read_Date(uchar   StartAddress,uchar   *date,uchar   bytes)   
  {   
          uchar   i;   
          Start();   
          Write_I2c(WR24C02);   
          TestAck();   
          Write_I2c(StartAddress);   
          TestAck();   
          Write_I2c(RD24C02);   
          TestAck();   
          for   (i   =   0;   i   <   bytes;   i++)   
          {   
                  *date   =   Read_I2c();   
                  Ack();   
                  date++;   
          }   
          NoAck();   
          Stop();   
          DelayMs(10);   
  }   
void SaveXYToNVRAM(void)
  {  uchar  *date0=&Pref_x;
      uchar  *date1=&Pref_y;
    Write_Date(1,date0,1) ;
   Write_Date(10,date1,1);
  }
 void ReadXYFromNVRAM(void)	
 {
     uchar  *date0=&Pref_x;
      uchar  *date1=&Pref_y;
        Read_Date(1,date0,1);
        Read_Date(10,date1,1);
 }
 void SaveGcodeToI2C(unsigned char start_add,unsigned char *p,unsigned char lenth)
{
        int i;
   for(i=0;i<lenth;i++)
   	{  
   	//   Write_One_Byte(start_add,*p);
		start_add++;
		p++;
   	}
     
}	
 #endif	

⌨️ 快捷键说明

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