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

📄 ds18b20-ds1302.lst

📁 基于ATMEL AT89S52与DALLS 18B20的应用程序
💻 LST
字号:
C51 COMPILER V6.23a  DS18B20_DS1302                                                        01/11/2004 19:02:17 PAGE 1   


C51 COMPILER V6.23a, COMPILATION OF MODULE DS18B20_DS1302
OBJECT MODULE PLACED IN DS18B20-DS1302.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE DS18B20-DS1302.C BROWSE DEBUG OBJECTEXTEND

stmt 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 P3 
  13          
  14          unsigned char data ds18b20_read_data[9];
  15          unsigned char code write_ds1302_data[3]={0x12,0x00,0x00};
  16          unsigned char data read_ds1302_data[3];
  17          
  18          bit zheng_fu_hao;
  19          sbit data_pin = P1^1;
  20          sbit RS = P2^2;
  21          sbit RW = P2^1;
  22          sbit E = P2^0;
  23          sbit CK=P1^5; 
  24          sbit IO=P1^6; 
  25          sbit DSRST=P1^7; 
  26          sbit ACC7=ACC^7; 
  27          sbit ACC0=ACC^0;
  28          
  29          unsigned char lcd_busy(void) 
  30          { 
  31   1        unsigned char temp; 
  32   1         
  33   1        portdata = 0xff; 
  34   1        RS = 0; 
  35   1        RW = 1; 
  36   1        E = 1; 
  37   1        temp = portdata; 
  38   1        E = 0; 
  39   1        return (temp); 
  40   1      } 
  41          
  42          void lcd_command_writedata(unsigned char check,unsigned char dispdata) 
  43          { 
  44   1        if (check == COMMAND) 
  45   1        { 
  46   2         RS = 0; 
  47   2         } 
  48   1        else 
  49   1        { 
  50   2         RS = 1; 
  51   2        } 
  52   1        RW = 0; 
  53   1        portdata = dispdata; 
  54   1        E = 1; 
  55   1        E = 0; 
C51 COMPILER V6.23a  DS18B20_DS1302                                                        01/11/2004 19:02:17 PAGE 2   

  56   1        while (lcd_busy() & BUSY); 
  57   1      } 
  58          
  59          void lcd_disp(unsigned char address,unsigned char disp_data) 
  60           { 
  61   1        lcd_command_writedata(COMMAND,address);
  62   1        lcd_command_writedata(WRITE_DATA,disp_data);
  63   1       } 
  64          
  65          void lcd_init(void) 
  66          { 
  67   1        lcd_command_writedata(COMMAND,LCD_CLEAR); 
  68   1        lcd_command_writedata(COMMAND,0x38); 
  69   1        lcd_command_writedata(COMMAND,0x0e); 
  70   1        lcd_command_writedata(COMMAND,0x06); 
  71   1      } 
  72          
  73          void ds1302open(void)//打开DS1302 
  74          { 
  75   1        CK=0; 
  76   1        DSRST=0; 
  77   1        DSRST=1; 
  78   1        } 
  79          
  80          void ds1302stop(void)//关闭DS1302 
  81          { 
  82   1        DSRST=0; 
  83   1        CK=1; 
  84   1        } 
  85          
  86          void ds1302write(unsigned char putin) 
  87          { 
  88   1        unsigned char i; 
  89   1        ACC=putin; 
  90   1        for (i=8;i>0;i--) 
  91   1        { 
  92   2         IO=ACC0; 
  93   2         CK=1; 
  94   2         CK=0; 
  95   2         ACC=ACC>>1; 
  96   2         } 
  97   1        } 
  98          
  99          unsigned char ds1302read (void) 
 100          { 
 101   1        unsigned char i; 
 102   1        ACC=0; 
 103   1        for (i=8;i>0;i--) 
 104   1        { 
 105   2         ACC=ACC>>1; 
 106   2         ACC7=IO; 
 107   2         CK=1; 
 108   2         CK=0; 
 109   2         } 
 110   1        return ACC; 
 111   1       } 
 112          
 113          void ds1302wt(unsigned char address,unsigned char val) //DS1302写数据 
 114          { 
 115   1        ds1302open(); 
 116   1        ds1302write(address); 
 117   1        ds1302write(val); 
C51 COMPILER V6.23a  DS18B20_DS1302                                                        01/11/2004 19:02:17 PAGE 3   

 118   1        ds1302stop(); 
 119   1        } 
 120          
 121          unsigned char ds1302rt(unsigned char address)//DS1302读数据 
 122           { 
 123   1        unsigned char tempdata; 
 124   1        ds1302open(); 
 125   1        ds1302write(address); 
 126   1        tempdata=ds1302read(); 
 127   1        ds1302stop(); 
 128   1        return tempdata; 
 129   1        } 
 130          
 131          void ds1302_write_data(void)
 132           {
 133   1        ds1302wt(0x84,write_ds1302_data[0]);
 134   1        ds1302wt(0x82,write_ds1302_data[1]);
 135   1        ds1302wt(0x80,write_ds1302_data[2]);
 136   1        }
 137          
 138          void ds1302_read_data(void)
 139           {
 140   1        read_ds1302_data[0] = ds1302rt(0x85);
 141   1        read_ds1302_data[1] = ds1302rt(0x83);
 142   1        read_ds1302_data[2] = ds1302rt(0x81);
 143   1        }
 144          
 145          void ds18b20_delay(unsigned char delay_time)  /*计数一次6us,再加上函数调用和返回所花费的14us时间*/
 146           {
 147   1         while (delay_time--);
 148   1       }
 149          
 150          void delay_ms(unsigned int ms_delay_time) /*计数一次大约1ms*/
 151           {
 152   1        unsigned char i;
 153   1      
 154   1         while (ms_delay_time--)
 155   1            {
 156   2              for (i = 0; i < 120; i ++)
 157   2                 {
 158   3                  }
 159   2             }
 160   1        }
 161          
 162          bit ds18b20_rst(void)
 163           { 
 164   1         bit ack = 1;
 165   1         unsigned char loop_time = 10;
 166   1      
 167   1         while ((loop_time --) && ack)
 168   1          {
 169   2           ds18b20_delay(10);
 170   2           data_pin = 1;
 171   2           nop;
 172   2           nop;
 173   2           data_pin = 0;
 174   2           ds18b20_delay(100);
 175   2           data_pin = 1;
 176   2           ds18b20_delay(10);
 177   2               ack = data_pin;
 178   2               ds18b20_delay(70);
 179   2               }
C51 COMPILER V6.23a  DS18B20_DS1302                                                        01/11/2004 19:02:17 PAGE 4   

 180   1              return (ack);
 181   1        }
 182          
 183          
 184          bit ds18b20_read_bit(void)
 185           {
 186   1        bit read_bit;
 187   1      
 188   1         data_pin = 0;
 189   1         nop;
 190   1         nop;
 191   1         data_pin = 1;
 192   1         nop;
 193   1         nop;
 194   1         nop;
 195   1         nop;
 196   1         nop;
 197   1         nop;
 198   1         nop;
 199   1         nop;
 200   1         read_bit = data_pin;
 201   1         ds18b20_delay(7);
 202   1         return (read_bit);
 203   1        }
 204          
 205          unsigned char ds18b20_read_byte(void)
 206           {
 207   1         unsigned char i;
 208   1         unsigned char read_temp = 0;
 209   1      
 210   1         for (i = 8; i > 0; i --)
 211   1           {
 212   2                if(ds18b20_read_bit())
 213   2                 {
 214   3                  read_temp = read_temp >> 1;
 215   3                      read_temp = read_temp | 0x80;
 216   3                  }
 217   2                else
 218   2                  {
 219   3                      read_temp = read_temp >> 1;
 220   3                       }
 221   2                 }
 222   1               return (read_temp);
 223   1        }
 224          
 225          
 226          void ds18b20_write_bit(bit write_data)
 227           {
 228   1         if (write_data)
 229   1           { 
 230   2                 data_pin = 0;
 231   2                 nop;
 232   2                 nop;
 233   2                 data_pin = 1;
 234   2                 ds18b20_delay(10);
 235   2             }
 236   1              else 
 237   1               {
 238   2                 data_pin = 0;
 239   2                 ds18b20_delay(10);
 240   2               }
 241   1         data_pin = 1;
C51 COMPILER V6.23a  DS18B20_DS1302                                                        01/11/2004 19:02:17 PAGE 5   

 242   1         nop;
 243   1         nop;
 244   1        }
 245          
 246          void ds18b20_write_byte(unsigned char send_data)
 247           {
 248   1         unsigned char i;
 249   1          
 250   1         for (i = 0; i < 8; i ++)
 251   1          {
 252   2               ds18b20_write_bit((bit)((send_data >> i) & 0x01));
 253   2              }
 254   1        }
 255          
 256          unsigned int ds18b20_read_temperature(void)
 257           {
 258   1        unsigned char i;
 259   1        unsigned int temperature;
 260   1      
 261   1        zheng_fu_hao = 0;
 262   1        if (!ds18b20_rst())
 263   1         {
 264   2           ds18b20_write_byte(jmp_rom);
 265   2               ds18b20_write_byte(tmp_start);
 266   2          }
 267   1         delay_ms(1);
 268   1         if (!ds18b20_rst())
 269   1         {
 270   2           ds18b20_write_byte(jmp_rom);
 271   2               ds18b20_write_byte(tmp_ram_read);
 272   2                for (i = 0; i < 9; i ++)
 273   2                 {
 274   3                  ds18b20_read_data[i] = ds18b20_read_byte();
 275   3                 }
 276   2              }
 277   1         temperature = (ds18b20_read_data[1] << 8) + ds18b20_read_data[0];
 278   1         if ((ds18b20_read_data[1] & 0xf8) == 0xf8)
 279   1           {
 280   2                temperature = ~ temperature + 1;
 281   2                zheng_fu_hao = 1;
 282   2                }
 283   1         return (temperature);
 284   1        }
 285          
 286          void disp_data(void)
 287           {
 288   1          unsigned long temperature_temp;
 289   1          unsigned int tem_get;
 290   1          unsigned char a,b,c,d;
 291   1      
 292   1          tem_get = ds18b20_read_temperature();
 293   1          temperature_temp =(unsigned long)((float)(tem_get)*(float)(0.0625)); /*温度计算*/
 294   1              lcd_command_writedata(COMMAND,LCD_CLEAR);
 295   1              if (!zheng_fu_hao)     /*判断温度正负值,判是否要显示负号*/
 296   1                {
 297   2                  lcd_disp(0x83,0xfe);
 298   2                 }
 299   1              else 
 300   1                {
 301   2                 lcd_disp(0x83,0x2d);
 302   2                 } 
 303   1        
C51 COMPILER V6.23a  DS18B20_DS1302                                                        01/11/2004 19:02:17 PAGE 6   

 304   1          a = temperature_temp / 100;  /*温度百位显示,为0时不显示*/
 305   1              if (a == 0x00)
 306   1                {
 307   2                  lcd_disp(0x84,0xfe);
 308   2                  }
 309   1              else
 310   1                {
 311   2             lcd_disp(0x84,a + 0x30);
 312   2                  }
 313   1      
 314   1          b = temperature_temp / 10 % 10; /*温度十位显示,当百位和十位同时为0时不显示*/
 315   1              if (a == 0x00 && b == 0x00)
 316   1                {
 317   2                  lcd_disp(0x85,0xfe);
 318   2                  }
 319   1              else
 320   1                {
 321   2             lcd_disp(0x85,b + 0x30);
 322   2                  }
 323   1              c = temperature_temp % 100 % 10;/*温度个位显示,无论其值为何值必须显示*/
 324   1          lcd_disp(0x86,c + 0x30);
 325   1              lcd_disp(0x87,0x2e);
 326   1      
 327   1              d = temperature_temp - a * 100 - b * 10 - c; /*温度小数位显示*/
 328   1              lcd_disp(0x88,d + 0x30); /*时钟显示*/
 329   1              lcd_disp(0x89,0xdf);
 330   1              lcd_disp(0x8a,0x43);
 331   1          ds1302_read_data();
 332   1              lcd_disp(0xc4,(read_ds1302_data[0] >> 4 & 0x0f) + 0x30);
 333   1              lcd_disp(0xc5,(read_ds1302_data[0]  & 0x0f) + 0x30);
 334   1          lcd_disp(0xc6,0x3a);
 335   1              lcd_disp(0xc7,(read_ds1302_data[1] >> 4 & 0x0f) + 0x30);
 336   1              lcd_disp(0xc8,(read_ds1302_data[1]  & 0x0f) + 0x30);
 337   1          lcd_disp(0xc9,0x3a);
 338   1              lcd_disp(0xca,(read_ds1302_data[2] >> 4 & 0x0f) + 0x30);
 339   1              lcd_disp(0xcb,(read_ds1302_data[2]  & 0x0f) + 0x30);
 340   1              lcd_disp(0xcf,0xfe);
 341   1        }
 342          void main(void)
 343           {
 344   1        delay_ms(10);
 345   1        lcd_init();
 346   1        ds1302_write_data();
 347   1        while (1)
 348   1        {
 349   2         disp_data();
 350   2         }
 351   1       }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    830    ----
   CONSTANT SIZE    =      3    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     12       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 + -