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

📄 ds18b20温度计.lst

📁 DS18B20原理图及资料
💻 LST
字号:
C51 COMPILER V7.10   DS18B20温度计                                                         07/14/2008 16:08:41 PAGE 1   


C51 COMPILER V7.10, COMPILATION OF MODULE DS18B20温度计
OBJECT MODULE PLACED IN DS18B20温度计.OBJ
COMPILER INVOKED BY: C:\Keil\C51\Bin\c51.exe DS18B20温度计.C DB SB OE ROM(LARGE) SMALL OT(6,SPEED) WL(2) RB(0)

line level    source

   1          //DS18B20温度计
   2          #include "reg51.h"
   3          #include "intrins.h"
   4          #define Disdata P1
   5          #define discan  P3
   6          #define uchar unsigned char
   7          #define uint unsigned int
   8          sbit DQ=P3^7;
   9          sbit DIN=P1^7;
  10          uint h;
  11          //温度小数部分查表
  12          uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
  13          uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
  14          uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7};
  15          uchar data temp_data[2]={0x00,0x00};
  16          uchar data display[5]={0x00,0x00,0x00,0x00,0x00};
  17          //11US延时函数
  18          void delay(uint t)
  19          {
  20   1      for(;t>0;t--);
  21   1      }
  22          //显示扫描函数
  23          scan()
  24          {
  25   1      char k;
  26   1        for(k=0;k<4;k++)
  27   1          {
  28   2            Disdata=dis_7[display[k]];
  29   2            if(k==1){DIN=0;}
  30   2            discan=scan_con[k];
  31   2                delay(90);
  32   2                discan=0xff;
  33   2          }
  34   1      }
  35          //DS18B20复位函数
  36          ow_reset(void)
  37          {
  38   1      char presence=1;
  39   1      while(presence)
  40   1        {
  41   2         while(presence)
  42   2          {
  43   3            DQ=1;_nop_();_nop_();
  44   3            DQ=0;
  45   3            delay(50);
  46   3            DQ=1;
  47   3            delay(6);
  48   3            presence=DQ;
  49   3          }
  50   2         delay(45);
  51   2         presence=~DQ;
  52   2        }
  53   1      DQ=1;
  54   1      }
  55          //DS18B20写命令函数
C51 COMPILER V7.10   DS18B20温度计                                                         07/14/2008 16:08:41 PAGE 2   

  56          void write_byte(uchar val)
  57          {
  58   1       uchar i;
  59   1       for(i=8;i>0;i--)
  60   1        {
  61   2         DQ=1;_nop_();_nop_();
  62   2         DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();
  63   2         DQ=val&0x01;
  64   2         delay(6);
  65   2         val=val/2;
  66   2        }
  67   1      DQ=1;
  68   1      delay(1);
  69   1      }
  70          //DS18B20读1字节函数
  71          uchar read_byte(void)
  72          {
  73   1       uchar i;
  74   1       uchar value=0;
  75   1       for(i=8;i>0;i--)
  76   1        {
  77   2          DQ=1;_nop_();_nop_();
  78   2          value>>=1;
  79   2          DQ=0;
  80   2          _nop_();_nop_();_nop_();_nop_();
  81   2          DQ=1;_nop_();_nop_();_nop_();_nop_();
  82   2          if(DQ)value|=0x80;
  83   2          delay(6);
  84   2        }
  85   1      DQ=1;
  86   1      return(value);
  87   1      }
  88          //
  89          read_temp()
  90          {
  91   1      ow_reset();
  92   1      write_byte(0xcc);
  93   1      write_byte(0xbe);
  94   1      temp_data[0]=read_byte();
  95   1      temp_data[1]=read_byte();
  96   1      ow_reset();
  97   1      write_byte(0xcc);
  98   1      write_byte(0x44);
  99   1      }
 100          //温度数据处理函数
 101          work_temp()
 102          {
 103   1       uchar n=0;
 104   1      if(temp_data[1]>127)
 105   1        {temp_data[1]=(256-temp_data[1]);
 106   2      temp_data[0]=(256-temp_data[0]);n=1;}
 107   1      display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]];
 108   1      display[4]=((temp_data[0]&0xf0) >> 4)|((temp_data[1]&0x0f)<<4);
 109   1      display[3]=display[4] / 100;
 110   1      display[1]=display[4] % 100;
 111   1      display[2]=display[1] / 10;
 112   1      display[1]=display[1] % 10;
 113   1      if(!display[3]){display[3]=0x0a;if(!display[2]){display[2]=0x0a;}}
 114   1      if(n){display[3]=0x0b;}
 115   1      }
 116          //主函数
 117          main()
C51 COMPILER V7.10   DS18B20温度计                                                         07/14/2008 16:08:41 PAGE 3   

 118          {
 119   1      Disdata=0xff;
 120   1      discan=0xff;
 121   1      for(h=0;h<4;h++){display[h]=8;}
 122   1      ow_reset();
 123   1      write_byte(0xcc);
 124   1      write_byte(0x44);
 125   1      for(h=0;h<500;h++)
 126   1        {scan();}
 127   1      while(1)
 128   1        {
 129   2         read_temp();
 130   2         work_temp();
 131   2         for(h=0;h<500;h++)
 132   2        {scan();}
 133   2         }
 134   1      }
 135          //结束
C51 COMPILER V7.10   DS18B20温度计                                                         07/14/2008 16:08:41 PAGE 4   

NAME                                    CLASS   MSPACE  TYPE    OFFSET  SIZE
====                                    =====   ======  ====    ======  ====


P1 . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0090H  1
P3 . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00B0H  1
ditab. . . . . . . . . . . . . . . . .  PUBLIC   CODE   ARRAY    0000H  16
DQ . . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      00B7H  1
_write_byte. . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  val. . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0005H  1
  i. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0003H  1
main . . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
scan . . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  k. . . . . . . . . . . . . . . . . .  * REG *  DATA   CHAR     0005H  1
read_byte. . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  i. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0004H  1
  value. . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0005H  1
temp_data. . . . . . . . . . . . . . .  PUBLIC   DATA   ARRAY    0000H  2
read_temp. . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
scan_con . . . . . . . . . . . . . . .  PUBLIC   CODE   ARRAY    001CH  4
dis_7. . . . . . . . . . . . . . . . .  PUBLIC   CODE   ARRAY    0010H  12
DIN. . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      0097H  1
work_temp. . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  n. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0007H  1
h. . . . . . . . . . . . . . . . . . .  PUBLIC   DATA   U_INT    0002H  2
ow_reset . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  presence . . . . . . . . . . . . . .  * REG *  DATA   CHAR     0005H  1
_delay . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  t. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_INT    0006H  2
display. . . . . . . . . . . . . . . .  PUBLIC   DATA   ARRAY    0004H  5


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    459    ----
   CONSTANT SIZE    =     32    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      9    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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