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

📄 wu01.lst

📁 DS18B20原理图及资料
💻 LST
字号:
C51 COMPILER V7.10   WU01                                                                  07/15/2008 17:30:13 PAGE 1   


C51 COMPILER V7.10, COMPILATION OF MODULE WU01
OBJECT MODULE PLACED IN wu01.OBJ
COMPILER INVOKED BY: C:\Keil\C51\Bin\c51.exe wu01.c DB SB OE ROM(LARGE) SMALL OT(6,SPEED) WL(2) RB(0)

line level    source

   1          #include <reg51.h>
   2          #include <intrins.h>
   3          
   4          #define TEST_TIME
   5          #undef TEST_TIME
   6          
   7          sbit DQ =P3^3; //定义通信端口 
   8          //DB 0C0H,0F3H,0A4H,0A1H,93H,89H,088H,0E3H,00H,81H
   9          unsigned char data dis_digit;
  10          unsigned char code dis_code[11]= {0x88,0xeb,0x4c,0x49,  // 0, 1, 2, 3
  11                                                0x2b,0x19,0x18,0xcb,0x08,0x09, 0xff};// 4, 5, 6, 7, 8, 9, off
  12          //{0xc0,0xf3,0xa4,0xa1,
  13                                                                          // 0x93,0x89,0x88,0xe3,0x00,0x81,0xff};
  14                           //
  15                                          // 
  16          unsigned char data dis_buf[4];
  17          unsigned char data dis_index;
  18          
  19          
  20          //延时函数 
  21          void delay(unsigned int i) //经验表明,这里i=1时约等于6.9us
  22          { 
  23   1              while(i--); 
  24   1      } 
  25          
  26          //初始化函数 
  27          bit Init_DS18B20(void) 
  28          { 
  29   1              unsigned char x=0; 
  30   1              unsigned int time = 0;
  31   1              
  32   1              DQ = 1; //DQ复位 
  33   1              delay(18); //稍做延时 
  34   1              DQ = 0; //单片机将DQ拉低
  35   1          delay(90); //精确延时 大于 480us 
  36   1      #ifdef TEST_TIME
              /*      TR0 = 0;
                      TH0 = 0;
                      TL0 = 0;
                      TR0 = 1;
              */
              #endif  
  43   1              
  44   1      #ifdef TEST_TIME
              /*
                      TR0 = 0;
                      time = (TH0<<8) + TL0 -2;
                      */
              /*here time = 0x202 ,that means
              514 * 12/11.0592 = 557.73 us.
              that means every delay() is 6.9us.
              */
              #endif  
  54   1      
  55   1              DQ = 1; //拉高总线 
C51 COMPILER V7.10   WU01                                                                  07/15/2008 17:30:13 PAGE 2   

  56   1              delay(14); 
  57   1              x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 
  58   1              if(x==0)
  59   1                 return 1;
  60   1              else
  61   1                 return 0;
  62   1      } 
  63          
  64          //读一个字节 
  65          unsigned char ReadOneChar(void) 
  66          { 
  67   1              unsigned char i=0; 
  68   1              unsigned char dat = 0; 
  69   1              for (i=8;i>0;i--) 
  70   1              { 
  71   2                      DQ = 0; // 给脉冲信号 
  72   2                      dat>>=1; 
  73   2                      DQ = 1; // 给脉冲信号 
  74   2                      if(DQ) 
  75   2                      dat|=0x80; 
  76   2                      delay(4); 
  77   2              } 
  78   1              return(dat); 
  79   1      } 
  80          
  81          //写一个字节 
  82          void WriteOneChar(unsigned char dat) 
  83          { 
  84   1              unsigned char i=0; 
  85   1              for (i=8; i>0; i--) 
  86   1              { 
  87   2                      DQ = 0; 
  88   2                      DQ = dat&0x01; 
  89   2                      delay(5); 
  90   2                      DQ = 1; 
  91   2                      dat>>=1; 
  92   2              } 
  93   1      } 
  94          
  95          //读取温度 
  96          unsigned int ReadTemperature(void) 
  97          { 
  98   1              unsigned char a=0; 
  99   1              unsigned char b=0; 
 100   1              unsigned int t=0; 
 101   1              float tt=0; 
 102   1              Init_DS18B20(); 
 103   1              WriteOneChar(0xCC); // 跳过读序号列号的操作 
 104   1              WriteOneChar(0x44); // 启动温度转换 
 105   1              Init_DS18B20(); 
 106   1              WriteOneChar(0xCC); //跳过读序号列号的操作 
 107   1              WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 
 108   1              a = ReadOneChar(); 
 109   1              b = ReadOneChar(); 
 110   1              t=b; 
 111   1              t<<=8; 
 112   1              t=t|a; //将温度的高位与低位合并
 113   1              tt=t *0.625;  
 114   1              t= tt*10+0.5; //对结果进行4舍5入 
 115   1              return(t); 
 116   1      } 
 117          
