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

📄 ds18b20.lst

📁 自己用51单片机做得温度控制系统
💻 LST
字号:
C51 COMPILER V8.15   DS18B20                                                               02/21/2009 14:51:24 PAGE 1   


C51 COMPILER V8.15, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN DS18B20.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DS18B20.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*****************************************/
   2          /* Copyright (c) 2009, 电子信息工程学院  */
   3          /* All rights reserved.                  */
   4          /* 作    者:王明兴                                              */
   5          /*****************************************/
   6          
   7          #include "DS18B20.h"
   8          
   9          extern uchar tplsb,tpmsb;               // 温度值低位、高位字节
  10          
  11          
  12          /* 延时t毫秒 */
  13          void delay(uint t)
  14          {
  15   1              uint i;
  16   1              while(t--)
  17   1              {
  18   2                      /* 对于11.0592M时钟,约延时1ms */
  19   2                      for (i=0;i<125;i++)
  20   2                      {}
  21   2              }
  22   1      } 
  23          
  24          /* 产生复位脉冲初始化DS18B20 */
  25          void TxReset(void)
  26          {
  27   1              uint i;
  28   1              DQ = 0;
  29   1      
  30   1              /* 拉低约900us */
  31   1              i = 100;
  32   1              while (i>0)     i--;    
  33   1              
  34   1              DQ = 1;                         // 产生上升沿
  35   1              i = 4;
  36   1              while (i>0)     i--;
  37   1      }
  38          
  39          /* 等待应答脉冲 */
  40          void RxWait(void)
  41          {
  42   1              uint i;
  43   1              while(DQ);
  44   1              while(~DQ);                     // 检测到应答脉冲 
  45   1              i = 4;
  46   1              while (i>0)     i--;
  47   1      }
  48          
  49          /* 读取数据的一位,满足读时隙要求 */ 
  50          bit RdBit(void)
  51          {
  52   1              uint i;
  53   1              bit b;
  54   1              DQ = 0;
  55   1              i++;
C51 COMPILER V8.15   DS18B20                                                               02/21/2009 14:51:24 PAGE 2   

  56   1              DQ = 1;
  57   1              i++;i++;                        // 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
  58   1              b = DQ;
  59   1              i = 8;
  60   1              while(i>0) i--;
  61   1              return (b);
  62   1      }
  63          
  64          /* 读取数据的一个字节 */
  65          uchar RdByte(void)
  66          {
  67   1              uchar i,j,b;
  68   1              b = 0;
  69   1              for (i=1;i<=8;i++)
  70   1              {
  71   2                      j = RdBit();
  72   2                      b = (j<<7)|(b>>1);
  73   2              }
  74   1              return(b);
  75   1      }
  76          
  77          /* 写数据的一个字节,满足写1和写0的时隙要求 */
  78          void WrByte(uchar b)
  79          {
  80   1              uint i;
  81   1              uchar j;
  82   1              bit btmp;
  83   1              for(j=1;j<=8;j++)
  84   1              {
  85   2                      btmp = b&0x01;
  86   2                      b = b>>1;               // 取下一位(由低位向高位)
  87   2                      if (btmp)
  88   2                      {
  89   3                              /* 写1 */
  90   3                              DQ = 0;
  91   3                              i++;i++;        // 延时,使得15us以内拉高
  92   3                              DQ = 1;
  93   3                              i = 8;
  94   3                              while(i>0) i--; // 整个写1时隙不低于60us 
  95   3                      }
  96   2                      else
  97   2                      {
  98   3                              /* 写0 */
  99   3                              DQ = 0;                 
 100   3                              i = 8;
 101   3                              while(i>0) i--; // 保持低在60us到120us之间
 102   3                              DQ = 1;
 103   3                              i++;
 104   3                              i++;
 105   3                      }
 106   2              }
 107   1      }
 108          
 109          /* 启动温度转换 */
 110          void convert(void)
 111          {
 112   1              EA = 0;
 113   1              TxReset();                      // 产生复位脉冲,初始化DS18B20
 114   1              RxWait();                       // 等待DS18B20给出应答脉冲
 115   1              delay(1);                       // 延时
 116   1              WrByte(0xcc);           // skip rom 命令
 117   1              WrByte(0x44);           // convert T 命令
C51 COMPILER V8.15   DS18B20                                                               02/21/2009 14:51:24 PAGE 3   

 118   1              EA = 1;
 119   1      }
 120          
 121          /* 读取温度值 */
 122          void RdTemp(void)
 123          {
 124   1              EA = 0;
 125   1              TxReset();                      // 产生复位脉冲,初始化DS18B20 
 126   1              RxWait();                       // 等待DS18B20给出应答脉冲
 127   1              delay(1);                       // 延时
 128   1              WrByte(0xcc);           // skip rom 命令
 129   1              WrByte(0xbe);           // read scratchpad 命令
 130   1              tplsb = RdByte();       // 温度值低位字节(其中低4位为二进制的“小数”部分)
 131   1              tpmsb = RdByte();       // 高位值高位字节(其中高5位为符号位)
 132   1              EA = 1;         
 133   1      }
 134          
 135          /* 主程序,读取的温度值最终存放在tplsb和tpmsb变量中。
 136             tplsb其中低4位为二进制的“小数”部分;tpmsb其中高
 137             5位为符号位。真正通过数码管输出时,需要进行到十进
 138             制有符号实数(包括小数部分)的转换。              
 139          void main(void)
 140          {
 141                  do
 142                  {       
 143                          delay(1);               // 延时1ms
 144                          convert();              // 启动温度转换,需要750ms
 145                          delay(1000);    // 延时1s
 146                          RdTemp();               // 读取温度                     
 147                  }
 148                  while(1);
 149          }
 150          */
 151          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    269    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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