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

📄 i2c.lst

📁 51实例大全
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   I2C                                                                   06/02/2010 10:03:45 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN .\obj\i2c.obj
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE i2c.c BROWSE DEBUG OBJECTEXTEND PRINT(.\obj\i2c.lst) OBJECT(.\obj\i2c.obj)

stmt level    source

   1          /*-----------------------------------------------
   2            名称:IIC协议 
   3            论坛:www.doflye.net
   4            编写:shifang
   5            修改:无
   6            内容:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改....(本例是1us机器
   7                          周期,即晶振频率要小于12MHZ)
   8          ------------------------------------------------*/  
   9            
  10                        
  11          #include "i2c.h"
  12          
  13          
  14          #define  _Nop()  _nop_()  //定义空指令
  15                                   
  16          bit ack;                      //应答标志位
  17          
  18          sbit SDA=P2^1;
  19          sbit SCL=P2^0;
  20          /*------------------------------------------------
  21           uS延时函数,含有输入参数 unsigned char t,无返回值
  22           unsigned char 是定义无符号字符变量,其值的范围是
  23           0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  24           长度如下 T=tx2+5 uS 
  25          ------------------------------------------------*/
  26          void DelayUs2x(unsigned char t)
  27          {   
  28   1       while(--t);
  29   1      }
  30          /*------------------------------------------------
  31           mS延时函数,含有输入参数 unsigned char t,无返回值
  32           unsigned char 是定义无符号字符变量,其值的范围是
  33           0~255 这里使用晶振12M,精确延时请使用汇编
  34          ------------------------------------------------*/
  35          void DelayMs(unsigned char t)
  36          {
  37   1           
  38   1       while(t--)
  39   1       {
  40   2           //大致延时1mS
  41   2           DelayUs2x(245);
  42   2               DelayUs2x(245);
  43   2       }
  44   1      }
  45          
  46          /*------------------------------------------------
  47                              启动总线
  48          ------------------------------------------------*/
  49          void Start_I2c()
  50          {
  51   1        SDA=1;   //发送起始条件的数据信号
  52   1        _Nop();
  53   1        SCL=1;
  54   1        _Nop();    //起始条件建立时间大于4.7us,延时
  55   1        _Nop();
C51 COMPILER V7.06   I2C                                                                   06/02/2010 10:03:45 PAGE 2   

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

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

⌨️ 快捷键说明

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