C51 COMPILER V7.10   WU01                                                                  07/15/2008 17:30:13 PAGE 3   

 118          void Delay_ms (unsigned int Nms )
 119          {
 120   1              unsigned char i;
 121   1              while(Nms--)
 122   1                      for(i=0; i<125; i++) ;
 123   1      }
 124          
 125          void main()
 126          {
 127   1              unsigned int t = 0;
 128   1              P0 = 0x00;
 129   1              P2 = 0x00;
 130   1      
 131   1              //以下为定时器初始化。
 132   1      
 133   1              TMOD = 0x01;    // M1,M0 = 0,1 工作在方式1,为16位定时器
 134   1              TH0 = 0xFC;
 135   1              TL0 = 0x17;             // TH和TL各提供8位。
 136   1              IE = 0x82;              //开cpu中断 和 源中断 即EA =  1, ET0 = 1
 137   1              dis_buf[0] = 0xff;
 138   1              dis_buf[1] = 0xff;
 139   1              dis_buf[2] = 0xff;
 140   1              dis_buf[3] = 0xff;
 141   1              
 142   1              dis_digit = 0xfe;
 143   1              dis_index = 0;
 144   1              
 145   1              TR0 = 1;        //在 TCON 中,启动定时器0。启动工作需要放置在初始化之后,这是一个好的习惯。
 146   1              do{             
 147   2                               t = ReadTemperature();
 148   2      
 149   2                              if (t>0 && t < 9999)
 150   2                              {
 151   3                                      dis_buf[0] = dis_code[t/1000];
 152   3                                      dis_buf[1] = dis_code[(t%1000)/100]&0xef;
 153   3                                      dis_buf[2] = dis_code[(t%100)/10];
 154   3                                      dis_buf[3] = dis_code[t%10];
 155   3                              }
 156   2      
 157   2                              Delay_ms(300);
 158   2              }
 159   1              while(1);
 160   1      }
 161          void timer0() interrupt 1 using 1               //函数名字可以任意取, interrupt 1中的"1"表示定时器0的中断号为1。
 162          // 定时器0中断服务程序, 用于数码管的动态扫描
 163          // dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
 164          // dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
 165          //                              选通P2.0口数码管
 166          // dis_buf   --- 显于缓冲区基地址       
 167          {
 168   1              TH0 = 0xFC;
 169   1              TL0 = 0x17;                     //在定时器中断中重新赋初始值。可以计算这里的时钟周期为
 170   1              // (0x10000- 0xfc17) * (1/(11.0592 * 10^6 / 12)) = 1.085ms
 171   1              
 172   1              P2 = 0xff;                                                      // 先关闭所有数码管
 173   1              P0 = dis_buf[dis_index];                        // 显示代码传送到P0口
 174   1              P2 = dis_digit;                                         // 
 175   1      
 176   1              dis_digit = _crol_(dis_digit,1);        // 位选通值左移, 下次中断时选通下一位数码管
 177   1              dis_index++;                                            // 
 178   1                                              
 179   1              if (dis_index >= 4)
C51 COMPILER V7.10   WU01                                                                  07/15/2008 17:30:13 PAGE 4   

 180   1              {
 181   2                      dis_index = 0;
 182   2                      dis_digit = 0xfe;
 183   2              }
 184   1      
 185   1      }
 186          
 187          
 188          
C51 COMPILER V7.10   WU01                                                                  07/15/2008 17:30:13 PAGE 5   

NAME                                    CLASS   MSPACE  TYPE    OFFSET  SIZE
====                                    =====   ======  ====    ======  ====


P0 . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0080H  1
P2 . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00A0H  1
P3 . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00B0H  1
IE . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00A8H  1
_Delay_ms. . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  Nms. . . . . . . . . . . . . . . . .  * REG *  DATA   U_INT    0006H  2
  i. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0005H  1
_WriteOneChar. . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  dat. . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0005H  1
  i. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0003H  1
ReadTemperature. . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  a. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0001H  1
  b. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0002H  1
  t. . . . . . . . . . . . . . . . . .  AUTO     DATA   U_INT    0000H  2
  tt . . . . . . . . . . . . . . . . .  AUTO     DATA   FLOAT    0002H  4
DQ . . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      00B3H  1
Init_DS18B20 . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  x. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0005H  1
  time . . . . . . . . . . . . . . . .  AUTO     DATA   U_INT    0000H  2
ReadOneChar. . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  i. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0005H  1
  dat. . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0003H  1
main . . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  t. . . . . . . . . . . . . . . . . .  AUTO     DATA   U_INT    0000H  2
TMOD . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0089H  1
dis_digit. . . . . . . . . . . . . . .  PUBLIC   DATA   U_CHAR   0000H  1
dis_index. . . . . . . . . . . . . . .  PUBLIC   DATA   U_CHAR   0001H  1
dis_code . . . . . . . . . . . . . . .  PUBLIC   CODE   ARRAY    0000H  11
TH0. . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   008CH  1
TL0. . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   008AH  1
timer0 . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
TR0. . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      008CH  1
dis_buf. . . . . . . . . . . . . . . .  PUBLIC   DATA   ARRAY    0002H  4
_delay . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  i. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_INT    0006H  2


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    529    ----
   CONSTANT SIZE    =     11    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      6      10
   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 + -