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

📄 iic.lst

📁 AT24c01存储器与单片机stc89C58硬件通讯
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.17   IIC                                                                   03/09/2009 15:54:45 PAGE 1   


C51 COMPILER V8.17, COMPILATION OF MODULE IIC
OBJECT MODULE PLACED IN .\obj\iic.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE iic.c BROWSE DEBUG OBJECTEXTEND PRINT(.\lis\iic.lst) OBJECT(.\obj\iic.obj)

line level    source

   1          /********************************************************************************/
   2          /*                                              MCS-51单片机模拟I2C软件包(V1.1)                                                 */                              
   3          /*      文件名:VI2C_C51.C                                                                                                                      */
   4          /*      相关文件:VI2C_C51.H,VI2C_C51.LIB                                                                                      */
   5          /*      功能说明:本模拟I2C软件包包含了I2C操作的底层函数,如发送数据及接收                      */
   6          /*      数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的与用户程          */
   7          /*      序连接并扩展.....                                                                                                                       */
   8          /*      注意:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的                      */
   9          /*      修改....(本软件包是1us机器周期,即晶振频率要小于12MHZ)                                           */
  10          /*      总线时序符合I2C标准模式,100Kbit/S。                                                                                     */
  11          /*                         更新时间:2005.12.7                                                                  */
  12          /********************************************************************************/
  13          #include "IIC.H"
  14          #include "CPU.H"
  15          #include "stdio.H"
  16          #include <intrins.h>
  17          #define  NOP()  _nop_()         /*定义空指令*/
  18          bit ack;                                        /*应答标志位*/
  19          /********************************************************************************/
  20          
  21          //延迟50ms
  22          /*
  23          void delay_50ms(unsigned int t)   
  24          {
  25                  unsigned int j; 
  26                  for(;t>0;t--) 
  27                  for(j=6245;j>0;j--); 
  28          }
  29          
  30          //I2C_Init为IIC初始化函数
  31          void I2C_Init()
  32          {
  33                  SCL = 1;        
  34                  _nop_();
  35                  _nop_();
  36                  _nop_();
  37                  SDA = 1;        
  38                  _nop_();
  39                  _nop_();
  40                  _nop_();
  41          } */
  42          /********************************************************************************/
  43          /*                      功能:          起动总线函数                                                                            */
  44          /*                      函数原型:       void  Start_I2c();                                                                      */
  45          /*                      功能:           启动I2C总线,即发送I2C起始条件.                                                  */
  46          /********************************************************************************/
  47          void Start_I2c()
  48          {
  49   1              SDA=1;                                          /*发送起始条件的数据信号*/
  50   1              NOP();
  51   1              SCL=1;
  52   1              NOP();NOP();                            /*起始条件建立时间大于4.7us,延时*/
  53   1              NOP();NOP();
  54   1              NOP();    
  55   1              SDA=0;                                          /*发送起始信号*/
C51 COMPILER V8.17   IIC                                                                   03/09/2009 15:54:45 PAGE 2   

  56   1              NOP();NOP();                            /* 起始条件锁定时间大于4μs*/
  57   1              NOP();NOP();
  58   1              NOP();       
  59   1              SCL=0;                                          /*钳住I2C总线,准备发送或接收数据 */
  60   1              NOP();NOP();
  61   1      }       
  62          /********************************************************************************/
  63          /*                      功能:结束总线函数                                                                                      */
  64          /*                      函数原型: void  Stop_I2c();                                                                             */
  65          /*                      功能:     结束I2C总线,即发送I2C结束条件.                                                        */
  66          /********************************************************************************/
  67          void Stop_I2c()
  68          {
  69   1              SDA=0;                                          /*发送结束条件的数据信号*/
  70   1              NOP();                                          /*发送结束条件的时钟信号*/
  71   1              SCL=1;                                          /*结束条件建立时间大于4μs*/
  72   1              NOP();NOP();
  73   1              NOP();NOP();
  74   1              NOP();
  75   1              SDA=1;                                          /*发送I2C总线结束信号*/
  76   1              NOP();NOP();
  77   1              NOP();NOP();
  78   1      }       
  79          /********************************************************************************/
  80          /*                      功能:          字节数据发送函数                                                                */
  81          /*                      函数原型:       void  SendByte(uchar c);                                                                */
  82          /*                      功能:           将数据c发送出去,可以是地址,也可以是数据,                                */
  83          /*                                              发完后等待应答,并对此状态位进行操作.                                    */
  84          /*                                              (不应答或非应答都使ack=0) 发送数据正常,ack=1;                  */
  85          /*                                              ack=0表示被控器无应答或损坏。                                                   */
  86          /********************************************************************************/
  87          void  SendByte(INT8U c)
  88          {
  89   1              INT8U  BitCnt;
  90   1              for(BitCnt=0;BitCnt<8;BitCnt++)         /*要传送的数据长度为8位*/
  91   1              {
  92   2                      if((c<<BitCnt)&0x80)SDA=1;      /*判断发送位*/
  93   2                      else  SDA=0;                
  94   2                      NOP();
  95   2                      SCL=1;                                  /*置时钟线为高,通知被控器开始接收数据位*/
  96   2                      NOP();NOP();                                    /*保证时钟高电平周期大于4μs*/
  97   2                      NOP();NOP();
  98   2                      NOP();         
  99   2                      SCL=0; 
 100   2              }
 101   1        
 102   1              NOP();NOP();
 103   1              SDA=1;                                  /*8位发送完后释放数据线,准备接收应答位*/
 104   1              NOP();NOP();   
 105   1              SCL=1;
 106   1              NOP();NOP();NOP();
 107   1              if(SDA==1)ack=0;     
 108   1              else ack=1;                             /*判断是否接收到应答信号*/
 109   1              SCL=0;
 110   1              NOP();NOP();
 111   1      }       
 112          /*******************************************************************
 113          功能:字节数据接收函数               
 114          函数原型: uchar  RcvByte();
 115          功能:     用来接收从器件传来的数据,并判断总线错误(不发应答信号),
 116                    发完后请用应答函数应答从机。  
 117          ********************************************************************/   
