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

📄 ds18b20.lst

📁 单片机为AT89S52
💻 LST
字号:
C51 COMPILER V7.09   DS18B20                                                               08/06/2005 09:34:15 PAGE 1   


C51 COMPILER V7.09, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN DS18B20.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE DS18B20.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<reg52.h>
   2          #include<string.h>
   3          #include <intrins.h>
   4          #include<stdio.h>
   5          #include<math.h>
   6          #define uchar unsigned char
   7          #define uint unsigned int
   8          typedef unsigned char byte;
   9          typedef unsigned int  word;
  10          //***********************************************//
  11          sbit DQ=P0^0;                    //温度信号输入,根据实际情况定义端口
  12          sbit da=P2^0;
  13          sbit clk=P2^1;
  14          sbit adra=P2^2;
  15          sbit adrb=P2^3;
  16          bit compare;
  17          uchar value;
  18          uchar  data DD[4];
  19          //*********函数声明****************//
  20          void delay(word useconds);
  21          void sdelay();
  22          void disp(uint value);
  23          chage1(uint temp);
  24          chage2(uint temp);
  25          display(uchar val);
  26          //****************ds18b20延时***********************//
  27          void delay(word useconds)
  28          {
  29   1        for(;useconds>0;useconds--);
  30   1      }
  31          
  32          //********DS18B20初始化子程序***********************//
  33          byte ow_reset(void)
  34          {
  35   1        byte presence;
  36   1        DQ = 0;                            //pull DQ line low
  37   1        delay(29);                         // leave it low for 480us
  38   1        DQ = 1;                            // allow line to return high
  39   1        delay(3);                          // wait for presence
  40   1        presence = DQ;                     // get presence signal
  41   1        delay(25);                         // wait for end of timeslot
  42   1        return(presence);                  // presence signal returned
  43   1      }                                    // 0=presence, 1 = no part
  44          
  45          //从 1-wire 总线上读取一个字节
  46          byte read_byte(void)
  47          {
  48   1        byte i;
  49   1        byte value = 0;
  50   1        for (i=8;i>0;i--)
  51   1        {
  52   2          value>>=1;
  53   2          DQ = 0;                          // pull DQ low to start timeslot
  54   2          DQ = 1;                          // then return high
  55   2          delay(1);                        //for (i=0; i<3; i++); 
C51 COMPILER V7.09   DS18B20                                                               08/06/2005 09:34:15 PAGE 2   

  56   2          if(DQ)value|=0x80;
  57   2          delay(6);                        // wait for rest of timeslot
  58   2        }
  59   1        return(value);
  60   1      }
  61          
  62          //向 1-WIRE 总线上写一个字节
  63          void write_byte(char val)
  64          {
  65   1        byte i;
  66   1        for (i=8; i>0; i--)                  // writes byte, one bit at a time
  67   1        {
  68   2          DQ = 0;                            // pull DQ low to start timeslot
  69   2          DQ = val&0x01;
  70   2          delay(5);                          // hold value for remainder of timeslot
  71   2          DQ = 1;
  72   2          val=val/2;
  73   2        }
  74   1        delay(5);
  75   1      }
  76          
  77          /***读取温度
  78          char Read_Temperature(void)
  79          {
  80            union{
  81              byte c[2];
  82              int x;
  83            }temp;
  84          
  85            ow_reset();
  86            write_byte(0xCC);                           // Skip ROM
  87            write_byte(0xBE);                           // Read Scratch Pad
  88            temp.c[1]=read_byte();
  89            temp.c[0]=read_byte();
  90            ow_reset();
  91            write_byte(0xCC);                           //Skip ROM
  92            write_byte(0x44);                           // Start Conversion
  93            return(temp.x/2);
  94          }
  95          
  96          //*********读取温度*************/
  97          char Read_Temperature(void)
  98          {
  99   1      uchar a=0;
 100   1      uchar b=0;
 101   1      uint t=0;
 102   1      //float tt=0;
 103   1      ow_reset();
 104   1      write_byte(0xCC);  //跳过读序号列号的操作
 105   1      write_byte(0xBE);  //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
 106   1      a=read_byte();
 107   1      b=read_byte();
 108   1      t=b;
 109   1      t<<=8;
 110   1      t=t|a;
 111   1      //tt=t*0.0625;
 112   1      ow_reset();
 113   1      write_byte(0xCC); // 跳过读序号列号的操作
 114   1      write_byte(0x44);   // 启动温度转换
 115   1      return(t);
 116   1      }
 117          //****led显示程序*****//
C51 COMPILER V7.09   DS18B20                                                               08/06/2005 09:34:15 PAGE 3   

 118          
 119          char code seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
 120                           0x77,0x7f,0x35,0x3f,0x75,0x71}; 
 121          void disp(uint value)
 122          {uint temp;
 123   1       temp=value;
 124   1       if(temp>0x270f)compare=1;
 125   1         else compare=0;
 126   1       if(compare==0){
 127   2                      chage1(temp);
 128   2                      DD[0]=seg[DD[0]];
 129   2                                      DD[1]=seg[DD[1]];
 130   2                                      DD[2]=seg[DD[2]];
 131   2                                      DD[3]=seg[DD[3]];
 132   2                      adra=0,adrb=0;
 133   2                      display(DD[0]);
 134   2                      adra=1,adrb=0;
 135   2                      display(DD[1]);
 136   2                      adra=0,adrb=1;
 137   2                      display(DD[2]);
 138   2                      adra=1,adrb=1;
 139   2                      display(DD[3]);
 140   2                                 }
 141   1       if(compare==1){chage2(temp);
 142   2       adra=1,adrb=1;
 143   2       display(DD[3]);
 144   2       adra=0,adrb=1;
 145   2       display(DD[2]);
 146   2       adra=1,adrb=0;
 147   2       display(DD[1]);
 148   2       adra=0,adrb=0;
 149   2       display(DD[0]);}
 150   1       } 
 151          //***********LED延时子程序****************************//
 152          void sdelay(void)
 153          {uint t;
 154   1       t=0x180;
 155   1       while(t--);
 156   1      }
 157          //***************************************//
 158          chage1(uint temp)
 159          {
 160   1       DD[0]=(int)(temp/1000);
 161   1       DD[1]=(int)((temp-DD[0]*1000)/100);
 162   1       DD[2]=(int)((temp-DD[0]*1000-DD[1]*100)/10);
 163   1       DD[3]=(int)(temp-DD[0]*1000-DD[1]*100-DD[2]*10);
 164   1      }
 165          //****************************************//
 166          chage2(uint temp)
 167          {
 168   1       temp=0;
 169   1       DD[0]=0x71;
 170   1       DD[1]=0x3E;
 171   1       DD[2]=0x38;
 172   1       DD[3]=0x38;
 173   1      }
 174          //****************************************//
 175          display(uchar val)
 176          {uchar i;
 177   1       bit bin;
 178   1        for(i=8;i>0;i--)
 179   1            {bin=val&0x80;
C51 COMPILER V7.09   DS18B20                                                               08/06/2005 09:34:15 PAGE 4   

 180   2                 val = val<<1; 
 181   2                 da=bin;
 182   2                 clk=0;
 183   2                 clk=1;
 184   2            }
 185   1           sdelay();
 186   1      }
 187          //**************************//
 188          main()
 189          {
 190   1       uint temper;
 191   1       ow_reset();
 192   1       while(1){
 193   2                temper=Read_Temperature();
 194   2                        (uint)temper=temper/16;
 195   2                disp(temper);
 196   2               }
 197   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    525    ----
   CONSTANT SIZE    =     16    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      5       4
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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