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

📄 ds1820.lst

📁 51单片机开发与应用技术详解(珍藏版)PPT及源码
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.08   DS1820                                                                07/04/2008 11:10:12 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE DS1820
OBJECT MODULE PLACED IN DS1820.OBJ
COMPILER INVOKED BY: C:\Program Files\keil\C51\BIN\C51.EXE DS1820.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <stdio.h>                                              //头文件
   2          #include <reg52.h>
   3          
   4          #define FALSE 0
   5          #define TRUE 1
   6          #define uchar unsigned char                             //预定义
   7          
   8          sbit DS18S20_DQ = P2^0;                 //定义P2^0引脚为DS18S20的DQ引脚
   9          
  10          /******************************* 全局变量声明 ********************************/
  11          uchar DS18S20ROM[8];                            // DS18S20 ROM位
  12          uchar LastData = 0; 
  13          uchar EndFlag = 0; 
  14          uchar ROMFound[5][8];                                   // DS18S20的ROM 代码表
  15          uchar numROMs;
  16          uchar CRCdsc;                                                   //用于CRC校验
  17          
  18          uchar code dsc[] = {
  19          0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
  20          157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
  21          35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
  22          190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
  23          70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
  24          219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
  25          101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
  26          248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
  27          140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
  28          17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
  29          175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
  30          50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
  31          202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
  32          87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
  33          233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
  34          116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53};
  35          
  36          
  37          void Delay(int useconds) 
  38          {
  39   1      int s;
  40   1      for (s=0; s<useconds;s++);                              //空循环语句实现延时
  41   1      }
  42          
  43          
  44          uchar Reset(void) 
  45          {
  46   1      uchar PresenceSignal;
  47   1      DS18S20_DQ = 0;                                                 //拉低数据线DQ
  48   1      Delay(30);                                                      //延时
  49   1      DS18S20_DQ = 1;                                                 //置数据线DQ为高电平
  50   1      Delay(3);                                                               //延时
  51   1      PresenceSignal = DS18S20_DQ;                    //读取存在信号
  52   1      Delay(30);                                                      //延时,等待时间隙结束
  53   1      return PresenceSignal;                                  //返回存在信号
  54   1      }
  55          
C51 COMPILER V8.08   DS1820                                                                07/04/2008 11:10:12 PAGE 2   

  56          
  57          
  58          void WriteBit(char val) 
  59          {
  60   1      DS18S20_DQ = 0;                                                 //拉低数据线DQ开始写时间隙
  61   1      if(val==1)
  62   1       DS18S20_DQ =1;                                                 //数据线DQ置1,写1 
  63   1      else
  64   1       DS18S20_DQ=0;                                          //数据线DQ置0,写0
  65   1      Delay(5);                                                               //延时,在时间隙内保持电平值,
  66   1      DS18S20_DQ = 1;                                                 //拉高数据线DQ
  67   1      }
  68                  
  69          
  70          
  71          void WriteByte(char val) 
  72          {
  73   1      uchar i;
  74   1      uchar temp;
  75   1      for (i=0; i<8; i++)                                             //循环写入字节,每次写入一位
  76   1      { 
  77   2      temp = val>>i;                                                  //移位
  78   2      temp &= 0x01;           
  79   2      WriteBit(temp);                                                 //调用位写入函数
  80   2      }
  81   1      Delay(5);
  82   1      }
  83          
  84          
  85          uchar ReadBit(void) 
  86          {
  87   1      uchar i;
  88   1      DS18S20_DQ = 0;                                         //拉低数据总线DQ开始读时间隙
  89   1      DS18S20_DQ = 1;                                                 //DQ置1
  90   1      for (i=0; i<3; i++);                                            //延时
  91   1      return DS18S20_DQ ;                                     //返回数据总线DQ上的位数据
  92   1      }
  93          
  94          uchar ReadByte(void) 
  95          {
  96   1      uchar i;
  97   1      uchar value = 0;
  98   1      for (i=0;i<8;i++)                                               //读取字节,每次读取一位
  99   1      {
 100   2      if(ReadBit()) 
 101   2      value|=0x01<<i;                                         //循环左移
 102   2      Delay(7);                                       
 103   2      }
 104   1      return(value);                                                  //返回字节数据
 105   1      }
 106          
 107          
 108          void ReadROMSerialNumber(void) 
 109          {
 110   1      int n;
 111   1      char dat[9];
 112   1      printf("\nReading DS18S20 ROM Code\n"); //输出信息
 113   1      Reset();                                                                //复位函数
 114   1      WriteByte(0x33);                                                //读出ROM序列号命令
 115   1      for (n=0;n<8;n++)
 116   1      {
 117   2      dat[n]=ReadByte();                                              //循环读ROM序列号
C51 COMPILER V8.08   DS1820                                                                07/04/2008 11:10:12 PAGE 3   

 118   2      }
 119   1      printf("\nDS18S20 ROMCode=%X%X%X%X\n",//输出ROM序列号
 120   1      dat[7],dat[6],dat[5],dat[4],dat[3],dat[2],dat[1],dat[0]);
 121   1      }
 122          
 123          
 124          uchar CRCCheck( uchar x) 
 125          {
 126   1      CRCdsc = dsc[CRCdsc^x];                         //查表校验
 127   1      return CRCdsc;
 128   1      }
 129          
 130          uchar SearchDevice(void) 
 131          {
 132   1      uchar m = 1;                                                    //DS18S20 ROM 位索引
 133   1      uchar n = 0;                                                    //DS18S20 ROM 字节索引
 134   1      uchar k = 1;    
 135   1      uchar x = 0;
 136   1      uchar discrepMarker = 0; 
 137   1      uchar g;
 138   1      uchar nxt; 
 139   1      int flag;
 140   1      nxt = FALSE;                    
 141   1      CRCdsc = 0; 
 142   1      flag = Reset();                                                         //复位函数
 143   1      if(flag||EndFlag)                                               //如果没有其它器件
 144   1      {                                                                       
 145   2      LastData = 0;   
 146   2      return FALSE;                                           //返回"假"
 147   2      }
 148   1      WriteByte(0xF0);                                                //搜索ROM 命令
 149   1      do                                                                      //循环
 150   1      {                                       
 151   2      x = 0;
 152   2      if(ReadBit()==1) x = 2;
 153   2      Delay(8);
 154   2      if(ReadBit()==1) x |= 1;        
 155   2      if(x ==3) break;
 156   2      else 
 157   2      {
 158   3      if(x>0)                                 
 159   3      g = x>>1;                       
 160   3      else 
 161   3      {                                       
 162   4      if(m<LastData) 
 163   4      g = ((DS18S20ROM[n]&k)>0);
 164   4      else 
 165   4      g = (m==LastData); 
 166   4      if (g==0) discrepMarker = m;
 167   4      }
 168   3      if(g==1) 
 169   3      DS18S20ROM[n] |= k;
 170   3      else 
 171   3      DS18S20ROM[n] &= ~k;
 172   3      WriteBit(g);                                            //位写入函数
 173   3      m++; 
 174   3      k = k<<1; 
 175   3      if(k==0) 
 176   3      { 
 177   4      CRCCheck(DS18S20ROM[n]);        //CRC校验
 178   4      n++; k++;
 179   4      }
C51 COMPILER V8.08   DS1820                                                                07/04/2008 11:10:12 PAGE 4   

 180   3      }
 181   2      }while(n<8);                                                    //直到全部ROM字节0~7都完成
 182   1      if(m<65||CRCdsc)  
 183   1      LastData=0; 

⌨️ 快捷键说明

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