C51 COMPILER V8.17   IIC                                                                   03/09/2009 15:54:45 PAGE 3   

 118          INT8U  RcvByte()
 119          {
 120   1              INT8U retc;
 121   1              INT8U BitCnt;
 122   1        
 123   1              retc=0; 
 124   1              SDA=1;                          /*置数据线为输入方式*/
 125   1              for(BitCnt=0;BitCnt<8;BitCnt++)
 126   1              {
 127   2                      NOP();           
 128   2                      SCL=0;                  /*置时钟线为低,准备接收数据位*/
 129   2                      NOP();NOP();                 /*时钟低电平周期大于4.7μs*/
 130   2                      NOP();NOP();NOP();
 131   2                      SCL=1;                  /*置时钟线为高使数据线上数据有效*/
 132   2                      NOP();NOP();
 133   2                      retc=retc<<1;
 134   2                      if(SDA==1)retc=retc+1;  /*读数据位,接收的数据位放入retc中 */
 135   2                      NOP();NOP(); 
 136   2              }
 137   1              SCL=0;    
 138   1              NOP();NOP();
 139   1              return(retc);
 140   1      }       
 141          /********************************************************************
 142          功能:应答子函数
 143          函数原型:  void Ack_I2c(bit a);
 144          功能:      主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
 145          ********************************************************************/
 146          void Ack_I2c(bit a)
 147          {
 148   1        
 149   1              if(a==0)SDA=0;               /*在此发出应答或非应答信号 */
 150   1          else SDA=1;
 151   1              NOP();NOP();
 152   1              NOP();      
 153   1              SCL=1;
 154   1              NOP();NOP();                    /*时钟低电平周期大于4μs*/
 155   1              NOP();NOP();
 156   1              NOP();NOP();  
 157   1              SCL=0;                     /*清时钟线,钳住I2C总线以便继续接收*/
 158   1              NOP();NOP();    
 159   1      }       
 160          //用户接口函数                                   
 161          /*******************************************************************
 162          功能:向无子地址器件发送字节数据函数               
 163          函数原型: bit  ISendByte(INT8U sla,INT8U c);  
 164          功能:     从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
 165                    如果返回1表示操作成功,否则操作有误。
 166          注意:    使用前必须已结束总线。
 167          ********************************************************************/
 168          /*
 169          bit ISendByte(INT8U sla,INT8U c)

⌨️ 快捷键说明

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