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

📄 44.lst

📁 ds18b20.rar
💻 LST
字号:
C51 COMPILER V8.02   44                                                                    05/15/2008 19:00:41 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE 44
OBJECT MODULE PLACED IN 44.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE 44.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          # include "reg51.h" 
   2          # include "intrins.h" 
   3          
   4          # define   disdata  P0
   5          # define   discan   P2
   6          
   7          # define uchar unsigned char 
   8          # define uint unsigned int 
   9          
  10          sbit DQ = P3^7; //温度输入口
  11          sbit DIN = P0^7;//led小数点控制
  12          /*sbit P3_4 = P3^4; //温度输入口
  13          sbit P3_5 = P3^5; //温度输入口
  14          sbit P3_6 = P3^6; //温度输入口
  15          sbit P3_7 = P3^7; //温度输入口
  16           
  17           
  18          uchar  DQ;      */
  19          uint h;
  20          uchar code ditab[16]= 
  21          {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; 
  22          uchar code dis_7[12]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
  23           
  24          uchar code scan_con[4]={0xf7,0xfB,0xFD,0xFE};//列扫描控制字 
  25          uchar data temp_data[2]={0x00, 0x00,};          //读出温度暂存
  26          uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据,1个运算暂存用
  27            
  28          void delay(uint t) 
  29          { 
  30   1      for(;t>0;t--); 
  31   1      }
  32          
  33          /******************************显示扫描函数******************************/ 
  34          scan() 
  35          { 
  36   1        char k; 
  37   1        for(k=0;k<4;k++)              //4位LED扫描控制
  38   1        { 
  39   2         disdata=dis_7[display[k]]; 
  40   2         if(k==1){DIN=0;}              //当K=1时,P0^7为低电平显示小数点
  41   2         discan=scan_con[k];   //列扫描
  42   2         delay(30);
  43   2         discan=0xFF; 
  44   2        } 
  45   1      }
  46          
  47          /*******************************DS复位函数******************************/ 
  48          ow_reset(void) 
  49          { 
  50   1        char presence=1; 
  51   1      
  52   1        while(presence) 
  53   1        { 
  54   2         while(presence) 
  55   2         { 
C51 COMPILER V8.02   44                                                                    05/15/2008 19:00:41 PAGE 2   

  56   3          DQ=1;_nop_();_nop_(); 
  57   3          DQ=0; 
  58   3          delay(50);  //延时550毫秒
  59   3          DQ=1; 
  60   3          delay(6); 
  61   3          presence=DQ; 
  62   3         } 
  63   2          delay(45); 
  64   2          presence=~DQ; 
  65   2        } 
  66   1          DQ=1; 
  67   1       }  
  68              
  69           /*****************************DS写命令函数*********************************/ 
  70           void write_byte(uchar val)  //向1-WIRE总线上写一字节
  71           { 
  72   1        uchar i;
  73   1        
  74   1        for(i=8;i>0;i--) 
  75   1        { 
  76   2         DQ=1;_nop_();_nop_(); 
  77   2         DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_(); 
  78   2      
  79   2         DQ=val&0x01;         //最低位移出
  80   2         delay(6); 
  81   2      
  82   2         val=val/2;   //右移1位
  83   2        } 
  84   1         DQ=1; 
  85   1         delay(1); 
  86   1       }
  87            
  88          /*******************************DS读一字节函数****************************************************/  
  89           uchar read_byte(void) 
  90           { 
  91   1        uchar i; 
  92   1        uchar value=0;
  93   1        
  94   1        for(i=8;i>0;i--) 
  95   1        { 
  96   2         DQ=1;_nop_();_nop_(); 
  97   2      
  98   2         value>>=1;
  99   2        
 100   2         DQ=0; 
 101   2         _nop_();_nop_();_nop_();_nop_();
 102   2         
 103   2         DQ=1;_nop_();_nop_();_nop_();_nop_(); 
 104   2      
 105   2         if(DQ) value|=0x80; 
 106   2         delay(6); 
 107   2        } 
 108   1        DQ=1; 
 109   1        return(value); 
 110   1       }
 111            
 112           /******************************读出温度函数*************************************************/ 
 113           read_temp() 
 114           { 
 115   1        ow_reset(); 
 116   1        write_byte(0xcc); 
 117   1        write_byte(0xbe);
C51 COMPILER V8.02   44                                                                    05/15/2008 19:00:41 PAGE 3   

 118   1        
 119   1        temp_data[0]=read_byte(); 
 120   1        temp_data[1]=read_byte(); 
 121   1      
 122   1        ow_reset(); 
 123   1        write_byte(0xcc); 
 124   1        write_byte(0x44); 
 125   1       }
 126            
 127           /********************************计算温度子函数**********************************************/ 
 128           work_temp() 
 129           { 
 130   1        uchar n=0; 
 131   1        if(temp_data[1]>127) 
 132   1         {temp_data[1]=(255-temp_data[1]);temp_data[0]=(255-temp_data[0]);n=1;} //负温度求补码
 133   1      
 134   1        display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]]; 
 135   1        display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ; 
 136   1         
 137   1        display[3]=display[4]/100; 
 138   1        display[1]=display[4]%100; 
 139   1        display[2]=display[1]/10; 
 140   1        display[1]=display[1]%10; 
 141   1        
 142   1        if(!display[3]){display[3]=0x0a; 
 143   2        if(!display[2]){display[2]=0x0a;}} //最高位为0时不显示
 144   1        if(n){display[3]=0x0b;}                        //负温度是最高为显示“-”
 145   1       }
 146            
 147           /*******************************主函数**********************************************************/ 
 148           main () 
 149           { 
 150   1        disdata=0xff;// 初始化端口
 151   1        discan=0xff;
 152   1                                                       
 153   1        for(h=0;h<4;h++)                //开机显示“8888”scan();
 154   1        {display[h]=8;}
 155   1        
 156   1        ow_reset();           //开机先转换一次
 157   1        write_byte(0xcc);//skip ROM 
 158   1        write_byte(0x44);//发转换命令
 159   1         
 160   1        for(h=0;h<500;h++)//开机显示“8888”两秒 
 161   1         {scan();} 
 162   1      
 163   1        while(1) 
 164   1         { 
 165   2          read_temp();  //读出温度数据
 166   2          work_temp();  //处理温度数据
 167   2          for(h=0;h<500;h++) //显示温度两秒
 168   2           {scan();} 
 169   2          } 
 170   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    437    ----
   CONSTANT SIZE    =     32    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      9    ----
   IDATA SIZE       =   ----    ----
C51 COMPILER V8.02   44                                                                    05/15/2008 19:00:41 PAGE 4   

   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 + -