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

📄 i2c_51.lst

📁 8051模拟I2C
💻 LST
字号:
C51 COMPILER V7.50   I2C_51                                                                06/18/2006 10:39:05 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE I2C_51
OBJECT MODULE PLACED IN I2C_51.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE I2C_51.C ROM(SMALL) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /***************************I2C_51.C****************************************************
   2              此程序包括发送数据及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,能很方便的与用户程序连接
             -并扩展。
   3              需要注意的是,函数是采用软件延时的方法产生SCL脉冲,对高晶振频率要做一定的修改(本例是1us机器周期,即晶
             -振频率要小于12MHZ)
   4          ********************************************************************************************/
   5          
   6          #include "reg52.h"
   7          #include "intrins.h"
   8          
   9          #define uchar unsigned char
  10          #define uint  unsigned int
  11          #define _Nop() _nop_()
  12          
  13          void Start_I2C(void);
  14          void Stop_I2C(void);
  15          void SendB(unsigned char c);
  16          unsigned char RcvB(void);
  17          void Ack_I2C(bit a);
  18          //bit ISendB(unsigned char sla, unsigned char c);
  19          //bit IRcvB(unsigned char sla, unsigned char * c);
  20          bit ISendStr(unsigned char sla, unsigned char suba, unsigned char * s,unsigned char no);
  21          bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char * s,unsigned char no);
  22          /*端口位定义*/
  23          sbit SDA = P3^2;//模拟I2C数据传送位
  24          sbit SCL = P3^3;//模拟I2C时钟控制位
  25          
  26          /*状态标志*/
  27          bit ack;//应答标志位
  28          
  29          /**********************************void Start_I2C()*********************************
  30          该函数是启动总线函数,功能是启动I2C总线,即发送I2C起始条件
  31          *********************************************************************************/
  32          
  33          void Start_I2C(void)
  34          {
  35   1              SDA = 1;//发送起始条件的数据信号
  36   1              _Nop();
  37   1              SCL = 1;
  38   1              _Nop();//起始条件建立时间大于4.7us,延时
  39   1              _Nop();
  40   1              _Nop();
  41   1              _Nop();
  42   1              _Nop();
  43   1              SDA = 0;//发送起始信号
  44   1              _Nop();//起始条件锁定时间大于4us
  45   1              _Nop();
  46   1              _Nop();
  47   1              _Nop();
  48   1              _Nop();
  49   1              SCL = 0;//嵌住I2C总线准备发送或接收数据
  50   1              _Nop();
  51   1              _Nop();
  52   1      }
  53          
