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

📄 db18b20.lst

📁 DS18B20与AT89C4051驱动程序,解决了许多网站上出现的有些错误代码,现用在家里测温,直接可用
💻 LST
字号:
C51 COMPILER V8.08   DB18B20                                                               12/18/2007 20:49:08 PAGE 1   


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

line level    source

   1          /*   MCU:89C4051  P1.0,P1.1接10K左右上拉电阻,晶振11.0592M
   2          
   3          
   4          /*  sbit DQ=P3^7;        89C4051的11脚接DS18B20      */
   5          
   6          #include <reg52.h>
   7          #include <stdio.h>
   8          #include <intrins.h>
   9          
  10          #define uchar unsigned char
  11          #define uint  unsigned int
  12          #define _Nop() _nop_();
  13          #define Disdata P1             //段码输出口
  14          #define Discan  P3             //扫描口
  15          
  16          uint h;
  17          
  18          
  19          uint temp;
  20          sbit DQ=P3^7;
  21          sbit DIN=P1^7;
  22          
  23          //********温度小数部分用查表法*******//
  24          uchar code ditab[16]=
  25          {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
  26           
  27          uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
  28          ////*共阳LED段码表      0    1    2   3    4    5    6     7    8    9   不亮  -  */
  29          uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7};  //列扫描控制字
  30          uchar data temp_data[2]={0x00,0x00};   //读出温度暂放
  31          uchar display[5]={0x08,0x08,0x08,0x0b,0x00};//显示单元数据,共4个数据,一个运算暂存用
  32          
  33          /***************11us延时函数******************/ 
  34          //--------------------------------------------------------------------------------------------------
  35          // 函数名称: delay
  36          // 入口参数: N
  37          // 函数功能:延时子程序,实现(16*N+24)us的延时 
  38          // 系统采用11.0592MHz的时钟时,延时满足要求,其它情况需要改动
  39          //--------------------------------------------------------------------------------------------------
  40          void delay(uint t)
  41           {
  42   1              int i;
  43   1              for(i=0;i<t;i++);
  44   1       }
  45          
  46          /******************显示扫描函数******************/
  47          scan()
  48          {
  49   1              char k;
  50   1              for(k=0;k<4;k++)            //4位LED扫描控制
  51   1              {
  52   2                      Disdata=dis_7[display[k]];
  53   2                      if(k==1) {DIN=0;}
  54   2                  Discan=scan_con[k];delay(120);Discan=0xff;
  55   2              }
C51 COMPILER V8.08   DB18B20                                                               12/18/2007 20:49:08 PAGE 2   

  56   1      }
  57          /*************DS18B20复位函数*****************/
  58           
  59           uchar ow_reset(void)
  60           {
  61   1              
  62   1         uchar deceive_ready;
  63   1         DQ=0;                               //拉低DQ线  
  64   1         delay(35);                          //延时至少480us~960us(471uS)
  65   1         DQ=1;                               //将DQ线设置位逻辑高    
  66   1         delay(3);                           //延时等待deceive_ready响应 (54uS)
  67   1         deceive_ready=DQ;                   //采样deceive_ready信号
  68   1         delay(25);                          //等待时序结束 (340uS)
  69   1         return(deceive_ready);              //有deceive_ready信号时返回0,否则返回1
  70   1       }
  71           
  72           /************DS18B20写命令函数******************/ 
  73           //--------------------------------------------------------------------------------------------------
  74          // 函数名称: write_bit
  75          // 入口参数: bitval
  76          // 函数功能:写一个bit子程序 
  77          //--------------------------------------------------------------------------------------------------
  78          void write_bit(unsigned char bitval)
  79            {
  80   1          DQ=0;                            //拉低DQ线开始时序
  81   1          if(bitval==1)
  82   1          DQ=1;                             //如果写逻辑为高
  83   1          delay(5);                         //延时  (80uS)
  84   1          DQ=1;                             //升高DQ线 
  85   1      }
  86           //向1-WIRE总线上写1个字节
  87           
  88           void write_byte(uchar val)
  89           {
  90   1              uchar i,temp;
  91   1              for(i=0;i<8;i++)
  92   1              {
  93   2                temp=val>>i;                         //将val位右移i位赋值给比temp
  94   2            temp=temp&0x01;                      //取temp最低位
  95   2            write_bit(temp);
  96   2            delay(5);                           //延时至时序结束      (80uS)
  97   2           }
  98   1       }
  99          
 100           
 101           /************DS18B20读命令函数******************/ 
 102           //--------------------------------------------------------------------------------------------------
 103          // 函数名称:read_bit
 104          // 入口参数: 无
 105          // 返回接收的数据
 106          // 函数功能:读一个bit子程序 
 107          //--------------------------------------------------------------------------------------------------
 108          unsigned char read_bit(void)
 109          {
 110   1       unsigned char i;
 111   1       DQ=0;                                 //拉低DQ线开始时序
 112   1       DQ=1;                                 //升高DQ线                        
 113   1       for(i=0;i<3;i++);                                          //延时至时序开始15us
 114   1       return(DQ);                           //返回DQ值
 115   1      }
 116          //--------------------------------------------------------------------------------------------------
 117          // 函数名称: read_byte
