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

📄 18b20_gai.lst

📁 基于ATMEL AT89S52与DALLS 18B20的应用程序
💻 LST
字号:
C51 COMPILER V8.08   18B20_GAI                                                             02/24/2009 10:08:59 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE 18B20_GAI
OBJECT MODULE PLACED IN 18B20_GAI.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE 18B20_GAI.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        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 disp_data) 
  54          { 
  55   1        static unsigned char flag = 0; 
C51 COMPILER V8.08   18B20_GAI                                                             02/24/2009 10:08:59 PAGE 2   

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

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

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

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

 304   1              TR0 = 1;
 305   1        }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    752    ----
   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 + -