找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1525|回复: 2
打印 上一主题 下一主题
收起左侧

STM32F1与DS18B20仿真监测温度,开始仿真后,要等一会才可以读出准确温度是怎么回事?

[复制链接]
跳转到指定楼层
#
用Proteus仿真时,stm32f103R6在读取 ds18b20 的温度时,温度总是过一会才可以读出准确温度,但是dht11在仿真时就可以直接读出有没有知道原因的大佬指点一下

如下图所示

未显示准确温度


显示准确温度

监测ds18b20单片机代码:
  1. #include "ds18b20.h"
  2. #include "delay.h"

  3. void DS18B20_Rst(void)
  4. {                 
  5.         DS18B20_IO_OUT();         //SET PG11 OUTPUT
  6.     DS18B20_DQ_OUT=0
  7.     my_delay_us(1200);
  8.     DS18B20_DQ_OUT=1;         //DQ=1
  9.         my_delay_us(20);
  10. }
  11. u8 DS18B20_Check(void)
  12. {   
  13.         u8 retry=0;
  14.         DS18B20_IO_IN();        //SET PG11 INPUT
  15.     while (DS18B20_DQ_IN&&retry<200)
  16.         {
  17.                 retry++;
  18.                 my_delay_us(5);
  19.         };
  20.         if(retry>=200)return 1;
  21.         else retry=0;
  22.     while (!DS18B20_DQ_IN&&retry<240)
  23.         {
  24.                 retry++;
  25.                 my_delay_us(5);
  26.         };
  27.         if(retry>=240)return 1;            
  28.         return 0;
  29. }
  30. u8 DS18B20_Read_Bit(void)         
  31. {
  32.     u8 data;
  33.         DS18B20_IO_OUT();        //SET PG11 OUTPUT
  34.     DS18B20_DQ_OUT=0;
  35.         my_delay_us(4);
  36.     DS18B20_DQ_OUT=1;
  37.         DS18B20_IO_IN();        //SET PG11 INPUT
  38.         my_delay_us(30);
  39.         if(DS18B20_DQ_IN)data=1;
  40.     else data=0;         
  41.     my_delay_us(140);
  42.     return data;
  43. }
  44. u8 DS18B20_Read_Byte(void)     
  45. {        
  46.     u8 i,j,dat;
  47.     dat=0;
  48.         for (i=1;i<=8;i++)
  49.         {
  50.         j=DS18B20_Read_Bit();
  51.         dat=(j<<7)|(dat>>1);
  52.     }                                                   
  53.     return dat;
  54. }
  55. void DS18B20_Write_Byte(u8 dat)     
  56. {            
  57.     u8 j;
  58.     u8 testb;
  59.         DS18B20_IO_OUT();        //SET PG11 OUTPUT;
  60.     for (j=1;j<=8;j++)
  61.         {
  62.         testb=dat&0x01;
  63.         dat=dat>>1;
  64.         if (testb)
  65.         {
  66.             DS18B20_DQ_OUT=0;        // Write 1
  67.             my_delay_us(4);                           
  68.             DS18B20_DQ_OUT=1;
  69.             my_delay_us(140);            
  70.         }
  71.         else
  72.         {
  73.             DS18B20_DQ_OUT=0;        // Write 0
  74.             my_delay_us(140);            
  75.             DS18B20_DQ_OUT=1;
  76.             my_delay_us(4);                          
  77.         }
  78.     }
  79. }
  80. void DS18B20_Start(void)
  81. {                                                                  
  82.     DS18B20_Rst();           
  83.         DS18B20_Check();         
  84.     DS18B20_Write_Byte(0xcc);        // skip rom
  85.     DS18B20_Write_Byte(0x44);        // convert
  86. }
  87. u8 DS18B20_Init(void)
  88. {
  89.          GPIO_InitTypeDef  GPIO_InitStructure;
  90.          
  91.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE)
  92.         
  93.          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;                                //PORTC.11 íÆíìêä3ö
  94.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  
  95.          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  96.          GPIO_Init(GPIOC, &GPIO_InitStructure);

  97.          GPIO_SetBits(GPIOC,GPIO_Pin_11);    //êä3ö1

  98.         DS18B20_Rst();

  99.         return DS18B20_Check();
  100. }
  101. short DS18B20_Get_Temp(void)
  102. {
  103.     u8 temp;
  104.     u8 TL,TH;
  105.         short tem;
  106.     DS18B20_Start ();                          // ds1820 start convert
  107.     DS18B20_Rst();
  108.     DS18B20_Check();         
  109.     DS18B20_Write_Byte(0xcc);        // skip rom
  110.     DS18B20_Write_Byte(0xbe);        // convert            
  111.     TL=DS18B20_Read_Byte();         // LSB   
  112.     TH=DS18B20_Read_Byte();         // MSB  
  113.                      
  114.     if(TH>7)
  115.     {
  116.         TH=~TH;
  117.         TL=~TL;
  118.         temp=0;
  119.     }else temp=1;
  120.     tem=TH
  121.     tem<<=8;   
  122.     tem+=TL;                                       
  123.     tem=(float)tem*0.625;            
  124.         if(temp)return tem;                 
  125.         else return -tem;   
  126. }
复制代码




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883242 发表于 2022-5-11 00:28 | 只看该作者
既然是仿真,就别计较太多了。你要是用实物搭出这种效果,才有解决的意义。
回复

使用道具 举报

楼主
ID:743781 发表于 2022-5-10 23:56 | 只看该作者
不发全部的 怎么看的出
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表