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

📄 pcf8591-da-lcd1602-c51.lst

📁 89S52单片机做的A/D,D/A的实验的源程序PCF8591 D/A CONVERTER */ /* */ /* LCD1602显示 */ /* 参考电压接至5V电源 */ /* 最小输出电
💻 LST
📖 第 1 页 / 共 3 页
字号:
 218   1          lcd_wcmd(0x06);      //移动光标
 219   1          delay(5);
 220   1          lcd_wcmd(0x01);      //清除LCD的显示内容
 221   1          delay(5);
 222   1      }
 223          
 224          /*******************************************************************/
 225          /*                                                                 */
 226          /*  设定显示位置                                                   */
 227          /*                                                                 */
 228          /*******************************************************************/
 229          
 230          void lcd_pos(uchar pos)
 231          {
 232   1        lcd_wcmd(pos | 0x80);  //数据指针=80+地址变量
 233   1      }
 234          
 235          //-------------------------------------------------------------------
 236          // 函数名称: iic_start()
 237          // 函数功能: 启动I2C总线子程序
 238          //-------------------------------------------------------------------
 239          void iic_start(void)
 240          { //时钟保持高,数据线从高到低一次跳变,I2C通信开始
 241   1              SDA = 1;
C51 COMPILER V7.08   PCF8591_DA_LCD1602_C51                                                12/21/2006 16:15:07 PAGE 5   

 242   1              SCL = 1;
 243   1              delayNOP();      // 延时5us
 244   1              SDA = 0;
 245   1              delayNOP();
 246   1          SCL = 0;
 247   1      }
 248          //-------------------------------------------------------------------
 249          // 函数名称: iic_stop()
 250          // 函数功能: 停止I2C总线数据传送子程序
 251          //-------------------------------------------------------------------
 252          void iic_stop(void)
 253          {
 254   1              SDA = 0;           //时钟保持高,数据线从低到高一次跳变,I2C通信停止
 255   1              SCL = 1;
 256   1              delayNOP();
 257   1              SDA = 1;
 258   1              delayNOP();
 259   1          SCL = 0;
 260   1      }
 261          //------------------------------------------------------------------
 262          // 函数名称: iicInit_()
 263          // 函数功能: 初始化I2C总线子程序
 264          //------------------------------------------------------------------
 265           void iicInit(void)
 266             {
 267   1         SCL = 0;
 268   1         iic_stop();
 269   1         }
 270          //-------------------------------------------------------------------
 271          // 函数名称: slave_ACK
 272          // 函数功能: 从机发送应答位子程序
 273          //-------------------------------------------------------------------
 274          void slave_ACK(void)
 275          {
 276   1              SDA = 0;
 277   1              SCL = 1;
 278   1              delayNOP();
 279   1              SCL = 0;
 280   1      }
 281          //-------------------------------------------------------------------
 282          // 函数名称: slave_NOACK
 283          // 函数功能: 从机发送非应答位子程序,迫使数据传输过程结束
 284          //-------------------------------------------------------------------
 285          void slave_NOACK(void)
 286          {
 287   1              SDA = 1;
 288   1              SCL = 1;
 289   1              delayNOP();
 290   1              SDA = 0;
 291   1          SCL = 0;
 292   1      }
 293          //-------------------------------------------------------------------
 294          // 函数名称: check_ACK
 295          // 函数功能: 主机应答位检查子程序,迫使数据传输过程结束
 296          //-------------------------------------------------------------------
 297          void check_ACK(void)
 298          {
 299   1          SDA = 1;        // 将p1.1设置成输入,必须先向端口写1
 300   1              SCL = 1;
 301   1              F0 = 0;
 302   1              delayNOP();
 303   1              if(SDA == 1)    // 若SDA=1表明非应答,置位非应答标志F0
C51 COMPILER V7.08   PCF8591_DA_LCD1602_C51                                                12/21/2006 16:15:07 PAGE 6   

 304   1          F0 = 1;
 305   1              SCL = 0;
 306   1      }
 307          //-------------------------------------------------------------------
 308          // 函数名称: IICSendByte
 309          // 入口参数: ch
 310          // 函数功能: 发送一个字节
 311          //-------------------------------------------------------------------
 312          void IICSendByte(uchar ch)
 313          
 314          {
 315   1              unsigned char idata n=8;     // 向SDA上发送一位数据字节,共八位
 316   1      
 317   1              while(n--)
 318   1              {
 319   2              if((ch&0x80) == 0x80)    // 若要发送的数据最高位为1则发送位1
 320   2                 {
 321   3                              SDA = 1;    // 传送位1
 322   3                              SCL = 1;
 323   3                          delayNOP();
 324   3                      //      SDA = 0;
 325   3                              SCL = 0;
 326   3                 }
 327   2                      else
 328   2                      {
 329   3                              SDA = 0;    // 否则传送位0
 330   3                              SCL = 1;
 331   3                              delayNOP();
 332   3                              SCL = 0;
 333   3                      }
 334   2                      ch = ch<<1;    // 数据左移一位
 335   2              }
 336   1      }
 337          //-------------------------------------------------------------------
 338          // 函数名称: IICreceiveByte
 339          // 返回接收的数据
 340          // 函数功能: 接收一字节子程序
 341          //-------------------------------------------------------------------
 342          uchar IICreceiveByte(void)
 343          {
 344   1              uchar idata n=8;     // 从SDA线上读取一上数据字节,共八位
 345   1              uchar tdata=0;
 346   1              while(n--)
 347   1              {
 348   2                 SDA = 1;
 349   2                 SCL = 1;
 350   2                 tdata =tdata<<1;                 //左移一位
 351   2                      if(SDA == 1)
 352   2                        tdata = tdata|0x01;   // 若接收到的位为1,则数据的最后一位置1
 353   2                      else
 354   2                        tdata = tdata&0xfe;   // 否则数据的最后一位置0
 355   2                 SCL = 0;
 356   2               }
 357   1      
 358   1               return(tdata);
 359   1      }
 360          //-------------------------------------------------------------------
 361          // 函数名称: DAC_PCF8591
 362          // 入口参数: slave_add从机地址,n要发送的数据个数
 363          // 函数功能: 发送n位数据子程序
 364          //-------------------------------------------------------------------
 365          void DAC_PCF8591(uchar controlbyte)
