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

📄 24c02.c

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


	
#include "i2c.h"


/*****************************************************************************

** 函数名称: IIC_Delay

** 功能描述: I2C时序延时

** 全局变量: 无

** 调用模块: 无

** 输入: t:延时量

** 输出: 无

******************************************************************************/
	     
void IIC_Delay(unsigned char t) 
{
   while(t--);
   
}

/*****************************************************************************

** 函数名称: I2C_Start

** 功能描述: 启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变

** 全局变量: DELAY_TIME

** 调用模块: IIC_Delay()

** 输入: 无

** 输出: 无

******************************************************************************/
		  
void I2C_Start(void)
{   
   SDA=1;
   SCL=1;
   IIC_Delay(DELAY_TIME);
   SDA=0;
   IIC_Delay(DELAY_TIME);
   SCL=0;
   IIC_Delay(DELAY_TIME);
}

/*****************************************************************************

** 函数名称: I2C_Stop

** 功能描述: 终止I2C总线,当SCL为高电平时使SDA产生一个正跳变

** 全局变量: DELAY_TIME

** 调用模块: IIC_Delay()

** 输入: 无

** 输出: 无

******************************************************************************/
		  
void I2C_Stop(void)
{
   SDA=0;
   IIC_Delay(DELAY_TIME);
   SCL=1;
   IIC_Delay(DELAY_TIME);
   SDA=1;
   IIC_Delay(DELAY_TIME);
   
}

/*****************************************************************************

** 函数名称: SEND_0

** 功能描述: 发送0(或应答信号),在SCL为高电平时使SDA信号为低

** 全局变量: DELAY_TIME

** 调用模块: IIC_Delay()

** 输入: 无

** 输出: 无

******************************************************************************/
		  
void SEND_0(void)   
{
   SDA=0;
   IIC_Delay(DELAY_TIME);
   SCL=1;
   IIC_Delay(DELAY_TIME);
   SCL=0;
   IIC_Delay(DELAY_TIME);
}

/*****************************************************************************

** 函数名称: SEND_1

** 功能描述: 发送1,在SCL为高电平时使SDA信号为高

** 全局变量: DELAY_TIME

** 调用模块: IIC_Delay()

** 输入: 无

** 输出: 无

******************************************************************************/
		  
void SEND_1(void)
{
   SDA=1;
   IIC_Delay(DELAY_TIME);
   SCL=1;
   IIC_Delay(DELAY_TIME);
   SCL=0;
   IIC_Delay(DELAY_TIME);
}

/*****************************************************************************

** 函数名称: Check_Acknowledge

** 功能描述: 发送完一个字节后检验设备的应答信号

** 全局变量: DELAY_TIME

** 调用模块: IIC_Delay()

** 输入: 无

** 输出: bit-当有应答信号时返回1,否则返回0。

******************************************************************************/
		  
bit Check_Acknowledge(void)
{
   bit F0;
   unsigned char Error_time=255;   //因故障接收方无ACK,超时值为255
   SDA=1;
   IIC_Delay(DELAY_TIME);
   SCL=1;
   IIC_Delay(DELAY_TIME);
   F0=SDA;
   while(F0)
   {
	  IIC_Delay(8);
	  F0 = SDA;
      if(--Error_time == 0)
        return FALSE;            //超时无应答,返回
   }
   IIC_Delay(DELAY_TIME);
   SCL=0;
   IIC_Delay(DELAY_TIME);
   if(F0==1)
      return FALSE;
   return TRUE;
}

/*****************************************************************************

** 函数名称: Send_UnAcknowledge

** 功能描述: 主控器发送停止信号前发送的非应答信号

** 全局变量: DELAY_TIME

** 调用模块: IIC_Delay()

** 输入: 无

** 输出: 无

******************************************************************************/
		 
void Send_UnAcknowledge(void)
{  
	 SDA=1;
     IIC_Delay(DELAY_TIME);
	 SCL=1;
	 IIC_Delay(DELAY_TIME);
	 SCL=0;
	 IIC_Delay(DELAY_TIME);
}

/*****************************************************************************

** 函数名称: WriteI2CByte

** 功能描述: 向I2C总线写一个字节

** 全局变量: DELAY_TIME,SEND_1(),SEND_0(),

** 调用模块: IIC_Delay()

** 输入: b:要发送的数据 

** 输出: 无

******************************************************************************/
		  
