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

📄 digthermo.lst

📁 此程序实现了ds18b20温度传感器的单线数据采集
💻 LST
字号:
C51 COMPILER V8.02   DIGTHERMO                                                             05/15/2008 21:15:01 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE DIGTHERMO
OBJECT MODULE PLACED IN DigThermo.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE DigThermo.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*此程序实现了ds18b20温度传感器的单线数据采集,并且通过LED显示小数和整数部分*/
   2          #include "DigThermo.h"
   3          
   4          /* 延时t*11us */
   5          void delay(uint t)
   6          {
   7   1        for(;t>0;t--);
   8   1      } 
   9          
  10          /* 产生复位脉冲初始化DS18B20 */
  11          void TxReset(void)
  12          {  char presence=1;
  13   1         while(presence)
  14   1         {
  15   2            while(presence)
  16   2           {
  17   3              DQ=1;_nop_();_nop_();//从高拉倒低
  18   3                  DQ=0;                                       
  19   3                  delay(50);           //550 us
  20   3                  DQ=1;                                        
  21   3                  delay(6);            //66 us
  22   3                   presence=DQ;         //presence=0 复位成功,继续下一步
  23   3           } 
  24   2           delay(45);            //延时500 us
  25   2           presence=~DQ;         
  26   2         }
  27   1         DQ=1;                   //拉高电平
  28   1      }
  29          
  30          /* 读取数据的一个字节 */
  31          uchar RdByte(void)
  32          {
  33   1              uchar i;
  34   1          uchar value=0;
  35   1          for(i=8;i>0;i--)
  36   1          {
  37   2            DQ=1;_nop_();_nop_();
  38   2            value>>=1;
  39   2            DQ=0;_nop_();_nop_();_nop_();_nop_();         //4 us
  40   2            DQ=1;_nop_();_nop_();_nop_();_nop_();         //4 us
  41   2            if(DQ)value|=0x80;
  42   2            delay(6);                                     //66 us
  43   2          }
  44   1         DQ=1;
  45   1         return(value);
  46   1      }
  47          
  48          /* 写数据的一个字节 */
  49          void WrByte(uchar val)
  50          {
  51   1         uchar i;
  52   1          for(i=8;i>0;i--)
  53   1           {
  54   2              DQ=1;_nop_();_nop_();                  //从高拉倒低
  55   2              DQ=0;_nop_();_nop_();_nop_();_nop_();  //5 us
C51 COMPILER V8.02   DIGTHERMO                                                             05/15/2008 21:15:01 PAGE 2   

  56   2              DQ=val&0x01;                           //最低位移出
  57   2              delay(6);                              //66 us
  58   2              val=val/2;                             //右移1位
  59   2           }
  60   1            DQ=1;
  61   1           delay(1);
  62   1      }
  63          /*功能匹配*/
  64          bit match_rom(uchar *rom)
  65          {
  66   1              uchar i;
  67   1              TxReset();
  68   1              WrByte(0x55);
  69   1              for(i=8;i>0;i--)
  70   1              {
  71   2                      WrByte(*(rom+i-1));
  72   2              }
  73   1              return 1;
  74   1      }       
  75          
  76          /* 读取温度值 */
  77          void RdTemp(uchar *serial)
  78          {
  79   1              TxReset();                      // 产生复位脉冲,初始化DS18B20 
  80   1              delay(200);                     // 延时
  81   1              WrByte(0xcc);           // skip rom 命令
  82   1              WrByte(0x44);           // read scratchpad 命令
  83   1              delay(1);                       // 延时
  84   1              match_rom(serial);        //匹配
  85   1              WrByte(0xbe);           // convert T 命令
  86   1              tplsb = RdByte();       // 温度值低位字节(其中低4位为二进制的“小数”部分)
  87   1              tpmsb = RdByte();       // 高位值高位字节(其中高5位为符号位)          
  88   1      }
  89          
  90           /*对采集到的数据进行处理*/
  91           void DataChange()
  92           {
  93   1         uint tem;
  94   1         uchar temp,flag;     
  95   1         uchar low,j;
  96   1         if(tpmsb>7)
  97   1         {
  98   2            flag=1;
  99   2            tem=tpmsb;
 100   2            tem<<=8;                                               
 101   2            tem=tem|tplsb;      // 两字节合成一个整型变量。
 102   2            tem=(tem^0xffff);//异或
 103   2                tem=tem+1;     //取反加1
 104   2                tplsb=tem&0xff;
 105   2                tpmsb=tem>>8;
 106   2         }
 107   1         temp=tpmsb<<4&0x70;
 108   1         temp=temp|(tplsb>>4);
 109   1         display[6]=temp/100;     // 取百位数据暂存
 110   1         display[5]=temp%100/10;     // 取十位数据暂存
 111   1         display[4]=temp%100%10;;      // 取个位数据暂存
 112   1         low=tplsb&0x0f;
 113   1         switch(low)                  //处理小数部分,对于12位的分辨率,以0.625和对应的数据相乘可以得出16种情况0000~1111
 114   1         {
 115   2          
 116   2                      case 0:                                 
 117   2                                    display[3]=0;
C51 COMPILER V8.02   DIGTHERMO                                                             05/15/2008 21:15:01 PAGE 3   

 118   2                                        break;
 119   2                              case 1:                                 
 120   2                                     display[3]=0;
 121   2                                         display[2]=6;
 122   2                                         display[1]=2;
 123   2                                         display[0]=5;
 124   2                                        break;
 125   2                              case 2:                                 
 126   2                                    display[3]=1;
 127   2                                        display[2]=2;
 128   2                                        display[1]=5;
 129   2                                        break;
 130   2                              case 3:                                 
 131   2                                    display[3]=1;
 132   2                                        display[2]=8;
 133   2                                        display[1]=7;
 134   2                                        display[0]=5;
 135   2                                        break;
 136   2                              case 4:                                 
 137   2                                    display[3]=2;
 138   2                                        display[2]=5;
 139   2                                        break;
 140   2                              case 5:                                 
 141   2                                    display[3]=3;
 142   2                                        display[2]=1;
 143   2                                        display[1]=2;
 144   2                                        display[0]=5;
 145   2                                        break;
 146   2                              case 6:                                 
 147   2                                    display[3]=3;
 148   2                                        display[2]=7;
 149   2                                        display[1]=5;
 150   2                                        break;
 151   2                              case 7:                                 
 152   2                                    display[3]=4;
 153   2                                        display[2]=3;
 154   2                                        display[1]=7;
 155   2                                        display[0]=5;
 156   2                                        break;
 157   2                              case 8:                                 
 158   2                                    display[3]=5;
 159   2                                        break;
 160   2                              case 9:                                 
 161   2                                    display[3]=5;
 162   2                                        display[2]=6;
 163   2                                        display[1]=2;
 164   2                                        display[0]=5;
 165   2                                        break;
 166   2                              case 10:                                        
 167   2                                    display[3]=6;
 168   2                                        display[2]=2;
 169   2                                        display[1]=5;
 170   2                                        break;
 171   2                              case 11:                                        
 172   2                                    display[3]=6;
 173   2                                        display[2]=8;
 174   2                                        display[1]=7;
 175   2                                        display[0]=5;
 176   2                                        break;
 177   2                              case 12:                                        
 178   2                                    display[3]=7;
 179   2                                        display[2]=5;
C51 COMPILER V8.02   DIGTHERMO                                                             05/15/2008 21:15:01 PAGE 4   

 180   2                                        break;
 181   2                              case 13:                                        
 182   2                                    display[3]=8;
 183   2                                        display[2]=1;
 184   2                                        display[1]=2;
 185   2                                        display[0]=5;
 186   2                                        break;
 187   2                              case 14:                                        
 188   2                                    display[3]=8;
 189   2                                        display[2]=7;
 190   2                                        display[1]=5;
 191   2                                        break;
 192   2                              case 15:                                        
 193   2                                    display[3]=9;
 194   2                                        display[2]=3;
 195   2                                        display[1]=7;
 196   2                                        display[0]=5;
 197   2                                        break;
 198   2                              default:break;
 199   2              }
 200   1      
 201   1        if(flag)      //把负号标志放在整数最高位不是0的前一位
 202   1        {
 203   2              if(display[6]==0&display[5]!=0) display[6]=16;
 204   2              if(display[6]==0&display[5]==0&display[4]!=0) display[5]=16;
 205   2              if(display[6]==0&display[5]==0&display[4]==0) display[5]=16;
 206   2              flag=0;
 207   2        }
 208   1              for(j=6;j>3;j--)
 209   1              {
 210   2                if(display[j]!=0) 
 211   2                break;
 212   2                if(j==4) break;       //当第一个整数位为0时,此位的0显示;
 213   2                display[j]=17;   // 使为0的数据不显示
 214   2              }
 215   1        
 216   1       } 
 217          /*uchar * read_rom(void)
 218          {
 219                  uchar rom[8],i;
 220                  TxReset();
 221                  WrByte(0x33);
 222                  for(i=7;i>=0;i--)
 223                  {
 224                          rom[i]=RdByte();
 225                  }
 226                  return &rom[0];
 227          }  */
 228          
 229          /*定时中断,显示采集的温度*/
 230            void t0(void) interrupt 1 using 0 
 231           {
 232   1          uchar i,tr;
 233   1          P2=0xff;
 234   1              if(i==4)//使第四位带有小数点
 235   1              tr=0x80;
 236   1              else    //其他位小数点不显示
 237   1              tr=0x00;
 238   1          P0=(tr|dispcode[display[i]]);
 239   1          P2=dispbitcode[7-i];
 240   1         i++;
 241   1         if(i==8) i=0;
C51 COMPILER V8.02   DIGTHERMO                                                             05/15/2008 21:15:01 PAGE 5   

 242   1         TH0=(65536-2200)/256; 
 243   1         TL0=(65536-2200)%256; 
 244   1       
 245   1       }
 246          
 247          /*主函数*/
 248          void main(void)
 249          {
 250   1        uchar i;       
 251   1        TMOD=0x01; 
 252   1        TH0=(65536-2200)/256; 
 253   1        TL0=(65536-2200)%256;
 254   1        TR0=1; 
 255   1        ET0=1; 
 256   1        EA=1;
 257   1         while(1)
 258   1              { 
 259   2                delay(130);
 260   2                RdTemp(get_serial+i*8);        // 读取温度 
 261   2                display[7]=i+10;        //显示当前传感器的编号
 262   2                DataChange(); //数据处理 
 263   2                i++ ;
 264   2                if(i==3) i=0;
 265   2              }
 266   1              
 267   1      }
 268          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    768    ----
   CONSTANT SIZE    =     18    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     42       8
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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