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

📄 pcf8591.lst

📁 RZ-51V20 实例程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 240   1              askflag = 0;
 241   1              delayNOP();   
C51 COMPILER V8.02   PCF8591                                                               12/31/2009 10:21:57 PAGE 5   

 242   1              if(SDA == 1)    // 若SDA=1表明非应答,置位非应答标志askflag
 243   1          askflag = 1;
 244   1              SCL = 0;
 245   1      }
 246          //-------------------------------------------------------------------
 247          // 函数名称: IICSendByte
 248          // 入口参数: ch
 249          // 函数功能: 发送一个字节
 250          //-------------------------------------------------------------------
 251          void IICSendByte(uchar ch)
 252           
 253          {
 254   1              unsigned char idata n=8;     // 向SDA上发送一位数据字节,共八位
 255   1      
 256   1              while(n--)
 257   1              { 
 258   2              if((ch&0x80) == 0x80)    // 若要发送的数据最高位为1则发送位1
 259   2                 {
 260   3                              SDA = 1;    // 传送位1
 261   3                              SCL = 1;
 262   3                          delayNOP();
 263   3                      //      SDA = 0;        
 264   3                              SCL = 0; 
 265   3                 }
 266   2                      else
 267   2                      {  
 268   3                              SDA = 0;    // 否则传送位0
 269   3                              SCL = 1;
 270   3                              delayNOP();
 271   3                              SCL = 0;
 272   3                      }
 273   2                      ch = ch<<1;    // 数据左移一位
 274   2              }
 275   1      }
 276          //-------------------------------------------------------------------
 277          // 函数名称: IICreceiveByte
 278          // 返回接收的数据
 279          // 函数功能: 接收一字节子程序
 280          //-------------------------------------------------------------------
 281          uchar IICreceiveByte(void)
 282          {
 283   1              uchar idata n=8;     // 从SDA线上读取一上数据字节,共八位
 284   1              uchar tdata=0;
 285   1              while(n--)
 286   1              {
 287   2                 SDA = 1;
 288   2                 SCL = 1;
 289   2                 tdata =tdata<<1;                 //左移一位
 290   2                      if(SDA == 1)
 291   2                        tdata = tdata|0x01;   // 若接收到的位为1,则数据的最后一位置1
 292   2                      else 
 293   2                        tdata = tdata&0xfe;   // 否则数据的最后一位置0
 294   2                 SCL = 0;
 295   2               }
 296   1      
 297   1               return(tdata);
 298   1      }
 299          //-------------------------------------------------------------------
 300          // 函数名称: DAC_PCF8591
 301          // 入口参数: slave_add从机地址,n要发送的数据个数
 302          // 函数功能: 发送n位数据子程序
 303          //-------------------------------------------------------------------
