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

📄 ds18b20zibian.lst

📁 菜鸟板的时钟 第一次学51 师兄们帮小弟看看 还有很多要改进的地方
💻 LST
字号:
C51 COMPILER V7.07   DS18B20ZIBIAN                                                         02/06/2009 15:27:44 PAGE 1   


C51 COMPILER V7.07, COMPILATION OF MODULE DS18B20ZIBIAN
OBJECT MODULE PLACED IN ds18b20zibian.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ds18b20zibian.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include <reg51.h>
   2          #include <intrins.h>//装载
   3          #define  uchar unsigned char
   4          #define  uint    unsigned int
   5          
   6          //sbit dq=P3^5;
   7          sbit DATA=P1^0;
   8          sbit CLK=P1^1;
   9          sbit  DQ=P3^5;
  10          sbit TEST=P3^4;
  11          
  12          uchar SEG7[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};/*0~9的数码管段码*/
  13          
  14          uchar act[2]={0x01,0x02};//02位数码管位码;   
  15          unsigned int tens,units,decile,tmp;
  16          float tmprt;
  17          bit flag_init=0;
  18          
  19          void send164(uchar m);
  20          void dis_time(uchar m);
  21          void  init_timer0(void);
  22          uchar discnt;
  23          uchar read_temp;
  24          uint  time_cnt;
  25          uchar temp1,temp2,temp;
  26          
  27          void  init_timer0(void)
  28          {
  29   1             TMOD=0X11;
  30   1              TH0=0xF4;TL0=0x48;TH1=0X3C;TL1=0XAF;
  31   1             
  32   1              ET0=1;
  33   1              ET1=1;
  34   1             TR1=1;TR0=1;EA=1;
  35   1      }
  36          void time1(void) interrupt 3    //50ms
  37          {//uchar temp1,temp2,temp;
  38   1         TH1=0X3C;TL1=0XAF;
  39   1          time_cnt++; // gettempTS(); 
  40   1              if(time_cnt>=20)   //  50毫秒计时时间到,读PCF8583的各寄存器的值
  41   1                      {     read_temp=1;
  42   2                                time_cnt=0;           
  43   2      
  44   2                              }
  45   1      
  46   1              }
  47          ///////*****************显示子函数*******************////////
  48          void send164(uchar m)
  49          {uchar k,i,b;
  50   1      k=SEG7[m];
  51   1      i=8;
  52   1      CLK=0;
  53   1      while (i--)
  54   1              {b=k>>i;
  55   2          if((b&0x01)==0x01)DATA=1;//判断b的最低位的值是多少
C51 COMPILER V7.07   DS18B20ZIBIAN                                                         02/06/2009 15:27:44 PAGE 2   

  56   2            else  DATA=0;
  57   2           CLK=1; 
  58   2          CLK=0;
  59   2           } 
  60   1              
  61   1      }
  62          
  63          
  64          void dis_time(uchar m)
  65          {
  66   1         //P1&=0XC3;/// 等价于 P1=P1&0xc3;;准备送段码  ,位码口全部清零
  67   1         P2=0X00;////准备送段码,位码口全部清零
  68   1               {switch(m)
  69   2                   {case 0:{send164(temp/10);P2=act[m];}break;//P1&=0XC3;
  70   3                     case 1:{send164(temp%10);P2=act[m];}break;//P1&=0XC3;
  71   3                     
  72   3                      default:break;}
  73   2                    }
  74   1      
  75   1      }
  76          
  77          ////******************定时器中断服务程序**************************/////
  78          void time0(void) interrupt 1 
  79          {
  80   1              TH0=0xFa;TL0=0x24;//TH0=0xF4;TL0=0x48;
  81   1                  dis_time(discnt);//}// 显示温度
  82   1                 discnt++;    
  83   1             if(discnt>1)discnt=0;// 显示为12位数码管
  84   1      
  85   1                
  86   1      }
  87          
  88           void Delay_uS(unsigned int tt)  //延时时间为(tt*9+16)us.晶振为12MHz
  89          {
  90   1              while(tt--)
  91   1              ;
  92   1      }
  93          
  94          void delay15us(void)
  95          {
  96   1      _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_n
             -op_();_nop_();
  97   1      }
  98          void Delay1mS(unsigned int tt)  //延时时间为tt ms.晶振为12MHz
  99          {
 100   1              unsigned char i;
 101   1              while(tt--)
 102   1              for(i=113;i>0;i--)
 103   1                      ;
 104   1      }
 105          
 106          void  DS18B20_init(void)
 107          {     uint i;
 108   1          start:   DQ=1;
 109   1                      _nop_();
 110   1                         DQ=0;
 111   1                       for(i=0;i<8;i++){delay15us();delay15us();delay15us();delay15us();delay15us();}
 112   1        //Delay_uS(54);
 113   1                         DQ=1;
 114   1                       delay15us();delay15us(); //Delay_uS(4);
 115   1                         while(DQ)
 116   1                              {
C51 COMPILER V7.07   DS18B20ZIBIAN                                                         02/06/2009 15:27:44 PAGE 3   

 117   2                                  i++;
 118   2                                  if(i>2000)
 119   2                                      {goto  start;
 120   3                                      } 
 121   2                              }
 122   1                         DQ=1;
 123   1                         for(i=0;i<8;i++){delay15us();delay15us();delay15us();delay15us();}//Delay_uS(45);
 124   1                          
 125   1      }
 126          /*void DS18B20_init(void)
 127          {
 128                  flag_init=1;      //初始化成功标志位,0为成功
 129                  DQ=1;                     //DQ复位
 130                  _nop_();
 131                  DQ=0;                     //拉低DQ
 132                  Delay_uS(58);    //延时484us(此信号要求480us~960us)
 133                  DQ=1;                    //释放DQ
 134                  Delay_uS(5);     //延时61us (在检测到 I/O 引脚上的上升沿之后DS18B20等待15us~60us并且接着发送存在脉冲60-240us
             -的低电平信号)
 135                  while(DQ);
 136                  Delay_uS(25);    //延时241us(DS18B20发送存在脉冲的低电平信号60~240us)
 137          }
 138          */
 139          /*unsigned char Readonechar(void)                //读一个字节
 140          {
 141                  unsigned char i,dat=0;
 142                  for(i=8;i;i--)
 143                  {
 144                  DQ=0;
 145                  dat>>=1;
 146                  DQ=1;
 147                  if(DQ)
 148                  dat|=0x80;
 149                  Delay_uS(6);//延时61us(所有读时间片的最短持续期限为60us,各个读时间片之间必须有最短为1us的恢复时间)
 150                  }
 151                  return dat;
 152          }
 153          */
 154          bit readTS(void)                                                //读DS18B20数据位
 155          {
 156   1      bit b;
 157   1      DQ=1;
 158   1      DQ=0;
 159   1      _nop_();_nop_();//_nop_();
 160   1      DQ=1;
 161   1      _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//_nop_();_nop_();_nop_();_nop_();
             -_nop_();_nop_();_nop_();
 162   1      b=DQ;_nop_();_nop_();
 163   1      DQ=1;
 164   1       Delay_uS(5);//delay15us();delay15us();delay15us();delay15us();
 165   1      //DQ=1;
 166   1      return b;
 167   1      }
 168          
 169          /*uchar readBTS(void)                                           //读1字节
 170          {unsigned char i,dat=0;
 171               bit b;
 172                  for(i=0;i<8;i++)
 173                  {
 174                  dat>>=1;
 175                  b=readTS();
 176                  if(b)
C51 COMPILER V7.07   DS18B20ZIBIAN                                                         02/06/2009 15:27:44 PAGE 4   

 177                  dat|=0x80;
 178                  
 179                          }
 180                  return b;
 181          }*/
 182          uchar readBTS(void)                                             //读1字节
 183          {char i,j;
 184   1      bit b;
 185   1      uchar a;
 186   1      j=0;
 187   1      for(i=0;i<8;i++)
 188   1      {
 189   2      b=readTS();
 190   2      if(b)j+=1;
 191   2      j=_cror_(j,1);
 192   2      }
 193   1      a=(uchar)j;
 194   1      return a;
 195   1      }
 196          
 197          void write0TS(void)                                             //写DS18B20数据位0
 198          {
 199   1      DQ=1;
 200   1      DQ=0;
 201   1      Delay_uS(5);//delay15us();delay15us();delay15us();delay15us();delay15us();  delay15us();delay15us();
 202   1      _nop_();_nop_();_nop_();_nop_();_nop_();
 203   1      DQ=1;
 204   1      _nop_();
 205   1      _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 206   1      }
 207          //********************************************************
 208          void write1TS(void)                                     //写DS18B20数据位1
 209          {
 210   1      DQ=1;
 211   1      DQ=0;
 212   1      _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 213   1      DQ=1;
 214   1      //_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 215   1       Delay_uS(5);//delay15us();delay15us();delay15us();delay15us();delay15us();delay15us();delay15us();
 216   1      }
 217          
 218          void writeBTS(uchar byte)                               //写1字节
 219          {uchar i;
 220   1      for(i=0;i<8;i++)
 221   1      {
 222   2      if(byte&0x01)
 223   2            write1TS();
 224   2      else
 225   2           write0TS();
 226   2      byte=byte>>1;
 227   2      }
 228   1      }
 229          
 230          /*void Writeonechar(unsigned char dat)    //写一个字节
 231          {
 232                  unsigned char i;
 233                  for(i=8;i;i--)
 234                  {
 235                          DQ=0;
 236                          DQ=dat&0x01;
 237                          Delay_uS(5); //延时61us(在I/O线由高电平变为低电平之后DS1820在15us~60us之间对 I/O 线采样)
 238                          DQ=1;
C51 COMPILER V7.07   DS18B20ZIBIAN                                                         02/06/2009 15:27:44 PAGE 5   

 239                          dat>>=1;
 240                  }
 241          }
 242          */
 243          /*void Readtemperature(void)
 244          {
 245                  tens=0;units=0;decile=0;tmp=0;
 246                  tmprt=0;
 247                  DS18B20_init();
 248                  Writeonechar(0xcc);// 跳过读序列号的操作
 249                  Writeonechar(0x44);// 启动温度转换
 250                  Delay1mS(100);
 251                  DS18B20_init();
 252                  Writeonechar(0xcc);//跳过读序号列号的操作
 253                  Writeonechar(0xbe);//读取温度寄存器
 254          
 255                  units=Readonechar();//读低八位
 256                  tens=Readonechar();      //读高八位
 257                  
 258                  tens<<=8;
 259                  tens|=units;             //高低位合并
 260                  tmprt=tens*0.0625;        //计算温度值
 261                  tmp=tmprt*10+0.5;         //放大10倍输出并四舍五入
 262          
 263                  tens=tmp/100;           //十位
 264                  units=tmp/10%10;         //个位 
 265                  temp1=(uchar)units;
 266                  temp2=(uchar)tens;
 267                  decile=tmp%10;          //小数位
 268          }*/
 269          
 270          void gettempTS(void)                                    //读取测得的环境温度
 271          {uchar a,b;
 272   1      DS18B20_init();
 273   1      writeBTS(0xcc);
 274   1      writeBTS(0x44);
 275   1      Delay1mS(700);
 276   1      DS18B20_init();
 277   1      writeBTS(0xcc);
 278   1      writeBTS(0xbe);
 279   1      temp2=readBTS();_nop_();_nop_();
 280   1      temp1=readBTS();
 281   1      readBTS();readBTS();readBTS();readBTS();
 282   1      readBTS();readBTS();readBTS();
 283   1      a=(temp2&0xf0)>>4;
 284   1      b=(temp1&0x07)<<4;
 285   1      temp=a|b;
 286   1      /*temp1=temp1<<4;
 287   1      temp1+=(temp2&0xf0)>>4;
 288   1      temp2=(temp2&0x0f)?5:0;*/
 289   1      }
 290          
 291          //********主函数*********
 292          void main(void)
 293          {
 294   1           Delay1mS(100);
 295   1          init_timer0();//初始化定时器T0
 296   1           Delay1mS(900);
 297   1          DS18B20_init();  //温度传感器DS18B20初始化
 298   1          temp=2;
 299   1          while(1)
 300   1          {
C51 COMPILER V7.07   DS18B20ZIBIAN                                                         02/06/2009 15:27:44 PAGE 6   

 301   2              { if( read_temp==1)
 302   3                     //read_temp=0;//TEST=~TEST;
 303   3                      { gettempTS(); read_temp=0;}    //读DS18B20检测到的温度Delay1mS(600);  
 304   3              }
 305   2                      //Display();
 306   2          }
 307   1      /*while(1)
 308   1      {
 309   1      
 310   1         if( read_temp==1)
 311   1              {
 312   1                read_temp=0;TEST=~TEST;}
 313   1                      tmstart();                      // ds1820开始转换
 314   1                      dmsec(2);    
 315   1                      temp1=tmrtemp();        // 读取温度     
 316   1              
 317   1      
 318   1      if(read_temp==1)
 319   1              {//temp1=34;gettempTS();
 320   1                      
 321   1                         read_temp=0;
 322   1              }
 323   1      
 324   1          }*/
 325   1      }
 326          
 327           
 328          
 329          
 330          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    603    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     31    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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