C51 COMPILER V8.08   DB18B20                                                               12/18/2007 20:49:08 PAGE 3   

 118          // 返回接收的数据 value
 119          // 函数功能:读一个byte子程序 
 120          //--------------------------------------------------------------------------------------------------
 121          unsigned char read_byte(void)
 122          {unsigned char i,m,receive_data;
 123   1         m=1;receive_data=0;                          //初始化
 124   1         for(i=0;i<8;i++)
 125   1         {
 126   2          if(read_bit()) 
 127   2          {
 128   3           receive_data=receive_data+(m<<i);
 129   3           }                                            //每读一位数据据,左移一位  
 130   2         delay(6);                                    //延时至时序结束 (93uS)
 131   2         }  
 132   1       return(receive_data);                           //返回value
 133   1      }
 134                           
 135           /*******************读出温度函数******************/ 
 136           
 137           read_temp()
 138           {
 139   1              ow_reset();                                     //总线复位
 140   1              write_byte(0xCC);                               //发出跳过ROM命令
 141   1              write_byte(0xBE);                               //发读命令
 142   1          temp_data[0]=read_byte();                       //温度低8位
 143   1          temp_data[1]=read_byte();                       //温度高8位
 144   1          ow_reset();                                     //总线复位 */
 145   1              write_byte(0xCC);                               //发出跳过ROM命令
 146   1              write_byte(0x44);                               //发转换命令
 147   1       }
 148          
 149           /*****************温度处理函数******************/ 
 150           
 151           work_temp()
 152           {
 153   1              uchar n=0;
 154   1              if(temp_data[1]>127)
 155   1                      {temp_data[1]=(~temp_data[1]);temp_data[0]=((~temp_data[0])+1);n=1;} 
 156   1              //temp_data[0]=0x91;      temp_data[1]=0x01;  */
 157   1              //temp=temp_data[0]&0x0f;  //作为暂存
 158   1              //display[0]=ditab[temp];  //小数部分查表法
 159   1              //temp=((temp_data[0]>>4)|((temp_data[1]&0x07)<<4));
 160   1              temp=(temp_data[0]>>4)|((temp_data[1]&0x07)<<4);
 161   1              display[3]=temp/100;              //百位
 162   1          display[2]=temp%100/10;          //十位
 163   1              display[1]=temp%10;              //个位
 164   1              temp=(temp_data[0]&0x0f)*625;    
 165   1              display[0]=temp/1000;            //小数
 166   1      
 167   1        
 168   1        if(n)                                                          //温度为负数
 169   1         {
 170   2              if(!display[2])                                      //十位为0
 171   2                 {
 172   3                      display[3]=0x0a;                                 //百位不显示
 173   3                      display[2]=0x0b;                             // 十位显示负号
 174   3                 }        
 175   2              else
 176   2                 display[3]=0x0b;                                 //否则百位上显负号
 177   2         }
 178   1         else                                                             //温度为正数
 179   1         {
C51 COMPILER V8.08   DB18B20                                                               12/18/2007 20:49:08 PAGE 4   

 180   2          if(!display[3])                                                //百位为0
 181   2           {
 182   3             display[3]=0x0a;                   //dis_7[display[3]]=dis_7[10]=0xFF,为不显示
 183   3            if(!display[2])                                     //十位为0
 184   3            {
 185   4             display[2]=0x0a;                                   //十位不显示
 186   4                }
 187   3          } 
 188   2         }                                 
 189   1      }
 190          
 191          /**************************************/
 192          /*               主函数               */
 193          /**************************************/ 
 194          
 195           main()
 196          {
 197   1        Disdata=0xff;
 198   1        Discan=0xff;
 199   1      
 200   1        ow_reset();                    //开机复位
 201   1        write_byte(0xCC);              //跳过ROM
 202   1        write_byte(0x44);              //发出转换命令
 203   1        
 204   1        for(h=0;h<150;h++)                 //开机显示2秒的“8888”
 205   1        {
 206   2         scan();
 207   2        }
 208   1        
 209   1        while(1)
 210   1        {
 211   2         read_temp();                  //读出DS18B20温度数据
 212   2         work_temp();                  //处理温度数据         
 213   2         scan();                      //调用显示子程序 
 214   2       } 
 215   1      } 


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    438    ----
   CONSTANT SIZE    =     32    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     11    ----
   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 + -