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

📄 ds18b20.lst

📁 89C52单片机特效源文件 已全部试验
💻 LST
字号:
C51 COMPILER V7.02a   DS18B20                                                              08/21/2008 20:02:18 PAGE 1   


C51 COMPILER V7.02a, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN ds18b20.OBJ
COMPILER INVOKED BY: D:\keil c702\C51\BIN\C51.EXE ds18b20.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include <reg52.h>
   2          #include <intrins.h>
   3          
   4          #define uchar unsigned char
   5          
   6          #define uint unsigned int
   7          
   8          sbit DS=P3^3;           //定义DS18B20接口
   9          
  10          int temp;             
  11          
  12          uchar flag1;            
  13          
  14          void display(unsigned char *lp,unsigned char lc);//数字的显示函数;lp为指向数组的地址,lc为显示的个数
  15          
  16          void delay();//延时子函数,5个空指令
  17          
  18          code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x08,0x00};
  19                                  //共阴数码管 0-9 - _ 空 表
  20          
  21          unsigned char l_tmpdate[8]={0,0,10,0,0,0,0,0};//定义数组变量,并赋值1,2,3,4,5,6,7,8,就是本程序显示
             -的八个数
  22          int tmp(void);
  23          void tmpchange(void);
  24          void tmpwritebyte(uchar dat);
  25          uchar tmpread(void);
  26          bit tmpreadbit(void);
  27          void dsreset(void);
  28          void delayb(uint count);
  29          
  30          
  31          void main()               //主函数
  32          
  33          {
  34   1      uchar i;
  35   1      int l_tmp;
  36   1        while(1)
  37   1        {
  38   2        tmpchange();      //温度转换
  39   2              l_tmp=tmp();
  40   2              if(l_tmp<0)             
  41   2              l_tmpdate[0]=10;        //判断温度为负温度,前面加"-"
  42   2              else
  43   2              {
  44   3              l_tmpdate[0]=temp/1000; //显示百位,这里用1000,是因为我们之前乖以10位了
  45   3              if(l_tmpdate[0]==0)             
  46   3                      l_tmpdate[0]=12;//判断温度为正温度且没有上百,前面不显示
  47   3              }
  48   2      l_tmp=temp%1000;
  49   2      l_tmpdate[1]=l_tmp/100;//获取十位
  50   2      l_tmp=l_tmp%100;
  51   2      l_tmpdate[2]=l_tmp/10;//获取个位
  52   2      l_tmpdate[3]=11;        
  53   2      l_tmpdate[4]=l_tmp%10;//获取小数第一位
  54   2      
C51 COMPILER V7.02a   DS18B20                                                              08/21/2008 20:02:18 PAGE 2   

  55   2      for(i=0;i<10;i++){              //循环输出10次,提高亮度
  56   3      display(l_tmpdate,5);   
  57   3      
  58   3         }              
  59   2      }
  60   1        
  61   1      
  62   1      }
  63          
  64          void display(unsigned char *lp,unsigned char lc)//显示
  65          {
  66   1              unsigned char i;                //定义变量
  67   1              P2=0;                                   //端口2为输出
  68   1              P1=P1&0xF8;                             //将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管
  69   1              for(i=0;i<lc;i++){              //循环显示
  70   2              P2=table[lp[i]];                //查表法得到要显示数字的数码段
  71   2              delay();                                //延时5个空指令 
  72   2              if(i==7)                                //检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据
  73   2                      break;
  74   2              P2=0;                                   //清0端口,准备显示下位
  75   2              P1++;                                   //下一位数码管
  76   2              }
  77   1      }
  78          void delay(void)                                                                //空5个指令
  79          {
  80   1      _nop_();_nop_();_nop_();_nop_();_nop_();
  81   1      }
  82          void delayb(uint count)      //delay
  83          
  84          {
  85   1      
  86   1        uint i;
  87   1      
  88   1        while(count)
  89   1      
  90   1        {
  91   2      
  92   2          i=200;
  93   2      
  94   2          while(i>0)
  95   2      
  96   2          i--;
  97   2      
  98   2          count--;
  99   2      
 100   2        }
 101   1      
 102   1      }
 103          
 104          
 105          void dsreset(void)       //DS18B20初始化
 106          
 107          {
 108   1      
 109   1        uint i;                
 110   1      
 111   1        DS=0;
 112   1      
 113   1        i=103;
 114   1      
 115   1        while(i>0)i--;
 116   1      
C51 COMPILER V7.02a   DS18B20                                                              08/21/2008 20:02:18 PAGE 3   

 117   1        DS=1;
 118   1      
 119   1        i=4;
 120   1      
 121   1        while(i>0)i--;
 122   1      
 123   1      }
 124          
 125           
 126          
 127          bit tmpreadbit(void)       // 读一位
 128          
 129          {
 130   1      
 131   1         uint i;
 132   1      
 133   1         bit dat;
 134   1      
 135   1         DS=0;i++;          //小延时一下
 136   1      
 137   1         DS=1;i++;i++;
 138   1      
 139   1         dat=DS;
 140   1      
 141   1         i=8;while(i>0)i--;
 142   1      
 143   1         return (dat);
 144   1      
 145   1      }
 146          
 147           
 148          
 149          uchar tmpread(void)   //读一个字节
 150          
 151          {
 152   1      
 153   1        uchar i,j,dat;
 154   1      
 155   1        dat=0;
 156   1      
 157   1        for(i=1;i<=8;i++)
 158   1      
 159   1        {
 160   2      
 161   2          j=tmpreadbit();
 162   2      
 163   2          dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好//一个字节在DAT里
 164   2      
 165   2        }
 166   1      
 167   1        return(dat);             //将一个字节数据返回
 168   1      
 169   1      }
 170          
 171           
 172          
 173          void tmpwritebyte(uchar dat)   
 174          
 175          {                           //写一个字节到DS18B20里
 176   1      
 177   1        uint i;
 178   1      
C51 COMPILER V7.02a   DS18B20                                                              08/21/2008 20:02:18 PAGE 4   

 179   1        uchar j;
 180   1      
 181   1        bit testb;
 182   1      
 183   1        for(j=1;j<=8;j++)
 184   1      
 185   1        {
 186   2      
 187   2          testb=dat&0x01;
 188   2      
 189   2          dat=dat>>1;
 190   2      
 191   2          if(testb)     // 写1部分
 192   2      
 193   2          {
 194   3      
 195   3            DS=0;
 196   3      
 197   3            i++;i++;
 198   3      
 199   3            DS=1;
 200   3      
 201   3            i=8;while(i>0)i--;
 202   3      
 203   3          }
 204   2      
 205   2          else
 206   2      
 207   2          {
 208   3      
 209   3            DS=0;       //写0部分
 210   3      
 211   3            i=8;while(i>0)i--;
 212   3      
 213   3            DS=1;
 214   3      
 215   3            i++;i++;
 216   3      
 217   3          }
 218   2      
 219   2        }
 220   1      
 221   1      }
 222          
 223           
 224          
 225          void tmpchange(void)  //发送温度转换命令
 226          
 227          {
 228   1      
 229   1        dsreset();             //初始化DS18B20
 230   1      
 231   1        delayb(1);             //延时
 232   1      
 233   1        tmpwritebyte(0xcc);  // 跳过序列号命令
 234   1      
 235   1        tmpwritebyte(0x44);  //发送温度转换命令
 236   1      
 237   1      }
 238          
 239          int tmp()               //获得温度
 240          
