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

📄 i2c.lst

📁 我的一个工程
💻 LST
字号:
C51 COMPILER V7.06   I2C                                                                   07/20/2008 03:32:37 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN E:\温度表\I2C.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE E:\温度表\I2C.C DB SB OE

stmt level    source

   1          /******************************************************************************
   2               I2C.C
   3               标准80C51模拟I2C总线程序(主模式,通用)
   4          ******************************************************************************/
   5          #include <REG52.H>
   6          #include "I2C.H"
   7          #include <intrins.h>
   8          
   9          //模拟I2C总线的管脚定义
  10          sbit I2C_SCL = P3^6;     //定义I2C总线时钟信号
  11          sbit I2C_SDA = P3^7;     //定义I2C总线数据信号
  12          /*******************************************************************************/
  13          /******************************************************************************
  14          函数:I2C_Delay()
  15          功能:模拟I2C总线延时
  16          说明:请根据具体情况调整延时值
  17          ******************************************************************************/
  18          void I2C_Delay()
  19          {
  20   1           unsigned char t;
  21   1           t = 100;
  22   1           while ( --t != 0 );     //延时2*t个机器周期
  23   1      }
  24          /******************************************************************************
  25          函数:I2C_Init()
  26          功能:I2C总线初始化,使总线处于空闲状态
  27          说明:在main()函数的开始处,应当执行一次本函数
  28          ******************************************************************************/
  29          void I2C_Init()
  30          {
  31   1           I2C_SCL = 1;   
  32   1           I2C_Delay();
  33   1           I2C_SDA = 1; 
  34   1           I2C_Delay();
  35   1      }
  36          /******************************************************************************
  37          函数:I2C_Start()
  38          功能:产生I2C总线的起始条件
  39          说明:SCL处于高电平期间,当SDA出现下降沿时启动I2C总线
  40                 本函数也用来产生重复起始条件
  41          ******************************************************************************/
  42          void I2C_Start()
  43          {
  44   1           I2C_SDA = 1;     
  45   1           I2C_Delay();
  46   1           I2C_SCL = 1;     
  47   1           I2C_Delay();
  48   1           I2C_SDA = 0;     
  49   1           I2C_Delay();
  50   1           I2C_SCL = 0;     
  51   1           I2C_Delay();
  52   1      }
  53          /******************************************************************************
  54          函数:I2C_Write()
  55          功能:向I2C总线写1个字节的数据
C51 COMPILER V7.06   I2C                                                                   07/20/2008 03:32:37 PAGE 2   

  56          参数:dat是要写到总线上的数据
  57          ******************************************************************************/
  58          void I2C_Write(unsigned char dat)
  59          {
  60   1           unsigned char t = 8;
  61   1           do
  62   1           {
  63   2               I2C_SDA = (bit)(dat & 0x80);
  64   2               dat <<= 1;
  65   2               I2C_SCL = 1;     
  66   2               I2C_Delay();
  67   2               while(!I2C_SCL);
  68   2               I2C_SCL = 0;     
  69   2               I2C_Delay();
  70   2           } while ( --t != 0 );
  71   1      }
  72          /******************************************************************************
  73          函数:I2C_Read()
  74          功能:从从机读取1个字节的数据
  75          返回:读取的1个字节数据
  76          ******************************************************************************/
  77          unsigned char I2C_Read()
  78          {
  79   1           unsigned char dat = 0;
  80   1           unsigned char t = 8;
  81   1          I2C_SDA = 1;     //在读取数据之前,要把SDA拉高,使之处于输入状态
  82   1           do
  83   1           {
  84   2               dat <<= 1;
  85   2               I2C_SCL = 1;     
  86   2               while(!I2C_SCL); 
  87   2               I2C_Delay();
  88   2               if ( I2C_SDA ) dat++;
  89   2               I2C_SCL = 0;     
  90   2               I2C_Delay();
  91   2           } while ( --t != 0 );
  92   1           return dat;
  93   1      }
  94          /******************************************************************************
  95          函数:I2C_GetAck()
  96          功能:读取从机应答位(应答或非应答),用于判断:从机是否成功接收主机数据
  97          返回:0-从机应答
  98                 1-从机非应答
  99          说明:从机在收到每一个字节后都要产生应答位,主机如果收到非应答则应当终止传输
 100          ******************************************************************************/
 101          bit I2C_GetAck()
 102          {
 103   1           bit Ack;
 104   1           I2C_SDA = 1;     
 105   1           I2C_Delay();
 106   1           I2C_SCL = 1;     
 107   1           I2C_Delay();
 108   1           while(!I2C_SCL);
 109   1           Ack = I2C_SDA;
 110   1           I2C_SCL = 0;     
 111   1           I2C_Delay();
 112   1           return Ack;
 113   1      }
 114          /******************************************************************************
 115          函数:I2C_PutAck()
 116          功能:主机产生应答位(应答或非应答),用于通知从机:主机是否成功接收从机数据
 117          参数: Ack = 0:主机应答
C51 COMPILER V7.06   I2C                                                                   07/20/2008 03:32:37 PAGE 3   

 118                 Ack = 1:主机非应答
 119          说明:主机在收到每一个字节后都要产生应答,在收到最后一个字节时,应当产生非应答
 120          ******************************************************************************/
 121          void I2C_PutAck(bit Ack)
 122          {
 123   1           I2C_SDA = Ack;   
 124   1           I2C_Delay();
 125   1           I2C_SCL = 1;     
 126   1           I2C_Delay();
 127   1           while(!I2C_SCL);
 128   1           I2C_SCL = 0;     
 129   1           I2C_Delay();
 130   1      }
 131          /******************************************************************************
 132          函数:I2C_Stop()
 133          功能:产生I2C总线的停止条件
 134          说明:SCL处于高电平期间,当SDA出现上升沿时停止I2C总线
 135          ******************************************************************************/
 136          void I2C_Stop()
 137          {
 138   1           I2C_SDA = 0;     
 139   1           I2C_Delay();
 140   1           I2C_SCL = 1;     
 141   1           I2C_Delay();
 142   1           I2C_SDA = 1;     
 143   1           I2C_Delay();
 144   1      }
 145          /******************************************************************************
 146          函数:clock()
 147          功能:延时一段时间,并产生应答位
 148          说明:
 149          ******************************************************************************/
 150          void clock()
 151          {
 152   1         unsigned char i=0;
 153   1         I2C_SCL=1; _nop_();
 154   1         while ((I2C_SDA==1)&&(i<255))i++;
 155   1         I2C_SCL=0; 
 156   1         _nop_();
 157   1      }
 158          //------------------------------------------------------------------------------
 159          
C51 COMPILER V7.06   I2C                                                                   07/20/2008 03:32:37 PAGE 4   

NAME                                    CLASS   MSPACE  TYPE    OFFSET  SIZE
====                                    =====   ======  ====    ======  ====


P1 . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0090H  1
I2C_SCL. . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      00B6H  1
P3 . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00B0H  1
_I2C_Write . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  dat. . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0006H  1
  t. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0005H  1
IE . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00A8H  1
clock. . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  i. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0007H  1
I2C_Delay. . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0007H  -----
  t. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0007H  1
IP . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00B8H  1
I2C_Read . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  dat. . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0006H  1
  t. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0005H  1
I2C_Start. . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
SCON . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0098H  1
I2C_Init . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
TCON . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0088H  1
I2C_Stop . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
I2C_GetAck . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  Ack. . . . . . . . . . . . . . . . .  AUTO     DATA   BIT      0000H  1
T2CON. . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00C8H  1
I2C_PutAck . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  Ack. . . . . . . . . . . . . . . . .  AUTO     DATA   BIT      0000H  1
I2C_SDA. . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      00B7H  1
PSW. . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00D0H  1


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    159    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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