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

📄 ds18b20.lst

📁 用DS18B20,做了一个加温水龙头程序
💻 LST
字号:
C51 COMPILER V8.02   DS18B20                                                               09/08/2008 19:38:14 PAGE 1   


C51 COMPILER V8.02, 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          * 名称: ds18b20温度显示
   3          * 说明: 
   4          * 功能: 把ds1820检测到温度显示到数码管上
   5          * 作者: 李存定 
   6          * 时间: 2008年4月15日
   7          * 版本: 0.1
   8          ***********************************************************************/
   9          //===================声明区===========================================
  10          #include<ds18b20.h>
  11          #define uchar unsigned char
  12          #define uint  unsigned int
  13          uint wd;
  14          /******************************************************************** 
  15          * 名称: 延时程序
  16          * 说明: 对于11.0592M时钟,约延时1ms 
  17          * 功能: 延时1ms 
  18          * 调用: 
  19          * 输入: Z
  20          * 返回值: 无
  21          ***********************************************************************/
  22          void delay(uint z)//延时程序
  23          {
  24   1              uint x,y;
  25   1              for(x=z;x>0;x--)
  26   1                      for(y=110;y>0;y--);
  27   1      }
  28          
  29          /******************************************************************** 
  30          * 名称: 初始化DS18B20程序
  31          * 说明: 产生复位脉冲 
  32          * 功能:  
  33          * 调用: 
  34          * 输入: 无
  35          * 返回值: 无
  36          ***********************************************************************/
  37          void ds1820_Reset(void)
  38          {
  39   1              uint i;  
  40   1              DQ = 0;
  41   1              i = 100;
  42   1              while (i>0)     i--;    //拉低约900us   
  43   1              
  44   1              DQ = 1;                         // 产生上升沿
  45   1              i = 4;
  46   1              while (i>0)     i--;
  47   1      }
  48          /******************************************************************** 
  49          * 名称: 等待应答脉冲
  50          * 说明: 
  51          * 功能: 
  52          * 调用: 
  53          * 输入: 无
  54          * 返回值: 无
  55          ***********************************************************************/
