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

📄 ds1820.lst

📁 温度芯片DS1820读写程序实例(基于MSC-51)
💻 LST
📖 第 1 页 / 共 2 页
字号:
 158          //输入参数      : <pSN>温度芯片的序号(ROM码)
 159          //              :  <pRdData> 存放读取出的数据
 160          //              :  <byLen>需读取的数据的长度
 161          void RdScratchpad(U8 *pSN, U8 *pRdData, U8 byLen)
 162          {
 163   1              U8 i;
 164   1              
 165   1              //输入参数检查
 166   1              if(byLen > 9)
 167   1              {
 168   2                      byLen = 9;
 169   2              }
 170   1              
 171   1              SendHeaderData(pSN, 0xbe);
 172   1              
 173   1              //读出数据
 174   1              for(i=0;i<byLen;i++)
 175   1              {
 176   2                      *pRdData++ = RdByte();
 177   2              }
 178   1              
 179   1              ResetChip();                    //复位芯片,结束读操作
C51 COMPILER V7.01  DS1820                                                                 07/11/2004 16:17:48 PAGE 4   

 180   1              Delay_ms(1);                    //延时  
 181   1      }
 182          
 183          
 184          //函数功能      : 写温度芯片中间寄存器(从偏移地址2开始)
 185          //输入参数      : <pSN>温度芯片的序号(ROM码)
 186          //              :  <pWrData> 写到中间寄存器的源数据
 187          //              :  <byLen>写入数据的长度        
 188          void WrScratchpad(U8 *pSN, U8 *pWrData, U8 byLen) 
 189          {
 190   1              U8 i;
 191   1              
 192   1              //输入参数检查
 193   1              if(byLen > 2)
 194   1              {
 195   2                      byLen = 2;
 196   2              }
 197   1              
 198   1              SendHeaderData(pSN, 0x4e);              //发送协议头                    
 199   1              
 200   1              //写入数据
 201   1              for(i=0;i<byLen;i++)
 202   1              {
 203   2                      WrByte(*pWrData++);
 204   2              }
 205   1              
 206   1              ResetChip();                            //复位芯片,结束写操作
 207   1              Delay_ms(1);                            //延时  
 208   1      }
 209          
 210          //函数功能:启动温度转换过程
 211          //输入参数:<pSN>芯片序号
 212          void StartConvertTmpt (U8 *pSN)                                                 //
 213          {       
 214   1              U8 byBusyFlag=0;
 215   1               
 216   1              SendHeaderData(pSN, 0x44);              //发送协议头                                    
 217   1              
 218   1              while(1)                                //某些情况下,这里可能出现死循环
 219   1              {
 220   2                      byBusyFlag = RdByte();
 221   2                      if(byBusyFlag == 0xff)
 222   2                      {
 223   3                              break;
 224   3                      }
 225   2              }
 226   1              
 227   1              ResetChip ();                           //复位,保持低电平480-960us                                      //
 228   1              Delay_ms(1);
 229   1      }                                                                       
 230          
 231          //函数功能      :读取温度
 232          //输入参数      : <pSN>芯片序号
 233          //输出参数      : 温度值,放大10倍的整数
 234          S16 RdTemperture (U8 *pSN)                                                              //
 235          {                                                                       
 236   1              U8 byRdData[8];
 237   1              U8 byTEMP_READ;
 238   1              U8 byCOUNT_PER_C;
 239   1              U8 byCOUNT_REMAIN;
 240   1              S16 t;                                                  
 241   1              float ft;
C51 COMPILER V7.01  DS1820                                                                 07/11/2004 16:17:48 PAGE 5   

 242   1              
 243   1              
 244   1              RdScratchpad(pSN, byRdData, 8);         //读取数据,没有读CRC校验码
 245   1      
 246   1              //0.5摄氏度精度的计算方法
 247   1      //      t = byRdData[0]+(byRdData[1]<<8);       //1表示0.5摄氏度
 248   1      //      return t;
 249   1              
 250   1              t = byRdData[0]+(byRdData[1]<<8);
 251   1              byTEMP_READ = t>>1;
 252   1              byCOUNT_REMAIN = byRdData[6];
 253   1              byCOUNT_PER_C = byRdData[7];
 254   1                                              
 255   1              ft = (float)byTEMP_READ - 0.25 + (float)(byCOUNT_PER_C - byCOUNT_REMAIN)/(float)byCOUNT_PER_C;
 256   1              t = ft*10;
 257   1              
 258   1              return t;                               //1表示0.1摄氏度                                                        
 259   1      }                                                                       
 260          
 261          //函数功能      :读取芯片序号(只能在总线只有一个器件时调用)
 262          //输入参数      : <pSN>返回的芯片序号存放地址
 263          void ReadROM(U8 *pSN)                                                                   //
 264          {                                                                       
 265   1              U8 i;
 266   1              
 267   1              ResetChip ();                   //复位                                  
 268   1              Delay_ms (1);                   //延时                                  
 269   1              WrByte(0x33);                   //发送读序列号子程序                    
 270   1              
 271   1              for(i=0;i<8;i++)
 272   1              {
 273   2                      *pSN ++ = RdByte();     //读取第一个序列号,应为10H;           //
 274   2              }                                                       
 275   1      }                                                                       
 276          
 277          //功能  :写温度报警上下限
 278          //输入参数      : <pSN>温度芯片序号
 279          //              :  <nHighAlarmLim> 温度报警上限
 280          //              :  <nLowAlarmLim> 温度报警下限
 281          U8 WrTmptAlarmLim(U8 *pSN, S16 nHighAlarmLim, S16 nLowAlarmLim)
 282          {
 283   1              U8 byWrData[2];
 284   1              U8 byRdData[4];
 285   1              
 286   1              byWrData[0] = nHighAlarmLim;
 287   1              byWrData[1] = nLowAlarmLim;
 288   1              
 289   1              WrScratchpad(pSN, byWrData, 2);         //写入数据
 290   1              
 291   1              RdScratchpad(pSN, byRdData, 4);         //读出数据进行校验
 292   1              if((byRdData[2] != nHighAlarmLim) || (byRdData[3] != nLowAlarmLim))
 293   1              {
 294   2                      return FALSE;
 295   2              }
 296   1              
 297   1              //将中间寄存器数据拷贝到E2RAM(存放报警限数据)
 298   1              SendHeaderData(pSN, 0x48);
 299   1              Delay_ms (6);                           //延时6ms       
 300   1              ResetChip();                            //复位芯片,结束本次操作
 301   1      }
 302                  
 303                          
C51 COMPILER V7.01  DS1820                                                                 07/11/2004 16:17:48 PAGE 6   

 304                                                                                  
 305          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    711    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      51
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       3
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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