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

📄 18b20.lst

📁 51单片机控制温度传感器DS18B20,4位数码管显示温度
💻 LST
字号:
C51 COMPILER V7.50   18B20                                                                 07/17/2008 13:04:26 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE 18B20
OBJECT MODULE PLACED IN 18b20.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE 18b20.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include "reg52.h"
   2          
   3          #include"intrins.h"
   4          #define  uch unsigned char                     //给unsigned char起别名 uch
   5          
   6          #define NOP()  _nop_ ()
   7          bit     read_flag=0;
   8          sbit  BEEP=P1^3;
   9          sbit  relay=P1^2;
  10          sbit  clk=P1^0;
  11          sbit  din=P1^1;
  12          sbit DQ=P2^0;
  13          unsigned char  code ledcode[]={0x11,0x7D,0x23,0x29,0x4D, 0x89,0x81,0x3D,0x01,0x09,0x05,\
  14          0xc1,0x8f,0x61,0x83,0x87}; //数码管段码
  15          
  16          
  17          //实验目的:熟悉DS18B20的使用
  18          //4位数码管显示温度结果,其中整数部分2位,小数部分2位
  19          //每次按下RB0键后进行一次温度转换。
  20          //硬件要求:把DS18B20插在18B20插座上
  21          //          拨码开关S10第1位置ON,其他位置OFF
  22          //          拨码开关S5、S6全部置ON,其他拨码开关全部置OFF
  23          
  24          
  25           
  26          
  27           unsigned char  TLV=0 ;                        //采集到的温度高8位
  28           unsigned char  THV=0;                         //采集到的温度低8位
  29           unsigned char TZ=0;                           //转换后的温度值整数部分
  30           unsigned char TX=0;                           //转换后的温度值小数部分
  31           unsigned int wd;                              //转换后的温度值BCD码形式
  32          
  33          unsigned char shi;                             //整数十位
  34          unsigned char ge;                              //整数个位
  35          unsigned char shifen;                          //十分位
  36          unsigned char baifen;                          //百分位
  37          unsigned char qianfen;                         //千分位
  38          unsigned char wanfen;                          //万分位
  39          
  40          //------------------------------------------------
  41          //延时函数
  42          void delay(char x,char y) 
  43          {
  44   1        char z;
  45   1        do{
  46   2            z=y;
  47   2            do{;}while(--z);
  48   2           }while(--x);
  49   1       }
  50          //其指令时间为:7+(3*(Y-1)+7)*(X-1)如果再加上函数调用的call 指令、页面设定、传递参数花掉的7 个指令。
  51          //则是:14+(3*(Y-1)+7)*(X-1)。
  52          
  53          //--------------------------------------------------
  54          //结果显示函数
  55          
