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

📄 ds1820.lst

📁 温度芯片DS1820读写程序实例(基于MSC-51)
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.01  DS1820                                                                 07/11/2004 16:17:48 PAGE 1   


C51 COMPILER V7.01, COMPILATION OF MODULE DS1820
OBJECT MODULE PLACED IN ds1820.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE ds1820.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          //**********************************************************************
   2          //功能          : 实时时钟DS1302操作模块
   3          //作者          : lihj
   4          //创建日期      : 2004-07-10
   5          //版本          : V1.0
   6          //修改记录      : 
   7          //***********************************************************************
   8          #include <reg51.h>
   9          #include <std.h>
  10          #include <ds1820.h>
  11          
  12          sbit TMDAT = P3^4;                      //根据实实际情况设定
  13          
  14          //函数功能:延时(12MHz晶振)
  15          //输入参数:<count>延时时间长度,单位1ms
  16          void Delay_ms (U16 count)                                               
  17          {                                                                       
  18   1              U16 i;                                                          
  19   1              while (count)                                                   
  20   1              {                                                               
  21   2                      i = 123;                                                
  22   2                      while (i>0) i--;                                        
  23   2                      count--;                                                
  24   2          }                                                                   
  25   1      }                                                                       
  26          
  27          //函数功能:复位芯片(至少480us长的低电平信号)
  28          void ResetChip (void)                                                   
  29          {                                                                       
  30   1              U16 i;  
  31   1                                                              
  32   1              TMDAT = 0;                              //480us~960us长低电平:复位
  33   1              i = 150;                                                        
  34   1              while (i--);            //延时约900 uS(12Mhz时) 
  35   1              TMDAT = 1;                                                      
  36   1              i = 5;                                                          
  37   1              while (i--);                    //DS1820检测到上升沿后,过15~60us后输出“存在”信号
  38   1      }
  39          
  40          //函数功能:    判断DS1820是否存在
  41          //返回参数:    TRUE:芯片存在
  42          //              FALSE:芯片不存在
  43          U8 ChipPresenceCheck(void)                              
  44          {                                                               
  45   1              U16 i;                                                  
  46   1              
  47   1              ResetChip();
  48   1              
  49   1              //等待70us,应该检测到低电平
  50   1              i = 11;
  51   1              while(i--);
  52   1              if(TMDAT)
  53   1              {
  54   2                      return FALSE;
  55   2              }
C51 COMPILER V7.01  DS1820                                                                 07/11/2004 16:17:48 PAGE 2   

  56   1              
  57   1              //等待400us,应检测到高电平,低电平信号保持60~240us
  58   1              i = 65; 
  59   1              while (i--);
  60   1              if(TMDAT)
  61   1              {
  62   2                      return TRUE;            
  63   2              }
  64   1              else
  65   1              {
  66   2                      return FALSE;
  67   2              }       
  68   1      }                                                                       
  69          
  70          //函数功能:从总线上读取1位信号
  71          bit RdBit (void)                                                        
  72          {                                                                         
  73   1              U16 i;                                                  
  74   1              bit b0;                                                 
  75   1              TMDAT = 0; i++;                         //下降沿之后,保持低电平至少1us                                         //
  76   1              TMDAT = 1; i++; i++;            //微量延时(既作输入又作输出的I/O脚,读数据时,先拉高电平)
  77   1              
  78   1              b0 = TMDAT;                                                     
  79   1              i = 9; 
  80   1              while (i--);                            //延时60us              
  81   1              return (b0);                                                    
  82   1      }                                                                       
  83          
  84          //函数功能:从总线上读取1个字节信号
  85          U8 RdByte (void)                                                
  86          {                                                                       
  87   1              U8 i,j,byRdData=0;                                              
  88   1              
  89   1              for (i=0;i<8;i++)                                               
  90   1              {                                                               
  91   2                      j = RdBit ();
  92   2                      byRdData >>= 1;                                         
  93   2                      byRdData = (j << 7) | byRdData;                         
  94   2              }                                                               
  95   1              return (byRdData);                                                      
  96   1      }                                                                       
  97          
  98          //函数功能:向总线上写一位数据  
  99          void WrBit(bit b0)
 100          {
 101   1              U8 i;
 102   1              
 103   1              if (b0)                                         
 104   1              {                                                       
 105   2                      TMDAT = 0;                              //产生一个下降沿,低电平至少保持1us     //
 106   2                      i++; i++;                                                       
 107   2                      TMDAT = 1;                              //输出1                         
 108   2                      i = 9; while (i--);                     //高电平保持60us                        //
 109   2              }                                                       
 110   1              else                                                    
 111   1              {                                                       
 112   2                      TMDAT = 0;                              // 写0  
 113   2                      i = 9; while (i--);                     //低电平保持60us                        //
 114   2                      TMDAT = 1;                                      
 115   2                      i++; i++;                                       
 116   2              }       
 117   1      }
C51 COMPILER V7.01  DS1820                                                                 07/11/2004 16:17:48 PAGE 3   

 118          
 119          //向总线上写一个字节
 120          void WrByte (U8 dat)                                    
 121          {                                                               
 122   1              U8 i;                                           
 123   1              bit testb;                                                      
 124   1              for (i=0;i<8;i++)                                               
 125   1              {                                                               
 126   2                      testb = dat & 0x01;                                     
 127   2                      dat = dat >> 1;                                         
 128   2                      WrBit(testb);                                           
 129   2              }                                                               
 130   1      }                                                                       
 131          
 132          //函数功能      :写1-Wire协议头操作(复位芯片、选择芯片、写命令码)
 133          //输入参数      :<pSN>芯片序号
 134          //              : <byCommand>命令码
 135          void SendHeaderData(U8 *pSN, U8 byCommand)
 136          {
 137   1              U8 i;
 138   1              
 139   1              ResetChip();                    //复位                          
 140   1              Delay_ms(1);                    //延时                          
 141   1      
 142   1      //***********************
 143   1      //如果总线上只有一个设备,不需要选择芯片操作    
 144   1      #if     (CHIP_NUM_IN_WIRE == 1)
                      WrByte(0xcc);                   //总线上只有一个设备,跳过芯片匹配步骤
              #else   
 147   1              WrByte(0x55);                   //发送ROM匹配命令               
 148   1              for(i=0;i<8;i++)                                        
 149   1              {                                                       
 150   2                      WrByte(*pSN++);         //发送64位序列号        
 151   2              }
 152   1      #endif                                                  
 153   1      
 154   1              WrByte(byCommand);              //发送读取中间寄存器命令
 155   1      }
 156          
 157          //函数功能      : 读温度芯片中间寄存器(从偏移地址0开始)

⌨️ 快捷键说明

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