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

📄 ds18b20.lst

📁 用DS18B20测温度
💻 LST
字号:
C51 COMPILER V7.50   DS18B20                                                               11/08/2007 10:15:28 PAGE 1   


C51 COMPILER V7.50, 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>  //_nop_();延时函数用;
   3          #define Disdata  P0   //段码输出口
   4          #define discan   P2   //扫描口
   5          #define uchar unsigned char 
   6          #define uint  unsigned int 
   7          sbit DQ=P1^0;        //温度输入口
   8          sbit DIN=P0^7;        //led 小数点控制
   9          sbit P20=P2^0;
  10          sbit P37=P3^7;
  11          uint h,count,jingjie1,jingjie2,jingjie;
  12          uchar sound;
  13          //****温度小数部分用查表法***//
  14          uchar code ditab[16]=
  15          {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,
  16           0x08,0x08,0x09,0x09};
  17          uchar code dis_7[12]=
  18          {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
  19          /*"0","1", "2"   "3"  "4"   "5"  "6" "7" "8"  "9" "不亮" "-"*/
  20          uchar code scan_con[4]={0x80,0x40,0x20,0x10}; //位控
  21          uchar data temp_data[2]={0x00,0x00};          //读出温度暂放
  22          uchar data display[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个,一个运算暂存用
  23          
  24          /***11us延时函数****/
  25          void delay(uint t)
  26          {
  27   1       for(;t>0;t--);
  28   1      }
  29          
  30          /***显示扫描函数***/
  31          scan()
  32          {
  33   1       char k;
  34   1         for(k=0;k<4;k++)
  35   1         {
  36   2          Disdata =dis_7[display[k]];
  37   2              if(k==1){DIN=0;}
  38   2              discan=scan_con[k];delay(90);discan=0x00;
  39   2              }
  40   1        }
  41          
  42          /****DS18B20复位函数***/
  43          ow_reset(void)
  44          {
  45   1       char presence =1;
  46   1       while(presence)
  47   1       {
  48   2        while(presence)
  49   2        {
  50   3         DQ=1;_nop_();_nop_();
  51   3         DQ=0;
  52   3         delay(50);
  53   3         DQ=1;
  54   3         delay(6);
  55   3         presence=DQ;
C51 COMPILER V7.50   DS18B20                                                               11/08/2007 10:15:28 PAGE 2   

  56   3         }
  57   2        delay(45);
  58   2        presence=~DQ;
  59   2       }
  60   1       DQ=1;
  61   1      }
  62          
  63          /****DS18B20写命令函数****/
  64          void write_byte(uchar val)
  65          {
  66   1       uchar i;
  67   1       for(i=8;i>0;i--)
  68   1       {
  69   2        DQ=1;_nop_();_nop_();
  70   2        DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();//延时5us
  71   2        DQ=val&0x01;        //取出最低位
  72   2        delay(6);
  73   2        val=val/2;
  74   2       }
  75   1       DQ=1;
  76   1       delay(1);
  77   1      }
  78          
  79          /******DS18B20读1字节函数****/
  80          uchar read_byte(void)
  81          {
  82   1       uchar i;
  83   1       uchar value =0;
  84   1       for(i=8;i>0;i--)
  85   1       {
  86   2        DQ=1;_nop_();_nop_();
  87   2        value>>=1;
  88   2        DQ=0;
  89   2        _nop_();_nop_();_nop_();_nop_();
  90   2        DQ=1;_nop_();_nop_();_nop_();_nop_();
  91   2        if(DQ) value|=0x80;
  92   2        delay(6);
  93   2       }
  94   1       DQ=1;
  95   1       return(value);
  96   1       }
  97          
  98           /*****读出温度函数****/
  99           read_temp()
 100           {
 101   1        ow_reset();
 102   1        write_byte(0xcc);
 103   1        write_byte(0xbe);
 104   1        temp_data[0]=read_byte();
 105   1        temp_data[1]=read_byte();
 106   1        ow_reset();
 107   1        write_byte(0xcc);
 108   1        write_byte(0x44);
 109   1       }
 110          
 111           /****温度数据处理函数*****/
 112           work_temp()
 113           {
 114   1        uchar n=0;
 115   1        if(temp_data[1]>127)
 116   1        //以下一行是负温度求补码
 117   1         {temp_data[1]=(256-temp_data[1]);temp_data[0]=(256-temp_data[0]);n=1;}
C51 COMPILER V7.50   DS18B20                                                               11/08/2007 10:15:28 PAGE 3   

 118   1        
 119   1        display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]];
 120   1        //显示小数一位,由于小数是16进制,所以要简化成10进制--ditab
 121   1        jingjie2=display[4];
 122   1        display[4]= ((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
 123   1                    //右移4位变成低四位   "或合并"   左移4位变成高四位 
 124   1        jingjie1=display[4];
 125   1        jingjie=(jingjie1<<4)|(jingjie2);
 126   1        display[3]=  display[4]/100;
 127   1        display[1]=  display[4]%100;
 128   1        display[2]=  display[1]/10;
 129   1        display[1]=  display[1]%10;
 130   1        if(! display[3]){ display[3]=0x00;if(! display[2]){display[2]=0x00;}}
 131   1        //最高位为0时都不显示
 132   1        if(n){display[3]=0x40;}
 133   1       }
 134          /****中断获得发声频率*****/ 
 135          void initial()
 136          {
 137   1       TMOD=0x01;
 138   1       TH0=(65536-500)/256;
 139   1       TL0=(65536-500)%256;
 140   1       EA=1;
 141   1       ET0=1;
 142   1       TR0=0;
 143   1      }
 144           /****主函数*****/
 145           main()
 146           {initial();
 147   1        P37=0;
 148   1        Disdata=0x00;
 149   1        discan=0x00;                      //初始化端口
 150   1        for(h=0;h<4;h++){ display[h]=8;}  //开机显示888
 151   1        ow_reset();                       //开机先转换一次
 152   1        write_byte(0xcc);
 153   1        write_byte(0x44);
 154   1        for(h=0;h<500;h++)
 155   1         {scan();}
 156   1        while(1)
 157   1        {TR0=0;
 158   2         P37=0;
 159   2         read_temp();
 160   2         work_temp();
 161   2         for(h=0;h<250;h++)          //显示温度1s
 162   2         {scan();
 163   3          if((jingjie1>=25&jingjie2>=1)|jingjie1>=26){TR0=1;}
 164   3          //只要温度超过25.1度就会响铃
 165   3              }                    
 166   2        }
 167   1       }
 168          
 169          void tO(void) interrupt 1
 170          {TH0=(65536-100)/256;
 171   1       TL0=(65536-100)%256;
 172   1      P37=~P37;
 173   1      }
 174          
 175          
 176          
 177          
 178          
 179          
C51 COMPILER V7.50   DS18B20                                                               11/08/2007 10:15:28 PAGE 4   

 180          
 181          
 182          
 183          
 184          
 185          


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