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

📄 测量温度.lst

📁 DS18B20测温源码程序上传
💻 LST
字号:
C51 COMPILER V8.02   测量温度                                                              07/13/2008 20:50:07 PAGE 1   


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

line level    source

   1          #include<reg52.h>
   2          #include<intrins.h>
   3          
   4          
   5          void delay(unsigned int t);
   6          void beep(unsigned int i);
   7          
   8          
   9          unsigned char DisBuff[4];
  10          unsigned char temp;
  11          unsigned char COM; 
  12          
  13          sbit COM1=P2^7;    //定义通信端口               
  14          sbit COM2=P2^4;
  15          sbit COM3=P2^5;
  16          sbit COM4=P2^6;
  17          sbit   DQ=P3^7;
  18          sbit BEEP=P3^4;  
  19          
  20          
  21          #define a 0x04                  //  AAAA
  22          #define b 0x01                                  // F    B
  23          #define c 0x10                                  // F    B
  24          #define d 0x40                                  //  GGGG
  25          #define e 0x80                                  // E    C
  26          #define f 0x02                                  // E    C
  27          #define g 0x08                                  //  DDDD    H
  28          #define h 0x20                  
  29          
  30          unsigned char code LED_table[]={
  31          a+b+c+d+e+f,                               //"0"
  32          b+c,                                               //"1"
  33          a+b+d+e+g,                                         //"2"
  34          a+b+c+d+g,                                         //"3"
  35          b+c+f+g,                                           //"4"
  36          a+c+d+f+g,                                         //"5"
  37          a+c+d+e+f+g,                               //"6"
  38          a+b+c,                                             //"7"
  39          a+b+c+d+e+f+g,                             //"8"
  40          a+b+c+d+f+g,                               //"9"
  41          b+c+e+f+g,                                         //"H"
  42          a+f+e+d,                                           //"C"
  43          d+e+f,                                             //"L"
  44          g,                                                         //"-"
  45          0x00                                               //black
  46          };
  47          
  48          #undef a
  49          #undef b
  50          #undef c
  51          #undef d
  52          #undef e
  53          #undef f
  54          #undef g
  55          
