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

📄 gsd.lst

📁 菜鸟板的时钟 第一次学51 师兄们帮小弟看看 还有很多要改进的地方
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.07   GSD                                                                   02/12/2009 20:21:02 PAGE 6   

 303   1      DQ=1;
 304   1      delay15us();delay15us();delay15us();delay15us();//delay15us(); Delay_uS(5);
 305   1      //DQ=1;
 306   1      return b;
 307   1      }
 308          uchar readBTS(void)                                             //读1字节
 309          {char i,j;
 310   1      bit b;
 311   1      uchar a;
 312   1      j=0;
 313   1      for(i=0;i<8;i++)
 314   1      {
 315   2      b=readTS();
 316   2      if(b)j+=1;
 317   2      j=_cror_(j,1);
 318   2      }
 319   1      a=(uchar)j;
 320   1      return a;
 321   1      }
 322          
 323          void write0TS(void)                                             //写DS18B20数据位0
 324          {
 325   1      DQ=1;
 326   1      DQ=0;
 327   1      delay15us();delay15us();delay15us();delay15us();//  delay15us();delay15us();Delay_uS(5);delay15us();
 328   1      _nop_();_nop_();_nop_();
 329   1      DQ=1;
 330   1      _nop_();
 331   1      _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 332   1      }
 333          //********************************************************
 334          void write1TS(void)                                     //写DS18B20数据位1
 335          {
 336   1      DQ=1;
 337   1      DQ=0;
 338   1      _nop_();
 339   1      _nop_();_nop_();_nop_();_nop_();_nop_();
 340   1      
 341   1      DQ=1;
 342   1      //_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 343   1      delay15us();delay15us();delay15us();delay15us();_nop_();_nop_();_nop_();_nop_();_nop_(); //delay15us();del
             -ay15us();delay15us();delay15us();delay15us();delay15us();delay15us();Delay_uS(5);
 344   1      }
 345          
 346          void writeBTS(uchar byte)                               //写1字节
 347          {uchar i;
 348   1      for(i=0;i<8;i++)
 349   1      {
 350   2      if(byte&0x01)
 351   2            write1TS();
 352   2      else
 353   2           write0TS();
 354   2      byte=byte>>1;
 355   2      }
 356   1      }
 357          void gettempTS(void)                                    //读取测得的环境温度
 358          {uchar a,b;
 359   1      EA=0;
 360   1      DS18B20_init();
 361   1      writeBTS(0xcc);
 362   1      writeBTS(0x44);EA=1;
 363   1      Delay1mS(100);EA=0;
C51 COMPILER V7.07   GSD                                                                   02/12/2009 20:21:02 PAGE 7   

 364   1      DS18B20_init();
 365   1      writeBTS(0xcc);
 366   1      writeBTS(0xbe);
 367   1      temp2=readBTS();
 368   1      temp1=readBTS();
 369   1      readBTS();readBTS();readBTS();readBTS();
 370   1      readBTS();readBTS();readBTS();EA=1;
 371   1      a=(temp2&0xf0)>>4;
 372   1      b=(temp1&0x07)<<4;
 373   1      temp=a|b;
 374   1      /*temp1=temp1<<4;
 375   1      temp1+=(temp2&0xf0)>>4;
 376   1      temp2=(temp2&0x0f)?5:0;*/
 377   1      }
 378          
 379          /*******************************************************************
 380                               起动总线函数               
 381          函数原型: void  Start_I2c();  
 382          功能:       启动I2C总线,即发送I2C起始条件.
 383            
 384          ********************************************************************/
 385          void Start_I2c(void)
 386          {
 387   1        SDA=1;   /*发送起始条件的数据信号*/
 388   1        _Nop();
 389   1        _Nop();
 390   1        SCL=1;
 391   1        _Nop();    /*起始条件建立时间大于4.7us,延时*/
 392   1        _Nop();
 393   1        _Nop();
 394   1        _Nop();
 395   1        _Nop(); 
 396   1        _Nop();    /*起始条件建立时间大于4.7us,延时*/
 397   1        SDA=0;   /*发送起始信号*/
 398   1        _Nop();    /* 起始条件锁定时间大于4μs*/
 399   1        _Nop();
 400   1        _Nop();
 401   1        _Nop();
 402   1        _Nop(); 
 403   1        _Nop();    /*起始条件建立时间大于4.7us,延时*/
 404   1        SCL=0;   /*钳住I2C总线,准备发送或接收数据 */
 405   1        _Nop();
 406   1        _Nop();
 407   1        _Nop();
 408   1        _Nop();
 409   1      }
 410          
 411           
 412          
 413          
 414          /*******************************************************************
 415                                结束总线函数               
 416          函数原型: void  Stop_I2c();  
 417          功能:       结束I2C总线,即发送I2C结束条件.
 418            
 419          ********************************************************************/
 420          void Stop_I2c(void)
 421          {
 422   1        SDA=0;  /*发送结束条件的数据信号*/
 423   1        _Nop();   /*发送结束条件的时钟信号*/
 424   1        _Nop();   /*发送结束条件的时钟信号*/
 425   1        SCL=1;  /*结束条件建立时间大于4μs*/
C51 COMPILER V7.07   GSD                                                                   02/12/2009 20:21:02 PAGE 8   

 426   1        _Nop();
 427   1        _Nop();
 428   1        _Nop();
 429   1        _Nop();
 430   1        _Nop();
 431   1        SDA=1;  /*发送I2C总线结束信号*/
 432   1        _Nop();
 433   1        _Nop();
 434   1        _Nop();
 435   1        _Nop();
 436   1        _Nop();
 437   1      }
 438          
 439           
 440          
 441          
 442          /*******************************************************************
 443                           字节数据传送函数               
 444          函数原型: void  SendByte(uchar c);
 445          功能:  将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
 446               此状态位进行操作.(不应答或非应答都使ack=0 假)     
 447               发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
 448          ********************************************************************/
 449          void  SendByte(uchar c)
 450          {
 451   1       uchar BitCnt;
 452   1       
 453   1       for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/
 454   1          {
 455   2           if((c<<BitCnt)&0x80)SDA=1;   /*判断发送位*/
 456   2             else  SDA=0;                
 457   2           _Nop();
 458   2        _Nop();
 459   2           SCL=1;               /*置时钟线为高,通知被控器开始接收数据位*/
 460   2            _Nop(); 
 461   2            _Nop();               /*保证时钟高电平周期大于4μs*/
 462   2            _Nop();
 463   2            _Nop();
 464   2            _Nop();  
 465   2         _Nop(); 
 466   2            _Nop();               /*保证时钟高电平周期大于4μs*/
 467   2            _Nop();
 468   2            _Nop();
 469   2            _Nop();          
 470   2           SCL=0; 
 471   2          }
 472   1          
 473   1          _Nop();
 474   1          _Nop();
 475   1       _Nop();
 476   1          _Nop();
 477   1          SDA=1;               /*8位发送完后释放数据线,准备接收应答位*/
 478   1          
 479   1       _Nop();
 480   1          _Nop(); 
 481   1       _Nop();
 482   1          _Nop();   
 483   1          SCL=1;
 484   1          _Nop();
 485   1          _Nop();
 486   1          _Nop();
 487   1        _Nop();
C51 COMPILER V7.07   GSD                                                                   02/12/2009 20:21:02 PAGE 9   

 488   1          _Nop();
 489   1          _Nop();
 490   1          if(SDA==1)ack=0;     
 491   1             else ack=1;        /*判断是否接收到应答信号*/
 492   1          SCL=0;
 493   1          _Nop();
 494   1          _Nop();
 495   1       _Nop();
 496   1          _Nop();
 497   1      }
 498          
 499           
 500          
 501           
 502          
 503          
 504          /*******************************************************************
 505                           字节数据传送函数               
 506          函数原型: uchar  RcvByte();
 507          功能:  用来接收从器件传来的数据,并判断总线错误(不发应答信号),
 508               发完后请用应答函数。  
 509          ********************************************************************/ 
 510          uchar  RcvByte(void)
 511          {
 512   1        uchar retc;
 513   1        uchar BitCnt;
 514   1        
 515   1        retc=0; 
 516   1        SDA=1;             /*置数据线为输入方式*/
 517   1        for(BitCnt=0;BitCnt<8;BitCnt++)
 518   1            {
 519   2              _Nop(); 
 520   2        _Nop();           
 521   2              SCL=0;       /*置时钟线为低,准备接收数据位*/
 522   2              _Nop();
 523   2              _Nop();         /*时钟低电平周期大于4.7μs*/
 524   2              _Nop();
 525   2              _Nop();
 526   2              _Nop();
 527   2        _Nop();
 528   2              _Nop();         /*时钟低电平周期大于4.7μs*/
 529   2              _Nop();
 530   2              _Nop();
 531   2              _Nop();
 532   2              SCL=1;       /*置时钟线为高使数据线上数据有效*/
 533   2              _Nop();
 534   2              _Nop();
 535   2          _Nop();
 536   2              _Nop();
 537   2              retc=retc<<1;
 538   2              if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
 539   2              _Nop();
 540   2              _Nop(); 
 541   2        _Nop();
 542   2              _Nop(); 
 543   2            }
 544   1        SCL=0;    
 545   1        _Nop();
 546   1        _Nop();
 547   1        _Nop();
 548   1        _Nop();
 549   1        return(retc);
C51 COMPILER V7.07   GSD                                                                   02/12/2009 20:21:02 PAGE 10  

 550   1      }
 551          
 552           
 553          
 554          
 555          /********************************************************************
 556                               应答子函数
 557          原型:  void Ack_I2c(bit a);
 558           
 559          功能:主控器进行应答信号,(可以是应答或非应答信号)
 560          ********************************************************************/
 561          void Ack_I2c(bit a)
 562          {
 563   1        
 564   1        if(a==0)SDA=0;     /*在此发出应答或非应答信号 */
 565   1              else SDA=1;
 566   1        _Nop();
 567   1        _Nop();
 568   1        _Nop();
 569   1        _Nop();
 570   1        _Nop();
 571   1        _Nop();         
 572   1        SCL=1;
 573   1          _Nop();
 574   1          _Nop();              /*时钟低电平周期大于4μs*/
 575   1          _Nop();
 576   1          _Nop();
 577   1          _Nop(); 
 578   1          _Nop();
 579   1          _Nop();              /*时钟低电平周期大于4μs*/
 580   1          _Nop();
 581   1          _Nop();
 582   1          _Nop();  
 583   1       SCL=0;                /*清时钟线,钳住I2C总线以便继续接收*/
 584   1          _Nop();
 585   1          _Nop();  
 586   1       _Nop();
 587   1          _Nop();   
 588   1      }
 589          
 590          /*******************************************************************
 591                              向有子地址器件发送字节数据函数               
 592          函数原型: bit  ISendByte(uchar sla,ucahr c);  
 593          功能:     从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
 594                     如果返回1表示操作成功,否则操作有误。
 595          注意:    使用前必须已结束总线。
 596          ********************************************************************/
 597          bit ISendByte(uchar sla,uchar suba,uchar c)
 598          {
 599   1         Start_I2c();               /*启动总线*/
 600   1         SendByte(sla);            /*发送器件地址*/
 601   1           if(ack==0)return(0);
 602   1        SendByte(suba);            /*发送器件地址*/
 603   1           if(ack==0)return(0);
 604   1         SendByte(c);               /*发送数据*/
 605   1           if(ack==0)return(0);
 606   1        Stop_I2c();                 /*结束总线*/ 
 607   1        return(1);
 608   1      }
 609          
 610          /*******************************************************************
 611                              向有子地址器件读字节数据函数               

⌨️ 快捷键说明

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