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

📄 ds18b20的应用.lst

📁 单总线通信协议
💻 LST
字号:
C51 COMPILER V8.02   DS18B20的应用                                                         05/12/2008 14:59:02 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE DS18B20的应用
OBJECT MODULE PLACED IN DS18B20的应用.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DS18B20的应用.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<reg51.h>
   2          #include<intrins.h>
   3          #include<absacc.h>
   4          #define uchar unsigned char
   5          #define uint unsigned int
   6          sbit DQ    = P2^0;     //定义DS18B20端口DQ  
   7          sbit RS    = P3^5;
   8          sbit RW    = P3^6;
   9          sbit E     = P3^7;
  10          uchar temp_data_l,temp_data_h;
  11          uchar code  LCDData[10]= {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
  12          uchar code  ditab[16]  = {0x30,0x31,0x31,0x32,0x33,0x33,0x34,0x34,0x35,0x36,0x36,0x37,0x38,0x38,0x39,0x39}
             -;
  13          uchar code  table2[16] = {0x74,0x65,0x6d,0x70,0x65,0x72,0x61,0x74,0x75,0x72,0x65,0x20,0x69,0x53,0x20,0x3a}
             -;
  14          uchar       display[7] = {0x00,0x00,0x00,0x2e,0x00,0xdf,0x43}; 
  15          //*********************************
  16          //          延时程序
  17          //*********************************
  18          void delay(uint N)
  19          {
  20   1        uint i;
  21   1        for(i=0;i<N;i++);
  22   1      }
  23          //**********************************
  24          //        初始化ds18B20程序
  25          //**********************************
  26          
  27          bit resetpulse(void)
  28          {
  29   1              
  30   1              DQ=0;
  31   1              //delay600us();                         //延时500us
  32   1              delay(40);                                      //延时500us
  33   1              DQ=1;
  34   1              //delay60us();                  // 延时60us
  35   1              delay(4);                               // 延时60us
  36   1              return(DQ);                             //读取P1.0的状态
  37   1      }
  38          /*************************************************************
  39          **功能:ds18b20的初始化                                                                         **
  40          **参数:无                                                                                              **
  41          *************************************************************/
  42          void ds18b20_init(void)
  43          {
  44   1              while(1)
  45   1              {
  46   2                      if(!resetpulse())       //收到ds18b20的应答信号
  47   2                      {       
  48   3                              DQ=1;
  49   3                              //delay600us(); //延时240us
  50   3                              delay(40);              //延时240us
  51   3                              break;          
  52   3                      }
  53   2                      else
C51 COMPILER V8.02   DS18B20的应用                                                         05/12/2008 14:59:02 PAGE 2   

  54   2                              resetpulse();    //否则再发复位信号
  55   2              }
  56   1      }
  57          
  58          //************************************
  59          //         读一位程序
  60          //************************************
  61          uchar read_bit(void)
  62          {
  63   1       // uchar i;
  64   1        DQ=0;
  65   1        _nop_();
  66   1        _nop_();
  67   1        //_nop_();
  68   1        //_nop_();
  69   1        DQ=1;
  70   1        delay(2);
  71   1        //for(i=0;i<5;i++);
  72   1        return(DQ);
  73   1       }
  74          //*************************************
  75          //         读一个字节程序
  76          //*************************************
  77          uchar read_byte(void)
  78          {
  79   1       uchar i,m,receive_data;
  80   1       m=1;
  81   1       receive_data=0;
  82   1       for(i=0;i<8;i++)
  83   1       {
  84   2        if(read_bit())
  85   2         {
  86   3         receive_data=receive_data+(m<<i);
  87   3         }
  88   2         delay(7);
  89   2         }
  90   1        return(receive_data);
  91   1      }
  92          //**************************************
  93          //          写一位程序
  94          //**************************************
  95          void write_bit(uchar bitval)
  96          {
  97   1       DQ=0;
  98   1       if(bitval==1)
  99   1       DQ=1;
 100   1       delay(5);
 101   1       DQ=1;
 102   1       }
 103          //***************************************
 104          //       向DS18B20写一个字节命令程序
 105          //***************************************
 106          void write_byte(uchar val)
 107          {
 108   1       uchar i,temp;
 109   1       for(i=0;i<8;i++)
 110   1       {
 111   2        temp=val>>i;
 112   2        temp=temp&0x01;
 113   2        write_bit(temp);
 114   2        delay(5);
 115   2        }
C51 COMPILER V8.02   DS18B20的应用                                                         05/12/2008 14:59:02 PAGE 3   

 116   1      }
 117          //*****************************************
 118          //   启动温度转换及读出温度值
 119          //*****************************************
 120          void read_T(void)
 121          {
 122   1           ds18b20_init();
 123   1           write_byte(0xCC);  // 跳过读序号列号的操作
 124   1           write_byte(0x44);  // 启动温度转换
 125   1               delay(500);
 126   1           ds18b20_init();
 127   1           write_byte(0xCC);  //跳过读序号列号的操作
 128   1           write_byte(0xBE);  //读取温度寄存器
 129   1           temp_data_l= read_byte();   //温度低8位
 130   1           temp_data_h = read_byte();   //温度高8位 
 131   1      }
 132          
 133          /*************************************************************
 134          **功能:判断LCD忙                                                                                       **
 135          **参数:无                                                                                              **
 136          *************************************************************/
 137          
 138          void check_busy(void)
 139          {
 140   1              
 141   1              while(1)
 142   1              {
 143   2              P1=0xff;
 144   2              E=0;
 145   2              _nop_();
 146   2              RS=0;
 147   2              _nop_();
 148   2              _nop_();
 149   2              RW=1;
 150   2              _nop_();
 151   2              _nop_();
 152   2              E=1;
 153   2              _nop_();
 154   2              _nop_();
 155   2              
 156   2              _nop_();
 157   2              _nop_();
 158   2              if((P1&0x80)==0)
 159   2              {
 160   3                      break;
 161   3                      
 162   3              }
 163   2              E=0;
 164   2              }
 165   1      }
 166          
 167          
 168          //******************************************
 169          //      将数据码写入LCD数据寄存器
 170          //******************************************      
 171          void write_command(uchar tempdata)
 172          {
 173   1          E=0;
 174   1              _nop_();
 175   1              _nop_();
 176   1              RS=0;
 177   1              _nop_();
C51 COMPILER V8.02   DS18B20的应用                                                         05/12/2008 14:59:02 PAGE 4   

 178   1              _nop_();
 179   1              RW=0;
 180   1              P1=tempdata;
 181   1              _nop_();
 182   1              _nop_();
 183   1              E=1;
 184   1              _nop_();
 185   1              _nop_(); 
 186   1              E=0;
 187   1              _nop_();
 188   1              check_busy();
 189   1      
 190   1      }
 191          //*******************************************
 192          //           写LCD1602使能程序
 193          //*******************************************
 194          void write_data(uchar tempdata)
 195          {
 196   1              E=0;
 197   1              _nop_();
 198   1              _nop_();
 199   1              RS=1;
 200   1              _nop_();
 201   1              _nop_();
 202   1              RW=0;
 203   1              P1=tempdata;
 204   1              _nop_();
 205   1              _nop_();
 206   1              E=1;
 207   1              _nop_();
 208   1              _nop_(); 
 209   1              E=0;
 210   1              _nop_();
 211   1              check_busy();
 212   1      
 213   1      }
 214          //*******************************************
 215          //         温度处理及显示
 216          //*******************************************
 217          void convert_T()//显示温度
 218          {
 219   1        uchar temp;
 220   1           if((temp_data_h&0xf0)==0xf0)
 221   1                 {
 222   2                    temp_data_l=~temp_data_l;
 223   2                    if(temp_data_l==0xff)
 224   2                      {
 225   3                              temp_data_l=temp_data_l+0x01;
 226   3                              temp_data_h=~temp_data_h;
 227   3                                      temp_data_h=temp_data_h+0x01;
 228   3                              }
 229   2                    else
 230   2                     {
 231   3                              temp_data_l=temp_data_l+0x01;
 232   3                              temp_data_h=~temp_data_h;
 233   3                 }
 234   2                                      display[4]=ditab[temp_data_l&0x0f];                       //查表得小数位的值
 235   2                              temp=((temp_data_l&0xf0)>>4)|((temp_data_h&0x0f)<<4);
 236   2                              display[0]=0x2d;
 237   2                              display[1]=LCDData[(temp%100)/10];
 238   2                              display[2]=LCDData[(temp%100)%10];
 239   2                 }
C51 COMPILER V8.02   DS18B20的应用                                                         05/12/2008 14:59:02 PAGE 5   

 240   1         else
 241   1             {  
 242   2                              display[4]=ditab[temp_data_l&0x0f];                       //查表得小数位的值
 243   2                              temp=((temp_data_l&0xf0)>>4)|((temp_data_h&0x0f)<<4);
 244   2                              display[0]=LCDData[temp/100];
 245   2                              display[1]=LCDData[(temp%100)/10];
 246   2                              display[2]=LCDData[(temp%100)%10];
 247   2      
 248   2                  }
 249   1      }
 250          //********************************************
 251          //            初始化LCD1602
 252          //********************************************
 253          void init()
 254          {
 255   1       write_command(0x01);
 256   1       write_command(0x38);
 257   1       write_command(0x0C);
 258   1       write_command(0x06);
 259   1      }
 260          
 261          //********************************************
 262          //              显示子程序
 263          //********************************************
 264          void display_T(void)
 265          {
 266   1        uchar i;
 267   1        write_command(0x80);
 268   1        for(i=0;i<16;i++)
 269   1        {
 270   2          write_data(table2[i]);
 271   2        }
 272   1        write_command(0xc0);
 273   1        for(i=0;i<7;i++)
 274   1        {
 275   2          write_data(display[i]);
 276   2        } 
 277   1      }
 278          //********************************************
 279          //               主函数
 280          //********************************************
 281          void main(void)
 282          {
 283   1        init();
 284   1        while(1)
 285   1        {
 286   2          read_T();
 287   2          convert_T();
 288   2              display_T();
 289   2        }
 290   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    499    ----
   CONSTANT SIZE    =     42    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      9    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.

C51 COMPILER V8.02   DS18B20的应用                                                         05/12/2008 14:59:02 PAGE 6   


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

⌨️ 快捷键说明

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