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

📄 iic.lst

📁 单片机实现消息队列的例子
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.10   IIC                                                                   12/14/2004 10:51:17 PAGE 1   


C51 COMPILER V7.10, COMPILATION OF MODULE IIC
OBJECT MODULE PLACED IN .\iic.obj
COMPILER INVOKED BY: C:\Program Files\Keil\C51\BIN\C51.EXE ..\SourceFile\iic.c LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\i
                    -ic.lst) OBJECT(.\iic.obj)

line level    source

   1          /*************************************************/
   2          
   3          /*****************I2C串行总线********************/
   4          
   5          /****************2003年1月15日*******************/
   6          
   7          /************WROTE BY ZLGMCU********************/
   8          
   9          /************MODIFY BY WANGSW********************/
  10          
  11          
  12            
  13          #include <intrins.h>              
  14          #include "reg52x2.h"            /*头文件的包含*/
  15          
  16          #include "define.h"
  17          #include "interrupt.h"
  18          #include "iic.h"
  19          
  20          
  21                                  
  22                                                           /*端口位定义*/
  23          sbit SDA=P3^4;            /*模拟I2C数据传送位*/
  24          sbit SCL=P3^5;            /*模拟I2C时钟控制位*/
  25          
  26                                                           /*状态标志*/
  27          bool ack;                /*应答标志位*/
  28          
  29          
  30          
  31          static void StartI2c(void);
  32          static void StopI2c(void);
  33          static bool SendByte(byte value);
  34          static byte RcvByte(void);
  35          static void AckI2c(bool bFlag);
  36          
  37          
  38          /**********************************************************************/
  39          
  40          
  41          
  42          static void StartI2c()
  43          {
  44   1              SDA = 1;   /*发送起始条件的数据信号*/
  45   1              _nop_();
  46   1              SCL = 1;
  47   1              _nop_();
  48   1              SDA = 0;   /*发送起始信号*/
  49   1              _nop_();
  50   1              SCL = 0;   /*钳住I2C总线,准备发送或接收数据 */
  51   1      }
  52          
  53          static void StopI2c()
  54          {
C51 COMPILER V7.10   IIC                                                                   12/14/2004 10:51:17 PAGE 2   

  55   1              SDA = 0;  /*发送结束条件的数据信号*/
  56   1              _nop_();
  57   1              SCL = 1;  /*结束条件建立时间大于4μs*/
  58   1              _nop_();
  59   1              SDA = 1;  /*发送I2C总线结束信号*/
  60   1      }
  61          
  62          static bool SendByte(byte value)
  63          {
  64   1              byte data i;
  65   1              
  66   1              for(i = 0; i < 8; i++)  /*要传送的数据长度为8位*/
  67   1              {
  68   2                      SCL = 0;
  69   2                      if((value << i) & 0x80)         /*取数据,并转串*/
  70   2                      {
  71   3                              SDA = 1;
  72   3                      }
  73   2                      else  
  74   2                      {
  75   3                              SDA = 0;
  76   3                      }
  77   2                      _nop_();
  78   2                      SCL = 1;               /*置时钟线为高,通知被控器开始接收数据位*/    
  79   2                      _nop_();
  80   2              }
  81   1              
  82   1              SCL = 0;
  83   1              _nop_();
  84   1              SDA = 1;               /*8位发送完后释放数据线,准备接收应答位*/
  85   1              _nop_();
  86   1              SCL = 1;
  87   1              _nop_();
  88   1              if(SDA)
  89   1              {
  90   2                      ack = 0;     
  91   2              }
  92   1              else
  93   1              {
  94   2                      ack = 1;        /*判断是否接收到应答信号*/
  95   2              }
  96   1              _nop_();
  97   1              SCL = 0;
  98   1              
  99   1              return(ack);
 100   1      }
 101          
 102          static byte RcvByte()
 103          {
 104   1              byte data i;
 105   1              byte data retc;
 106   1      
 107   1              retc = 0; 
 108   1              SDA = 1;             /*置数据线为输入方式*/
 109   1              
 110   1              for(i = 0; i < 8; i++)
 111   1              {
 112   2                      SCL = 0;       /*置时钟线为低,准备接收数据位*/
 113   2                      _nop_();
 114   2                      SCL = 1;       /*置时钟线为高使数据线上数据有效*/ 
 115   2                      _nop_();
 116   2                      retc = retc << 1;
C51 COMPILER V7.10   IIC                                                                   12/14/2004 10:51:17 PAGE 3   

 117   2                      if(SDA)
 118   2                      {
 119   3                       retc = retc + 1; /*读数据位,接收的数据位放入retc中 */
 120   3                      }
 121   2              }
 122   1              SCL = 0;    
 123   1              return(retc);
 124   1      }
 125          
 126          static void AckI2c(bool bFlag)
 127          {
 128   1              if(bFlag)
 129   1              {
 130   2                      SDA = 1;     /*在此发出应答或非应答信号 */
 131   2              }
 132   1              else 
 133   1              {
 134   2                      SDA = 0;  
 135   2              }
 136   1              _nop_();
 137   1              SCL = 1;
 138   1              _nop_();
 139   1              SCL = 0;                /*清时钟线,钳住I2C总线以便继续接收*/ 
 140   1      }
 141          
 142          
 143          /***************************************************************/
 144          
 145          
 146          extern bool iic_send_byte(byte SlaveAddress, byte value)
 147          {
 148   1              StartI2c();               /*启动总线*/
 149   1              
 150   1              if(!SendByte(SlaveAddress))            /*发送器件地址*/
 151   1              {
 152   2                      return(FALSE);
 153   2              }
 154   1              
 155   1              if(!SendByte(value))               /*发送数据*/
 156   1              {
 157   2                      return(FALSE);
 158   2              }
 159   1              
 160   1              StopI2c();                 /*结束总线*/ 
 161   1              return(TRUE);
 162   1      }
 163          
 164          
 165          
 166          
 167          extern bool iic_rcv_byte(byte SlaveAddress, byte value)
 168          {
 169   1              StartI2c();                /*启动总线*/
 170   1              
 171   1              if(!SendByte(SlaveAddress + 1))           /*发送器件地址*/
 172   1              {
 173   2                      return(FALSE);
 174   2              }
 175   1              
 176   1              value = RcvByte();               /*读取数据*/
 177   1              
 178   1              AckI2c(TRUE);               /*发送非就答位*/
C51 COMPILER V7.10   IIC                                                                   12/14/2004 10:51:17 PAGE 4   

 179   1              
 180   1              StopI2c();                  /*结束总线*/ 
 181   1              return(TRUE);
 182   1      }
 183          
 184          
 185          extern bool iic_send_str(byte SlaveAddress, byte address, byte *source, byte len) 
 186          {
 187   1              byte i;
 188   1      
 189   1              StartI2c();               /*启动总线*/
 190   1              
 191   1              if(!SendByte(SlaveAddress))            /*发送器件地址*/
 192   1              {
 193   2                      return(FALSE);
 194   2              }
 195   1              
 196   1              if(!SendByte(address))            /*发送器件子地址*/

⌨️ 快捷键说明

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