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

📄 pcf8591.lst

📁 I2C接口的ADC应用PCF8591
💻 LST
字号:
C51 COMPILER V7.06   PCF8591                                                               05/10/2005 22:57:35 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE PCF8591
OBJECT MODULE PLACED IN PCF8591.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil20\C51\BIN\C51.EXE PCF8591.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 delayNOP(); {_nop_();_nop_();_nop_();_nop_();};                  
   7          bit   bdata SystemError;                // 从机错误标志位
   8          //-----------------------PCF8591专用变量定义--------------------------------------------------------
   9          #define PCF8591_WRITE   0x92
  10          #define PCF8591_READ    0x93
  11          #define  NUM  4                             //  接收和发送缓存区的深度
  12          unsigned char idata receivebuf[NUM];    // 数据接收缓冲区
  13          //--------------------------------------------------------------------------------------------------
  14          // 函数名称: iic_start()
  15          // 函数功能: 启动I2C总线子程序
  16          //--------------------------------------------------------------------------------------------------
  17          void iic_start(void)
  18          {       EA=0;            //时钟保持高,数据线从高到低一次跳变,I2C通信开始
  19   1              SDA = 1;         
  20   1              SCL = 1;
  21   1              delayNOP();      // 延时5us 
  22   1              SDA = 0;
  23   1              delayNOP();
  24   1              SCL = 0;
  25   1      }
  26          //--------------------------------------------------------------------------------------------------
  27          // 函数名称: iic_stop()
  28          // 函数功能: 停止I2C总线数据传送子程序
  29          //--------------------------------------------------------------------------------------------------
  30          void iic_stop(void)
  31          { 
  32   1              SDA = 0;           //时钟保持高,数据线从低到高一次跳变,I2C通信停止
  33   1              SCL = 1;
  34   1              delayNOP();
  35   1              SDA = 1;
  36   1              delayNOP();
  37   1              SCL = 0;
  38   1      }
  39          //--------------------------------------------------------------------------------------------------
  40          // 函数名称: slave_ACK
  41          // 函数功能: 从机发送应答位子程序
  42          //--------------------------------------------------------------------------------------------------
  43          void slave_ACK(void)
  44          {
  45   1              SDA = 0;    
  46   1              SCL = 1;
  47   1              delayNOP();                     
  48   1              SDA = 1;
  49   1              SCL = 0;
  50   1      }
  51          //--------------------------------------------------------------------------------------------------
  52          // 函数名称: slave_NOACK
  53          // 函数功能: 从机发送非应答位子程序,迫使数据传输过程结束
  54          //--------------------------------------------------------------------------------------------------
  55          void slave_NOACK(void)
C51 COMPILER V7.06   PCF8591                                                               05/10/2005 22:57:35 PAGE 2   

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

 118   2                      tdata = tdata<<1;    // 左移一位,或_crol_(temp,1)
 119   2                      if(SDA == 1)
 120   2                              tdata = tdata|0x01;    // 若接收到的位为1,则数据的最后一位置1
 121   2                      else 
 122   2                              tdata = tdata&0xfe;    // 否则数据的最后一位置0
 123   2                      SCL=0;
 124   2              }
 125   1              return(tdata);
 126   1      }
 127          //--------------------------------------------------------------------------------------------------
 128          // 函数名称: DAC_PCF8591
 129          // 入口参数: slave_add从机地址,n要发送的数据个数
 130          // 函数功能: 发送n位数据子程序
 131          //--------------------------------------------------------------------------------------------------
 132          void DAC_PCF8591(unsigned char controlbyte,unsigned char wdata)
 133          {    
 134   1              iic_start();                // 启动I2C
 135   1              IICSendByte(PCF8591_WRITE);     // 发送地址位
 136   1              check_ACK();                // 检查应答位
 137   1          if(F0 == 1)
 138   1              { 
 139   2                      SystemError = 1;
 140   2                      return;    // 若非应答表明器件错误或已坏,置错误标志位SystemError
 141   2              }
 142   1          IICSendByte(controlbyte&0x77);      //Control byte
 143   1              check_ACK();                // 检查应答位
 144   1          if(F0 == 1)
 145   1              { 
 146   2                      SystemError = 1;
 147   2                      return;    // 若非应答表明器件错误或已坏,置错误标志位SystemError
 148   2              }
 149   1           IICSendByte(wdata);        //data byte
 150   1              check_ACK();                // 检查应答位
 151   1          if(F0 == 1)
 152   1              { 
 153   2                      SystemError = 1;
 154   2                      return;    // 若非应答表明器件错误或已坏,置错误标志位SystemError
 155   2              }
 156   1              iic_stop();         // 全部发完则停止
 157   1              delayNOP();
 158   1              delayNOP();
 159   1              delayNOP();
 160   1              delayNOP();
 161   1      }
 162          //--------------------------------------------------------------------------------------------------
 163          // 函数名称: ReadPCF8591
 164          // 入口参数: controlbyte控制字
 165          // 函数功能: 连续读入4路通道的A/D转换结果到receivebuf
 166          //--------------------------------------------------------------------------------------------------
 167          void ADC_PCF8591(unsigned char controlbyte)
 168          { 
 169   1          unsigned char idata receive_da,i=0;
 170   1              iic_start();
 171   1              IICSendByte(PCF8591_WRITE);     //控制字
 172   1              check_ACK();
 173   1              if(F0 == 1)
 174   1              {
 175   2                      SystemError = 1;
 176   2                      return;
 177   2              }
 178   1              IICSendByte(controlbyte);       //控制字
 179   1              check_ACK();
C51 COMPILER V7.06   PCF8591                                                               05/10/2005 22:57:35 PAGE 4   

 180   1              if(F0 == 1)
 181   1              {
 182   2                      SystemError = 1;
 183   2                      return;
 184   2              }
 185   1          iic_start();     //重新发送开始命令
 186   1              IICSendByte(PCF8591_READ);      //控制字
 187   1              check_ACK();
 188   1              if(F0 == 1)
 189   1              {
 190   2                      SystemError = 1;
 191   2                      return;
 192   2              }
 193   1              while(i<4)
 194   1              { 
 195   2                      receive_da=IICreceiveByte();
 196   2                      receivebuf[i++]=receive_da;
 197   2                      slave_ACK();    // 收到一个字节后发送一个应答位
 198   2              }
 199   1              slave_NOACK();    // 收到最后一个字节后发送一个非应答位
 200   1              iic_stop();
 201   1      }
 202          //--------------------------------------------------------------------------------------------------
 203          // 函数名称: main
 204          // 函数功能: 主程序
 205          //--------------------------------------------------------------------------------------------------
 206          main()
 207          {
 208   1      DAC_PCF8591(0x40,0); //控制字为0100 0000,允许模拟量输出
 209   1                           //零值点输出测试
 210   1      DAC_PCF8591(0x40,0xff); //控制字为0100 0000,允许模拟量输出
 211   1                           //满值点输入测试
 212   1      ADC_PCF8591(0x40);
 213   1      }
 214          
 215          
 216          
 217          
 218          
 219          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    334    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =      4       4
   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 + -