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

📄 viic.lst

📁 c51bus 51单片机的各种接口总线程序包
💻 LST
字号:
C51 COMPILER V7.06   VIIC                                                                  03/29/2005 00:10:11 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE VIIC
OBJECT MODULE PLACED IN viic.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE viic.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          //-----------------------函数声明,变量定义--------------------------------------------------------
   2          #include <reg51.h>
   3          #include <intrins.h>
   4          sbit SDA=P1^0;                          // 将p1.0口模拟数据口
   5          sbit SCL=P1^1;                          // 将p1.1口模拟时钟口
   6          #define  NUM  10                            //  接收和发送缓存区的深度
   7          #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};                  
   8          unsigned char idata sendbuf[NUM];       // 数据发送缓冲区
   9          unsigned char idata receivebuf[NUM];    // 数据接收缓冲区
  10          bit   bdata SystemError;                // 从机错误标志位
  11          //--------------------------------------------------------------------------------------------------
  12          // 函数名称: iic_start()
  13          // 函数功能: 启动I2C总线子程序
  14          //--------------------------------------------------------------------------------------------------
  15          void iic_start(void)
  16          {       EA=0;            //时钟保持高,数据线从高到低一次跳变,I2C通信开始
  17   1              SDA = 1;         
  18   1              SCL = 1;
  19   1              delayNOP();      // 延时5us 
  20   1              SDA = 0;
  21   1              delayNOP();
  22   1              SCL = 0;
  23   1      }
  24          //--------------------------------------------------------------------------------------------------
  25          // 函数名称: iic_stop()
  26          // 函数功能: 停止I2C总线数据传送子程序
  27          //--------------------------------------------------------------------------------------------------
  28          void iic_stop(void)
  29          { 
  30   1              SDA = 0;           //时钟保持高,数据线从低到高一次跳变,I2C通信停止
  31   1              SCL = 1;
  32   1              delayNOP();
  33   1              SDA = 1;
  34   1              delayNOP();
  35   1              SCL = 0;
  36   1      }
  37          //--------------------------------------------------------------------------------------------------
  38          // 函数名称: slave_ACK
  39          // 函数功能: 从机发送应答位子程序
  40          //--------------------------------------------------------------------------------------------------
  41          void slave_ACK(void)
  42          {
  43   1              SDA = 0;    
  44   1              SCL = 1;
  45   1              delayNOP();                     
  46   1              SDA = 1;
  47   1              SCL = 0;
  48   1      }
  49          //--------------------------------------------------------------------------------------------------
  50          // 函数名称: slave_NOACK
  51          // 函数功能: 从机发送非应答位子程序,迫使数据传输过程结束
  52          //--------------------------------------------------------------------------------------------------
  53          void slave_NOACK(void)
  54          { 
  55   1              SDA = 1;   
C51 COMPILER V7.06   VIIC                                                                  03/29/2005 00:10:11 PAGE 2   

  56   1              SCL = 1;
  57   1              delayNOP();
  58   1              SDA = 0;
  59   1              SCL = 0;
  60   1      }
  61          //--------------------------------------------------------------------------------------------------
  62          // 函数名称: check_ACK
  63          // 函数功能: 主机应答位检查子程序,迫使数据传输过程结束
  64          //--------------------------------------------------------------------------------------------------
  65          void check_ACK(void)
  66          { 
  67   1              SDA = 1;      // 将p1.0设置成输入,必须先向端口写1
  68   1              SCL = 1;
  69   1              F0 = 0;
  70   1              if(SDA == 1)    // 若SDA=1表明非应答,置位非应答标志F0
  71   1                      F0 = 1;
  72   1              SCL = 0;
  73   1      }
  74          
  75          //--------------------------------------------------------------------------------------------------
  76          // 函数名称: IICSendByte
  77          // 入口参数: ch
  78          // 函数功能: 发送一个字节
  79          //--------------------------------------------------------------------------------------------------
  80          void IICSendByte(unsigned char ch)
  81          { 
  82   1              unsigned char idata n=8;     // 向SDA上发送一位数据字节,共八位
  83   1              while(n--)
  84   1              { 
  85   2                      if((ch&0x80) == 0x80)    // 若要发送的数据最高位为1则发送位1
  86   2                      {
  87   3                              SDA = 1;    // 传送位1
  88   3                              SCL = 1;
  89   3                              delayNOP();
  90   3                              SDA = 0;
  91   3                              SCL = 0;    
  92   3                      }
  93   2                      else
  94   2                      {  
  95   3                              SDA = 0;    // 否则传送位0
  96   3                              SCL = 1;
  97   3                              delayNOP();
  98   3                              SCL = 0;  
  99   3                      }
 100   2                      ch = ch<<1;    // 数据左移一位
 101   2              }
 102   1      }
 103          //--------------------------------------------------------------------------------------------------
 104          // 函数名称: IICreceiveByte
 105          // 返回接收的数据
 106          // 函数功能: 接收一字节子程序
 107          //--------------------------------------------------------------------------------------------------
 108          unsigned char IICreceiveByte(void)
 109          {
 110   1              unsigned char idata n=8;    // 从SDA线上读取一上数据字节,共八位
 111   1              unsigned char tdata;
 112   1              while(n--)
 113   1              {
 114   2                      SDA = 1;
 115   2                      SCL = 1;
 116   2                      tdata = tdata<<1;    // 左移一位,或_crol_(temp,1)
 117   2                      if(SDA == 1)
C51 COMPILER V7.06   VIIC                                                                  03/29/2005 00:10:11 PAGE 3   

 118   2                              tdata = tdata|0x01;    // 若接收到的位为1,则数据的最后一位置1
 119   2                      else 
 120   2                              tdata = tdata&0xfe;    // 否则数据的最后一位置0
 121   2                      SCL=0;
 122   2              }
 123   1              return(tdata);
 124   1      }
 125          //--------------------------------------------------------------------------------------------------
 126          // 函数名称: writeNbyte
 127          // 入口参数: slave_add从机地址,n要发送的数据个数
 128          // 函数功能: 发送n位数据子程序
 129          //--------------------------------------------------------------------------------------------------
 130          void writeNbyte(unsigned char slave_add, unsigned char n)
 131          {          
 132   1              unsigned char idata send_da,i=0;
 133   1              iic_start();                // 启动I2C
 134   1              IICSendByte(slave_add);     // 发送地址位
 135   1              check_ACK();                // 检查应答位
 136   1          if(F0 == 1)
 137   1              { 
 138   2                      SystemError = 1;
 139   2                      return;    // 若非应答表明器件错误或已坏,置错误标志位SystemError
 140   2              }
 141   1              while(n--)
 142   1              { 
 143   2              send_da = sendbuf[i++];  
 144   2              IICSendByte(send_da);
 145   2                      check_ACK();    // 检查应答位
 146   2                      if (F0 == 1)
 147   2                      {
 148   3                              SystemError=1;
 149   3                              return;    // 若非应答表明器件错误或已坏,置错误标志位SystemError
 150   3                      }
 151   2              }
 152   1              iic_stop();         // 全部发完则停止
 153   1      }
 154          //--------------------------------------------------------------------------------------------------
 155          // 函数名称: receiveNbyte
 156          // 入口参数: slave_add从机地址,n要发送的数据个数
 157          // 函数功能: 接收n位数据子程序
 158          //--------------------------------------------------------------------------------------------------
 159          void receiveNbyte(unsigned char idata slave_add, unsigned char n)
 160          { 
 161   1              unsigned char idata receive_da,i=0;
 162   1              iic_start();
 163   1              IICSendByte(slave_add);
 164   1              check_ACK();
 165   1              if(F0 == 1)
 166   1              {
 167   2                      SystemError = 1;
 168   2                      return;
 169   2              }
 170   1              while(n--)
 171   1              { 
 172   2                      receive_da=IICreceiveByte();
 173   2                      receivebuf[i++]=receive_da;
 174   2                      slave_ACK();    // 收到一个字节后发送一个应答位
 175   2              }
 176   1              slave_NOACK();    // 收到最后一个字节后发送一个非应答位
 177   1              iic_stop();
 178   1      }

C51 COMPILER V7.06   VIIC                                                                  03/29/2005 00:10:11 PAGE 4   


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    261    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =     20       6
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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