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

📄 1.lst

📁 实现精确的温度测量,达到+-0.5度,并可测温范围从-55到+85.
💻 LST
字号:
C51 COMPILER V7.06   1                                                                     01/22/2008 23:08:41 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE 1
OBJECT MODULE PLACED IN 1.OBJ
COMPILER INVOKED BY: D:\Program Files\C51\BIN\C51.EXE 1.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include<reg51.h>
   2          #define uchar unsigned char
   3          #define uint  unsigned int
   4          uchar l,m,s;
   5          sbit diao=P3^5;
   6          
   7          uchar tplsb,tpmsb;//温度值低位,高位字节
   8          sbit DQ=P3^7;//数据通信线
   9          
  10          /*延时t毫秒*/
  11          void delay(uint t)
  12          {  uint i;
  13   1         while(t--)
  14   1         { 
  15   2            /*对于11。0592MHZ时钟,约延时1ms*/
  16   2            for(i=0;i<125;i++)
  17   2            {}
  18   2         }
  19   1      }
  20          /*产生复位脉冲初始化DS18B20*/
  21          void TxReset(void)
  22          {
  23   1         uint i;
  24   1         DQ=0;
  25   1         /*拉低约900us*/
  26   1         i=100;
  27   1         while(i>0) i--;
  28   1                        //产生上升沿
  29   1         DQ=1;
  30   1         i=4;
  31   1         while(i>0)  i--;
  32   1      }
  33          /*等待应答脉冲*/
  34          void RxWait(void)
  35          {
  36   1         uint i;
  37   1         while(DQ);   //检测到应答脉冲
  38   1         i=4;
  39   1         while(i>0) i--;
  40   1      }
  41          /*读取数据的一位,满足读时隙要求*/
  42          bit RdBit(void)
  43          {
  44   1         uint i;
  45   1         bit b;
  46   1         DQ=0;
  47   1         i++;          //保持低至少1us
  48   1         DQ=1;
  49   1         i++;i++;      //延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
  50   1         b=DQ;
  51   1         i=8;
  52   1         while(i>0)  i--;//读时隙不低于60us
  53   1         return(b);  
  54   1      }
  55          /*读数据的一个字节*/
C51 COMPILER V7.06   1                                                                     01/22/2008 23:08:41 PAGE 2   

  56          uchar RdByte(void)
  57          {
  58   1         uchar i,j,b;
  59   1         b=0;
  60   1         for(i=1;i<=8;i++)
  61   1         {
  62   2            j=RdBit();
  63   2            b=(j<<7)|(b>>1);
  64   2         }
  65   1         return(b);
  66   1      }
  67          /*写数据的一个字节,满足写1和写0的时隙要求*/
  68          void WrByte(uchar b)
  69          {
  70   1         uint i;
  71   1         uchar j;
  72   1         bit btmp;
  73   1         for(j=1;j<=8;j++)
  74   1         {
  75   2            btmp=b&0x01;
  76   2            b=b>>1;        //取下一位(由低位向高位)
  77   2            if(btmp)
  78   2            {
  79   3              /*写1*/
  80   3              DQ=0;     //延时,使得15us以内拉高
  81   3              i++;i++;
  82   3              DQ=1;
  83   3              i=8;
  84   3              while(i>0)  i--; //整个写1时隙不低于60us
  85   3            }
  86   2            else 
  87   2            {
  88   3              /*写0*/
  89   3              DQ=0;
  90   3              i=8;
  91   3              while(i>0)  i--;//保持低在60~120us之间
  92   3              DQ=1;
  93   3              i++;
  94   3              i++;
  95   3            }
  96   2         } 
  97   1      }
  98          /*启动温度转换*/
  99          void convert(void)
 100          {
 101   1         TxReset();      //产生复位脉冲,初始化DS18B20
 102   1         RxWait();       //等待DS18B20给出应答脉冲
 103   1         delay(1);       //延时
 104   1         WrByte(0xcc);   //skip rom命令
 105   1         WrByte(0x44);   //convert T命令
 106   1      }
 107          /*读取温度值*/
 108          void RdTemp(void)
 109          {  uchar i;
 110   1         TxReset();      //产生复位脉冲,初始化DS18B20
 111   1         RxWait();       //等待DS18B20给出应答脉冲
 112   1         delay(1);       //延时
 113   1         WrByte(0xcc);   //skip rom命令
 114   1         WrByte(0xbe);   //read scratchpad命令
 115   1         tplsb=RdByte(); //温度值低位字节(其中低4位为二进制的“小数”部分)
 116   1         tpmsb=RdByte(); //温度值高位字节(其中高5位为符号位)
 117   1         for(i=0;i<4;i++) {tpmsb=tpmsb<<1;}
C51 COMPILER V7.06   1                                                                     01/22/2008 23:08:41 PAGE 3   

 118   1         m=tpmsb&0x7f;
 119   1         for(i=0;i<4;i++) {tplsb=tplsb>>1;}
 120   1         s=m|tplsb;
 121   1         //if(s) diao=1;
 122   1         
 123   1      }
 124          /*主程序,读取的温度值最终存放在tplsb和tpmsb变量中。tplsb中的低4位为二进制的“小数”部分;
 125             tpmsb中的高5位为符号位,真正通过数码管输出时,需要进行到十进制有符号实数(包括小数部分) 的转换*/
 126          
 127          uchar data_table[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x63,0x39};//共阴
 128          //uchar data_table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳
 129          uchar display(uchar x)
 130          {  
 131   1        P0=data_table[(x/10)%10];P2=0x8f;
 132   1        //P2=0xfe;
 133   1        delay(1);
 134   1        P0=data_table[x%10];P2=0x4f;
 135   1        //P2=0xfd;
 136   1        delay(1);
 137   1        P0=data_table[10];P2=0x2f;
 138   1        //P2=0xfb;
 139   1        delay(1);
 140   1        P0=data_table[11];P2=0x1f;
 141   1        //P2=0xf7;
 142   1        delay(1);/**/
 143   1      }
*** WARNING C173 IN LINE 143 OF 1.C: missing return-expression
 144          /*void time0(void) interrupt 1
 145          { 
 146            TH0=20000/256;
 147            TL0=20000%256;
 148            display(s);
 149            if(tplsb==1) P1=0xf0;
 150            delay(1000);
 151          }*/
 152          void main(void)
 153          { //uchar i;
 154   1         //P0=0x00;
 155   1          //P2=0xff;
 156   1        /* TMOD=0x01;
 157   1         TR0=1;
 158   1         EA=1;
 159   1         ET0=1;
 160   1         TH0=20000/256;
 161   1         TL0=20000%256;*/
 162   1         //do
 163   1         //{
 164   1            diao=0;
 165   1            delay(1);    //延时1ms
 166   1            convert();   //启动温度转换,需要750ms
 167   1            delay(1000); //延时1s
 168   1            RdTemp();    //读取温度
 169   1                while(1)
 170   1                {display(s);diao=1;}
 171   1        //}
 172   1        //while(1);
 173   1      }
 174          
 175          
 176          
 177          
 178          
C51 COMPILER V7.06   1                                                                     01/22/2008 23:08:41 PAGE 4   

 179          
 180          
 181          
 182          
 183          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    391    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     17    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  1 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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