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

📄 ds18b20.lst

📁 DS18B20多点测温
💻 LST
字号:
C51 COMPILER V8.02   DS18B20                                                               04/15/2009 18:08:19 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          #include<C8051F020.h>
   2          #include<intrins.h>
   3          
   4          #define uchar unsigned char
   5          #define uint unsigned int
   6          
   7          /*DS18B20功能命令*/
   8          #define SEARCH_ROM                      0xf0    //搜索ROM
   9          #define READ_ROM                        0x33    //读DS18B20序列号
  10          #define MATCH_ROM                       0x55    //匹配ROM
  11          #define SKIP_ROM                        0xcc    //跳过读序列号的操作
  12          #define ALARM_SEARCH            0xec    //报警搜索
  13          #define CONVERT_T                       0x44    //启动温度转换
  14          #define WRITE_SCRATCHPAD        0x4e    //可写暂存器,即高温,低温触发器
  15          #define READ_SCRATCHPAD     0xbe        //读取温度寄存器
  16          #define READ_POWER_SUPPLY       0xb4    //读供电方式,0为寄生方式,1为外部电源
  17          #define COPY_SCRATCHPAD         0x48    //拷贝存储器
  18          
  19          sbit DQ =P0^0;                                          //模拟1_Wire总线DQ
  20          
  21          uchar High_limit=30;                                    //代表初始上限30
  22          uchar Low_limit =10;                                    //代表初始下限27
  23          
  24          /*--------------------------------------------------------------------------------
  25                  函数名称:void Wire_delay(uint T_us);
  26                  函数功能:初始化DS18B20; 
  27          ---------------------------------------------------------------------------------*/
  28          void Wire_delay(uint T_us)                       //延时T_us,us
  29          {
  30   1              while(T_us)
  31   1              {
  32   2                      _nop_();_nop_(); 
  33   2                              _nop_();_nop_();_nop_();
  34   2                                      _nop_();_nop_();_nop_();
  35   2              //                              _nop_();_nop_();_nop_();
  36   2              //                                      _nop_();_nop_();_nop_();
  37   2              //                                              _nop_();_nop_();_nop_();
  38   2                      --T_us;
  39   2              }
  40   1      }
  41          
  42          /*--------------------------------------------------------------------------------
  43                  函数名称:void Reset_DS18B20( );
  44                  函数功能:复位DS18B20; 调试好
  45          ---------------------------------------------------------------------------------*/
  46          bit Reset_DS18B20( )                            //初始化函数
  47          {
  48   1          uchar Reset_flag=1,i;
  49   1          bit Judge=1;
  50   1      
  51   1              DQ=0;                                                   //上拉电阻拉高总线
  52   1          Wire_delay(600);                            //等待DS18B20响应
  53   1                      DQ=1; 
  54   1                      Wire_delay(80); 
  55   1                                  for (i=0;i<16;i++)   //60us-240us    
C51 COMPILER V8.02   DS18B20                                                               04/15/2009 18:08:19 PAGE 2   

  56   1                                          {   
  57   2                                              Wire_delay(20); 
  58   2                                                      Reset_flag=DQ;                  //采样应答信号
  59   2                                                                      if(Reset_flag==0)
  60   2                                                                               Judge=0;   
  61   2                                          }   
  62   1              return(Judge);                          //返回0-有设备连接1-无设备连接                            
  63   1      }  
  64          /*--------------------------------------------------------------------------------
  65                  函数名称:uchar Read_byte( );
  66                  函数功能:通过总线,将18B20内部数据读出,以字节为单位;
  67                  入口参数:无;
  68                  出口参数:receive_data;读出的数据;
  69          ---------------------------------------------------------------------------------*/
  70          bit Read_bit()
  71          {
  72   1              bit re_bit;
  73   1      
  74   1              DQ=0;                                                           // 给脉冲信号
  75   1                      Wire_delay(1);
  76   1                              DQ=1;
  77   1                                      Wire_delay(2);
  78   1                                              re_bit=DQ;
  79   1                                                      Wire_delay(60);                 //重要!!!
  80   1              return(re_bit);
  81   1      }
  82          
  83          uchar Read_byte( )                                                              //读一个字节
  84          {
  85   1              uchar i,receive_data=0;
  86   1      
  87   1          for(i=0;i<8;i++)
  88   1           {
  89   2                      if(Read_bit()==1)
  90   2                              receive_data=receive_data|(0x01<<i);
  91   2                      Wire_delay(2);
  92   2           }
  93   1      
  94   1           return(receive_data);
  95   1      }
  96          
  97          /*--------------------------------------------------------------------------------
  98                  函数名称:void Write_byte(uchar write_data);
  99                  函数功能:通过总线,将数据写入DS18B20内部;
 100                  入口参数:write_data;写入的数据;
 101                  出口参数:无;
 102          ---------------------------------------------------------------------------------*/
 103          void Write_bit(bit Trans_data)
 104          {
 105   1              DQ=0;
 106   1                      Wire_delay(2);
 107   1                              if(Trans_data==1)
 108   1                                      DQ=1;
 109   1                      Wire_delay(60);
 110   1                              DQ=1;           
 111   1      }
 112          
 113          void Write_byte(uchar write_data)               //写一个字节
 114          {
 115   1          uchar i,Bit;
 116   1              
 117   1          for(i=0;i<8;i++)
C51 COMPILER V8.02   DS18B20                                                               04/15/2009 18:08:19 PAGE 3   

 118   1          {
 119   2                      Bit=write_data>>i;
 120   2                              Bit=Bit&0x01;                           //1_wire低位在前传输
 121   2                                      Write_bit(Bit);
 122   2                                              Wire_delay(2);
 123   2          }
 124   1              //Wire_delay(120);
 125   1      }
 126          
 127          /*--------------------------------------------------------------------------------
 128                  函数名称:DS18B20_Initial( );
 129                  函数功能:初始化;
 130                  入口参数:无;
 131                  出口参数:无;
 132          ---------------------------------------------------------------------------------*/
 133          void DS18B20_Initial( )                                 //18b20寄存器初始化
 134          {
 135   1              Reset_DS18B20( );
 136   1                      Write_byte(SKIP_ROM );                  //跳过读序列号
 137   1                              Write_byte(WRITE_SCRATCHPAD);   //写字节到暂存器,即高温,低温触发器和配置寄存器
 138   1                                      Write_byte(High_limit);                 //设置上限温度值
 139   1                                              Write_byte(Low_limit);              //设置下限温度值
 140   1                                                      Write_byte(0x7f);               //设置为12位分辨率
 141   1              Reset_DS18B20( );
 142   1                      Write_byte(SKIP_ROM);                    //跳过读序列号
 143   1                              Write_byte(CONVERT_T);                   //拷贝存储器                   
 144   1      }
 145          
 146          /*--------------------------------------------------------------------------------
 147                  函数名称:void Start_Convert();
 148                  函数功能;开始温度转换;
 149                  入口参数:无;
 150                  出口参数:无;
 151          ---------------------------------------------------------------------------------*/
 152          void Start_Convert()
 153          {
 154   1              Reset_DS18B20( );
 155   1              Write_byte(SKIP_ROM);                    //跳过读序列号
 156   1                      Write_byte(CONVERT_T);                   //拷贝存储器                   
 157   1      }
 158          
 159          
 160          /*--------------------------------------------------------------------------------
 161                  函数名称:uint Read_temperature( );
 162                  函数功能:读取温度;
 163                  入口参数:无;
 164                  出口参数:温度所对应的二进制数;
 165          ---------------------------------------------------------------------------------*/
 166                  uint  Temper;
 167          uint Read_temperature()          //读取温度
 168          {
 169   1              bit Busy_Test=0;
 170   1              uchar tempL=0;                          //温度值低8位
 171   1              uchar tempH=0;                          //温度值高8位
 172   1              //uint i;//,T[16];
 173   1      
 174   1          Reset_DS18B20();
 175   1              Write_byte(SKIP_ROM);           //跳过读序号列号的操作
 176   1                      Write_byte(READ_SCRATCHPAD);                    //读取温度寄存器(共可读9个寄存器),前两个就是温度值
 177   1              /*for(i=0;i<16;i++)
 178   1                      {
 179   1                              T[i]=Read_bit();
C51 COMPILER V8.02   DS18B20                                                               04/15/2009 18:08:19 PAGE 4   

 180   1                                      Wire_delay(200);        
 181   1                      }*/     
 182   1                       tempL=Read_byte();                                                             //读一个字节
 183   1                       tempH=Read_byte();                                                                     //读一个字节
 184   1              
 185   1                              Start_Convert();
 186   1                                      Wire_delay(2);  
 187   1                                              Busy_Test=DQ;
 188   1                                                      while(!Busy_Test)
 189   1                                      Busy_Test=DQ;
 190   1                      //for(i=0;i<80;i++)
 191   1                      //      Wire_delay(1000);
 192   1                                      
 193   1              /*Temper=T[0]*0.0625+T[1]*0.125+T[2]*0.25+T[3]*0.5+T[4]*1+T[5]*2+T[6]*4+T[7]*8+T[8]*16
 194   1                              T[9]*32+T[10]*64+T[11]*128+T[12]*256;*/
 195   1                      Temper=tempH;
 196   1                      Temper<<=8;
 197   1                              Temper|=tempL;
 198   1              return(Temper);
 199   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    307    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      4       1
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       4
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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