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

📄 dianziqin.lst

📁 基于DS18B20和RS232的智能温度控制系统
💻 LST
字号:
C51 COMPILER V8.02   DIANZIQIN                                                             04/02/2007 20:26:21 PAGE 1   


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

line level    source

   1          /*****************************************/
   2          /*       基于DS18B20数字温度计           */
   3          /*                                       */
   4          /*              马泽民                               */
   5          /*****************************************/
   6          
   7          
   8          
   9          #include <reg52.h>                              // 引用标准库的头文件
  10          #include <absacc.h>
  11          #include <stdio.h>
  12          #include <math.h>
  13          #include<intrins.h>
  14          
  15          
  16          #define uchar unsigned char 
  17          #define uint unsigned int 
  18          
  19          sbit DIN = P1^0;                                        // 串行数据输入
  20          sbit CLK = P1^1;                                        // 串行时钟
  21          sbit LOAD = P1^3;                                       // 显示数据锁存控制
  22          sbit DQ = P3^3;                    // 数据通信线DQ
  23          sbit SQW =P3^5;                                    //报警线 
  24          sbit light=P2^0;                                   //报警灯 
  25          sbit motor_a=P3^0;
  26          sbit motor_b=P3^1;
  27          
  28          
  29          
  30          uchar TH0_temp,TL0_temp;
  31          uchar tplsb,tpmsb,tplsb_f,tpmsb_f;                        // 温度值低位、高位字节 
  32          uchar tm,tl,tm_f,tl_f,mp,tp;
  33          
  34          #define NoOp   0x00                     // 空操作寄存器
  35          #define Digit0 0x01                     // 数码管1寄存器
  36          #define Digit1 0x02                     // 数码管2寄存器
  37          #define Digit2 0x03                     // 数码管3寄存器
  38          #define Digit3 0x04                     // 数码管4寄存器
  39          
  40          #define DecodeMode 0x09                 // 译码模式寄存器
  41          #define Intensity 0x0a                          // 亮度寄存器
  42          #define ScanLimit 0x0b                  // 扫描位数寄存器
  43          #define ShutDown 0x0c                   // 低功耗模式寄存器
  44          #define DisplayTest 0x0f                // 显示测试寄存器
  45          
  46          #define ShutdownMode 0x00               // 低功耗方式
  47          #define NormalOperation 0x01            // 正常操作方式
  48          #define ScanDigit 0x04                  // 扫描位数设置,显示4位数码管
  49          #define DecodeDigit 0xff                // 译码设置,4位均为BCD码
  50          #define IntensityGrade 0x0f             // 亮度级别设置
  51          #define TestMode 0x01                   // 显示测试模式
  52          #define TextEnd 0x00                    // 显示测试结束,恢复正常工作模式
  53          
  54          
  55          /* 延时t毫秒 */