C51 COMPILER V8.02   DS18B20                                                               09/08/2008 19:38:14 PAGE 2   

  56          void RxWait(void)
  57          {
  58   1              uint i;
  59   1              while(DQ);
  60   1              while(~DQ);                     // 检测到应答脉冲 
  61   1              i = 4;
  62   1              while (i>0)     i--;
  63   1      }
  64          /******************************************************************** 
  65          * 名称: 读取数据的一位
  66          * 说明: 满足读时隙要求
  67          * 功能: DS18B20输出数据
  68          * 调用: 
  69          * 输入: 无
  70          * 返回值: b
  71          ***********************************************************************/
  72          bit RdBit(void)
  73          {
  74   1              uint i;
  75   1              bit b;
  76   1              DQ = 0;
  77   1              i++;
  78   1              DQ = 1;//读之前一定要拉高。设定是空闲
  79   1              i++;i++;// 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
  80   1              b = DQ;
  81   1              i = 8;
  82   1              while(i>0) i--;
  83   1              return (b);
  84   1      }
  85          /******************************************************************** 
  86          * 名称: 读取数据的一个字节
  87          * 说明: 满足读时隙要求
  88          * 功能: DS18B20读取的一个字节数据
  89          * 调用: bit RdBit(void)
  90          * 输入: 无
  91          * 返回值: b
  92          ***********************************************************************/
  93          uchar RdByte(void)
  94          {
  95   1              uchar i,j,b;
  96   1              b = 0;
  97   1              for (i=1;i<=8;i++)
  98   1              {
  99   2                      j = RdBit();
 100   2                      b = (j<<7)|(b>>1);//重点弄清楚
 101   2              }
 102   1              return(b);
 103   1      }
 104          
 105          /******************************************************************** 
 106          * 名称: 写数据的一个字节
 107          * 说明: 满足写1和写0的时隙要求
 108          * 功能: 写一个字节数据
 109          * 调用: bit RdBit(void)
 110          * 输入: 
 111          * 返回值:
 112          ***********************************************************************/
 113          void WrByte(uchar b)
 114          {
 115   1              uint i;
 116   1              uchar j;
 117   1              bit btmp;
C51 COMPILER V8.02   DS18B20                                                               09/08/2008 19:38:14 PAGE 3   

 118   1              for(j=1;j<=8;j++)
 119   1              {
 120   2                      btmp = b&0x01;
 121   2                      b = b>>1;               // 取下一位(由低位向高位)
 122   2                      if (btmp)
 123   2                      {
 124   3                              /* 写1 */
 125   3                              DQ = 0;
 126   3                              i++;i++;        // 延时,使得15us以内拉高
 127   3                              DQ = 1;
 128   3                              i = 8;
 129   3                              while(i>0) i--; // 整个写1时隙不低于60us 
 130   3                      }
 131   2                      else
 132   2                      {
 133   3                              /* 写0 */
 134   3                              DQ = 0;                 
 135   3                              i = 8;
 136   3                              while(i>0) i--; // 保持低在60us到120us之间
 137   3                              DQ = 1;
 138   3                              i++;
 139   3                              i++;
 140   3                      }
 141   2              }
 142   1      }
 143          /******************************************************************** 
 144          * 名称: 启动温度转换
 145          * 说明: 
 146          * 功能:
 147          * 调用: ds1820_Reset(void),RxWait();WrByte();
 148          * 输入: 0xcc:跳过ROM只对单一元件有效,0x44:开始温度转换
 149          * 返回值:
 150          ***********************************************************************/
 151          void convert(void)
 152          {
 153   1              ds1820_Reset();         // 产生复位脉冲,初始化DS18B20
 154   1              RxWait();                       // 等待DS18B20给出应答脉冲
 155   1              delay(1);                       // 延时
 156   1              WrByte(0xcc);           // 跳过ROM命令
 157   1              WrByte(0x44);           // 开始温度转换命令
 158   1      }
 159          /******************************************************************** 
 160          * 名称: 读取温度值
 161          * 说明: 
 162          * 功能:
 163          * 调用: WrByte();RdByte();
 164          * 输入: 0xcc:跳过ROM只对单一元件有效,0xbe:读暂存器
 165          * 返回值:
 166          ***********************************************************************/
 167          uint RdTemp()
 168          {       float tt;
 169   1              uint temp;
 170   1              ds1820_Reset();         // 产生复位脉冲,初始化DS18B20 
 171   1              RxWait();                       // 等待DS18B20给出应答脉冲
 172   1              delay(1);                       // 延时
 173   1              WrByte(0xcc);           // skip rom 命令
 174   1              WrByte(0xbe);           // 读温度转化好的数据命令
 175   1              tplsb = RdByte();       // 温度值低位字节(其中低4位为二进制的"小数"部分
 176   1              tpmsb = RdByte();       // 高位值高位字节(其中高5位为符号位)
 177   1                              
 178   1              temp=tpmsb;
 179   1              temp=temp<<8;//temp是16位的数。
C51 COMPILER V8.02   DS18B20                                                               09/08/2008 19:38:14 PAGE 4   

 180   1              temp=temp|tplsb;//两字节合成一个整型变量。
 181   1              tt=temp*0.0625;//得到真实十进制温度值,因为DS18B20
 182   1      
 183   1                       //可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度。
 184   1      
 185   1           return temp;     //返回温度值
 186   1      
 187   1      }
 188          
 189          
 190          
 191          
 192          
 193          
 194          void main(void)
 195          {       
 196   1              while(1)
 197   1              {       
 198   2                      delay(1);       // 延时1ms
 199   2                      convert();      // 启动温度转换,12位需要750ms
 200   2                      delay(10);      // 延时1s
 201   2                      wd=RdTemp();
 202   2                      if(wd<=25)
 203   2                      {
 204   3                              G=1;
 205   3                      
 206   3                      }
 207   2                      else if(25<wd<=35)
 208   2                      {
 209   3                      
 210   3                       L=1;
 211   3                      
 212   3                      }
 213   2                      else if(35<wd<=45)
 214   2                      {
 215   3                      
 216   3                              R=1;
 217   3                      
 218   3                      
 219   3                      }
 220   2                      else if(wd>45)
 221   2                      {
 222   3                         R=1;
 223   3                         delay(10);
 224   3                         R=0;
 225   3                         delay(10);
 226   3                      
 227   3                      
 228   3                      }
 229   2      
 230   2                      
 231   2                              
 232   2                      
 233   2              }
 234   1              
 235   1              
 236   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    426    ----
   CONSTANT SIZE    =   ----    ----
C51 COMPILER V8.02   DS18B20                                                               09/08/2008 19:38:14 PAGE 5   

   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      4       6
   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 + -