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

📄 iic.lst

📁 mcp3221 ad转换。通过iic串口读取ad转换数值
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.02   IIC                                                                   03/30/2009 08:19:12 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE IIC
OBJECT MODULE PLACED IN iic.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE iic.c BROWSE DEBUG OBJECTEXTEND

line level    source

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

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

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

⌨️ 快捷键说明

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