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

📄 text1.lst

📁 18b20测温程序
💻 LST
字号:
C51 COMPILER V8.05a   TEXT1                                                                11/08/2008 08:12:06 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE TEXT1
OBJECT MODULE PLACED IN Text1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Text1.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg52.h>      
   2          #include <absacc.h>
   3          #include <stdio.h>
   4          #include <math.h>
   5          
   6          #define uchar unsigned char 
   7          #define uint unsigned int 
   8          
   9          uchar tplsb,tpmsb;              // 温度值低位、高位字节
  10           
  11          //uchar code discode[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9和'-'号,共阴极数码
             -管
  12          //uchar code flocode[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}
             -;
  13          sbit DQ = P2^0;                 // 数据通信线DQ
  14          void delay(uint t)
  15          {
  16   1              uint i;
  17   1              while(t--)
  18   1              {
  19   2                      /* 对于11.0592M时钟,约延时1ms */
  20   2                      for (i=0;i<125;i++)
  21   2                      {}
  22   2              }
  23   1      } 
  24          
  25          /* 产生复位脉冲初始化DS18B20 */
  26          void TxReset(void)
  27          {
  28   1              uint i;
  29   1              DQ = 0;
  30   1      
  31   1              /* 拉低约900us */
  32   1              i = 100;
  33   1              while (i>0)     i--;    
  34   1              
  35   1              DQ = 1;                         // 产生上升沿
  36   1              i = 4;
  37   1              while (i>0)     i--;
  38   1      }
  39          
  40          /* 等待应答脉冲 */
  41          void RxWait(void)
  42          {
  43   1              uint i;
  44   1              while(DQ);
  45   1              while(~DQ);                     // 检测到应答脉冲 
  46   1              i = 4;
  47   1              while (i>0)     i--;
  48   1      }
  49          
  50          /* 读取数据的一位,满足读时隙要求 */ 
  51          bit RdBit(void)
  52          {
  53   1              uint i;
C51 COMPILER V8.05a   TEXT1                                                                11/08/2008 08:12:06 PAGE 2   

  54   1              bit b;
  55   1              DQ = 0;
  56   1              i++;
  57   1              DQ = 1;
  58   1              i++;i++;                        // 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
  59   1              b = DQ;
  60   1              i = 8;
  61   1              while(i>0) i--;
  62   1              return (b);
  63   1      }
  64          
  65          /* 读取数据的一个字节 */
  66          uchar RdByte(void)
  67          {
  68   1              uchar i,j,b;
  69   1              b = 0;
  70   1              for (i=1;i<=8;i++)
  71   1              {
  72   2                      j = RdBit();
  73   2                      b = (j<<7)|(b>>1);
  74   2              }
  75   1              return(b);
  76   1      }
  77          
  78          /* 写数据的一个字节,满足写1和写0的时隙要求 */
  79          void WrByte(uchar b)
  80          {
  81   1              uint i;
  82   1              uchar j;
  83   1              bit btmp;
  84   1              for(j=1;j<=8;j++)
  85   1              {
  86   2                      btmp = b&0x01;
  87   2                      b = b>>1;               // 取下一位(由低位向高位)
  88   2                      if (btmp)
  89   2                      {
  90   3                              /* 写1 */
  91   3                              DQ = 0;
  92   3                              i++;i++;        // 延时,使得15us以内拉高
  93   3                              DQ = 1;
  94   3                              i = 8;
  95   3                              while(i>0) i--; // 整个写1时隙不低于60us 
  96   3                      }
  97   2                      else
  98   2                      {
  99   3                              /* 写0 */
 100   3                              DQ = 0;                 
 101   3                              i = 8;
 102   3                              while(i>0) i--; // 保持低在60us到120us之间
 103   3                              DQ = 1;
 104   3                              i++;
 105   3                              i++;
 106   3                      }
 107   2              }
 108   1      }
 109          
 110          /* 启动温度转换 */
 111          void convert(void)
 112          {
 113   1              TxReset();                      // 产生复位脉冲,初始化DS18B20
 114   1              RxWait();                       // 等待DS18B20给出应答脉冲
 115   1              delay(1);                       // 延时
C51 COMPILER V8.05a   TEXT1                                                                11/08/2008 08:12:06 PAGE 3   

 116   1              WrByte(0xcc);           // skip rom 命令
 117   1              WrByte(0x44);           // convert T 命令
 118   1      }
 119          
 120          /* 读取温度值 */
 121          void RdTemp(void)
 122          {
 123   1              TxReset();                      // 产生复位脉冲,初始化DS18B20 
 124   1              RxWait();                       // 等待DS18B20给出应答脉冲
 125   1              delay(1);                       // 延时
 126   1              WrByte(0xcc);           // skip rom 命令
 127   1              WrByte(0xbe);           // read scratchpad 命令
 128   1              tplsb = RdByte();       // 温度值低位字节(其中低4位为二进制的“小数”部分)
 129   1              tpmsb = RdByte();       // 高位值高位字节(其中高5位为符号位)          
 130   1      }
 131          
 132          /* 主程序,读取的温度值最终存放在tplsb和tpmsb变量中。
 133             tplsb其中低4位为二进制的“小数”部分;tpmsb其中高
 134             5位为符号位。真正通过数码管输出时,需要进行到十进
 135             制有符号实数(包括小数部分)的转换。              */
 136          
 137          
 138          void main(void)
 139          {
 140   1              do
 141   1              {       
 142   2                      delay(1);               // 延时1ms
 143   2                      convert();              // 启动温度转换,需要750ms
 144   2                      delay(1000);    // 延时1s
 145   2                      RdTemp();               // 读取温度     
 146   2                      P1=tplsb;
 147   2                      P3=tpmsb;               
 148   2              }
 149   1              while(1);
 150   1      }
 151          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    290    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      2    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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