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

📄 vi2c_c51.lst

📁 IIC 的驱动程序 很完整。通过KEIL C 编译在ROTUES 上用AT89C51仿真通过。
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.20   VI2C_C51                                                              05/30/2006 19:25:31 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE VI2C_C51
OBJECT MODULE PLACED IN VI2C_C51.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE VI2C_C51.C BROWSE DEBUG OBJECTEXTEND

line level    source

*** WARNING C500 IN LINE 1 OF VI2C_C51.C: MISSING DEVICE (SECURITY KEY NOT FOUND)
   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          /********************************************************************/
  12          
  13          #include <reg51.h>
  14          #include <intrins.h>
  15          
  16          #define  uchar unsigned char  /*宏定义*/
  17          #define  uint  unsigned int
  18          
  19          #define  _Nop()  _nop_()        /*定义空指令*/
  20          
  21          
  22          sbit SDA=P1^0;             /*模拟I2C数据传送位*/
  23          sbit SCL=P1^1;             /*模拟I2C时钟控制位*/
  24          
  25          bit ack;           /*应答标志位*/
  26             
  27          
  28          
  29          /*******************************************************************
  30                               起动总线函数               
  31          函数原型: void  Start_I2c();  
  32          功能:     启动I2C总线,即发送I2C起始条件.  
  33          ********************************************************************/
  34          void Start_I2c()
  35          {
  36   1        SDA=1;    /*发送起始条件的数据信号*/
  37   1        _Nop();
  38   1        SCL=1;
  39   1        _Nop();     /*起始条件建立时间大于4.7us,延时*/
  40   1        _Nop();
  41   1        _Nop();
  42   1        _Nop();
  43   1        _Nop();  
  44   1        _Nop() ; 
  45   1        SDA=0;    /*发送起始信号*/
  46   1        _Nop();     /* 起始条件锁定时间大于4μs*/
  47   1        _Nop();
  48   1        _Nop();
  49   1        _Nop();
  50   1        _Nop();
  51   1        _Nop() ;      
  52   1        SCL=0;    /*钳住I2C总线,准备发送或接收数据 */
  53   1        _Nop();
  54   1        _Nop();
C51 COMPILER V7.20   VI2C_C51                                                              05/30/2006 19:25:31 PAGE 2   

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

 117   1          SCL=1;
 118   1          _Nop();
 119   1          _Nop();
 120   1         // _Nop();
 121   1          if(SDA==1)ack=0;     
 122   1             else ack=1;        /*判断是否接收到应答信号*/
 123   1          SCL=0;
 124   1          _Nop();
 125   1          _Nop();
 126   1      }
 127          
 128           
 129          
 130           
 131          
 132          
 133          /*******************************************************************
 134                           字节数据接收函数               
 135          函数原型: uchar  RcvByte();
 136          功能:     用来接收从器件传来的数据,并判断总线错误(不发应答信号),
 137                    发完后请用应答函数应答从机。  
 138          ********************************************************************/ 
 139          uchar  RcvByte()
 140          {
 141   1        uchar retc;
 142   1        uchar BitCnt;
 143   1        
 144   1        retc=0; 
 145   1        SDA=1;               /*置数据线为输入方式*/
 146   1        for(BitCnt=0;BitCnt<8;BitCnt++)
 147   1            {
 148   2              _Nop();           
 149   2              SCL=0;                  /*置时钟线为低,准备接收数据位*/
 150   2              _Nop();
 151   2              _Nop();                 /*时钟低电平周期大于4.7μs*/
 152   2              _Nop();
 153   2              _Nop();
 154   2              _Nop();
 155   2              SCL=1;                  /*置时钟线为高使数据线上数据有效*/
 156   2              _Nop();
 157   2              _Nop();
 158   2              retc=retc<<1;
 159   2              if(SDA==1)retc=retc+1;  /*读数据位,接收的数据位放入retc中 */
 160   2              _Nop();
 161   2              _Nop(); 
 162   2            }
 163   1        SCL=0;    
 164   1        _Nop();
 165   1        _Nop();
 166   1        return(retc);
 167   1      }
 168          
 169           
 170          
 171          
 172          /********************************************************************
 173                               应答子函数
 174          函数原型:  void Ack_I2c(bit a);
 175          功能:      主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
 176          ********************************************************************/
 177          void Ack_I2c(bit a)
 178          {
C51 COMPILER V7.20   VI2C_C51                                                              05/30/2006 19:25:31 PAGE 4   

 179   1        
 180   1        if(a==0)SDA=0;           /*在此发出应答或非应答信号 */
 181   1              else SDA=1;
 182   1        _Nop();
 183   1        _Nop(); 
 184   1        _Nop();      
 185   1        SCL=1;
 186   1        _Nop();

⌨️ 快捷键说明

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