ds18b20.lst

来自「使用PROTEUS仿真的智能温度计,使用DS18B20测温,C编写」· LST 代码 · 共 216 行

LST
216
字号
C51 COMPILER V8.08   DS18B20                                                               08/04/2008 18:57:57 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE DS18B20
NO OBJECT MODULE REQUESTED
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DS18B20.c BROWSE DEBUG OBJECTEXTEND SRC(.\DS18B20.SRC)

line level    source

   1          // *********************************************************************************** //
   2          //
   3          //      Filename                :   DS18B20.c
   4          //      Title           :   DS18B20 test file
   5          //      Author                  :   MO YAN
   6          //      Created Date    :   2008.8.2
   7          //      Revisited Date  :   2008.8.2
   8          //      Description             :   Provide Function to get the temprature from the DS18B20 at any three pins
   9          //      Version         :   1.2
  10          //
  11          //  Copyright (c) 2008, All rights reserved.
  12          // *********************************************************************************** //
  13          #include<regx51.h>
  14          sbit rs=P3^4;   //LCD pins
  15          sbit rw=P3^5;
  16          sbit en=P3^6;
  17          sbit DQ=P3^7;   //DS18B20 pin
  18          
  19          unsigned char L_18B20,H_18B20;
  20          unsigned int fg=0,zhengshu,xiaoshu_a;
  21          char code number[]="0123456789";
  22          
  23          /*--------LCD--------*/
  24          void delay100us(void)
  25          {
  26   1         #pragma asm
  27   1                  MOV      R5,#3           
  28   1      LOOP1:      MOV      R6,#7           
  29   1      LOOP2:      NOP                        
  30   1             NOP                         
  31   1             DJNZ    R6,LOOP2              
  32   1                  DJNZ      R5,LOOP1 
  33   1         #pragma endasm
  34   1      } 
  35          
  36          void write_command(unsigned command)
  37          {
  38   1         rw=0;
  39   1         rs=0;
  40   1         en=1;
  41   1         P2=command;
  42   1         delay100us();
  43   1         en=0;
  44   1         rw=1;
  45   1      }
  46          
  47          void write_data(unsigned lcddata)
  48          {
  49   1         rw=0;
  50   1         rs=1;
  51   1         en=1;
  52   1         P2=lcddata;
  53   1         delay100us();
  54   1         en=0;
  55   1         rw=1;
C51 COMPILER V8.08   DS18B20                                                               08/04/2008 18:57:57 PAGE 2   

  56   1      }
  57          
  58          void display_string(unsigned x,unsigned y,char*p)
  59          {
  60   1         if(x==1)
  61   1            write_command(128+y);
  62   1         else
  63   1            write_command(192+y);
  64   1         while(*p)
  65   1         {
  66   2            write_data(*p);
  67   2                p++;
  68   2              }
  69   1      }
  70          
  71          /*void display_num(unsigned x,unsigned y,unsigned i)
  72          {
  73             if(x==1)
  74                write_command(128+y);
  75             else
  76                write_command(192+y);
  77             write_data(number[i]);
  78          } */
  79            
  80          /*------DS18B20------*/
  81          
  82          
  83          void delay_18B20(unsigned int i)
  84          {
  85   1              while(i--);
  86   1      }
  87          
  88          
  89          /*DS18B20的复位脉冲 主机通过拉低单总线至少480us以产生复位脉冲
  90            然后主机释放单总线并进入接收模式 此时单总线电平被拉高
  91            DS18B20检测到上升沿后 延时15~60us,拉低总线60~240us产生应答脉冲  */                                         
  92          void Init_DS18B20(void) 
  93          {
  94   1               unsigned char x=0;
  95   1               DQ = 1;          //DQ复位
  96   1               delay_18B20(8);  //稍做延时
  97   1               DQ = 0;          //单片机将DQ拉低
  98   1               delay_18B20(80); //精确延时 大于 480us
  99   1               DQ = 1;          //拉高总线
 100   1               delay_18B20(14);
 101   1               x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 102   1               delay_18B20(20);
 103   1      }
 104          
 105          /*写时隙 主机在写1时隙向DS18B20写入1,在写0时隙向DS18B20写入0
 106            所有写时隙至少需要60us,且在两次写时隙之间至少需要1us的恢复时间
 107            两种写时隙均以主机拉低总线开始
 108            产生写1时隙:主机拉低总线后,必须在15us内释放总线,由上拉电阻拉回至高电平
 109            产生写0时隙:主机拉低总线后,必须整个时隙保持低电平 */
 110          void WriteOneChar(unsigned char dat)
 111          {
 112   1              unsigned char i=0;
 113   1              for (i=8; i>0; i--)
 114   1              {
 115   2                      DQ = 0;
 116   2                      DQ = dat&0x01;
 117   2              delay_18B20(5);
C51 COMPILER V8.08   DS18B20                                                               08/04/2008 18:57:57 PAGE 3   

 118   2                      DQ = 1;
 119   2              dat>>=1;
 120   2       }
 121   1      }
 122            
 123          /*所有读时隙至少60us 且两次独立的读时隙之间至少需要1us的恢复时间
 124            每次读时隙由主机发起,拉低总线至少1us。
 125            若传1,则保持总线高电平;若发送0,则拉低总线
 126            传0时DS18B20在该时隙结束时释放总线,再拉回高电平状态,主机必须在读时隙开始后的15us内释放总线,并保持采样
             -总线状态 */
 127          unsigned char ReadOneChar(void)
 128          {
 129   1              unsigned char i=0;
 130   1              unsigned char dat = 0;
 131   1              for (i=8;i>0;i--)
 132   1               {
 133   2                        DQ = 0; // 给脉冲信号
 134   2                        dat>>=1;
 135   2                        DQ = 1; // 给脉冲信号
 136   2                        if(DQ)
 137   2                        dat|=0x80;
 138   2                        delay_18B20(4);
 139   2               }
 140   1              return(dat);
 141   1      }
 142                           
 143          
 144          void read_18B20(void)
 145          {
 146   1      
 147   1              Init_DS18B20();
 148   1              WriteOneChar(0xCC);     // 跳过读序号列号的操作
 149   1              WriteOneChar(0x44);     // 启动温度转换
 150   1      
 151   1              delay_18B20(100);       // this message is wery important
 152   1      
 153   1              Init_DS18B20();
 154   1              WriteOneChar(0xCC);     //跳过读序号列号的操作
 155   1              WriteOneChar(0xBE);     //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
 156   1      
 157   1              delay_18B20(100);
 158   1      
 159   1              L_18B20=ReadOneChar();  //读取低八位数据
 160   1              H_18B20=ReadOneChar();  //读取高八位数据
 161   1      
 162   1              zhengshu=L_18B20/16+H_18B20*16; //整数部分
 163   1              xiaoshu_a=(L_18B20&0x0f)*10/16; //小数第一位
 164   1      }
 165          
 166          
 167          /*------MAIN------*/
 168          void main(void)
 169          {
 170   1         write_command(56);
 171   1         write_command(12);
 172   1         write_command(6);
 173   1         write_command(1);
 174   1         write_command(2);
 175   1         display_string(1,0," Temprature:");
 176   1         do{read_18B20();
 177   2         write_command(192);
 178   2         write_data((0x30|(zhengshu/10)));
C51 COMPILER V8.08   DS18B20                                                               08/04/2008 18:57:57 PAGE 4   

 179   2         write_data((0x30|(zhengshu-(zhengshu/10)*10)));
 180   2         write_data(0x2e);
 181   2         write_data(0x30|xiaoshu_a);
 182   2         }
 183   1         while(1);
 184   1      }
 185                   


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    410    ----
   CONSTANT SIZE    =     24    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      8    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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