C51 COMPILER V8.02   测量温度                                                              07/13/2008 20:50:07 PAGE 2   

  56          #define SP 14                                                                   
  57          /********************************************************/
  58          /*                           初始化系统                                         */
  59          /********************************************************/
  60          void Sys_Init()                 
  61          {
  62   1        TMOD=0x01;
  63   1        TH0=(65536-1000)/256;          //1ms
  64   1        TL0=(65536-1000)%256; 
  65   1        EA=1;
  66   1        ET0=1;
  67   1        TR0=1;
  68   1      }
  69          
  70          /*********************************************************/
  71          /*                        初始化DS18B20                                          */
  72          /*********************************************************/ 
  73          void Init_DS18B20(void)         //初始化函数
  74          {
  75   1        unsigned char x=0;
  76   1        DQ = 1;         //DQ复位
  77   1        delay(8);       //稍做延时
  78   1        DQ = 0;         //pull DQ line low
  79   1        delay(80);      //leave it low for 480~960us
  80   1        DQ = 1;         //allow line to return high
  81   1        delay(14);      //wait for presence 15~60us
  82   1        x=DQ;           //稍做延时后 如果x=0则初始化成功
  83   1        delay(20);      //                       x=1则初始化失败
  84   1      }
  85          /*********************************************************/
  86          /*                          读一个字节                                           */
  87          /*********************************************************/ 
  88          unsigned char Read_byte(void)
  89          {
  90   1      unsigned char i=0;
  91   1      unsigned char dat=0;
  92   1      for (i=8;i>0;i--)
  93   1      {
  94   2        DQ = 0;         // 给脉冲信号
  95   2        dat>>=1;
  96   2        DQ = 1;         // 给脉冲信号
  97   2        if(DQ)
  98   2         dat|=0x80;     // 取数据最高位
  99   2        delay(4);
 100   2      }
 101   1      return(dat);
 102   1      }
 103          
 104          /*********************************************************/
 105          /*                            写一个字节                                         */
 106          /*********************************************************/
 107          void Write_byte(unsigned char dat)
 108          {
 109   1      unsigned char i=0;
 110   1      for (i=8; i>0; i--)
 111   1      {
 112   2        DQ = 0;
 113   2        DQ = dat&0x01;                   //取数据最低位
 114   2        delay(5);
 115   2        DQ = 1;
 116   2        dat>>=1;
 117   2      }
C51 COMPILER V8.02   测量温度                                                              07/13/2008 20:50:07 PAGE 3   

 118   1      delay(4);
 119   1      }
 120          
 121          /*********************************************************/
 122          /*                              读取温度                                         */
 123          /*********************************************************/
 124          ReadTemperature(void)                            
 125          {
 126   1      unsigned char a=0;
 127   1      unsigned char b=0;
 128   1      unsigned char t=0;
 129   1      
 130   1      Init_DS18B20();
 131   1      
 132   1      Write_byte(0xCC); // 跳过读序号列号的动作  因为只有一个器件
 133   1      Write_byte(0x44); // 启动温度转换
 134   1      
 135   1      Init_DS18B20();
 136   1      
 137   1      Write_byte(0xCC); //跳过读序号列号的动作
 138   1      Write_byte(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
 139   1      a=Read_byte();    //读取温度值低位
 140   1      b=Read_byte();    //读取温度值高位
 141   1      //a=a>>4;         //低位右移4位,舍弃小数部分
 142   1      //b=b<<4;         //高位左移4位,舍弃符号位
 143   1      //t=b|a;
 144   1      //return(t);
 145   1      t=(b*256+a)*10/16;
 146   1      if(t!=temp)
 147   1      {
 148   2              beep(5000);
 149   2              temp=t;
 150   2      }
 151   1      return((b*256+a)*10/16); //     b*256+a  把两个8位温度变成16位
 152   1      }                                                // *10      扩大10倍从而保留小数位
 153                                                           // /16      把18b20的输出换算成实际温度,
 154                                                           //          显示时的小数点视情况而定
 155          
 156          /*********************************************************/
 157          /*                              温度显示函数                             */
 158          /*********************************************************/
 159          void DisplayNumber(unsigned int Num)    
 160          {
 161   1              unsigned char i;
 162   1              EA=0;
 163   1              for(i=0;i<4;i++)
 164   1              {
 165   2              DisBuff[i]=Num%10;
 166   2              Num/=10;
 167   2              }
 168   1      /*        if(DisBuff[3]==0)
 169   1                {
 170   1                   DisBuff[3]=0xff;   
 171   1                   if(DisBuff[2]==0)
 172   1                    {
 173   1                      DisBuff[2]=0xff;        
 174   1                      if(DisBuff[1]==0)
 175   1                                DisBuff[1]=0xff;
 176   1                    }
 177   1                }       */
 178   1      for(i=3;i>=0;i--)                                                   //消隐无效"0"
 179   1         {
C51 COMPILER V8.02   测量温度                                                              07/13/2008 20:50:07 PAGE 4   

 180   2               if(DisBuff[i]==0) DisBuff[i]=SP;
 181   2               else break;
 182   2         }
 183   1              delay(100);     
 184   1              EA=1;
 185   1      
 186   1      } 
 187          /*********************************************************/
 188          /*                            数码管扫描选通                                 */
 189          /*********************************************************/
 190          void Display_Scan() interrupt 1        //中断1触发时,就会指向该函数执行
 191          {                                                                          //并且保留现场,该函数完成后,回到入口,
 192   1      TR0=0;                                                             //从原现场继续执行,等待下次中断发生
 193   1        TH0=(65536-1000)/256;                            //1ms
 194   1        TL0=(65536-1000)%256;  
 195   1      TR0=1;
 196   1      
 197   1              if(COM>3) COM=0;
 198   1              COM1=1;COM2=1;COM3=1;COM4=1;
 199   1          switch(COM)
 200   1          {
 201   2              case 0: P0=LED_table[DisBuff[0]]; COM1=0; break;
 202   2          case 1: P0=LED_table[DisBuff[1]]|0x20; COM2=0; break;        //在数码管第二位上点亮小数点
 203   2              case 2: P0=LED_table[DisBuff[2]]; COM3=0; break;
 204   2              case 3: P0=LED_table[DisBuff[3]]; COM4=0; break;
 205   2          }
 206   1              COM++;                                   
 207   1      }
 208          
 209          /*********************************************************/
 210          /*                               延时子程序                                      */
 211          /*********************************************************/
 212          void delay(unsigned int i)
 213          {
 214   1           while(i--);
 215   1          
 216   1      }
 217          
 218          /*********************************************************/
 219          /*                               蜂鸣器                                          */
 220          /*********************************************************/
 221          void beep(unsigned int i)
 222          {
 223   1              BEEP = 0;
 224   1              while(i--) {}
 225   1              BEEP = 1;
 226   1      }
 227          
 228          /*********************************************************/
 229          /*                               主函数                                          */
 230          /*********************************************************/
 231          void main(void)
 232          {
 233   1         unsigned int temp;
 234   1         Sys_Init();
 235   1         while(1)                         //死循环
 236   1         {
 237   2          temp=ReadTemperature();
 238   2          DisplayNumber(temp);
 239   2         }
 240   1      }
 241          
C51 COMPILER V8.02   测量温度                                                              07/13/2008 20:50:07 PAGE 5   

 242          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    484    ----
   CONSTANT SIZE    =     15    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      6      11
   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 + -