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

📄 viic_c51.lst

📁 此程序是I2C操作平台的底层的C子程序,如发送数据及接收数据,应答位发送。E2PROM的读写程序。
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   VIIC_C51                                                              03/23/2009 22:19:43 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE VIIC_C51
OBJECT MODULE PLACED IN VIIC_C51.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE VIIC_C51.c LARGE BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /********************************************************************
   2                                 VIIC_C51.C
   3            此程序是I2C操作平台(主方式的软件平台)的底层的C子程序,如发送数据
   4          及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的
   5          与用户程序连接并扩展.....  
   6            
   7              注意:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 
   8          一定的修改....(本例是1us机器周期,即晶振频率要小于12MHZ)
   9          
  10          ********************************************************************/
  11          /*************************24WC02管脚接法****************************/
  12          //C02引脚| 符号  | 与单片机相连的引脚
  13          //1      |  A0   |  接地                                           //
  14          //2      |  A1   |  接地                                           //
  15          //3      |  A2   |  接地                                           //
  16          //4      |  GND  |  接地                                           //
  17          //5      |  SDA  |  接10K上拉电阻与 P1^7 相接                      //
  18          //6      |  SCL  |  接10K上拉电阻与 P1^6 相接                      //
  19          //7      |  WP   |  接地                                           //
  20          //8      |  VDD  |  电源                                           //
  21          
  22            
  23            
  24                        
  25          #include <reg52.h>                  /*头文件的包含*/
  26          #include <intrins.h>
  27          
  28          
  29          #define  uchar unsigned char        /*宏定义*/
  30          #define  uint  unsigned int
  31          
  32          #define  _Nop()  _nop_()            /*定义空指令*/
  33          
  34          /* 常,变量定义区 */
  35           
  36                                              /*端口位定义*/
  37          sbit SDA=P1^1;                      /*模拟I2C数据传送位*/
  38          sbit SCL=P1^0;                      /*模拟I2C时钟控制位*/
  39          
  40                                              /*状态标志*/
  41          bit ack;                                /*应答标志位*/
  42             
  43          
  44          #define  CSI24WC02  0xA0            /*定义器件地址*/
  45          
  46          
  47          
  48          /*******************************************************************
  49                               起动总线函数               
  50          函数原型: void  Start_I2c();  
  51          功能:       启动I2C总线,即发送I2C起始条件.
  52            
  53          ********************************************************************/
  54          void Start_I2c()
  55          {
C51 COMPILER V7.50   VIIC_C51                                                              03/23/2009 22:19:43 PAGE 2   

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

 118   2             else  SDA=0;                
 119   2           _Nop();
 120   2           SCL=1;                         /*置时钟线为高,通知被控器开始接收数据位*/
 121   2            _Nop(); 
 122   2            _Nop();                       /*保证时钟高电平周期大于4μs*/
 123   2            _Nop();
 124   2            _Nop();
 125   2            _Nop();         
 126   2           SCL=0; 
 127   2          }
 128   1          
 129   1          _Nop();
 130   1          _Nop();
 131   1          SDA=1;                          /*8位发送完后释放数据线,准备接收应答位*/
 132   1          _Nop();
 133   1          _Nop();   
 134   1          SCL=1;
 135   1          _Nop();
 136   1          _Nop();
 137   1          _Nop();
 138   1          if(SDA==1)ack=0;     
 139   1             else ack=1;                  /*判断是否接收到应答信号*/
 140   1          SCL=0;
 141   1          _Nop();
 142   1          _Nop();
 143   1      }
 144          
 145          
 146          
 147          
 148          
 149          
 150          /*******************************************************************
 151                           字节数据传送函数               
 152          函数原型: uchar  RcvByte();
 153          功能:  用来接收从器件传来的数据,并判断总线错误(不发应答信号),
 154               发完后请用应答函数。  
 155          ********************************************************************/   
 156          uchar  RcvByte()
 157          {
 158   1        uchar retc;
 159   1        uchar BitCnt;
 160   1        
 161   1        retc=0; 
 162   1        SDA=1;                           /*置数据线为输入方式*/
 163   1        for(BitCnt=0;BitCnt<8;BitCnt++)
 164   1            {
 165   2              _Nop();           
 166   2              SCL=0;                     /*置时钟线为低,准备接收数据位*/
 167   2              _Nop();
 168   2              _Nop();                    /*时钟低电平周期大于4.7μs*/
 169   2              _Nop();
 170   2              _Nop();
 171   2              _Nop();
 172   2              SCL=1;                     /*置时钟线为高使数据线上数据有效*/
 173   2              _Nop();

⌨️ 快捷键说明

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