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

📄 vi2c_c51.lst

📁 51单片机的I2C总线的EEPROM读写程序,用于基础的开发学习,适合初学者
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.10   VI2C_C51                                                              07/02/2005 10:56:29 PAGE 1   


C51 COMPILER V7.10, COMPILATION OF MODULE VI2C_C51
OBJECT MODULE PLACED IN VI2C_C51.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE VI2C_C51.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          
   2          
   3          #include <reg51.h>
   4          #include <intrins.h>
   5          
   6          #define  uchar unsigned char    /*宏定义*/
   7          #define  uint  unsigned int
   8          
   9          #define  _Nop()  _nop_()        /*定义空指令*/
  10          
  11          
  12          sbit SDA=P0^7;                  /*模拟I2C数据传送位*/
  13          sbit SCL=P0^6;                  /*模拟I2C时钟控制位*/
  14          
  15          bit ack;                        /*应答标志位*/
  16             
  17          
  18          
  19          /*******************************************************************
  20                               起动总线函数               
  21          函数原型: void  Start_I2c();  
  22          功能:     启动I2C总线,即发送I2C起始条件.  
  23          ********************************************************************/
  24          void Start_I2c()
  25          {
  26   1        SDA=1;        /*发送起始条件的数据信号*/
  27   1        _Nop();
  28   1        SCL=1;
  29   1        _Nop();       /*起始条件建立时间大于4.7us,延时*/
  30   1        _Nop();
  31   1        _Nop();
  32   1        _Nop();
  33   1        _Nop();    
  34   1        SDA=0;        /*发送起始信号*/
  35   1        _Nop();       /* 起始条件锁定时间大于4μs*/
  36   1        _Nop();
  37   1        _Nop();
  38   1        _Nop();
  39   1        _Nop();       
  40   1        SCL=0;        /*钳住I2C总线,准备发送或接收数据 */
  41   1        _Nop();
  42   1        _Nop();
  43   1      }
  44          
  45          
  46          
  47          
  48          /*******************************************************************
  49                                结束总线函数               
  50          函数原型: void  Stop_I2c();  
  51          功能:     结束I2C总线,即发送I2C结束条件.  
  52          ********************************************************************/
  53          void Stop_I2c()
  54          {
  55   1        SDA=0;        /*发送结束条件的数据信号*/
C51 COMPILER V7.10   VI2C_C51                                                              07/02/2005 10:56:29 PAGE 2   

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

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

⌨️ 快捷键说明

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