C51 COMPILER V7.50   I2C_51                                                                06/18/2006 10:39:05 PAGE 2   

  54          /******************************************************************
  55          该函数为结束总线函数,功能是结束I2C总线,即发送I2C结束条件
  56          ******************************************************************/
  57          void Stop_I2C(void)
  58          {
  59   1              SDA = 0;//发送结束条件的数据信号
  60   1              _Nop();
  61   1              SCL = 1;//发送结束条件的时钟信号
  62   1              _Nop();//结束条件建立时间大于4us
  63   1              _Nop();
  64   1              _Nop();
  65   1              _Nop();
  66   1              _Nop();
  67   1              SDA = 1;//发送I2C总线结束信号
  68   1              _Nop();
  69   1              _Nop();
  70   1              _Nop();
  71   1              _Nop();
  72   1      }
  73          
  74          
  75          
  76          /*********************void SendB(unsigned char c)*********************************
  77          该函数为字节数据传送函数,功能是将数据c发送出去,可以是地址,也可以是数据,发送完毕后等待应答,
  78          并对此状态位进行操作(不应答或非应答都使ack = 0,假)。发送数据正常ack = 1;ack = 0表示被控制
  79          器无应答或损坏。
  80          ****************************************************************/
  81          void SendB(unsigned char c)
  82          {
  83   1              unsigned char BitCnt;
  84   1      
  85   1              for(BitCnt = 0;BitCnt < 8;BitCnt++)//要传送的数据长度为8位
  86   1              {
  87   2                      if((c<<BitCnt)&0x80)
  88   2                              SDA = 1;//判断发送位//判断需要发送的bit为0还是1
  89   2                      else 
  90   2                              SDA = 0;
  91   2                      _Nop();
  92   2      
  93   2                      SCL = 1;//置时钟线为高,通知被控制器开始接收数据位
  94   2                      _Nop();
  95   2                      _Nop();//保证时钟高电平周期大于4us
  96   2                      _Nop();
  97   2                      _Nop();
  98   2                      _Nop();
  99   2      
 100   2                      SCL = 0;
 101   2              }
 102   1              _Nop();
 103   1              _Nop();
 104   1      
 105   1              SDA = 1;//8位发送完毕后,释放数据线准备接收应答位
 106   1              _Nop();
 107   1              _Nop();
 108   1      
 109   1              SCL = 1;
 110   1              _Nop();
 111   1              _Nop();
 112   1              _Nop();
 113   1      
 114   1              if(SDA == 1)
 115   1                      ack = 0;//判断是否接收到应答信号
C51 COMPILER V7.50   I2C_51                                                                06/18/2006 10:39:05 PAGE 3   

 116   1              else
 117   1                      ack = 1;
 118   1      
 119   1              SCL = 0;
 120   1              _Nop();
 121   1              _Nop();
 122   1      }
 123          /***************************unsigned char RcvB()******************************
 124          该函数是字节数据传送函数,功能:接收从器件传来的数据,并判断总线错误(不发应答信号),
 125          发送完毕后调用应答函数。
 126          ************************************************************************/
 127          
 128          unsigned char RcvB(void)
 129          {
 130   1              unsigned char retc;
 131   1              unsigned char BitCnt;
 132   1      
 133   1              retc = 0;
 134   1      
 135   1              SDA = 1;
 136   1              for(BitCnt = 0;BitCnt < 8;BitCnt++)
 137   1              {
 138   2                      _Nop();
 139   2                      SCL = 0;//置时钟总线为低,准备接收数据
 140   2                      _Nop();
 141   2                      _Nop();//时钟低电平大于4us
 142   2                      _Nop();
 143   2                      _Nop();
 144   2                      _Nop();
 145   2      
 146   2                      SCL = 1;//置时钟总线为高,是数据线上数据有效
 147   2                      _Nop();
 148   2                      _Nop();
 149   2      
 150   2                      retc = retc << 1;
 151   2                      if(SDA == 1) retc = retc + 1;//读数据位,接收的数据位放入retc中
 152   2                      _Nop();
 153   2                      _Nop();
 154   2              }
 155   1      
 156   1              SCL = 0;
 157   1              _Nop();
 158   1              _Nop();
 159   1              return(retc);
 160   1      }
 161          
 162          /***********************************void Ack_I2C(bit a)*********************************
 163          该函数为应答函数,功能:主控制器进行应答信号(主机发送的应答信号)(对于从机的应答信号,主机只需要检测)
 164          ******************************************************************************************/
 165          
 166          void Ack_I2C(bit a)
 167          {
 168   1              if(a == 0)
 169   1                      SDA = 0;//在此发出应答或非应答信号
 170   1              else
 171   1                      SDA = 1;
 172   1              _Nop();
 173   1              _Nop();
 174   1              _Nop();
 175   1      
 176   1              SCL = 1;
 177   1              _Nop();//时钟低电平周期大于4us
C51 COMPILER V7.50   I2C_51                                                                06/18/2006 10:39:05 PAGE 4   

 178   1              _Nop();
 179   1              _Nop();
 180   1              _Nop();
 181   1              _Nop();
 182   1      
 183   1              SCL = 0;//清时钟线,嵌住I2C总线以便接收
 184   1              _Nop();
 185   1              _Nop();
 186   1      }
 187          
 188          /******************************bit ISendB(unsigned char sla, unsigned char c)*****************************
             -****
 189          该函数为无子地址器件发送字节数据函数,功能:从启动总线到发送地址、数据,结束总线的全过程,从器件地址sla,

⌨️ 快捷键说明

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