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

📄 zlg_i2c.lst

📁 使用单片机模拟I2C时序对24c02进行读写,通过proteus仿真对数据进行分析. 有仿真图片
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.02   ZLG_I2C                                                               11/30/2007 14:28:45 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE ZLG_I2C
OBJECT MODULE PLACED IN ZLG_I2C.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE SRC\ZLG_I2C.c BROWSE DEBUG OBJECTEXTEND PRINT(.\ZLG_I2C.lst) OBJECT(ZLG_I2C
                    -.obj)

line level    source

   1          /********************************************************************
   2                                 ZLG_I2C.C
   3            此程序是I2C操作平台(主方式的软件平台)的底层的C子程序,如发送数据
   4          及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的
   5          与用户程序连接并扩展.....  
   6            
   7              注意:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 
   8          一定的修改....(本例是1us机器周期,即晶振频率要小于12MHZ)
   9          
  10          ********************************************************************/
  11          
  12          #include "..\inc\main.h"
  13                                                          
  14          sbit SDA=P3^5;                  /*模拟I2C数据传送位*/
  15          sbit SCL=P3^4;                  /*模拟I2C时钟控制位*/
  16                                 
  17          //bit ack;                              /*应答标志位*/
  18          uchar ack;                                      //应答位标志位可设置成这样.
  19             
  20          /*******************************************************************
  21                               起动总线函数               
  22          函数原型: void start_i2c(void);  
  23          功能:     启动I2C总线,即发送I2C起始条件.
  24            
  25          ********************************************************************/
  26          void start_i2c(void)
  27          {
  28   1              SDA=1;          /*发送起始条件的数据信号*/
  29   1              _Nop();
  30   1              SCL=1;
  31   1              _Nop();         /*起始条件建立时间大于4.7us,延时*/
  32   1              _Nop();
  33   1              _Nop();
  34   1              _Nop();
  35   1              _Nop();    
  36   1              SDA=0;          /*发送起始信号*/
  37   1              _Nop();         /* 起始条件锁定时间大于4μs*/
  38   1              _Nop();
  39   1              _Nop();
  40   1              _Nop();
  41   1              _Nop();       
  42   1              SCL=0;          /*钳住I2C总线,准备发送或接收数据 */
  43   1              _Nop();
  44   1              _Nop();
  45   1      }
  46          
  47          
  48          
  49          
  50          /*******************************************************************
  51                                结束总线函数               
  52          函数原型: void stop_i2c(void);  
  53          功能:     结束I2C总线,即发送I2C结束条件.
  54            
C51 COMPILER V8.02   ZLG_I2C                                                               11/30/2007 14:28:45 PAGE 2   

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

 117          
 118          
 119          
 120          /*******************************************************************
 121                           字节数据传送函数               
 122          函数原型: uchar  receive_byte(void);
 123          功能:     用来接收从器件传来的数据,并判断总线错误(不发应答信号),
 124                    发完后请用应答函数。  
 125          ********************************************************************/   
 126          uchar  receive_byte(void)
 127          {       
 128   1              uchar retc;
 129   1              uchar BitCnt; 
 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)
 146   2                      retc=retc+1;    /*读数据位,接收的数据位放入retc中 */
 147   2              _Nop();
 148   2              _Nop(); 
 149   2              }
 150   1              SCL=0;    
 151   1              _Nop();
 152   1              _Nop();
 153   1              return (retc);
 154   1      }

⌨️ 快捷键说明

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