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

📄 w012.lst

📁 使用了Keil环境开发
💻 LST
字号:
C51 COMPILER V8.02   W012                                                                  06/07/2007 21:45:00 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE W012
OBJECT MODULE PLACED IN w012.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE w012.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*******************************************************************************
   2          * 实验名称: 数字温度表(DS18B20)数码管显示                                      *
   3          ********************************************************************************
   4          * 实验描述: 四位数码管显示测量的温度                                           *
   5          * 实验说明: 数码管从左到右依次显示温度的百位十位个位小数部分                               *
   6          *           DS18B20没有安装时,数码管显示FFF.F                                                     *
   7          *                       实验前要在J7上安装DS18B20                                                                  *
   8          *                       1:接DS18B20的GND端                                                                                *
   9          *           2:接DS18B20的DQ端                                                 * 
  10          *           3:接DS18B20的VDD端                                                *
  11          *******************************************************************************/
  12          
  13          #include <reg52.h>
  14          #include <intrins.h>
  15          
  16          sbit DQ = P3^7;   //定义DS18B20端口DQ  
  17          
  18          bit presence;     //DS18B20初始化成功标志位
  19          
  20          unsigned char digit=0;  //数码管显示位
  21          
  22          /* 段码表 */
  23          unsigned char code seg_code[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, // 0-9
  24                                                                           0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x00};     // A, b, C, d, E, F, off
  25          
  26          /*温度小数部分查表*/
  27          unsigned char code  ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
  28                                           0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
  29          
  30          unsigned char data  temp_data[2] = {0x00,0x00};  //温度数据缓存
  31          unsigned char data  dis_data[5]={0,0,0,0,0};     //温度值百十个小数位及一个数据缓存
  32          
  33          
  34          void Delay( int num)  //us级延时函数
  35          {
  36   1        while( --num );
  37   1      }
  38          
  39          void WriteSegData(unsigned char seg) //写段码数据函数
  40          {
  41   1              
  42   1              if(seg > 16)         
  43   1                      seg = 16;                
  44   1              seg = seg_code[seg];
  45   1      
  46   1              if(digit == 2)
  47   1                 seg = seg+0x80;  //小数点的位置
  48   1      
  49   1              P0 = seg;               
  50   1              _nop_();        
  51   1              _nop_();
  52   1      
  53   1              P2 &= 0x1F;             
  54   1              _nop_();
  55   1              _nop_();
C51 COMPILER V8.02   W012                                                                  06/07/2007 21:45:00 PAGE 2   

  56   1      
  57   1              P2 |= 0xE0;        
  58   1      }
  59          
  60          void WriteDigitData(unsigned char dig) //写位选数据函数
  61          {
  62   1      
  63   1              dig &= 0x0F;
  64   1              P0 = ~dig;
  65   1              _nop_();
  66   1              _nop_();
  67   1      
  68   1              P2 &= 0x3F;     
  69   1              _nop_();
  70   1              _nop_();
  71   1              
  72   1              P2 |= 0xE0;     
  73   1      }
  74          
  75          DS18B20_Init(void) //DS18B20初始化函数
  76          {  
  77   1           DQ = 1;      
  78   1           Delay(8);    
  79   1      
  80   1           DQ = 0;      //将DQ拉低
  81   1           Delay(95);   //延时 大于480us
  82   1      
  83   1           DQ = 1;      //拉高总线
  84   1           Delay(8);
  85   1      
  86   1           presence = DQ; //如果 presence=0则初始化成功 presence=1则初始化失败
  87   1           Delay(100);
  88   1           DQ = 1; 
  89   1           
  90   1           return(presence); //返回presence
  91   1      }
  92          
  93          ReadOneChar(void)        //读一个字节数据函数
  94          {
  95   1        unsigned char i = 0;
  96   1        unsigned char dat = 0;
  97   1      
  98   1        for (i = 8; i >0; i--)
  99   1          {
 100   2            DQ = 0;   
 101   2            dat >>= 1;
 102   2            DQ = 1;    //给脉冲信号
 103   2      
 104   2            if(DQ)
 105   2              dat |= 0x80;
 106   2              Delay(4);
 107   2          }
 108   1      
 109   1          return(dat);
 110   1      }
 111          
 112          
 113          void WriteOneChar(unsigned char dat) //写一个字节数据函数
 114          {
 115   1        unsigned char i = 0 ;
 116   1        for (i = 8; i>0; i--)
 117   1        {
C51 COMPILER V8.02   W012                                                                  06/07/2007 21:45:00 PAGE 3   

 118   2          DQ = 0;
 119   2          DQ = dat&0x01;
 120   2          Delay(4);
 121   2      
 122   2          DQ = 1;
 123   2          dat>>=1;
 124   2        }
 125   1      }
 126          
 127          void ReadTemperature(void)      //读取温度函数
 128          {
 129   1               presence = 1;
 130   1           while(presence == 1)
 131   1               DS18B20_Init();
 132   1               
 133   1           WriteOneChar(0xCC);    //跳过读序号列号的操作
 134   1           WriteOneChar(0x44);    //启动温度转换
 135   1      
 136   1           presence = 1;
 137   1           while(presence == 1)
 138   1               DS18B20_Init();
 139   1      
 140   1           WriteOneChar(0xCC);    //跳过读序号列号的操作
 141   1           WriteOneChar(0xBE);    //读取温度寄存器
 142   1      
 143   1           temp_data[0] = ReadOneChar();   //读温度低8位
 144   1           temp_data[1] = ReadOneChar();   //读温度高8位 
 145   1      }
 146          
 147          void TemperatureConvert()   //温度数据转换函数
 148          {
 149   1        dis_data[4]=temp_data[0]&0x0f;          //temp_data[0]低4为有效
 150   1        dis_data[3]=ditab[dis_data[4]];     //查表得小数位的值
 151   1        dis_data[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
 152   1        dis_data[0]=(dis_data[4])/100;          //百位
 153   1        dis_data[1]=(dis_data[4]%100)/10;       //十位
 154   1        dis_data[2]=(dis_data[4])%10;           //个位
 155   1      
 156   1        if(dis_data[0]==0)         //百位为0,不显示
 157   1         { 
 158   2           dis_data[0]=16;
 159   2                             
 160   2           if(dis_data[1]==0)      //十位为0,不显示
 161   2             dis_data[1]=16 ;
 162   2         }
 163   1      
 164   1      }
 165          
 166          void Timer0_Init(void) //T0初始化函数
 167          {
 168   1              TMOD = 0x01;
 169   1              TH0 = 0xEE;
 170   1              TL0 = 0x00;
 171   1              EA = 1;
 172   1              ET0 = 1;
 173   1      }
 174          void main()       //主函数
 175           {
 176   1          P0 = 0xFF;
 177   1              P2 = 0xFF;
 178   1              
 179   1              Timer0_Init();
C51 COMPILER V8.02   W012                                                                  06/07/2007 21:45:00 PAGE 4   

 180   1              TR0 = 1;     
 181   1      
 182   1          while(1)
 183   1          {
 184   2                DS18B20_Init();
 185   2      
 186   2                if(presence==0)
 187   2            {
 188   3              ReadTemperature();
 189   3                  TemperatureConvert();
 190   3            } 
 191   2      
 192   2                if(presence==1)
 193   2            {
 194   3              DS18B20_Init();
 195   3      
 196   3              dis_data[0]=dis_data[1]=dis_data[2]=dis_data[3]=15 ;
 197   3                  dis_data[4]=0 ;
 198   3            }
 199   2         }
 200   1      }
 201          
 202          
 203          void timer0() interrupt 1 using 1       //中断程序
 204          {
 205   1              TH0 = 0xEE;
 206   1              TL0 = 0x00;
 207   1              if(digit > 3)  
 208   1                      digit = 0;
 209   1              else
 210   1                      digit++;
 211   1              WriteSegData(dis_data[digit]);
 212   1              WriteDigitData(1<<digit);   
 213   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    415    ----
   CONSTANT SIZE    =     33    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      8    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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