C51 COMPILER V8.02   PCF8591                                                               12/31/2009 10:21:57 PAGE 6   

 304          void DAC_PCF8591(uchar controlbyte,uchar w_data)
 305          {    
 306   1              
 307   1              iic_start();                    // 启动I2C
 308   1              delayNOP();
 309   1      
 310   1              IICSendByte(PCF8591_WRITE);     // 发送地址位
 311   1              check_ACK();                    // 检查应答位
 312   1          if(askflag == 1)
 313   1               { 
 314   2                      SystemError = 1;
 315   2                      return;                     // 若非应答,置错误标志位
 316   2           }
 317   1          IICSendByte(controlbyte&0x77);      //Control byte 
 318   1              check_ACK();                    //检查应答位
 319   1          if(askflag == 1)
 320   1               { 
 321   2                      SystemError = 1;
 322   2                      return;                    // 若非应答,置错误标志位
 323   2               }
 324   1          IICSendByte(w_data);               //data byte
 325   1              check_ACK();                  // 检查应答位
 326   1          if(askflag == 1)
 327   1               { 
 328   2                      SystemError = 1;
 329   2              return;   // 若非应答表明器件错误或已坏,置错误标志位SystemError
 330   2               }
 331   1              iic_stop();         // 全部发完则停止
 332   1              delayNOP();
 333   1              delayNOP();
 334   1              delayNOP();
 335   1              delayNOP();     
 336   1      }
 337          //-------------------------------------------------------------------
 338          // 函数名称: ADC_PCF8591
 339          // 入口参数: controlbyte控制字
 340          // 函数功能: 连续读入4路通道的A/D转换结果到receivebuf
 341          //-------------------------------------------------------------------
 342          void ADC_PCF8591(uchar controlbyte)
 343          { 
 344   1          uchar idata receive_da,i=0;
 345   1      
 346   1              iic_start();
 347   1      
 348   1              IICSendByte(PCF8591_WRITE);     //控制字
 349   1              check_ACK();
 350   1              if(askflag == 1)
 351   1              {
 352   2                      SystemError = 1;
 353   2                      return;
 354   2              }
 355   1      
 356   1              IICSendByte(controlbyte);       //控制字
 357   1              check_ACK();
 358   1              if(askflag == 1)
 359   1              {
 360   2                      SystemError = 1;
 361   2                      return;
 362   2              }
 363   1      
 364   1          iic_start();                //重新发送开始命令
 365   1              IICSendByte(PCF8591_READ);      //控制字
C51 COMPILER V8.02   PCF8591                                                               12/31/2009 10:21:57 PAGE 7   

 366   1              check_ACK();
 367   1              if(askflag == 1)
 368   1              {
 369   2                      SystemError = 1;
 370   2                      return;
 371   2              }
 372   1               
 373   1          IICreceiveByte();   //空读一次,调整读顺序
 374   1          slave_ACK();        //收到一个字节后发送一个应答位
 375   1      
 376   1              while(i<4)
 377   1              {  
 378   2                receive_da=IICreceiveByte();
 379   2                receivebuf[i++]=receive_da;
 380   2                slave_ACK();       //收到一个字节后发送一个应答位
 381   2              }
 382   1              slave_NOACK();       //收到最后一个字节后发送一个非应答位
 383   1              iic_stop();
 384   1      }
 385          //-------------------------------------------------------------------
 386          // 函数名称: main
 387          // 函数功能: 主程序
 388          //-------------------------------------------------------------------
 389          main()
 390          {
 391   1          uchar i,l;
 392   1          delay(10);                 //延时
 393   1          lcd_init();                //初始化LCD             
 394   1              
 395   1          lcd_pos(0);                //设置显示位置为第一行的第1个字符
 396   1           i = 0;
 397   1          while(dis4[i] != '\0')
 398   1           {                         //显示字符
 399   2             lcd_wdat(dis4[i]);
 400   2             i++;
 401   2           }
 402   1      
 403   1          lcd_pos(0x40);             //设置显示位置为第二行第1个字符
 404   1           i = 0;
 405   1          while(dis5[i] != '\0')
 406   1           {
 407   2             lcd_wdat(dis5[i]);      //显示字符
 408   2             i++;
 409   2           }
 410   1              
 411   1        while(1)
 412   1        {
 413   2              iicInit();                    //I2C总线初始化
 414   2          ADC_PCF8591(0x04);
 415   2      
 416   2              if(SystemError == 1)      //有错误,重新来
 417   2                {
 418   3                      iicInit();                                //I2C总线初始化
 419   3                  ADC_PCF8591(0x04);
 420   3                 }   
 421   2              
 422   2              for(l=0;l<4;l++)        
 423   2               {
 424   3                show_value(receivebuf[0]); //显示通道0       
 425   3                  lcd_pos(0x02);             
 426   3              lcd_wdat(dis[2]);        //整数位显示
 427   3              lcd_pos(0x04);             
C51 COMPILER V8.02   PCF8591                                                               12/31/2009 10:21:57 PAGE 8   

 428   3              lcd_wdat(dis[1]);        //第一位小数显示 
 429   3              lcd_pos(0x05);             
 430   3              lcd_wdat(dis[0]);        //第二位小数显示
 431   3      
 432   3            show_value(receivebuf[1]); //显示通道1     
 433   3                  lcd_pos(0x0b);             
 434   3              lcd_wdat(dis[2]);        //整数位显示
 435   3              lcd_pos(0x0d);             
 436   3              lcd_wdat(dis[1]);        //第一位小数显示 
 437   3              lcd_pos(0x0e);             
 438   3              lcd_wdat(dis[0]);        //第二位小数显示
 439   3      
 440   3                show_value(receivebuf[2]); //显示通道2                 
 441   3                  lcd_pos(0x42);             
 442   3              lcd_wdat(dis[2]);        //整数位显示
 443   3              lcd_pos(0x44);             
 444   3              lcd_wdat(dis[1]);        //第一位小数显示 
 445   3              lcd_pos(0x45);             
 446   3              lcd_wdat(dis[0]);        //第二位小数显示
 447   3      
 448   3            show_value(receivebuf[3]); //显示通道3     
 449   3                  lcd_pos(0x4b);             
 450   3              lcd_wdat(dis[2]);        //整数位显示
 451   3              lcd_pos(0x4d);              
 452   3              lcd_wdat(dis[1]);        //第一位小数显示 
 453   3              lcd_pos(0x4e);             
 454   3              lcd_wdat(dis[0]);        //第二位小数显示
 455   3      
 456   3                iicInit();                  //I2C总线初始化  
 457   3            DAC_PCF8591(0x40,receivebuf[0]); //D/A输出
 458   3      
 459   3                      if(SystemError == 1)      //有错误,重新来
 460   3                  {
 461   4                       iicInit();                               //I2C总线初始化
 462   4                       DAC_PCF8591(0x40,receivebuf[0]); //D/A输出
 463   4                  }           
 464   3      
 465   3            //delay(50);                       //延时
 466   3               }
 467   2      
 468   2         }
 469   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    861    ----
   CONSTANT SIZE    =     34    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      8       1
   IDATA SIZE       =      4       4
   BIT SIZE         =      2       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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