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

📄 main3.lst

📁 STC12C54XX 下 DS18B20 温度传感器控制程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 190          //串口发送子程序
 191          void send(uchar cmd)
 192          { 
 193   1         P3_7 = 1;
 194   1         SBUF = cmd;
 195   1         while(!TI);
 196   1         TI=0;
 197   1         P3_7 = 0;
 198   1      
 199   1      }
 200          
 201          
 202          /************************************************************
 203          *Function:18B20初始化
 204          *************************************************************/
 205          void Init18B20 (void)
 206          { DQ = 1;
 207   1        _nop_();
 208   1        DQ = 0;
 209   1        TempDelay(150);     //延时 480 uS
 210   1        TempDelay(200);
 211   1        TempDelay(200);
 212   1        //_nop_();
 213   1        DQ = 1;
 214   1        TempDelay(60);     //延时  60 uS
 215   1        //_nop_();
 216   1      
 217   1        if(DQ == 0)
 218   1          Flag = 1;        //检测到总线上有 DS1820
 219   1        else
 220   1          Flag = 0;        //没有检测到总线上的 DS1820
 221   1      
 222   1        TempDelay(250);    //250
 223   1        TempDelay(200);
 224   1        //_nop_();
 225   1        //_nop_();
 226   1        DQ = 1;                        //释放DS18B20总线
 227   1      }
 228          
 229          
 230          /************************************************************
 231          *Function:向18B20写入一个字节
 232          *************************************************************/
 233          void WriteByte (uchar WR)    //单字节写入
 234          { uchar i;
 235   1      
 236   1        for (i = 0;i < 8;i++)
 237   1        { DQ = 0;                                      //写时间隙开始
 238   2          TempDelay(16);                       //DS18B20总线复位保持16us
 239   2          DQ = WR & 0x01;                      //写一个bit
C51 COMPILER V8.05a   MAIN3                                                                03/20/2008 09:46:54 PAGE 5   

 240   2          TempDelay(45);           //等待 45 uS
 241   2          //_nop_();
 242   2              WR >>= 1;
 243   2              DQ = 1;                                  //释放总线准备写入下一位
 244   2          _nop_();                             //1us 恢复时间
 245   2        }
 246   1        DQ = 1;                                        //释放DS18B20总线
 247   1      }
 248          
 249          
 250          /************************************************************
 251          *Function:读18B20的一个字节
 252          *************************************************************/
 253          uchar ReadByte (void)       //读取单字节
 254          { uchar i,u = 0;
 255   1      
 256   1        for(i = 0;i < 8;i++)
 257   1        { u >>= 1;
 258   2          DQ = 0;                                 //读时间隙开始
 259   2              _nop_();
 260   2          DQ = 1;                                 //开始读,总线释放
 261   2              TempDelay(8);           //持续 8 uS
 262   2          if(DQ == 1)
 263   2            u |= 0x80;                    //从DS18B20读得一位bit
 264   2          TempDelay(45);                  //持续 60 uS
 265   2              DQ = 1;                                 //释放总线准备读下一位
 266   2          _nop_();                            //1us 恢复时间
 267   2        }
 268   1        DQ = 1;                               //重新释放DS18B20 总线
 269   1        return(u);                            //返回从DS18B20总线上获得的数据
 270   1      }
 271          
 272          
 273          /************************************************************
 274          *Function:读18B20
 275          *************************************************************/
 276          void read_18B20 (uchar j)
 277          { uchar i;
 278   1        for(i = 0;i < j;i++)
 279   1        { *p = ReadByte();
 280   2          p++;
 281   2        }
 282   1      }
 283          
 284          
 285          /************************************************************
 286          *Function:CRC校验
 287          *************************************************************/
 288          uchar CRC (uchar j)
 289          { uchar i,crc_data = 0;
 290   1        for(i = 0;i < j;i++)                             //查表校验
 291   1          crc_data = CrcTable[crc_data^temp_buff[i]];
 292   1        return (crc_data);
 293   1      }
 294          
 295          
 296          /************************************************************
 297          *Function:读取温度
 298          *************************************************************/
 299          void GemTemp (void)
 300          { read_18B20 (9);
 301   1        if (CRC(9) == 0)         //校验正确
C51 COMPILER V8.05a   MAIN3                                                                03/20/2008 09:46:54 PAGE 6   

 302   1        { Temperature = temp_buff[1]*0x100 + temp_buff[0];
 303   2          //Temperature *= 0.0625;
 304   2          Temperature /= 16;
 305   2          TempDelay(1);
 306   2        }
 307   1      }
 308          
 309          
 310          /************************************************************
 311          *Function:内部配置
 312          *************************************************************/
 313          void Config18b20 (void)    //重新配置报警限定值和分辨率
 314          { Init18B20();
 315   1        WriteByte(0xCC);    //skip rom
 316   1        WriteByte(0x4E);    //WRite scratchpad
 317   1        WriteByte(0x19);    //上限
 318   1        WriteByte(0x1A);    //下限
 319   1        WriteByte(0x7F);    //set 11 bit (0.125)
 320   1      
 321   1        Init18B20();
 322   1        WriteByte(0xCC);    //skip rom
 323   1        WriteByte(0x48);    //保存设定值
 324   1      
 325   1        Init18B20();
 326   1        WriteByte(0xCC);    //skip rom
 327   1        WriteByte(0xB8);    //回调设定值
 328   1      }
 329          
 330          
 331          /************************************************************
 332          *Function:读18B20ID
 333          *************************************************************/
 334          void ReadID (void)    //读取器件 id
 335          { Init18B20();
 336   1        WriteByte(0x33);    //read rom
 337   1        read_18B20(8);
 338   1      }
 339          
 340          
 341          /************************************************************
 342          *Function:18B20ID全处理
 343          *************************************************************/
 344          void TemperatuerResult(void)
 345          { p = ID_buff;
 346   1        ReadID();                        //读取ID
 347   1        Config18b20();           //内部配置
 348   1      
 349   1        Init18B20 ();            //复位
 350   1        WriteByte(0xCC);     //skip rom
 351   1        WriteByte(0x44);     //开始温度转换
 352   1        DQ = 1;
 353   1        TempDelay(200);
 354   1        TempDelay(200);
 355   1        TempDelay(200);
 356   1      
 357   1        Init18B20 ();            //复位
 358   1        WriteByte(0xCC);     //skip rom
 359   1        WriteByte(0xBE);     //读取暂存器和CRC 字节
 360   1        p = temp_buff;
 361   1        GemTemp();
 362   1      }
 363          
C51 COMPILER V8.05a   MAIN3                                                                03/20/2008 09:46:54 PAGE 7   

 364          
 365          //串口接收中断
 366          void uart_isr()    interrupt  4
 367          { 
 368   1        EA = 0;
 369   1      
 370   1        comData = SBUF;                                //接收数据
 371   1        RI  = 0;
 372   1      
 373   1        EA = 1;
 374   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    542    ----
   CONSTANT SIZE    =    256    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     23      23
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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