C51 COMPILER V7.50   18B20                                                                 07/17/2008 13:04:26 PAGE 2   

  56          //系统初始化函数
  57          void  leddisp(unsigned char num)
  58              {
  59   1               unsigned char i,k;
  60   1               k=ledcode[num];
  61   1               for(i=0;i<8;i++)
  62   1                  {
  63   2                   if((k&0x01)==0x01) 
  64   2                       din=1;
  65   2                       else 
  66   2                       din=0;
  67   2                       clk=0;
  68   2                       clk=1;
  69   2                       k>>=1;
  70   2                              
  71   2                      }
  72   1              
  73   1              }
  74          
  75          //-----------------------------------------------
  76          //复位DS18B20函数
  77          void reset(void)
  78          {
  79   1       bit presence=1;
  80   1      
  81   1      
  82   1        while(presence==1)
  83   1        { 
  84   2          DQ=0 ;                                //主机拉至低电平
  85   2          delay(2,70);                              //延时503us
  86   2         DQ=1;                                //释放总线等电阻拉高总线,并保持15~60us
  87   2          delay(2,7);                               //延时70us
  88   2          if(DQ==1) presence=1;                     //没有接收到应答信号,继续复位
  89   2          else presence=0;                          //接收到应答信号
  90   2          //delay(2,60);   //延时430us
  91   2      delay(2,60); 
  92   2         }
  93   1       BEEP=1;
  94   1        }
  95          
  96          //-----------------------------------------------
  97          //写18b20写字节函数
  98          void write_byte(uch val)
  99          {
 100   1       uch i;
 101   1       uch temp;
 102   1       for(i=8;i>0;i--)
 103   1       {
 104   2         temp=val&0x01;                            //最低位移出
 105   2         DQ=0; 
 106   2         NOP();
 107   2         NOP();
 108   2         NOP();
 109   2         NOP();
 110   2         NOP();                                    //从高拉至低电平,产生写时间隙
 111   2         if(temp==1)  DQ=1;                   //如果写1,拉高电平
 112   2         delay(2,7);                               //延时63us
 113   2         DQ=1; 
 114   2         NOP();
 115   2         NOP();
 116   2         val=val>>1;                               //右移一位
 117   2        }
C51 COMPILER V7.50   18B20                                                                 07/17/2008 13:04:26 PAGE 3   

 118   1      }
 119          
 120          //------------------------------------------------
 121          //18b20读字节函数
 122          uch read_byte(void)
 123          {
 124   1       uch i;
 125   1       uch value=0;                                //读出温度
 126   1       static bit j;
 127   1       for(i=8;i>0;i--)
 128   1       {
 129   2         value>>=1; 
 130   2         DQ=0;
 131   2         NOP();
 132   2         NOP();
 133   2         NOP();
 134   2         NOP();
 135   2         NOP();
 136   2         NOP();                                   //6us
 137   2         DQ=1;                               //拉至高电平
 138   2         NOP(); 
 139   2         NOP();
 140   2         NOP();  
 141   2         NOP(); 
 142   2         NOP();                                  //4us
 143   2         j=DQ;
 144   2         if(j) value|=0x80;
 145   2         delay(2,7);                             //63us
 146   2        }
 147   1        return(value);
 148   1      }
 149          
 150          //-------------------------------------------------
 151          //启动温度转换函数
 152          void get_temp()
 153          { 
 154   1      int i;
 155   1      DQ=1;
 156   1      reset();                                 //复位等待从机应答 
 157   1      write_byte(0XCC);                        //忽略ROM匹配 
 158   1      write_byte(0X44);                        //发送温度转化命令  
 159   1      for(i=50;i>0;i--)
 160   1          {
 161   2              
 162   2             // display();                       //调用多次显示函数,确保温度转换完成所需要的时间
 163   2          }
 164   1      reset();                                 //再次复位,等待从机应答 
 165   1      write_byte(0XCC);                        //忽略ROM匹配 
 166   1      write_byte(0XBE);                        //发送读温度命令 
 167   1      TLV=read_byte();                         //读出温度低8 
 168   1      THV=read_byte();                         //读出温度高8位 
 169   1      DQ=1;                                     //释放总线 
 170   1      TZ=(TLV>>4)|(THV<<4)&0X3f;               //温度整数部分
 171   1      TX=TLV<<4;                               //温度小数部分
 172   1      if(TZ>100)TZ/100;                       //不显示百位
*** WARNING C275 IN LINE 172 OF 18B20.C: expression with possibly no effect
 173   1      ge=TZ%10;//个位                          //整数部分个位
 174   1      shi=TZ/10;//十位                         //整数十位
 175   1      wd=0;  
 176   1      if (TX & 0x80) wd=wd+5000;
 177   1      if (TX & 0x40) wd=wd+2500;
 178   1      if (TX & 0x20) wd=wd+1250;
C51 COMPILER V7.50   18B20                                                                 07/17/2008 13:04:26 PAGE 4   

 179   1      if (TX & 0x10) wd=wd+625;                //以上4条指令把小数部分转换为BCD码形式             
 180   1      shifen=wd/1000;                          //十分位                    
 181   1      baifen=(wd%1000)/100;                    //百分位
 182   1      qianfen=(wd%100)/10;                     //千分位
 183   1      wanfen=wd%10;                         //万分位
 184   1      NOP();
 185   1      NOP();
 186   1      }
 187          
 188          //--------------------------------------------------
 189          //主函数
 190          void main()
 191          {
 192   1         while(1)
 193   1           {
 194   2             get_temp();   //调用温度转换函数      
 195   2            leddisp(shi);    //调用结果显示函数 ,温度十位
 196   2            leddisp(ge);    //温度个位
 197   2            leddisp(shifen);//温度十分位
 198   2            leddisp(baifen);//温度百分位
 199   2                delay(200,200); //调用延时函数
 200   2                delay(200,200);
 201   2                delay(200,200);
 202   2                delay(200,200);
 203   2           }
 204   1      }
 205          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    449    ----
   CONSTANT SIZE    =     16    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     12    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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