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

📄 18b20.lst

📁 读取DS18B20温度传感器程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   18B20                                                                 12/07/2007 03:15:42 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE 18B20
OBJECT MODULE PLACED IN 18B20.OBJ
COMPILER INVOKED BY: C:\tools\Keil\C51\BIN\C51.EXE 18B20.C BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include <intrins.h>
   2          #include <reg52.h>
   3          #define Uchar unsigned char
   4          #define Uint  unsigned int
   5          #define SomeNOP(); _nop_();
   6          sbit DQ = P3^7;                                         //18B20温度传感器
   7          sbit JDQ = P3^6;                                        //继电器输出
   8          //LCD1602的口线接法
   9          sbit E=P2^2;
  10          sbit RW=P2^1;
  11          sbit RS=P2^0;   
  12          /*I2C总线要用到的口线定义*/
  13          sbit SDA = P3^4;
  14          sbit SCL = P3^3;
  15          
  16          //以下为函数声明
  17          void TempDelay(unsigned char us);
  18          void Ds18b20_rst(void);
  19          void WriteByte(unsigned char wrdat);
  20          unsigned char ReadByte(void);
  21          void Delay(unsigned int t);   // delay 40us
  22          void SendCommandByte(unsigned char ch);
  23          void SendDataByte(unsigned char ch);
  24          void InitLcd();
  25          //I2C驱动要用到的一些函数
  26          void Delay_1ms(Uchar time);
  27          void I2CStart(void);    
  28          void I2CStop(void);
  29          void AutoACK(void);             //在一定的时间内自动确定ACK的信号//
  30          void Writex(Uchar j);
  31          Uchar Readx(void);
  32          void X24_Write(Uchar Addresslow,Uchar Write_date);
  33          Uchar X24_Read(Uchar Addresslow);
  34          void ramini(void);
  35          void time0(void);
  36          
  37          union                                                                                   
  38          {
  39                  unsigned int iInt;
  40                  unsigned char cChar[2];
  41          }TMP;                           
  42          
  43          unsigned int nowwd,highwd;              //当前的温度,设定报警
  44          unsigned char keyscan,teml,temh;
  45          unsigned char dssttime,svtime;
  46          unsigned char bdata myflag1;
  47          sbit keybit = myflag1^0;                        //按键标志
  48          sbit dsokbit = myflag1^1;                       //DS18B20在线
  49          sbit dsstbit = myflag1^2;
  50          sbit dsfubit = myflag1^3;
  51          sbit newwdbit = myflag1^4;
  52          sbit newjrbit = myflag1^5;
  53          sbit setjrbit = myflag1^6;
  54          void main(void)
  55          {
C51 COMPILER V7.06   18B20                                                                 12/07/2007 03:15:42 PAGE 2   

  56   1              TH0=0xf8;
  57   1              TL0=0xce;
  58   1              TMOD=0x01;
  59   1              TR0=1;
  60   1              keyscan=50;
  61   1              InitLcd();
  62   1              ramini();
  63   1        SendCommandByte(0x80);  //设置DDRAM地址
  64   1              SendDataByte('T');
  65   1              SendDataByte('e');
  66   1              SendDataByte('m');
  67   1              SendDataByte('p');
  68   1              SendDataByte(':');
  69   1      
  70   1        SendCommandByte(0xC0);  //设置DDRAM地址
  71   1              SendDataByte('S');
  72   1              SendDataByte('e');
  73   1              SendDataByte('t');
  74   1              SendDataByte(' ');
  75   1              SendDataByte(':');
  76   1              IE=0x82;        
  77   1              newjrbit=1;
  78   1              while(1){}
  79   1      }
  80          
  81          void time0(void) interrupt 1
  82          {
  83   1              unsigned char k,p;
  84   1              TH0=0xf8;                                       //2ms
  85   1              TL0=0xce;
  86   1              if(keyscan--==0)
  87   1              {
  88   2                      keyscan=50;
  89   2                      k=P1;k=k&0x03;
  90   2                      if(k!=0x03)
  91   2                      {
  92   3                                      switch(k)
  93   3                                      {
  94   4                                              case 0x02: 
  95   4                                                      if(keybit==0){keybit=1;highwd++;setjrbit=1;svtime=30;newjrbit=1;}break;
  96   4                                              case 0x01: 
  97   4                                                      if(keybit==0){keybit=1;highwd--;setjrbit=1;svtime=30;newjrbit=1;}break;         
  98   4                                      }
  99   3                                      
 100   3                      }
 101   2                      else{keybit=0;} 
 102   2                      if(setjrbit==1)
 103   2                      {
 104   3                              if(svtime--==0)
 105   3                              {
 106   4                                      TMP.iInt=highwd;
 107   4                                      X24_Write(0x10,TMP.cChar[0]);
 108   4                                      X24_Write(0x11,TMP.cChar[1]);
 109   4                                      setjrbit=0;
 110   4                              }       
 111   3                      }       
 112   2                      if(dsstbit==0)  //采集温度值
 113   2                      {
 114   3                              Ds18b20_rst();
 115   3                              if(dsokbit==1)
 116   3                              {
 117   4                                      WriteByte(0xCC);        //忽略ROM匹配 
C51 COMPILER V7.06   18B20                                                                 12/07/2007 03:15:42 PAGE 3   

 118   4                                      WriteByte(0x44); //发送温度转化命令 
 119   4                                      dsstbit=1;dssttime=0x07;
 120   4                              }       
 121   3                      }
 122   2                      else
 123   2                      {
 124   3                              if(dssttime--==0)
 125   3                              {
 126   4                                      Ds18b20_rst();
 127   4                                      if(dsokbit==1)
 128   4                                      {
 129   5                                              WriteByte(0xCC);
 130   5                                              WriteByte(0xBE);
 131   5                                              teml=ReadByte();
 132   5                                              temh=ReadByte();
 133   5                                              k=temh&0xfc;
 134   5                                              if(k!=0xfc)
 135   5                                              {
 136   6                                                      k=(temh<<4)&0xf0;p=(teml>>4)&0x0f;
 137   6                                                      k=k|p;
 138   6      
 139   6                                                      nowwd=k*10;
 140   6                                                      k=teml&0x0f;k=k*10;p=k/16;
 141   6                                                      if((k%16)>5){p=p+1;}
 142   6                                                      nowwd=nowwd+p;
 143   6                                                      dsstbit=0;dsfubit=0;
 144   6                                              }
 145   5                                              else
 146   5                                              {
 147   6                                                      k=(temh<<4)&0xf0;p=(teml>>4)&0x0f;
 148   6                                                      k=k|p;
 149   6                                                      k=(~k);
 150   6                                                      nowwd=k*10;
 151   6                                                      k=(teml&0x0f)|0xf0;k=~k;k=k*10;p=k/16;
 152   6                                                      if((k%16)>5){p=p+1;}
 153   6                                                      nowwd=nowwd+p;
 154   6                                                      dsstbit=0;dsfubit=1;            
 155   6                                              }                       
 156   5                                              newwdbit=1;
 157   5                                      }       
 158   4                              }
 159   3                      }                               
 160   2              }
 161   1              
 162   1              if(newwdbit==1)
 163   1              {
 164   2                      newwdbit=0;
 165   2                      if(nowwd<highwd){JDQ=1;}else{JDQ=0;}
 166   2                      SendCommandByte(0x87);  //设置DDRAM地址 
 167   2                      
 168   2                      k=(Uchar)(nowwd/1000);
 169   2                      k=k+0x30;
 170   2                      SendDataByte(k);
 171   2                      k=(Uchar)((nowwd%1000)/100);
 172   2                      k=k+0x30;
 173   2                      SendDataByte(k);
 174   2                      k=(Uchar)((nowwd%100)/10);
 175   2                      k=k+0x30;
 176   2                      SendDataByte(k);
 177   2                      SendDataByte('.');              
 178   2                      k=(Uchar)(nowwd%10);
 179   2                      k=k+0x30;
C51 COMPILER V7.06   18B20                                                                 12/07/2007 03:15:42 PAGE 4   

 180   2                      SendDataByte(k);
 181   2              }       
 182   1              
 183   1              if(newjrbit==1)
 184   1              {
 185   2                      newjrbit=0;
 186   2                      SendCommandByte(0xc7);  //设置DDRAM地址 
 187   2                      
 188   2                      k=(Uchar)(highwd/1000);
 189   2                      k=k+0x30;
 190   2                      SendDataByte(k);
 191   2                      k=(Uchar)((highwd%1000)/100);
 192   2                      k=k+0x30;
 193   2                      SendDataByte(k);
 194   2                      k=(Uchar)((highwd%100)/10);
 195   2                      k=k+0x30;
 196   2                      SendDataByte(k);
 197   2                      SendDataByte('.');              
 198   2                      k=(Uchar)(highwd%10);
 199   2                      k=k+0x30;
 200   2                      SendDataByte(k);
 201   2              }       
 202   1      }
 203          
 204          //18B20要用到的一些函数
 205          void TempDelay(unsigned char us)        //延时
 206          {
 207   1              while(us--);
 208   1      }
 209          void Ds18b20_rst(void)                  //18B20复位
 210          {
 211   1              DQ=1;
 212   1              _nop_();
 213   1              DQ=0;
 214   1              TempDelay(86);
 215   1              _nop_();
 216   1              DQ=1;
 217   1              TempDelay(14);
 218   1              _nop_();
 219   1              _nop_();
 220   1              _nop_();
 221   1              if(DQ==0){dsokbit=1;}
 222   1              else{dsokbit=0;}
 223   1              TempDelay(20);
 224   1              _nop_();
 225   1              _nop_();
 226   1              DQ=1;   
 227   1      }
 228          void WriteByte(unsigned char wrdat)             //向18B20写入一字节
 229          {
 230   1              unsigned char i;
 231   1              for(i=0;i<8;i++)
 232   1              {
 233   2                      DQ=0;
 234   2                      _nop_();
 235   2                      DQ=wrdat&0x01;
 236   2                      TempDelay(5);
 237   2                      _nop_();
 238   2                      _nop_();
 239   2                      DQ=1;
 240   2                      wrdat>>=1;
 241   2              }
C51 COMPILER V7.06   18B20                                                                 12/07/2007 03:15:42 PAGE 5   

 242   1      }
 243          
 244          unsigned char ReadByte(void)                    //读18B20的一个字节
 245          {
 246   1              unsigned char i,u=0;
 247   1              for(i=0;i<8;i++)
 248   1              {
 249   2                      DQ=0;
 250   2                      u>>=1;

⌨️ 快捷键说明

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