C51 COMPILER V8.02   DIANZIQIN                                                             04/02/2007 20:26:21 PAGE 2   

  56          void delay(uint t)
  57          {
  58   1              uint i;                                                                                                                                                                                             
             -                                                                                                    
  59   1              while(t--)
  60   1              {
  61   2                      /* 对于12M时钟,约延时1ms */
  62   2                      for (i=0;i<125;i++)
  63   2                      {}
  64   2              }
  65   1      }
  66          
  67          /* 向MAX7219写入字节(8位)*/
  68          void SendChar (uchar byte)
  69          {
  70   1              uchar i,temp;
  71   1          _nop_();
  72   1          for (i=0;i<8;i++)
  73   1          {
  74   2                      temp=byte&0x80;
  75   2              byte=byte<<1;
  76   2              if(temp)
  77   2              {
  78   3                      DIN=1;   //写1 
  79   3                      CLK=0;
  80   3                      CLK=1;
  81   3              }
  82   2              else
  83   2              {
  84   3                      DIN=0;     //写0 
  85   3                      CLK=0;
  86   3                      CLK=1;
  87   3              }
  88   2          }
  89   1      }
  90          
  91          /* 向MAX7219写入字(16位)*/
  92          void WriteWord (uchar addr,uchar num)
  93          {
  94   1          LOAD=0;
  95   1          _nop_();
  96   1          SendChar(addr);
  97   1          _nop_();
  98   1          SendChar(num);
  99   1          _nop_();
 100   1          LOAD=1;                             // 锁存进相应寄存器
 101   1      }
 102          
 103          /* MAX7219初始化 */
 104          void InitDisplay (void)
 105          {
 106   1          WriteWord (ScanLimit,ScanDigit);         // 设置扫描界限
 107   1          WriteWord (DecodeMode,DecodeDigit);      // 设置译码模式
 108   1          WriteWord (Intensity,IntensityGrade);    // 设置亮度
 109   1          WriteWord (ShutDown,NormalOperation);    // 设置为正常工作模式
 110   1      }
 111          
 112          /* 产生复位脉冲初始化DS18B20 */
 113          void TxReset(void)
 114          {
 115   1              uint i;
 116   1              DQ = 0;
C51 COMPILER V8.02   DIANZIQIN                                                             04/02/2007 20:26:21 PAGE 3   

 117   1      
 118   1              /* 拉低约900us */
 119   1              i = 100;
 120   1              while (i>0)     i--;    
 121   1              
 122   1              DQ = 1;                         // 产生上升沿
 123   1              i = 4;
 124   1              while (i>0)     i--;
 125   1      }
 126          
 127          /* 等待应答脉冲 */
 128          void RxWait(void)
 129          {
 130   1              uint i;
 131   1              while(DQ);
 132   1              while(~DQ);                     // 检测到应答脉冲 
 133   1              i = 4;
 134   1              while (i>0)     i--;
 135   1      }
 136          
 137          /* 读取数据的一位,满足读时隙要求 */ 
 138          bit RdBit(void)
 139          {
 140   1              uint i;
 141   1              bit b;
 142   1              DQ = 0;
 143   1              i++;
 144   1              DQ = 1;
 145   1              i++;i++;                        // 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
 146   1              b = DQ;
 147   1              i = 8;
 148   1              while(i>0) i--;
 149   1              return (b);
 150   1      }
 151          
 152          /* 读取数据的一个字节 */
 153          uchar RdByte(void)
 154          {
 155   1              uchar i,j,b;
 156   1              b = 0;
 157   1              for (i=1;i<=8;i++)
 158   1              {
 159   2                      j = RdBit();
 160   2                      b = (j<<7)|(b>>1);
 161   2              }
 162   1              return(b);
 163   1      }
 164          
 165          /* 写数据的一个字节,满足写1和写0的时隙要求 */
 166          void WrByte(uchar b)
 167          {
 168   1              uint i;
 169   1              uchar j;
 170   1              bit btmp;
 171   1              for(j=1;j<=8;j++)
 172   1              {
 173   2                      btmp = b&0x01;
 174   2                      b = b>>1;               // 取下一位(由低位向高位)
 175   2                      if (btmp)
 176   2                      {
 177   3                              /* 写1 */
 178   3                              DQ = 0;
C51 COMPILER V8.02   DIANZIQIN                                                             04/02/2007 20:26:21 PAGE 4   

 179   3                              i++;i++;        // 延时,使得15us以内拉高
 180   3                              DQ = 1;
 181   3                              i = 8;
 182   3                              while(i>0) i--; // 整个写1时隙不低于60us 
 183   3                      }
 184   2                      else
 185   2                      {
 186   3                              /* 写0 */
 187   3                              DQ = 0;                 
 188   3                              i = 8;
 189   3                              while(i>0) i--; // 保持低在60us到120us之间
 190   3                              DQ = 1;
 191   3                              i++;
 192   3                              i++;
 193   3                      }
 194   2              }
 195   1      }
 196          
 197          /* 启动温度转换 */
 198          void convert(void)
 199          {
 200   1              TxReset();                      // 产生复位脉冲,初始化DS18B20
 201   1              RxWait();                       // 等待DS18B20给出应答脉冲
 202   1              delay(1);                       // 延时
 203   1              WrByte(0xcc);           // skip rom 命令
 204   1              WrByte(0x44);           // convert T 命令
 205   1      }
 206          
 207          /* 读取温度值 */
 208          void RdTemp(void)
 209          {
 210   1              TxReset();                      // 产生复位脉冲,初始化DS18B20 
 211   1              RxWait();                       // 等待DS18B20给出应答脉冲
 212   1              delay(1);                       // 延时
 213   1              WrByte(0xcc);           // skip rom 命令
 214   1              WrByte(0xbe);           // read scratchpad 命令
 215   1              tplsb = RdByte();       // 温度值低位字节(其中低4位为二进制的“小数”部分)
 216   1              tpmsb = RdByte();       // 高位值高位字节(其中高5位为符号位)          
 217   1      }
 218          
 219          void INTT0() interrupt 1 
 220          {
 221   1              TH0=TH0_temp;
 222   1              TL0=TL0_temp;
 223   1              SQW=~SQW;
 224   1      }
 225          
 226          
 227          /* 主函数 */
 228          void main(void)
 229          { 
 230   1      
 231   1      TMOD=0x01;
 232   1      ET0     =1;
 233   1      EA      =1;
 234   1      TH0=0;
 235   1      TL0=0;
 236   1      TCON=0x10;
 237   1      TR0=0;
 238   1      InitDisplay ();                                                 // MAX7219初始化 
 239   1      WriteWord(DisplayTest,TestMode);                // 开始显示测试,点亮所有LED
 240   1      delay(1000);                                                    // 延时约1s
C51 COMPILER V8.02   DIANZIQIN                                                             04/02/2007 20:26:21 PAGE 5   

 241   1      WriteWord (DisplayTest,TextEnd);                // 退出显示测试模式
 242   1      light=1;
 243   1      
 244   1      while(1)
 245   1      {
 246   2      InitDisplay (); 
 247   2      delay(1);
 248   2      convert();
 249   2      delay(1000);
 250   2      RdTemp();                                                                                        
 251   2         
 252   2      if(((tpmsb>>3)&0x1f)==0x1f)
 253   2              {
 254   3                      tplsb_f=~tplsb+0x01;
 255   3                  if (tplsb==0)
 256   3                              { tpmsb_f=~tpmsb+1;}
 257   3                  else
 258   3                              { tpmsb_f=~tpmsb; }
 259   3                 
 260   3              tm_f=((tpmsb_f&0x07)<<4)*16+(tplsb_f&0xf0)>>4;
 261   3          tl_f=((tplsb_f&0x0f)*10)/16;
 262   3              WriteWord (Digit0,0x0a);
 263   3          WriteWord (Digit1,tm_f/10); 
 264   3          WriteWord (Digit2,((tm_f%10)|0x80));
 265   3          WriteWord (Digit3,tl_f);
 266   3              }
 267   2              else
 268   2          {
 269   3          tm=((tpmsb&0x07)<<4)*16+(tplsb&0xf0)>>4;
 270   3          tl=((tplsb&0x0f)*10)/16;
 271   3              WriteWord (Digit0,0);
 272   3          WriteWord (Digit1,tm/10); 
 273   3          WriteWord (Digit2,((tm%10)|0x80));
 274   3          WriteWord (Digit3,tl);
 275   3         if(tm>19)
 276   3         {  
 277   4          TH0_temp=0xFC;
 278   4          TL0_temp=0x5C;
 279   4              TR0=1;
 280   4              light=~light;
 281   4              
 282   4              }
 283   3      else
 284   3        {
 285   4       TR0=0;
 286   4       SQW=0;
 287   4       }
 288   3       }
 289   2       }
 290   1      }
 291          
 292          
 293          
 294          
 295          
 296          
 297          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    649    ----
   CONSTANT SIZE    =   ----    ----
C51 COMPILER V8.02   DIANZIQIN                                                             04/02/2007 20:26:21 PAGE 6   

   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     12    ----
   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 + -