void WriteI2CByte(unsigned char Byte)//reentrant
{
   unsigned char i;
   for(i=0;i<8;i++)
   {   
   		if((Byte << i) & 0x80)
         	SEND_1();
       	else
         	SEND_0();
   }
}

/*****************************************************************************

** 函数名称: ReadI2CByte

** 功能描述: 从I2C总线读一个字节

** 全局变量: DELAY_TIME

** 调用模块: IIC_Delay()

** 输入: 无

** 输出: char-从I2C总线读出的数据.

******************************************************************************/
          
unsigned char ReadI2CByte(void)//reentrant
{
   bit F0;
   unsigned char Byte=0,i;
   for(i=0; i<8; i++)
   {
      SDA=1;             /*释放总线*/
      IIC_Delay(DELAY_TIME);
      SCL=0;             //置时钟线为低,准备接收数据
      IIC_Delay(DELAY_TIME);
      SCL=1;             /*接受数据*/
      IIC_Delay(DELAY_TIME);
      F0=SDA;
      IIC_Delay(DELAY_TIME);
      SCL=0;
      if(F0 == 1)
      {
         Byte <<= 1;
         Byte |= 0x01;
      }
      else
       Byte <<= 1;
   }
   return Byte;
}

/*****************以下为读写24c04的函数**************************************/

/*****************************************************************************

** 函数名称: Write_One_Byte

** 功能描述: write a byte to memory

** 全局变量: 无

** 调用模块: IIC_Delay(),I2C_Start(),I2C_Stop(),WriteI2CByte(unsigned char b)
             Check_Acknowledge()
             
** 输入: addr:写入地址,thedata:要写入的数据

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

******************************************************************************/
	  
bit Write_One_Byte(unsigned char addr,unsigned char thedata)
{
   bit acktemp=1;
   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);
   }
   WriteI2CByte(thedata);        /*the data*/
   acktemp=Check_Acknowledge();
   if(!acktemp)
   {  
      	I2C_Stop();
		return(FALSE);
   }
   I2C_Stop();
   IIC_Delay(8);
   return(TRUE);
}

/*****************************************************************************

** 函数名称: Write_A_Page

** 功能描述: write a page to AT24c04

** 全局变量: 无

** 调用模块: IIC_Delay(),I2C_Start(),I2C_Stop(),WriteI2CByte(unsigned char b)
             Check_Acknowledge()
             
** 输入: *buffer:写入数据缓冲首地址,addr:写入页首地址

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

******************************************************************************/
	  
bit Write_A_Page(unsigned char *buffer,unsigned char addr)
{
   bit acktemp=1;
   unsigned char i;
   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);
	 }
   for(i=0;i<Page_Word;i++)
   {
      WriteI2CByte(*buffer);
			buffer++;
      if(!Check_Acknowledge())
      {  
         I2C_Stop();
		 return(FALSE);
      }
	 
   }

   I2C_Stop();
   for(i=0;i<10;i++)
   {  
      	IIC_Delay(200);         //IIC_Delay 10mS
   }
   return(TRUE);

}

/*****************************************************************************

** 函数名称: Read_One_Byte

** 功能描述: read a byte from memory

** 全局变量: 无

** 调用模块: IIC_Delay(),I2C_Start(),I2C_Stop(),WriteI2CByte(unsigned char b)
             Check_Acknowledge(),Send_UnAcknowledge()
             
** 输入: addr:读入地址

** 输出: char-当读出正确时反回读出值,否则返回0xff。

******************************************************************************/
	  
unsigned char Read_One_Byte(unsigned char addr)
{         
   bit acktemp=1;
   unsigned char mydata;
   I2C_Start();
   WriteI2CByte(SLAW);         /*write the SLAW*/
   acktemp=Check_Acknowledge();
   if(!acktemp)
   {  
      	I2C_Stop();
		return(0xff);
   }
   WriteI2CByte(addr);         /*write memory address*/
   acktemp=Check_Acknowledge();
   if(!acktemp)
   {  
      	I2C_Stop();
		return(0xff);
   }
   I2C_Start();
   WriteI2CByte(SLAR);        /*write the SLAR*/
   acktemp=Check_Acknowledge();
   if(!acktemp)
   {  
      	I2C_Stop();
		return(0xff);
   }
   mydata=ReadI2CByte();
   Send_UnAcknowledge();
   I2C_Stop();
   return mydata;
}

/*****************************************************************************

** 函数名称: Read_N_Bytes

** 功能描述: read N bytes from memory N<16

⌨️ 快捷键说明

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