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

📄 测量温度.lst

📁 ds18b20的测温程序
💻 LST
字号:
C51 COMPILER V8.02   测量温度                                                              02/07/2008 13:19:49 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE 测量温度
OBJECT MODULE PLACED IN 测量温度.OBJ
COMPILER INVOKED BY: C:\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          
   7          
   8          unsigned char DisBuff[4];
   9          unsigned char COM; 
  10          
  11          sbit COM1=P2^7;    //定义通信端口               
  12          sbit COM2=P2^4;
  13          sbit COM3=P2^5;
  14          sbit COM4=P2^6;
  15          sbit   DQ=P3^7;  
  16          
  17          
  18          #define a 0x04                  //  AAAA
  19          #define b 0x01                                  // F    B
  20          #define c 0x10                                  // F    B
  21          #define d 0x40                                  //  GGGG
  22          #define e 0x80                                  // E    C
  23          #define f 0x02                                  // E    C
  24          #define g 0x08                                  //  DDDD    H
  25          #define h 0x20                  
  26          
  27          unsigned char code LED_table[]={
  28          a+b+c+d+e+f,                               //"0"
  29          b+c,                                               //"1"
  30          a+b+d+e+g,                                         //"2"
  31          a+b+c+d+g,                                         //"3"
  32          b+c+f+g,                                           //"4"
  33          a+c+d+f+g,                                         //"5"
  34          a+c+d+e+f+g,                               //"6"
  35          a+b+c,                                             //"7"
  36          a+b+c+d+e+f+g,                             //"8"
  37          a+b+c+d+f+g,                               //"9"
  38          b+c+e+f+g,                                         //"H"
  39          a+f+e+g,                                           //"C"
  40          d+e+f,                                             //"L"
  41          g,                                                         //"-"
  42          0x00                                               //black
  43          };
  44          
  45          #undef a
  46          #undef b
  47          #undef c
  48          #undef d
  49          #undef e
  50          #undef f
  51          #undef g
  52          
  53          #define SP 14                                                                   
  54          /********************************************************/
  55          /*                           初始化系统                                         */
C51 COMPILER V8.02   测量温度                                                              02/07/2008 13:19:49 PAGE 2   

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

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

 180          /*********************************************************/
 181          void Display_Scan() interrupt 1        //中断1触发时,就会指向该函数执行
 182          {                                                                          //并且保留现场,该函数完成后,回到入口,
 183   1      TR0=0;                                                             //从原现场继续执行,等待下次中断发生
 184   1        TH0=(65536-1000)/256;                            //1ms
 185   1        TL0=(65536-1000)%256;  
 186   1      TR0=1;
 187   1              
 188   1              if(COM>3) COM=0;
 189   1              COM1=1;COM2=1;COM3=1;COM4=1;
 190   1          switch(COM)
 191   1          {
 192   2              case 0: P0=LED_table[DisBuff[0]]; COM1=0; break;
 193   2          case 1: P0=LED_table[DisBuff[1]]|0x20; COM2=0; break;        //在数码管第二位上点亮小数点
 194   2              case 2: P0=LED_table[DisBuff[2]]; COM3=0; break;
 195   2              case 3: P0=LED_table[DisBuff[3]]; COM4=0; break;
 196   2          }
 197   1              COM++;                                   
 198   1      }
 199          
 200          /*********************************************************/
 201          /*                               延时子程序                                      */
 202          /*********************************************************/
 203          void delay(unsigned int i)
 204          {
 205   1           while(i--);
 206   1          
 207   1      }
 208          /*********************************************************/
 209          /*                               主函数                                          */
 210          /*********************************************************/
 211          void main(void)
 212          {
 213   1         unsigned int temp;
 214   1         Sys_Init();
 215   1         while(1)                         //死循环
 216   1         {
 217   2          temp=ReadTemperature();
 218   2          DisplayNumber(temp);
 219   2         }
 220   1      }
 221          
 222          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    422    ----
   CONSTANT SIZE    =     15    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      5      10
   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 + -