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

📄 ds18b20.lst

📁 关于温度传感器和电机测速的单片机程序
💻 LST
字号:
C51 COMPILER V7.00  DS18B20                                                                11/14/2005 20:20:15 PAGE 1   


C51 COMPILER V7.00, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN ds18b20.OBJ
COMPILER INVOKED BY: D:\MCU\Keil51\C51\BIN\C51.EXE ds18b20.c ROM(SMALL) BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include <intrins.h>
   2          #include <reg51.h>
   3          
   4          //这里以11.0592M晶体为例,不同的晶体速度可能需要调整延时的时间
   5          sbit DQ = P3^5;
   6          unsigned char m_CRC(unsigned char CRC0,unsigned char InByt);
   7          
   8          //延时
   9          void delay(unsigned int useconds)
  10          {
  11   1              for(;useconds>0;useconds--);
  12   1      }
  13          void delay750()
  14          {
  15   1      int x;
  16   1              for(x=0;x<20000;x++) {} 
  17   1              for(x=0;x<20000;x++) {} 
  18   1              for(x=0;x<20000;x++) {} 
  19   1              for(x=0;x<20000;x++) {} 
  20   1              for(x=0;x<20000;x++) {} 
  21   1              for(x=0;x<20000;x++) {} 
  22   1              for(x=0;x<20000;x++) {} 
  23   1              for(x=0;x<20000;x++) {} 
  24   1      }
  25          
  26          //复位
  27          bit ow_reset(void)      // 0=presence, 1 = no part
  28          {
  29   1      bit presence;
  30   1      char count;
  31   1              DQ = 0;         //pull DQ line low
  32   1              delay(42);      // leave it low for 480us
  33   1              DQ = 1;         // allow line to return high
  34   1              count = 0;
  35   1              delay(2);
  36   1              do 
  37   1              {
  38   2                      delay(1);       // the first is for recover period
  39   2                      presence = DQ;
  40   2                      count++;
  41   2              } while (presence && (count<8));
  42   1              if(count>=8) return 1;
  43   1              count = 0;
  44   1              do
  45   1              {
  46   2                      delay(1);
  47   2                      presence = DQ;
  48   2                      count++;
  49   2              } while (!presence&&(count<60));
  50   1              if(count>=60) return 1; // 如果拉死,也认为不存在       
  51   1              delay(36);
  52   1              return 0;
  53   1      }       
  54          
  55          //从 1-wire 总线上读取一个字节
C51 COMPILER V7.00  DS18B20                                                                11/14/2005 20:20:15 PAGE 2   

  56          unsigned char read_byte(void)
  57          {
  58   1      unsigned char i;
  59   1      unsigned char value = 0;
  60   1              for (i=8;i>0;i--)
  61   1              {
  62   2                      value>>=1;
  63   2                      DQ = 0; // pull DQ low to start timeslot
  64   2                      DQ = 0; // then return high
  65   2                      DQ = 1; // then return high
  66   2                      DQ = 1; // then return high
  67   2                                      // 
  68   2                      _nop_();
  69   2                      _nop_();
  70   2                      _nop_();
  71   2                      _nop_();
  72   2                      _nop_();
  73   2                      _nop_();
  74   2                      _nop_();
  75   2                      _nop_();
  76   2                      if(DQ)value|=0x80;
  77   2                      delay(4); // wait for rest of timeslot
  78   2              }
  79   1              return(value);
  80   1      }
  81          
  82          //向 1-WIRE 总线上写一个字节
  83          void write_byte(char val)
  84          {
  85   1      unsigned char i;
  86   1              for (i=8; i>0; i--) // writes byte, one bit at a time
  87   1              {
  88   2                      DQ = 0; // pull DQ low to start timeslot
  89   2                      DQ = 0; //pull DQ line low
  90   2                      DQ = val&0x01;
  91   2                      delay(5); // hold value for remainder of timeslot
  92   2                      DQ = 1;
  93   2                      val=val/2;
  94   2              }
  95   1              delay(5);
  96   1      }
  97          
  98          //读取温度
  99          int Read_Temperature(void)
 100          {
 101   1      unsigned char xl,xh;
 102   1      unsigned char cfg;
 103   1      unsigned int x;
 104   1      unsigned char crc;
 105   1              do
 106   1              {
 107   2              ow_reset();
 108   2              write_byte(0xCC); // Skip ROM
 109   2              write_byte(0x44); // Start Conversion
 110   2              delay(2);
 111   2              delay750();
 112   2              ow_reset();
 113   2              write_byte(0xCC); // Skip ROM
 114   2              write_byte(0xBE); // Read Scratch Pad
 115   2              xl = read_byte();
 116   2              crc = m_CRC(0,xl);
 117   2              xh = read_byte();
C51 COMPILER V7.00  DS18B20                                                                11/14/2005 20:20:15 PAGE 3   

 118   2              crc = m_CRC(crc,xh);
 119   2              cfg = read_byte();      // TH 
 120   2              crc = m_CRC(crc,cfg);
 121   2              cfg = read_byte();      // TL 
 122   2              crc = m_CRC(crc,cfg);
 123   2              cfg = read_byte();      // config 
 124   2              crc = m_CRC(crc,cfg);
 125   2              cfg = read_byte();      // Reserve0 
 126   2              crc = m_CRC(crc,cfg);
 127   2              cfg = read_byte();      // Reserve1 
 128   2              crc = m_CRC(crc,cfg);
 129   2              cfg = read_byte();      // Reserve2 
 130   2              crc = m_CRC(crc,cfg);
 131   2              cfg = read_byte();      // CRC read from inside
 132   2              } while(cfg!=crc);
 133   1      //      ow_reset();
 134   1      
 135   1              x = xh;
 136   1              x = (x<<8)+xl + 3;      // 4 舍 5 入
 137   1              x = (x>>3); 
 138   1              x = x + (x<<2);
 139   1      //      x = cfg;
 140   1              return x;
 141   1      }
 142          
 143          int Read_ROM(char k)
 144          {
 145   1      unsigned char x[8]; 
 146   1      char i;
 147   1              ow_reset();
 148   1              write_byte(0x33); // Skip ROM
 149   1              for(i = 0;i<8;i++) x[i] = read_byte();
 150   1              ow_reset();
 151   1              return x[k];
 152   1      }


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


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

⌨️ 快捷键说明

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