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

📄 18b20.lst

📁 一个集合DS18B20的多路温度测量系统,加上adc0809数据采集,加上1602液晶显示的综合数据处理系统,有较高学习价值.
💻 LST
字号:
C51 COMPILER V8.02   18B20                                                                 01/17/2007 01:12:44 PAGE 1   


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

line level    source

   1          #include "system.h"
   2          #include <INTRINS.H>                              //为调用nop空指令需要
   3          
   4          
   5          sbit DQ    =    P3^7;                                              //温度输入口
   6          unsigned char c_b;
   7          unsigned char c_b_c;
   8          unsigned char n;
   9          
  10          unsigned char data temp_data[2] = {0x00,0x00};                  //读出温度暂放
  11          
  12          /****************************延时函数*******************************/
  13          void delay(unsigned int t)
  14          {
  15   1              for(;t > 0; t--);
  16   1      }
  17          
  18          
  19          /****************************DS18B20复位函数*******************************/
  20          void ow_reset(void)
  21          {
  22   1              char presence = 1;
  23   1              while (presence)
  24   1              {
  25   2                      while (presence)
  26   2                      {
  27   3                              DQ = 1;
  28   3      
  29   3                              _nop_();
  30   3                              _nop_();
  31   3      
  32   3                              DQ = 0;
  33   3                              delay(50);
  34   3      
  35   3                              DQ = 1;
  36   3                              delay(6);
  37   3      
  38   3                              presence = DQ;
  39   3                      }
  40   2                      delay (45);
  41   2                      presence = ~DQ;
  42   2              }
  43   1              DQ  = 1;
  44   1      }
  45          
  46          
  47          
  48          
  49          /****************************DS18B20写命令函数*******************************/
  50          //向1-wire    总线上写一个字节
  51          void write_byte(unsigned char val)
  52          {
  53   1              unsigned char i;
  54   1              for(i = 8; i > 0; i--)
  55   1              {
C51 COMPILER V8.02   18B20                                                                 01/17/2007 01:12:44 PAGE 2   

  56   2                      DQ = 1;
  57   2                      _nop_();
  58   2                      _nop_();
  59   2                      
  60   2                      DQ = 0;                                                                                          //延时5us
  61   2                      _nop_();
  62   2                      _nop_();
  63   2                      _nop_();
  64   2                      _nop_();
  65   2                      _nop_();
  66   2                      
  67   2                      DQ = val & 0x01;                                                                        //最低位益出
  68   2                      delay(6);                                                                                       //66us
  69   2                      val = val / 2;                                                                          //右移一位
  70   2              }
  71   1              DQ = 1;
  72   1              delay(1);
  73   1      }
  74          
  75          
  76          /****************************DS18B20读字节函数*******************************/
  77          unsigned char read_byte(void)
  78          {
  79   1              unsigned char i;
  80   1              unsigned char value = 0;
  81   1              
  82   1              for(i = 8; i > 0; i--)
  83   1              {
  84   2                      DQ = 1;;
  85   2                      _nop_();
  86   2                      _nop_();
  87   2      
  88   2                      value >>= 1;
  89   2                      DQ = 0;                                           //4us
  90   2                      _nop_();
  91   2                      _nop_();
  92   2                      _nop_();
  93   2                      _nop_();
  94   2                      
  95   2                      DQ = 1;                                          //4us
  96   2                      _nop_();
  97   2                      _nop_();
  98   2                      _nop_();
  99   2                      _nop_();
 100   2                      
 101   2                      if(DQ)
 102   2                      value |= 0x80;
 103   2                      delay(6);                                        //66us
 104   2              }
 105   1              DQ = 1;
 106   1              return (value);
 107   1      }
 108          
 109          
 110          /***************************读出温度函数******************************/
 111          void read_temp()
 112          {
 113   1              
 114   1              ow_reset();                                                                               //总线复位
 115   1              write_byte(0xCC);                                                                 //发SKIP ROM命令
 116   1              write_byte(0xBE);                                                                 //发读命令
 117   1              temp_data[0] = read_byte();                                               //温度低8位
C51 COMPILER V8.02   18B20                                                                 01/17/2007 01:12:44 PAGE 3   

 118   1              temp_data[1] = read_byte();                                               //温度高8位
 119   1              
 120   1              n = temp_data[1];                                                                         //若n为1则为负温                      
 121   1              if(n)                                                           
 122   1              {                                                               
 123   2                      temp = (~temp_data[0]+1)/2;     //如果为负温则去除其补码        
 124   2              }                                                               
 125   1              else                                                    
 126   1              {                                                               
 127   2                      temp = (temp_data[0])/2;                        
 128   2              }
 129   1      
 130   1              ow_reset();                                                                               
 131   1              write_byte(0xCC);                                                                 
 132   1              write_byte(0x44);                                                                 //SKIP ROM
 133   1                                                                                                                //发转换命令
 134   1      }                                                                                                         
 135          
 136          
 137          
 138          
 139          
 140          
 141          
 142          
 143          
 144          
 145          /***************************温度数据处理函数******************************/
 146          void work_temp()
 147          {                                                       
 148   1              if(temp_data[1] > 127)//负温度处理函数
 149   1              {
 150   2                      temp_data[1] = (256-temp_data[1]);                              //负温度求补码
 151   2                      temp_data[3] = (256-temp_data[0]);                      //负温度求补码
 152   2                      display[3]   = temp_data[3] & 0x0f;
 153   2      
 154   2                      display[4] = ((temp_data[0] & 0xf0 >> 4) | (temp_data[1] & 0x0f) << 4);      //取出整数
 155   2                      if(display[4] < 10 & display[4] >= 0)
 156   2                      {
 157   3                              display[1] = display[4]/1;
 158   3                              display[2] = display[3]%10;
 159   3                              c_b_c = 1;
 160   3                              n = 1;
 161   3                      }
 162   2                      else
 163   2                      {
 164   3                              display[1] = display[4]/10;
 165   3                              display[2] = display[4]%10;
 166   3                              n = 1;
 167   3                      }               
 168   2              }
 169   1              else
 170   1              {
 171   2                      display[4] = ((temp_data[0] & 0xf0 >> 4) | (temp_data[1] & 0x0f) << 4); //取出整数
 172   2                      if(display[4] < 10 & display[4] >= 0)
 173   2                      {
 174   3                              display[0] = display[4]/1;
 175   3                              
 176   3                              //小数位
 177   3                              display[1] = display[3]/10;
 178   3                              display[2] = display[3]%10;
 179   3                              c_b = 1;
C51 COMPILER V8.02   18B20                                                                 01/17/2007 01:12:44 PAGE 4   

 180   3                      }
 181   2                      else
 182   2                      {
 183   3                              display[0] = display[4]/10;
 184   3                              display[1] = display[4]%10;
 185   3      
 186   3                              //小数位
 187   3                              display[2] = display[3]/10;
 188   3                              c_b_c = 1;
 189   3                      }
 190   2              }
 191   1      } 


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