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

📄 8583 b20.lst

📁 菜鸟板的时钟 第一次学51 师兄们帮小弟看看 还有很多要改进的地方
💻 LST
📖 第 1 页 / 共 3 页
字号:
 231          
 232          /*void DS18B20_init(void)
 233          {
 234                  flag_init=1;      //初始化成功标志位,0为成功
 235                  DQ=1;                     //DQ复位
 236                  _nop_();
 237                  DQ=0;                     //拉低DQ
 238                  Delay_uS(58);    //延时484us(此信号要求480us~960us)
 239                  DQ=1;                    //释放DQ
 240                  Delay_uS(5);     //延时61us (在检测到 I/O 引脚上的上升沿之后DS18B20等待15us~60us并且接着发送存在脉冲60-240us
             -的低电平信号)
C51 COMPILER V7.07   8583_B20                                                              02/05/2009 23:03:45 PAGE 5   

 241                  flag_init=DQ;
 242                  Delay_uS(40);    //延时241us(DS18B20发送存在脉冲的低电平信号60~240us)
 243          }
 244          */
 245          unsigned char Readonechar(void)          //读一个字节
 246          {
 247   1              unsigned char i,dat=0;
 248   1              for(i=8;i>0;i--)
 249   1              {
 250   2              DQ=0;
 251   2              dat>>=1;
 252   2              DQ=1;
 253   2              if(DQ)
 254   2              dat|=0x80;
 255   2              Delay_uS(6);//延时61us(所有读时间片的最短持续期限为60us,各个读时间片之间必须有最短为1us的恢复时间)
 256   2              }
 257   1              return dat;
 258   1      }
 259          
 260          void Writeonechar(unsigned char dat)      //写一个字节
 261          {
 262   1              unsigned char i;
 263   1              for(i=8;i>0;i--)
 264   1              {
 265   2                      DQ=0;
 266   2                      DQ=dat&0x01;
 267   2                      Delay_uS(5); //延时61us(在I/O线由高电平变为低电平之后DS1820在15us~60us之间对 I/O 线采样)
 268   2                      DQ=1;
 269   2                      dat>>=1;
 270   2              }
 271   1      }
 272          
 273          void Readtemperature(void)
 274          {
 275   1              tens=0;units=0;decile=0;tmp=0;
 276   1              tmprt=0;
 277   1              DS18B20_init();
 278   1              Writeonechar(0xcc);// 跳过读序列号的操作
 279   1              Writeonechar(0x44);// 启动温度转换
 280   1              Delay1mS(500);
 281   1              DS18B20_init();
 282   1              Writeonechar(0xcc);//跳过读序号列号的操作
 283   1              Writeonechar(0xbe);//读取温度寄存器
 284   1      
 285   1              units=Readonechar();//读低八位
 286   1              tens=Readonechar();      //读高八位
 287   1              
 288   1              tens<<=8;
 289   1              tens|=units;             //高低位合并
 290   1              tmprt=tens*0.0625;        //计算温度值
 291   1              tmp=tmprt*10+0.5;         //放大10倍输出并四舍五入
 292   1      
 293   1              tens=tmp/100;           //十位
 294   1              units=tmp/10%10;         //个位 
 295   1              tempb21=(uchar)units;
 296   1              tempb20=(uchar)tens;
 297   1              decile=tmp%10;          //小数位
 298   1      }
 299          //////////////////断码输出//////////////////////
 300          
 301          void send164(uchar m)
 302          {uchar k,i,b;
C51 COMPILER V7.07   8583_B20                                                              02/05/2009 23:03:45 PAGE 6   

 303   1      k=SEG7[m];
 304   1      i=8;
 305   1      CLK=0;
 306   1      while (i--)
 307   1              {b=k>>i;
 308   2          if((b&0x01)==0x01)DATA=1;//判断b的最低位的值是多少
 309   2            else  DATA=0;
 310   2           CLK=1; _nop_();
 311   2          CLK=0;
 312   2           } 
 313   1              
 314   1      }
 315                                              //P2 KOU                                                 //P1kou     
 316                                              
 317          void dis_time(uchar m)
 318          {
 319   1         P1&=0XC3;/// 等价于 P1=P1&0xc3;;准备送段码  ,位码口全部清零
 320   1         P2=0X00;////准备送段码,位码口全部清零
 321   1         
 322   1               {switch(m)
 323   2                   {case 0:{send164(tempb21);P2|=act[m];P1&=0XC3;}break;
 324   3                     case 1:{send164(tempb20);P2|=act[m];P1&=0XC3;}break;
 325   3                     case 2:{send164(day/10);P2|=act[m];P1&=0XC3;}break;
 326   3                     case 3:{send164(day%10);P2|=act[m];P1&=0XC3;}break;
 327   3                     case 4:{send164(hou/10);P2|=act[m];P1&=0XC3;}break;
 328   3                      case 5:{send164(hou%10);P2|=act[m];P1&=0XC3;}break;
 329   3                      case 6:{send164(min/10);P2|=act[m];P1&=0XC3;}break;
 330   3                      case 7:{send164(min%10);P2|=act[m];P1&=0XC3;}break;
 331   3                      case 8:{send164(sec/10);P1|=act[m];P2=0X00;}break;
 332   3                      case 9:{send164(sec%10);P1|=act[m];P2=0X00;}break;
 333   3                      case 10:{send164(tempb20);P1|=act[m];P2=0X00;}break;
 334   3                      case 11:{send164(tempb21);P1|=act[m];P2=0X00;}break;
 335   3                      
 336   3                      default:break;}
 337   2                    }
 338   1      
 339   1      }
 340          
 341          
 342          void dis_adjtime(uchar m)
 343          {  
 344   1           if(cnt>100)
 345   1              { 
 346   2                  P1&=0XC3;
 347   2                 P2=0X00;
 348   2                              switch(m)
 349   2                              {case 0:{send164(mon/10);P2|=act[m];P1&=0XC3;}break;
 350   3                            case 1:{send164(mon%10);P2|=act[m];P1&=0XC3;}break;
 351   3                            case 2:{send164(day/10);P2|=act[m];P1&=0XC3;}break;
 352   3                            case 3:{send164(day%10);P2|=act[m];P1&=0XC3;}break;
 353   3                             case 4:{send164(hou/10);P2|=act[m];P1&=0XC3;}break;
 354   3                             case 5:{send164(hou%10);P2|=act[m];P1&=0XC3;}break;
 355   3                              case 6:{send164(min/10);P2|=act[m];P1&=0XC3;}break;
 356   3                              case 7:{send164(min%10);P2|=act[m];P1&=0XC3;}break;
 357   3                              case 8:{send164(0);P1&=act[m];P2=0X00;}break;
 358   3                              case 9:{send164(0);P1&=act[m];P2=0X00;}break;
 359   3                              case 10:{send164(0);P1&=act[m];P2=0X00;}break;
 360   3                             case 11:{send164(0);P1&=act[m];P2=0X00;}break;
 361   3                                default:break;
 362   3                                                }
 363   2                    }
 364   1            else 
C51 COMPILER V7.07   8583_B20                                                              02/05/2009 23:03:45 PAGE 7   

 365   1              {  
 366   2                  P1&=0XC3;
 367   2                 P2=0X00;
 368   2              }
 369   1      }
 370          
 371          
 372          void TIMERIni(void)
 373          {
 374   1             TMOD=0X11;
 375   1              TH0=0xFa;TL0=0x24;TH1=0X3C;TL1=0XAF;
 376   1             EA=1;
 377   1              ET0=1;
 378   1              ET1=1;
 379   1             TR1=1;TR0=1;
 380   1      }
 381          
 382          
 383          
 384           
 385             
 386          /*******************************************************************
 387                               起动总线函数               
 388          函数原型: void  Start_I2c();  
 389          功能:       启动I2C总线,即发送I2C起始条件.
 390            
 391          ********************************************************************/
 392          void Start_I2c(void)
 393          {
 394   1        SDA=1;   /*发送起始条件的数据信号*/
 395   1        _Nop();
 396   1        _Nop();
 397   1        SCL=1;
 398   1        _Nop();    /*起始条件建立时间大于4.7us,延时*/
 399   1        _Nop();
 400   1        _Nop();
 401   1        _Nop();
 402   1        _Nop(); 
 403   1        _Nop();    /*起始条件建立时间大于4.7us,延时*/
 404   1        SDA=0;   /*发送起始信号*/
 405   1        _Nop();    /* 起始条件锁定时间大于4μs*/
 406   1        _Nop();
 407   1        _Nop();
 408   1        _Nop();
 409   1        _Nop(); 
 410   1        _Nop();    /*起始条件建立时间大于4.7us,延时*/
 411   1        SCL=0;   /*钳住I2C总线,准备发送或接收数据 */
 412   1        _Nop();
 413   1        _Nop();
 414   1        _Nop();
 415   1        _Nop();
 416   1      }
 417          
 418           
 419          
 420          
 421          /*******************************************************************
 422                                结束总线函数               
 423          函数原型: void  Stop_I2c();  
 424          功能:       结束I2C总线,即发送I2C结束条件.
 425            
 426          ********************************************************************/
