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

📄 i2c.c

📁 51单片机的模拟I2C总线接口函数
💻 C
字号:
/*
*********************************************************************************************************
*                                                                                                         
*                             低成本汇率电子显示屏控制系统的开发
*                                     独立本科段毕业设计
*  
*                                     Since 2004 - 2005
*                                    All Rights Reserved.
*
*
*------------------------------------------文件信息------------------------------------------------------
*
*  文件名 : I2C.C
*  作  者 : li.yao
*  日  期 : 2004年 05月 13日,星期四
*  描  述 : 软件模拟I2C总线的驱动程序,包括100KHz(T=10us)的慢速模式和400KHz(T=2.5us)的快速模式。
*  
*------------------------------------------日志记录------------------------------------------------------
*
*  版  本 : V1.02 
*  作  者 : li.yao
*  日  期 : 2005年 02月 28日,星期一 
*  变  更 : 修改了几处BUGS,补全了注释。
*
*--------------------------------------------------------------------------------------------------------
*
*  版  本 : V1.00  格式说明: 主版本号 . 升级版本号 + 内部测试版本号  
*  作  者 : li.yao
*  日  期 : 2004年 05月 13日,星期四
*  变  更 : 文件建立。
*
*********************************************************************************************************
*/

#include "..\INC\HEADER.H"

/*
*********************************************************************************************************
*                                          配置参数                                                     *
*********************************************************************************************************
*/

sbit SDA = P1^1;                                   // I2C总线的数据线                            
sbit SCL = P1^0;                                   // I2C总线的时钟线

#define  I2cDelay( )  { _nop_(); _nop_(); } 


/*
*********************************************************************************************************
*                                         函数说明
*
*  函数名 : void I2cStart(void); 
*  参数表 : none
*  返回值 : none
*  功  能 : 启动I2C总线,私有函数。
*
*  作  者 : li.yao
*  日  期 : 2004年 05月 13日,星期四   
*   
*-----------------------------------------日志记录-------------------------------------------------------
*
*  版  本 : V1.02                     
*  作  者 : li.yao                    
*  日  期 : 2005年 02月 28日,星期一  
*  变  更 : 增加了中断关闭操作。      
*
*--------------------------------------------------------------------------------------------------------
*
*  版  本 : V1.00   格式说明:主版本号 . 升级版本号 + 内部测试版本号  
*  作  者 : li.yao
*  日  期 : 2004年 05月 13日,星期四 
*  变  更 : 函数建立。
*
*********************************************************************************************************
*/

void    I2cStart(void)
{
   EA  = 0;
   I2cDelay();
   SCL = 1;
   SDA = 1;
   I2cDelay();
   SDA = 0;
   I2cDelay();
   SCL = 0;
}

/*
*********************************************************************************************************
*                                         函数说明
*
*  函数名 : void I2cStop(void);
*  参数表 : none
*  返回值 : none
*  功  能 : 关闭I2C总线,私有函数。
*
*  作  者 : Li.yao
*  日  期 : 2004年 05月 13日,星期四   
*   
*-----------------------------------------日志记录-------------------------------------------------------
*
*  版  本 : V1.02                     
*  作  者 : li.yao                    
*  日  期 : 2005年 02月 28日,星期一  
*  变  更 : 增加了中断打开操作。      
*
*--------------------------------------------------------------------------------------------------------
*
*  版  本 : V1.00   格式说明:主版本号 . 升级版本号 + 内部测试版本号  
*  作  者 : li.yao
*  日  期 : 2004年 05月 13日,星期四 
*  变  更 : 函数建立。
*
*********************************************************************************************************
*/

void    I2cStop(void)
{
   SDA = 0;
   SCL = 0;
   I2cDelay();
   SCL = 1;
   I2cDelay();
   SDA = 1;
   I2cDelay();
   EA  = 1;
}

/*
*********************************************************************************************************
*                                         函数说明
*
*  函数名 : void I2cAckS(void);
*  参数表 : none
*  返回值 : none
*  功  能 : 主器件为接收方,从器件为发送方时,应答信号,私有函数。
*
*  作  者 : li.yao
*  日  期 : 2004年 05月 13日,星期四 
*   
*-----------------------------------------日志记录-------------------------------------------------------
*
*  版  本 : V1.00   格式说明:主版本号 . 升级版本号 + 内部测试版本号  
*  作  者 : li.yao
*  日  期 : 2004年 05月 13日,星期四 
*  变  更 : 函数建立。
*
*********************************************************************************************************
*/

