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

📄 iic(ok).lst

📁 IIC 的驱动程序 很完整。通过KEIL C 编译在ROTUES 上用AT89C51仿真通过。
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.20   IIC_OK_                                                               06/07/2006 17:13:03 PAGE 1   


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

line level    source

*** WARNING C500 IN LINE 1 OF IIC(OK).C: MISSING DEVICE (SECURITY KEY NOT FOUND)
   1          //#include <VI2C_C51.C>
   2          #include <reg51.h>
   3          #include <intrins.h>
   4          #define  uchar unsigned char  /*宏定义*/
   5          #define  uint  unsigned int
   6          #define write24c01 0xA0
   7          #define writeaddr 0x20
   8          #define readaddr 0x20
   9          #define  _Nop()  _nop_()  
  10          
  11          //sbit SDA=P1^0;             /*模拟I2C数据传送位*/
  12          //sbit SCL=P1^1;             /*模拟I2C时钟控制位*/
  13          sbit SDA=P3^7;
  14          sbit SCL=P3^6;
  15          bit ack;           /*应答标志位*/
  16             
  17          uchar T[6]={2,0,0,5,5,4};
  18          uchar R[6];
  19          code uchar tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  20          void display();
  21          void delay(uchar x);
  22          
  23          /*******************************************************************
  24                               起动总线函数               
  25          函数原型: void  Start_I2c();  
  26          功能:     启动I2C总线,即发送I2C起始条件.  
  27          ********************************************************************/
  28          void Start_I2c()
  29          {
  30   1        SDA=1;    /*发送起始条件的数据信号*/
  31   1        _Nop();
  32   1        SCL=1;
  33   1        _Nop();     /*起始条件建立时间大于4.7us,延时*/
  34   1        _Nop();
  35   1        _Nop();
  36   1        _Nop();
  37   1        _Nop();  
  38   1        _Nop() ; 
  39   1        SDA=0;    /*发送起始信号*/
  40   1        _Nop();     /* 起始条件锁定时间大于4μs*/
  41   1        _Nop();
  42   1        _Nop();
  43   1        _Nop();
  44   1        _Nop();
  45   1        _Nop() ;      
  46   1        SCL=0;    /*钳住I2C总线,准备发送或接收数据 */
  47   1        _Nop();
  48   1        _Nop();
  49   1      }
  50          
  51           
  52          
  53          
  54          /*******************************************************************
C51 COMPILER V7.20   IIC_OK_                                                               06/07/2006 17:13:03 PAGE 2   

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

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

 179   1        SCL=1;
 180   1        _Nop();
 181   1        _Nop();                    /*时钟低电平周期大于4μs*/
 182   1        _Nop();
 183   1        _Nop();
 184   1        _Nop();  
 185   1        SCL=0;                     /*清时钟线,钳住I2C总线以便继续接收*/
 186   1        _Nop();
 187   1        _Nop();    
 188   1      }
 189          
 190           
 191          
 192          /*******************************************************************
 193                           用户接口函数                                   
 194          *******************************************************************/
 195          
 196          

⌨️ 快捷键说明

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