C51 COMPILER V7.07   8583_B20                                                              02/05/2009 23:03:45 PAGE 8   

 427          void Stop_I2c(void)
 428          {
 429   1        SDA=0;  /*发送结束条件的数据信号*/
 430   1        _Nop();   /*发送结束条件的时钟信号*/
 431   1        _Nop();   /*发送结束条件的时钟信号*/
 432   1        SCL=1;  /*结束条件建立时间大于4μs*/
 433   1        _Nop();
 434   1        _Nop();
 435   1        _Nop();
 436   1        _Nop();
 437   1        _Nop();
 438   1        SDA=1;  /*发送I2C总线结束信号*/
 439   1        _Nop();
 440   1        _Nop();
 441   1        _Nop();
 442   1        _Nop();
 443   1        _Nop();
 444   1      }
 445          
 446           
 447          
 448          
 449          /*******************************************************************
 450                           字节数据传送函数               
 451          函数原型: void  SendByte(uchar c);
 452          功能:  将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
 453               此状态位进行操作.(不应答或非应答都使ack=0 假)     
 454               发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
 455          ********************************************************************/
 456          void  SendByte(uchar c)
 457          {
 458   1       uchar BitCnt;
 459   1       
 460   1       for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/
 461   1          {
 462   2           if((c<<BitCnt)&0x80)SDA=1;   /*判断发送位*/
 463   2             else  SDA=0;                
 464   2           _Nop();
 465   2        _Nop();
 466   2           SCL=1;               /*置时钟线为高,通知被控器开始接收数据位*/

⌨️ 快捷键说明

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