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

📄 1602_ds18b20.lst

📁 基于ATMEL AT89S52与DALLS 18B20的应用程序
💻 LST
字号:
C51 COMPILER V8.08   1602_DS18B20                                                          02/25/2009 14:25:04 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE 1602_DS18B20
OBJECT MODULE PLACED IN 1602_ds18b20.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE 1602_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          
  14          unsigned char data ds18b20_read_data[9];
  15          unsigned char code table[17] = "designed by hwb ";
  16          bit zheng_fu_hao;
  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          
  23          unsigned char lcd_busy(void) 
  24          { 
  25   1        unsigned char temp; 
  26   1         
  27   1        portdata = 0xff; 
  28   1        RS = 0; 
  29   1        RW = 1; 
  30   1        E = 1; 
  31   1        temp = portdata; 
  32   1        E = 0; 
  33   1        return (temp); 
  34   1      } 
  35          
  36          void lcd_command_writedata(unsigned char check,unsigned char dispdata) 
  37          { 
  38   1        if (check == COMMAND) 
  39   1        { 
  40   2         RS = 0; 
  41   2         } 
  42   1        else 
  43   1        { 
  44   2         RS = 1; 
  45   2        } 
  46   1        RW = 0; 
  47   1        portdata = dispdata; 
  48   1        E = 1; 
  49   1        E = 0; 
  50   1        while (lcd_busy() & BUSY); 
  51   1      } 
  52          
  53          void lcd_disp(unsigned char address,unsigned char disp_data) 
  54           { 
  55   1        lcd_command_writedata(COMMAND,address);
C51 COMPILER V8.08   1602_DS18B20                                                          02/25/2009 14:25:04 PAGE 2   

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

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

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

 242   1                {
 243   2             lcd_disp(0x85,b + 0x30);
 244   2                  }
 245   1              c = temperature_temp % 100 % 10;/*温度个位显示,无论其值为何值必须显示*/
 246   1          lcd_disp(0x86,c + 0x30);
 247   1              lcd_disp(0x87,0x2e);
 248   1              d = temperature_temp - a * 100 - b * 10 - c;
 249   1              lcd_disp(0x88,d + 0x30);
 250   1              lcd_disp(0x89,0xdf);
 251   1              lcd_disp(0x8a,0x43);
 252   1               for (i = 0; i < 17;i ++)
 253   1                {
 254   2                 lcd_disp(0xc0 + i,table[i]);
 255   2                  }
 256   1              delay_ms(50);
 257   1              ds18b20_read_data[1] = 0;
 258   1              ds18b20_read_data[0] = 0;
 259   1       } 
 260          void system_init(void)
 261           {
 262   1        EA = 0;
 263   1        TH0 = 0x00;
 264   1        TL0 = 0x00;
 265   1        TMOD = 0x01;
 266   1        TF0 = 0;
 267   1        TR0 = 0;
 268   1        ET0 = 1;
 269   1        EA = 1;
 270   1         }
 271          void main(void)
 272           {
 273   1        delay_ms(10);
 274   1        lcd_init();
 275   1        system_init();
 276   1        LED = 0; 
 277   1        TR0 = 1; 
 278   1        while (1)
 279   1         {
 280   2          PCON = 0x01;
 281   2          }
 282   1        }
 283          void timer_interrupt(void) interrupt 1
 284           {
 285   1          TH0 = 0x00;
 286   1              TL0 = 0x00;
 287   1              tmp_disp();
 288   1              TR0 = 0;
 289   1              TR0 = 1;
 290   1        }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    736    ----
   CONSTANT SIZE    =     17    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      9       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 + -