void    I2cAckS(void)
{
   SDA = 0;
   I2cDelay();
   SCL = 1;
   I2cDelay();
   SCL = 0;
}

/*
*********************************************************************************************************
*                                         函数说明
*
*  函数名 : void I2cNotAckS(void);
*  参数表 : none
*  返回值 : none
*  功  能 : 主器件为接收方,从器件为发送方时,非应答信号,私有函数。
*
*  作  者 : li.yao
*  日  期 : 2004年 05月 13日,星期四 
*   
*-----------------------------------------日志记录-------------------------------------------------------
*
*  版  本 : V1.00   格式说明:主版本号 . 升级版本号 + 内部测试版本号  
*  作  者 : li.yao
*  日  期 : 2004年 05月 13日,星期四 
*  变  更 : 函数建立。
*
*********************************************************************************************************
*/

void    I2cNotAckS(void)
{
   SDA = 1;
   I2cDelay();
   SCL = 1;
   I2cDelay();
   SCL = 0;
}

/*
*********************************************************************************************************
*                                         函数说明
*
*  函数名 : INT8U I2cAckR(void);
*  参数表 : none
*  返回值 : 是否等待超时。
*  功  能 : 等待从器件接收方的应答,私有函数。
*
*  作  者 : li.yao
*  日  期 : 2004年 05月 13日,星期四 
*   
*-----------------------------------------日志记录-------------------------------------------------------
*
*  版  本 : V1.00   格式说明:主版本号 . 升级版本号 + 内部测试版本号  
*  作  者 : li.yao
*  日  期 : 2004年 05月 13日,星期四 
*  变  更 : 函数建立。
*
*********************************************************************************************************
*/

INT8U    I2cAckR(void)
{
   INT8U    time = 0xFF;

   SDA = 1;
   I2cDelay();
   SCL = 1;
   I2cDelay();
   while (SDA == 1)
   {
       time--;
       if (!time)
       {
           I2cStop();
           return FALSE;
       }
   }
   SCL = 0;
   return TRUE;
}

/*
*********************************************************************************************************
*                                         函数说明
*
*  函数名 : INT8U I2cRead(void);
*  参数表 : none
*  返回值 : 接收到的字节。
*  功  能 : 接收一个字节的数据,私有函数。
*
*  作  者 : li.yao
*  日  期 : 2004年 05月 13日,星期四 
*   
*-----------------------------------------日志记录-------------------------------------------------------
*
*  版  本 : V1.00   格式说明:主版本号 . 升级版本号 + 内部测试版本号  
*  作  者 : li.yao
*  日  期 : 2004年 05月 13日,星期四 
*  变  更 : 函数建立。
*
*********************************************************************************************************
*/

INT8U    I2cRead(void)
{
   INT8U       i = 8;
   INT8U      ch = 0;

   SDA = 1;
   while (i--)
   {
       ch <<= 1;
       SCL = 0;
       I2cDelay();
       SCL = 1;
       I2cDelay();
       ch |= SDA;
   }
   SCL = 0;
   return ch;
}

/*
*********************************************************************************************************
*                                         函数说明
*
*  函数名 : void I2cWrite(INT8U ch);
*  参数表 : ch: 要发送的字节。
*  返回值 : none
*  功  能 : 发送一个字节的数据,私有函数。
*
*  作  者 : li.yao
*  日  期 : 2004年 05月 13日,星期四 
*   
*-----------------------------------------日志记录-------------------------------------------------------
*
*  版  本 : V1.00   格式说明:主版本号 . 升级版本号 + 内部测试版本号  
*  作  者 : li.yao
*  日  期 : 2004年 05月 13日,星期四 
*  变  更 : 函数建立。
*
*********************************************************************************************************
*/

void    I2cWrite(INT8U ch)
{
   INT8U       i = 8;

   while (i--)
   {
       SCL = 0;
       I2cDelay();
       SDA = (UBIT)(ch & 0x80);
       ch <<= 1;
       I2cDelay();
       SCL = 1;
       I2cDelay();
   }
   SCL = 0;
}

/*
*********************************************************************************************************
*                                          文件结束                                                     *
*********************************************************************************************************
*/

⌨️ 快捷键说明

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