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

📄 ds18b20.lst

📁 该程序解决了单片机c语言中时序要求严格的问题,已经调试通过
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   DS18B20                                                               01/09/2006 16:57:59 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN DS18B20.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\Bin\c51.exe DS18B20.c DB SB OE ROM(LARGE) SMALL OT(6,SPEED) WL(2) RB(0)

line level    source

   1          #include<reg52.h>
   2          #include<absacc.h>
   3          #include<intrins.h>
   4          
   5          #define unit unsigned int
   6          #define uchar unsigned char
   7          #define FALSE 0
   8          #define TRUE 1
   9          #define DS18B20MAX 10
  10          
  11          sbit LED=P1^6;
  12          sbit DQ=P1^7;
  13          
  14          uchar ROMID[DS18B20MAX][8];     // 该DS18B20的ROMID是 28 CB 81 C2  00 00 00 41
  15          uchar scratchPad[9];
  16          uchar TH=0x64;                                  // 温度监测系统设定的温度报警上限值
  17                                                                          // 0 1100100 设为100摄氏度
  18          uchar TL=0xd8;                                  // 温度监测系统设定的温度报警下限值
  19                                                                          // 1 1011000 设为零下40摄氏度
  20          uchar confgReg=0x3f;                    // 温度监测系统设定的配置寄存器数据值
  21                                                                          // 0 01 111111 分辨率为10位,最大转换时间187.5秒
  22          void initial(void)
  23          {
  24   1              IE=0x00;
  25   1          TMOD=0x20;
  26   1          PCON=0x00;
  27   1          SCON=0x40;
  28   1          TH1=0xfd;
  29   1          TL1=0xfd;
  30   1          LED=1;
  31   1         
  32   1          
  33   1      }
  34          
  35              
  36          void delay_1s(void)
  37          {
  38   1              unsigned char i;
  39   1              unsigned int j;
  40   1              for(i=0;i<250;i++)
  41   1                for(j=0;j<672;j++);
  42   1      }  
  43          
  44          
  45          void delay(int time)                    // 延时子程序
  46          {                                                               // 系统采用的是11.059MHz的晶振,所以该延时程序产生16*time+24μs 的延时
  47   1              int     i;
  48   1              for(i=0;i<time;i++);
  49   1      }
  50          
  51          
  52          bit bus_reset(void)             // 产生单总线系统的总线复位信号,并返回总线上是否存在单总线器件信息
  53          {                                                               // 若返回0表明总线上存在单总线器件,若返回1表明总线上不存在单总线器件
  54   1              bit presence;
  55   1              DQ=0;                                           // 拉低DQ总线开始复位
C51 COMPILER V7.50   DS18B20                                                               01/09/2006 16:57:59 PAGE 2   

  56   1              delay(28);                                      // 保持DQ低480μs
  57   1              DQ=1;                                           // 释放DQ
  58   1              delay(5);                       // 等待大于60us,等待从设备将总线拉低,如果有从设备就拉低,否则就是高电平
  59   1              presence=DQ;                            // 获取应答信号
  60   1              delay(25);                                      // 等待总线初始化过程结束
  61   1              return(presence);                       // 返回应答信号,有芯片应答presence=0
  62   1                                              // 无芯片应答presence=1
  63   1      }
  64          
  65          
  66          bit read_bit(void)                              // 从总线上读取一个数据位
  67          {
  68   1              DQ=0;                                           // 将总线DQ拉低启动读时隙                                       
  69   1              DQ=1;                                           // 释放DQ信号线,等待从机返回数据位
  70   1              _nop_();                    // 延时4μs再读数据
  71   1              _nop_();
  72   1              _nop_();
  73   1              _nop_();
  74   1              return DQ;  
  75   1              
  76   1      }
  77          
  78          
  79          uchar read_byte(void)           // 从单总线上读取一个字节
  80          {
  81   1              uchar i;
  82   1              uchar value=0;                          // 将返回值初始化为0
  83   1              for(i=0;i<8;i++)
  84   1              {
  85   2                      if(read_bit())
  86   2                              value|=0x01<<i;         // 读一字节数据,一个读时序中读一位,并做移位处理
  87   2                              
  88   2                      delay(3);                               // 延时60μs以完成此次读时序,之后再读下一位数据
  89   2              }
  90   1              return(value);
  91   1      }
  92          
  93          
  94          void write_bit(uchar bitval)    // 向单总线上写一个数据位
  95          {
  96   1              DQ=0;                                           // 拉低DQ以开始一个写时序
  97   1              if(bitval==1)
  98   1                      DQ=1;                                   // 如要写"1"则将总线置高
  99   1              delay(3);                                       // 延时60μs供DS18B20采样
 100   1              DQ=1;                                           // 释放DQ总线
 101   1              
 102   1      }
 103          
 104          
 105          void write_byte(uchar val)              // 向单总线上写一个数据字节
 106          {
 107   1              uchar i;
 108   1              uchar temp=0;                           // 将返回值初始化为0
 109   1              for(i=0;i<8;i++)                        // 写一字节数据,一次写一位
 110   1              {
 111   2                      temp=val>>i;                    // 移位操作,将本次要写的位移到最低位
 112   2                      temp&=0x01;
 113   2                      write_bit(temp);                // 向总线写该位
 114   2              }
 115   1              delay(5);                       // 等待时隙结束
 116   1      }
 117          
C51 COMPILER V7.50   DS18B20                                                               01/09/2006 16:57:59 PAGE 3   

 118          
 119          /*uchar send_matchRom(uchar DS18B20No)          // 系统主机向总线发出匹配ROM命令
 120          {                                                                                       // ROM ID是编号为DS18B20No的温度传感器的ROM序列号
 121                  uchar i;
 122                  if(bus_reset()) return FALSE;                   // 如果总线上没有器件,返回FALSE
 123                  write_byte(0x55);                                               // 向总线写匹配命令0x55
 124                  for(i=0;i<8;i++)                                                // 连续写入8个字节的ROMID
 125                  {
 126                          write_byte(ROMID[DS18B20No][i]);        // 向总线写ROMID的第i个字节
 127                  }
 128                  return TRUE;    
 129          }       
 130                  
 131          
 132          void read_scratchPad(uchar DTNo)                // 系统主机从指定的DS18B20中读取便笺存储器的所有字节
 133          {                                                                               // 读取的结果放到全局变量scratchPad[9]中
 134                  uchar i;
 135                  send_matchRom(DTNo);                            // 向总线发出匹配ROM命令,使编号为DTNo的器件处于选中状态
 136                  write_byte(0xBE);                                       // 向总线发出读便笺存储器命令
 137                  for(i=0;i<9;i++)                                        // 连续读入9个字节的便笺存储器单元
 138                  {
 139                          scratchPad[i]=read_byte();              // 从总线读取1个字节存入scratchPad[i]
 140                  }
 141                  
 142          }
 143          
 144          

⌨️ 快捷键说明

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