C51 COMPILER V7.08   PCF8591_DA_LCD1602_C51                                                12/21/2006 16:15:07 PAGE 7   

 366          {
 367   1      
 368   1              iic_start();                    // 启动I2C
 369   1              delayNOP();
 370   1      
 371   1              IICSendByte(PCF8591_WRITE);     // 发送地址位
 372   1              check_ACK();                    // 检查应答位
 373   1          if(F0 == 1)
 374   1               {
 375   2                      SystemError = 1;
 376   2                      return;                     // 若非应答,置错误标志位
 377   2           }
 378   1          IICSendByte(controlbyte&0x77);      //Control byte
 379   1              check_ACK();                    //检查应答位
 380   1          if(F0 == 1)
 381   1               {
 382   2                      SystemError = 1;
 383   2                      return;                    // 若非应答,置错误标志位
 384   2               }
 385   1      }
 386          
 387          //-------------------------------------------------------------------
 388          // 函数名称: ADC_PCF8591
 389          // 入口参数: controlbyte控制字
 390          // 函数功能: 连续读入4路通道的A/D转换结果到receivebuf
 391          //-------------------------------------------------------------------
 392          /*
 393          void ADC_PCF8591(uchar controlbyte)
 394          {
 395              uchar idata i; //,receive_da;
 396          
 397                  iic_start();
 398          
 399                  IICSendByte(PCF8591_WRITE);     //控制字
 400                  check_ACK();
 401                  if(F0 == 1)
 402                  {
 403                          SystemError = 1;
 404                          return;
 405                  }
 406          
 407                  IICSendByte(controlbyte);       //控制字
 408                  check_ACK();
 409                  if(F0 == 1)
 410                  {
 411                          SystemError = 1;
 412                          return;
 413                  }
 414          
 415              iic_start();                //重新发送开始命令
 416                  IICSendByte(PCF8591_READ);      //控制字
 417                  check_ACK();
 418                  if(F0 == 1)
 419                  {
 420                          SystemError = 1;
 421                          return;
 422                  }
 423          
 424              IICreceiveByte();   //空读一次,调整读顺序
 425              slave_ACK();        //收到一个字节后发送一个应答位
 426          
 427          //      while(i<4)
C51 COMPILER V7.08   PCF8591_DA_LCD1602_C51                                                12/21/2006 16:15:07 PAGE 8   

 428                  for(i=0;i<4;i++)
 429                  {
 430                  //  receive_da=IICreceiveByte();
 431                  //  receivebuf[i]=receive_da;
 432                receivebuf[i] = IICreceiveByte();
 433                    slave_ACK();       //收到一个字节后发送一个应答位
 434                  }
 435                  slave_NOACK();       //收到最后一个字节后发送一个非应答位
 436                  iic_stop();
 437          }*/
 438          
 439          /*********************************************************
 440            输出三角波
 441          *********************************************************/

⌨️ 快捷键说明

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