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

📄 18b20

📁 DS18b20测温程序
💻
字号:
C51 COMPILER V9.00   VV                                                                    11/20/2012 17:43:09 PAGE 1   


C51 COMPILER V9.00, COMPILATION OF MODULE VV
OBJECT MODULE PLACED IN vv.OBJ
COMPILER INVOKED BY: F:\学习软件\keil uvision4\C51\BIN\C51.EXE vv.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<reg52.h>
   2          #include<stdio.h>
   3          #define uchar unsigned char
   4          #define uint unsigned int
   5          sbit ds=P2^2;      //温度传感器信号线
   6          sbit beep=P2^3;    //蜂鸣器
   7          sbit dula=P2^6;   //数码管段选线
   8          sbit wela=P2^7;   //数码管位选线
   9          
  10          
  11          uint temp;              //定义整型的温度数据
  12          float ftemp;    //定义浮点型的温度数据
  13          uint warnl1=270;
  14          uint warnl2=250;
  15          uint warnh1=300;
  16          uint warnh2=320;
  17          sbit led0=P1^0;
  18          sbit led1=P1^1;
  19          sbit led2=P1^2;
  20          sbit led3=P1^3;
  21          uchar code table[]=
  22          {
  23                  0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
  24                  0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef 
  25                  //不带小数点的0~9位编码
  26          };
  27          
  28          void delay(uint t)              //延时函数
  29          {
  30   1              uint i,j;
  31   1              for(i=t;i>0;i--)
  32   1                      for(j=110;j>0;j--);
  33   1      }
  34          void dsreset(void)//DS18B20复位,初始化函数
  35          {
  36   1              uint i;
  37   1              ds=1;
  38   1              ds=0;
  39   1              i=100;
  40   1              while(i>0)i--;
  41   1              ds=1;
  42   1              i=6;
  43   1              while(i>0)i--;
  44   1      }
  45          
  46          bit tempreadbit(void)//读1位数据函数
  47          {
  48   1              uint i;
  49   1              bit dat;
  50   1              ds=0;i++;
  51   1              ds=1;i++;i++;      //i++起延时作用
  52   1              dat=ds;
  53   1              i=8;while(i>0)i--;
  54   1              return(dat);
  55   1      }
C51 COMPILER V9.00   VV                                                                    11/20/2012 17:43:09 PAGE 2   

  56          uchar tempread(void)// 读1个字节数据函数
  57          {
  58   1              uchar i,j,dat;
  59   1              dat=0;
  60   1              for(i=1;i<=8;i++)
  61   1              {
  62   2                      j=tempreadbit();
  63   2                      dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在dat里
  64   2              }
  65   1              return(dat);
  66   1      }                       
  67          void tempwritebyte(uchar dat) //向DS18B20写一个字节数据函数
  68          {
  69   1              uint i;
  70   1              uchar j;
  71   1              bit testb;
  72   1              for(j=1;j<=8;j++)
  73   1              {
  74   2                      testb=dat&0x01;
  75   2                      dat=dat>>1;
  76   2                      if(testb)         //写1
  77   2                      {
  78   3                              ds=0;
  79   3                              i++;i++;
  80   3                              ds=1;
  81   3                              i=8;while(i>0)i--;
  82   3              
  83   3                      }
  84   2                      else
  85   2                      {
  86   3                              ds=0;     //写0
  87   3                              i=8;while(i>0)i--;
  88   3                              ds=1;
  89   3                              i++;i++;
  90   3                      }
  91   2              }
  92   1      }       
  93          
  94          void tempchange(void)    //DS18B20开始获取温度并开始转换
  95          {
  96   1              dsreset();
  97   1              delay(1);
  98   1              tempwritebyte(0xcc); //写跳过读ROM指令
  99   1              tempwritebyte(0x44); //写温度转换指令
 100   1                      
 101   1      }       
 102          uint get_temp()    //读取寄存器中存储的温度数据
 103          {
 104   1               uchar a,b;
 105   1               dsreset();
 106   1               delay(1);
 107   1               tempwritebyte(0xcc);  
 108   1               tempwritebyte(0xbe);
 109   1               a=tempread(); //读低8位
 110   1               b=tempread(); //读高8位
 111   1               temp=b;
 112   1               temp<<=8;         //两个字节组合为1个字节
 113   1               temp=temp|a;
 114   1               ftemp=temp*0.0625;//温度在寄存器中为12位,分辨率为0.0625
 115   1               temp=ftemp*10+0.5;//乘以10表示小数点后面只取1位,加0.5是四舍五入
 116   1               ftemp=ftemp+0.05;
 117   1               return temp;      //temp是整型
C51 COMPILER V9.00   VV                                                                    11/20/2012 17:43:09 PAGE 3   

 118   1      }
 119          ////////////////////显示程序//////////////////////////
 120          void display(uchar num,uchar dat) //num是第几个数码管,dat是要显示的数字
 121          {
 122   1        uchar i;
 123   1        dula=0;
 124   1        P0=table[dat];
 125   1        dula=1;
 126   1        dula=0;
 127   1      
 128   1        wela=0;
 129   1        i=0XFF;
 130   1        i=i&(~((0X01)<<(num)));//用i来存储位选数据,只有一位为0
 131   1        P0=i;
 132   1        wela=1;
 133   1        wela=0;    
 134   1        delay(1);
 135   1      }
 136          
 137          void dis_temp(uint t) //t显示的是整型温度值
 138          {
 139   1        uchar i;
 140   1        i=t/100;
 141   1        display(0,i);
 142   1        i=t%100/10;
 143   1        display(1,i+10);
 144   1        i=t%100%10;
 145   1        display(2,i);
 146   1      }
 147          
 148                  
 149          /*void warn(uint s,uchar led)
 150          {
 151                  uchar i;
 152                  i=s;
 153                  beep=0;
 154                  P1=led;
 155                  while(i--)
 156                  {
 157                          dis_temp(get_temp());
 158                  }
 159                  beep=1;
 160                  P1=0xff;
 161                  i=s;
 162                  while(i--)
 163                  {
 164                          dis_temp(get_temp());
 165                  }
 166          }
 167          void deal(uint z)
 168          {
 169                  uchar buff[4],i;
 170                  if((z>warnl2)&&(z<=warnl1))
 171                  {
 172                          warn(10,0x01);
 173                  }       
 174                  else if(z<=warnl2)
 175                  {
 176                          warn(20,0x03);
 177                  }
 178                  else if((z<warnh2)&&(z>warnh1))
 179                  {
C51 COMPILER V9.00   VV                                                                    11/20/2012 17:43:09 PAGE 4   

 180                          warn(40,0x04);
 181                  }
 182                  else if(z>warnh2)
 183                  {
 184                          warn(20,0x0c);
 185                  }
 186                  else
 187                  {
 188                          i=40;
 189                          while(i--)
 190                          {
 191                                  dis_temp(get_temp());
 192                          }
 193                  }
 194          }                  */
 195          void main()
 196          {
 197   1              uchar buff[4],i;
 198   1              while(1)
 199   1              {
 200   2                      tempchange();
 201   2                      for(i=10;i>0;i--)
 202   2                      {
 203   3                              dis_temp(get_temp());
 204   3                      }
 205   2      
 206   2              //      deal(temp);
 207   2                      sprintf(buff,"%f",ftemp);
 208   2                      for(i=10;i>0;i--)
 209   2                      {
 210   3                              dis_temp(get_temp());
 211   3                      }
 212   2              }
 213   1      }         
 214                                  
 215          
 216                          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    542    ----
   CONSTANT SIZE    =     23    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     14       5
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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