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

📄 ds18b20.lst

📁 基于ATMEL AT89S52与DALLS 18B20的应用程序
💻 LST
字号:
C51 COMPILER V8.08   DS18B20                                                               02/25/2009 16:20:26 PAGE 1   


C51 COMPILER V8.08, 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 <intrins.h>
   3          #define jmp_rom 0xcc
   4          #define tmp_start 0x44
   5          #define tmp_ram_read 0xbe
   6          #define nop _nop_()
   7          #define BUSY 0x80 
   8          #define WRITE_DATA 0xff 
   9          #define delay_data 0xff 
  10          #define COMMAND 0x00 
  11          #define LCD_CLEAR 0x01 
  12          #define portdata P0 
  13          #define secondline 0xc0
  14          
  15          unsigned char data ds18b20_read_data[9];
  16          unsigned char data table[32] = "temperature 00.0designed by hwb ";
  17          sbit data_pin = P3^7;
  18          sbit RS = P2^7;
  19          sbit RW = P2^6;
  20          sbit E = P2^5;
  21          sbit LED = P2 ^ 3;
  22          bit zheng_fu_hao;
  23          
  24          unsigned char lcd_busy(void) 
  25          { 
  26   1        unsigned char temp; 
  27   1         
  28   1        portdata = 0xff; 
  29   1        RS = 0; 
  30   1        RW = 1; 
  31   1        E = 1; 
  32   1        temp = portdata; 
  33   1        E = 0; 
  34   1        return (temp); 
  35   1      } 
  36          
  37          void lcd_command_writedata(unsigned char check,unsigned char dispdata) 
  38          { 
  39   1        if (check == COMMAND) 
  40   1        { 
  41   2         RS = 0; 
  42   2         } 
  43   1        else 
  44   1        { 
  45   2         RS = 1; 
  46   2        } 
  47   1        RW = 0; 
  48   1        portdata = dispdata; 
  49   1        E = 1; 
  50   1        E = 0; 
  51   1        while (lcd_busy() & BUSY); 
  52   1      } 
  53          
  54          void lcd_disp(unsigned char disp_data) 
  55          { 
C51 COMPILER V8.08   DS18B20                                                               02/25/2009 16:20:26 PAGE 2   

  56   1        static unsigned char flag = 0; 
  57   1         
  58   1        if (!flag || disp_data == 255) 
  59   1        { 
  60   2         lcd_command_writedata(COMMAND,LCD_CLEAR); 
  61   2         flag = 0; 
  62   2         if (disp_data == 255) 
  63   2         { 
  64   3          return; 
  65   3         } 
  66   2        } 
  67   1         if (flag == 16) 
  68   1         { 
  69   2          lcd_command_writedata(COMMAND,secondline); 
  70   2         } 
  71   1         lcd_command_writedata(WRITE_DATA,disp_data); 
  72   1         while (lcd_busy() & BUSY); 
  73   1         flag++; 
  74   1         if (flag >= 32)  flag = 0; 
  75   1      }
  76          
  77          void lcd_init(void) 
  78          { 
  79   1        lcd_command_writedata(COMMAND,LCD_CLEAR); 
  80   1        lcd_command_writedata(COMMAND,0x38); 
  81   1        lcd_command_writedata(COMMAND,0x0e); 
  82   1        lcd_command_writedata(COMMAND,0x06); 
  83   1      } 
  84          
  85          
  86          void ds18b20_delay(unsigned char delay_time)  /*计数一次6us,再加上函数调用和返回所花费的14us时间*/
  87           {
  88   1         while (delay_time--);
  89   1       }
  90          
  91          void delay_ms(unsigned int ms_delay_time) /*计数一次大约1ms*/
  92           {
  93   1        unsigned char i;
  94   1      
  95   1         while (ms_delay_time--)
  96   1            {
  97   2              for (i = 0; i < 120; i ++)
  98   2                 {
  99   3                  }
 100   2             }
 101   1        }
 102          
 103          bit ds18b20_rst(void)
 104           { 
 105   1         bit ack = 1;
 106   1         unsigned char loop_time = 10;
 107   1      
 108   1         while ((loop_time --) && ack)
 109   1          {
 110   2           ds18b20_delay(10);
 111   2           data_pin = 1;
 112   2           nop;
 113   2           nop;
 114   2           data_pin = 0;
 115   2           ds18b20_delay(100);
 116   2           data_pin = 1;
 117   2           ds18b20_delay(10);
C51 COMPILER V8.08   DS18B20                                                               02/25/2009 16:20:26 PAGE 3   

 118   2               ack = data_pin;
 119   2               ds18b20_delay(70);
 120   2               }
 121   1              return (ack);
 122   1        }
 123          
 124          
 125          bit ds18b20_read_bit(void)
 126           {
 127   1        bit read_bit;
 128   1      
 129   1         data_pin = 0;
 130   1         nop;
 131   1         nop;
 132   1         data_pin = 1;
 133   1         nop;
 134   1         nop;
 135   1         nop;
 136   1         nop;
 137   1         nop;
 138   1         nop;
 139   1         nop;
 140   1         nop;
 141   1         read_bit = data_pin;
 142   1         ds18b20_delay(7);
 143   1         return (read_bit);
 144   1        }
 145          
 146          unsigned char ds18b20_read_byte(void)
 147           {
 148   1         unsigned char i;
 149   1         unsigned char read_temp = 0;
 150   1      
 151   1         for (i = 8; i > 0; i --)
 152   1           {
 153   2                if(ds18b20_read_bit())
 154   2                 {
 155   3                  read_temp = read_temp >> 1;
 156   3                      read_temp = read_temp | 0x80;
 157   3                  }
 158   2                else
 159   2                  {
 160   3                      read_temp = read_temp >> 1;
 161   3                       }
 162   2                 }
 163   1               return (read_temp);
 164   1        }
 165          
 166          
 167          void ds18b20_write_bit(bit write_data)
 168           {
 169   1         if (write_data)
 170   1           { 
 171   2                 data_pin = 0;
 172   2                 nop;
 173   2                 nop;
 174   2                 data_pin = 1;
 175   2                 ds18b20_delay(10);
 176   2             }
 177   1              else 
 178   1               {
 179   2                 data_pin = 0;
C51 COMPILER V8.08   DS18B20                                                               02/25/2009 16:20:26 PAGE 4   

 180   2                 ds18b20_delay(10);
 181   2               }
 182   1         data_pin = 1;
 183   1         nop;
 184   1         nop;
 185   1        }
 186          
 187          void ds18b20_write_byte(unsigned char send_data)
 188           {
 189   1         unsigned char i;
 190   1          
 191   1         for (i = 0; i < 8; i ++)
 192   1          {
 193   2               ds18b20_write_bit((bit)((send_data >> i) & 0x01));
 194   2              }
 195   1        }
 196          
 197          unsigned int ds18b20_read_temperature(void)
 198           {
 199   1        unsigned char i;
 200   1        unsigned int temperature;
 201   1      
 202   1        zheng_fu_hao = 0;
 203   1        if (!ds18b20_rst())
 204   1         {
 205   2           ds18b20_write_byte(jmp_rom);
 206   2               ds18b20_write_byte(tmp_start);
 207   2          }
 208   1         delay_ms(1);
 209   1         if (!ds18b20_rst())
 210   1         {
 211   2           ds18b20_write_byte(jmp_rom);
 212   2               ds18b20_write_byte(tmp_ram_read);
 213   2                for (i = 0; i < 9; i ++)
 214   2                 {
 215   3                  ds18b20_read_data[i] = ds18b20_read_byte();
 216   3                 }
 217   2              }
 218   1         temperature = (ds18b20_read_data[1] << 8) + ds18b20_read_data[0];
 219   1         if ((ds18b20_read_data[1] & 0xf8) == 0xf8)
 220   1           {
 221   2                temperature = ~ temperature + 1;
 222   2                zheng_fu_hao = 1;
 223   2                }
 224   1         return (temperature);
 225   1        }
 226          
 227          void tmp_disp(void)
 228           {
 229   1          unsigned long temperature_temp;
 230   1          unsigned int tem_get;
 231   1          unsigned char a,b,c,d;
 232   1              unsigned char i;
 233   1      
 234   1          tem_get = ds18b20_read_temperature();
 235   1          temperature_temp =(unsigned long)((float)(tem_get)*(float)(0.0625)); /*温度计算*/
 236   1              lcd_command_writedata(COMMAND,LCD_CLEAR);
 237   1              /*if (!zheng_fu_hao)     判断温度正负值,判是否要显示负号
 238   1                {
 239   1                  table[11] = 0xfe;
 240   1                 }
 241   1              else 
C51 COMPILER V8.08   DS18B20                                                               02/25/2009 16:20:26 PAGE 5   

 242   1                {
 243   1                 lcd_disp(0x83,0x2d);
 244   1                 }   */
 245   1          a = temperature_temp / 100;  /*温度百位显示,为0时不显示*/
 246   1              if (a != 0x00)
 247   1                {
 248   2                  table[11] = a + 0x30;
 249   2                  }
 250   1              else table[11] = 0xfe;
 251   1          b = temperature_temp / 10 % 10; /*温度十位显示,当百位和十位同时为0时不显示*/
 252   1              if (b != 0x00)
 253   1                {
 254   2                  table[12] = b + 0x30;
 255   2                  }
 256   1              else table[12] = 0xfe;
 257   1              c = temperature_temp % 100 % 10;/*温度个位显示,无论其值为何值必须显示*/
 258   1          table[13] = c + 0x30;
 259   1              d = temperature_temp - a * 100 - b * 10 - c;
 260   1              table[15] = d + 0x30;
 261   1              for (i = 0 ; i < 32; i ++)
 262   1                { 
 263   2                 lcd_disp(table[i]);
 264   2                  }
 265   1              delay_ms(100);
 266   1              ds18b20_read_data[1] = 0;
 267   1              ds18b20_read_data[0] = 0;
 268   1              table[12] = 0x30;
 269   1              table[13] = 0x30;
 270   1              table[15] = 0x30;
 271   1      
 272   1       } 
 273          
 274          void system_init(void)
 275           {
 276   1        EA = 0;
 277   1        TH0 = 0x00;
 278   1        TL0 = 0x00;
 279   1        TMOD = 0x01;
 280   1        TF0 = 0;
 281   1        TR0 = 0;
 282   1        ET0 = 1;
 283   1        EA = 1;
 284   1         }
 285          
 286          void main(void)
 287           {
 288   1        delay_ms(10);
 289   1        lcd_init();
 290   1        system_init();
 291   1        LED = 0; 
 292   1        TR0 = 1; 
 293   1        while (1)
 294   1         {
 295   2          PCON = 0x01;
 296   2          }
 297   1        }
 298          
 299          void timer_interrupt(void) interrupt 1
 300           {
 301   1          TH0 = 0x00;
 302   1              TL0 = 0x00;
 303   1              tmp_disp();
C51 COMPILER V8.08   DS18B20                                                               02/25/2009 16:20:26 PAGE 6   

 304   1              TR0 = 0;
 305   1              TR0 = 1;
 306   1        }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    720    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     42       6
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       3
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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