C51 COMPILER V7.02a   DS18B20                                                              08/21/2008 20:02:18 PAGE 5   

 241          {
 242   1      
 243   1        float tt;
 244   1      
 245   1        uchar a,b;
 246   1      
 247   1        dsreset();
 248   1      
 249   1        delayb(1);
 250   1      
 251   1        tmpwritebyte(0xcc);   
 252   1      
 253   1        tmpwritebyte(0xbe);    //发送读取数据命令
 254   1      
 255   1        a=tmpread();          //连续读两个字节数据
 256   1      
 257   1        b=tmpread();
 258   1      
 259   1        temp=b;
 260   1      
 261   1        temp<<=8;             
 262   1      
 263   1        temp=temp|a;         //两字节合成一个整型变量。
 264   1      
 265   1        tt=temp*0.0625;       //得到真实十进制温度值,因为DS18B20
 266   1      
 267   1      //可以精确到0.0625度,所以读回数据的最低位代表的是
 268   1      
 269   1      //0.0625度。
 270   1      
 271   1        temp=tt*10+0.5;   //放大十倍,这样做的目的将小数点后第一位
 272   1      
 273   1      //也转换为可显示数字,同时进行一个四舍五入操作。
 274   1      
 275   1        return temp;     //返回温度值
 276   1      
 277   1      }
 278          
 279          void readrom()          //read the serial 读取温度传感器的序列号
 280          
 281          {                      //本程序中没有用到此函数
 282   1      
 283   1        uchar sn1,sn2;
 284   1      
 285   1        dsreset();
 286   1      
 287   1        delayb(1);
 288   1      
 289   1        tmpwritebyte(0x33);
 290   1      
 291   1        sn1=tmpread();
 292   1      
 293   1        sn2=tmpread();
 294   1      
 295   1      }
 296          
 297          void delay10ms()            
 298            {
 299   1      
 300   1          uchar a,b;
 301   1      
 302   1          for(a=10;a>0;a--)
C51 COMPILER V7.02a   DS18B20                                                              08/21/2008 20:02:18 PAGE 6   

 303   1      
 304   1            for(b=60;b>0;b--);
 305   1      
 306   1         }
 307          
 308          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    547    ----
   CONSTANT SIZE    =     13    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     11      12
   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 + -