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

📄 18b20.lst

📁 Keil C51单片机基础实验源程序
💻 LST
字号:
C51 COMPILER V7.06   18B20                                                                 10/25/2006 16:41:27 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE 18B20
OBJECT MODULE PLACED IN 18b20.OBJ
COMPILER INVOKED BY: D:\keil\C51\BIN\C51.EXE 18b20.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          
   2          #include <reg52.h>                 //DS18B20温度传感器程序 
   3          code unsigned char seg7code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
   4                                         0x82,0xf8,0x80,0x90,0xff}; //不带小数点的共阳数码管段码
   5          code unsigned char seg7codeB[]={0x40,0x79,0x24,0x30,0x19,0x12,
   6                                         0x02,0x78,0x00,0x10,0xff}; //带小数点的共阳数码管段码
   7          
   8          sbit DQ=P3^6; //数据传输线接单片机的相应的引脚 
   9          unsigned char tempL=0; //设全局变量
  10          unsigned char tempH=0; 
  11          unsigned int sdata;//测量到的温度的整数部分
  12          unsigned char xiaoshu1;//小数第一位
  13          unsigned char xiaoshu2;//小数第二位
  14          unsigned char xiaoshu;//两位小数
  15          bit  fg=1;        //温度正负标志
  16          
  17          
  18          
  19          //******************延时子程序 *******************************
  20          
  21          //这个延时程序的具体延时时间是time=i*8+10,适用于小于2ms的延时
  22          
  23          //************************************************************
  24          void delay(unsigned char i)
  25          {
  26   1       for(i;i>0;i--);
  27   1      }
  28          
  29          
  30          //***********************************************************
  31          
  32          //                     延时子程序
  33          
  34          //************************************************************
  35          void delay1ms()
  36          {
  37   1       unsigned char i;
  38   1       for(i=124;i>0;i--);  //延时124*8+10=1002us
  39   1      }
  40          
  41          
  42          
  43          //*****************************初始化程序 *********************************//
  44          
  45          Init_DS18B20(void) 
  46          {
  47   1       unsigned char x=0;
  48   1       DQ=1; //DQ先置高 
  49   1       delay(8); //稍延时
  50   1       DQ=0; //发送复位脉冲 
  51   1       delay(80); //延时(>480us) 
  52   1       DQ=1; //拉高数据线 
  53   1       delay(5); //等待(15~60us) 
  54   1       x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1 
  55   1       delay(20); 
C51 COMPILER V7.06   18B20                                                                 10/25/2006 16:41:27 PAGE 2   

  56   1      } 
  57          
  58          
  59          //**********读一个字节************//
  60          
  61          ReadOneChar(void)  //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
  62          {
  63   1      unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
  64   1      unsigned char dat=0; 
  65   1      for (i=8;i>0;i--) //一个字节有8位 
  66   1      {
  67   2       DQ=1; 
  68   2       delay(1); 
  69   2       DQ=0;
  70   2       dat>>=1; 
  71   2       DQ=1; 
  72   2       if(DQ) 
  73   2       dat|=0x80; 
  74   2       delay(4);
  75   2      } 
  76   1      return(dat);
  77   1      } 
  78          
  79          
  80          
  81          //*********************** **写一个字节**************************//
  82          
  83          WriteOneChar(unsigned char dat) 
  84          { 
  85   1        unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,
  86   1        for(i=8;i>0;i--) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。 
  87   1        {
  88   2         DQ=0; //在开始另一个写周期前必须有1us以上的高电平恢复期。 
  89   2         DQ=dat&0x01; 
  90   2         delay(5); 
  91   2         DQ=1; 
  92   2         dat>>=1;
  93   2        } 
  94   1        delay(4);
  95   1      } 
  96          
  97          
  98          //读温度值(低位放tempL;高位放tempH;)
  99          ReadTemperature(void) 
 100          { 
 101   1       Init_DS18B20(); //初始化
 102   1       WriteOneChar(0xcc); //跳过读序列号的操作
 103   1       WriteOneChar(0x44); //启动温度转换
 104   1       delay(125); //转换需要一点时间,延时 
 105   1       Init_DS18B20(); //初始化
 106   1       WriteOneChar(0xcc); //跳过读序列号的操作 
 107   1       WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位) 
 108   1       tempL=ReadOneChar(); //读出温度的低位LSB
 109   1       tempH=ReadOneChar(); //读出温度的高位MSB 
 110   1        
 111   1                      if(tempH>0x7f)      //最高位为1时温度是负
 112   1                      {
 113   2                       tempL=~tempL;         //补码转换,取反加一
 114   2                       tempH=~tempH+1;       
 115   2                       fg=0;      //读取温度为负时fg=0
 116   2             }
 117   1                      sdata = tempL/16+tempH*16;      //整数部分
C51 COMPILER V7.06   18B20                                                                 10/25/2006 16:41:27 PAGE 3   

 118   1                      xiaoshu1 = (tempL&0x0f)*10/16; //小数第一位
 119   1                      xiaoshu2 = (tempL&0x0f)*100/16%10;//小数第二位
 120   1                      xiaoshu=xiaoshu1*10+xiaoshu2; //小数两位
 121   1      }
 122          
 123          
 124          //********************显示函数****************
 125          void Led(unsigned int date)
 126          { 
 127   1       if(fg==1)
 128   1       {
 129   2               P1=0xfe;     //P1.0=0,选通第一位
 130   2               P2=seg7code[date/10];  //十位数,查表,输出
 131   2               delay1ms();
 132   2               P2=0xff;        //消隐
 133   2              
 134   2               P1=0xfd;     //P1.1=0,选通第二位,个位数
 135   2               P2=seg7codeB[date%10];
 136   2               delay1ms();
 137   2               P2=0xff;       //消隐
 138   2              
 139   2               P1=0xfb;     //P1.3=0,选通第三位,小数点第一位
 140   2               P2=seg7code[xiaoshu1];
 141   2               delay1ms();
 142   2               P2=0xff;         //消隐
 143   2              
 144   2               P1=0xf7;     //P1.3=0,选通第四位,小数点第二位
 145   2               P2=seg7code[xiaoshu2];
 146   2               delay1ms();
 147   2               P2=0xff;       //消隐
 148   2       }
 149   1      
 150   1         if(fg==0)  //温度为负时显示的数据
 151   1         {
 152   2               P1=0xfe;     //P1.0=0,选通第一位
 153   2               P2=seg7code[11];  //显示负号
 154   2               delay1ms();
 155   2               P2=0xff;        //消隐
 156   2              
 157   2               P1=0xfd;     //P1.1=0,选通第二位,十位数
 158   2               P2=seg7code[date/10];
 159   2               delay1ms();
 160   2               P2=0xff;       //消隐
 161   2              
 162   2               P1=0xfb;     //P1.3=0,选通第三位,个位数
 163   2               P2=seg7codeB[date%10];
 164   2               delay1ms();
 165   2               P2=0xff;         //消隐
 166   2              
 167   2               P1=0xf7;     //P1.3=0,选通第四位,小数点第一位
 168   2               P2=seg7code[xiaoshu1];
 169   2               delay1ms();
 170   2               P2=0xff;       //消隐
 171   2         }
 172   1      }
 173          
 174          
 175          //**************************** //主程序 
 176          
 177          
 178          main()
 179          {
C51 COMPILER V7.06   18B20                                                                 10/25/2006 16:41:27 PAGE 4   

 180   1       while(1)
 181   1       {
 182   2        ReadTemperature();
 183   2        Led(sdata);
 184   2       }
 185   1      }


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