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

📄 temp.lst

📁 通过ds18b20的读写时序
💻 LST
字号:
C51 COMPILER V7.09   TEMP                                                                  06/05/2008 21:41:50 PAGE 1   


C51 COMPILER V7.09, COMPILATION OF MODULE TEMP
OBJECT MODULE PLACED IN Temp.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Temp.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<reg52.h>
   2          #define uchar unsigned char
   3          #define uint unsigned int
   4          
   5          
   6          uchar dis[5]={0x10,0x10,0x10,0x10};
   7          uchar c[4]={1, 2, 4, 8};
   8          uchar seg7[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
   9          uchar dot_seg[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
  10          
  11          uint    tm; //从DS18B20读出的数据
  12          
  13          uchar isNeg;/*是否为负数标志位*/
  14          sbit DQ=P3^7;/*DS18B20的DQ端*/
  15          /* ********************延时t毫秒 ***************************/
  16          void delay(uint t)
  17          {
  18   1              uchar m;
  19   1              while(t--)
  20   1              {
  21   2                      for (m=0;m<100;m++)
  22   2                              ;
  23   2              }
  24   1      } 
  25          
  26          /******************************ds1820程序***************************************/
  27          void delay_18B20(uint i)//延时1微秒
  28          {
  29   1         while(i--)
  30   1              ;
  31   1      }
  32          
  33          
  34          /********************* 产生复位脉冲初始化DS18B20 **************************/
  35          void TxReset(void)
  36          {
  37   1              DQ = 1;          //DQ复位
  38   1              delay_18B20(4); //延时
  39   1              DQ = 0;          //DQ拉低
  40   1              delay_18B20(100); //精确延时大于480us
  41   1              DQ = 1;          //拉高
  42   1              delay_18B20(4); 
  43   1      }
  44          
  45          /* ***********************等待应答脉冲 *********************/
  46          void RxWait(void)
  47          {
  48   1              while(DQ)
  49   1                      ;
  50   1              while(~DQ)
  51   1                      ;                       // 检测到应答脉冲 
  52   1      
  53   1              delay_18B20(1);
  54   1      }
  55          
C51 COMPILER V7.09   TEMP                                                                  06/05/2008 21:41:50 PAGE 2   

  56          /* ****************读取数据的一个字节 *****************************/
  57          uchar RdByte(void)
  58          {
  59   1              unsigned char i=0;
  60   1              unsigned char dat = 0;
  61   1              for(i = 8; i > 0; i--)
  62   1              {   
  63   2                      DQ = 0; //给脉冲信号
  64   2              dat >>= 1;
  65   2              DQ = 1; //给脉冲信号
  66   2              if(DQ)
  67   2                      dat |= 0x80;
  68   2              delay_18B20(10);
  69   2              }
  70   1         return(dat);
  71   1      }
  72          
  73          /* ****************写数据的一个字节,满足写1和写0的时隙要求 *************/
  74          void WrByte(uchar wdata)
  75          {
  76   1              unsigned char i=0;
  77   1              for(i = 8; i > 0; i--)
  78   1              {
  79   2                      DQ = 0;
  80   2              DQ = wdata&0x01;
  81   2              delay_18B20(10);
  82   2              DQ = 1;
  83   2              wdata>>=1;
  84   2                      delay_18B20(10);
  85   2              }
  86   1      }
  87          
  88          /* **************启动温度转换 *******************/
  89          void convert(void)
  90          {
  91   1              TxReset();                      // 产生复位脉冲,初始化DS18B20
  92   1              RxWait();                       // 等待DS18B20给出应答脉冲
  93   1              WrByte(0xcc);           // skip rom 命令
  94   1              WrByte(0x44);           // convert T 命令
  95   1      }
  96          
  97          /**************** 读取温度值 *********************/
  98          void RdTemp(void)
  99          {
 100   1              uchar tpmsb, tplsb;
 101   1      
 102   1              convert();
 103   1              TxReset();                      // 产生复位脉冲,初始化DS18B20 
 104   1              RxWait();                       // 等待DS18B20给出应答脉冲
 105   1              WrByte(0xcc);           // skip rom 命令
 106   1              WrByte(0xbe);           // read scratchpad 命令
 107   1              tplsb = RdByte();       // 温度值低位字节(其中低4位为二进制的“小数”部分)
 108   1              tpmsb = RdByte();       // 高位值高位字节(其中高5位为符号位)          
 109   1              tm = tpmsb;
 110   1              tm <<= 8;
 111   1              tm = tm | tplsb;
 112   1              if(tm & 0x0fff)
 113   1                      isNeg = 0;
 114   1              else
 115   1              {
 116   2                      tm = ~tm + 1;
 117   2                      isNeg = 1;
C51 COMPILER V7.09   TEMP                                                                  06/05/2008 21:41:50 PAGE 3   

 118   2              }
 119   1      }
 120          
 121          //*************************8数据处理程序************************//
 122          void dataProc(void)
 123          {
 124   1          uchar temp1,temp2;
 125   1              uint tt;
 126   1              uint tmp;
 127   1      
 128   1              if(tm < 0) 
 129   1                      tm = 0 - tm;
 130   1              temp2 = tm & 0x0f;
 131   1              temp1 = (tm >> 4) & 0xff;
 132   1              tmp = temp1 / 10 % 10;
 133   1              if(tmp >= 5 && tmp != 16)
 134   1                      P1 = 0x08;
 135   1              else 
 136   1                      P1 = 0x40;
 137   1      
 138   1              if(tmp == 0)
 139   1                      dis[0] = seg7[16];
 140   1              else
 141   1                      dis[0] = seg7[tmp];
 142   1              if(isNeg)
 143   1                      dis[0] = 0xbf;
 144   1              tmp = temp1 % 10;
 145   1              dis[1] = dot_seg[tmp];
 146   1              tt = tm & 0x0f;
 147   1              if(isNeg == 0)
 148   1                      tt = 625*tt;
 149   1              else 
 150   1              {
 151   2                      tt = 0 - tt;
 152   2                      tt = tt & 0x0f;
 153   2                      tt = tt * 625;
 154   2              }
 155   1              tmp = tt / 1000;
 156   1              dis[2] = seg7[tmp];
 157   1              tmp = tt / 100 % 10;
 158   1              dis[3] = seg7[tmp];
 159   1      }
 160          //**************显示程序**************** 使用了时钟中断//
 161          void display(void) interrupt 1
 162          {   
 163   1              static uchar    i;   
 164   1              
 165   1              TH0 = 0xD8;
 166   1              TL0 = 0xF0;      
 167   1              P2 = c[i];  
 168   1              P0 = dis[i];
 169   1              i = (i + 1) % 4;
 170   1      }
 171          
 172          void initINT(void)
 173          {
 174   1              TMOD = 0x01;
 175   1              TH0 = 0xF0;
 176   1              TL0 = 0x5F;
 177   1              ET0 = 1;
 178   1              EX0 = 1;
 179   1          TR0 = 1;    
C51 COMPILER V7.09   TEMP                                                                  06/05/2008 21:41:50 PAGE 4   

 180   1              EA = 1;
 181   1      }
 182          
 183          /* 主程序,读取的温度值最终存放在tplsb和tpmsb变量中。
 184             tplsb其中低4位为二进制的“小数”部分;tpmsb其中高
 185             5位为符号位。真正通过数码管输出时,需要进行到十进
 186             制有符号实数(包括小数部分)的转换。*/      
 187          void main(void)
 188          {       
 189   1              initINT();
 190   1              P0=0xff;
 191   1              P1 = 0;
 192   1              while(1)
 193   1              {       
 194   2                      RdTemp();               // 读取温度
 195   2                      dataProc();
 196   2                      delay(250);
 197   2              }
 198   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    509    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     40       1
   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 + -