欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 自己寫的ds18b20程序,找不到器件,請(qǐng)指導(dǎo) [打印本頁]

作者: reking8    時(shí)間: 2024-12-18 11:38
標(biāo)題: 自己寫的ds18b20程序,找不到器件,請(qǐng)指導(dǎo)
結(jié)合網(wǎng)上其他程序,自己又寫的,但是存在檢測(cè)返回1,不知道怎么回事,自己又檢查不出來,請(qǐng)幫忙看一下
作者: TandiHQ    時(shí)間: 2024-12-18 11:38
這是我當(dāng)時(shí)在VET6上寫的(標(biāo)準(zhǔn)庫),里面貼了源程序,再附上工程文件

DS18B20指令流程.docx

17.11 MB, 下載次數(shù): 0

STM32[STD]-DS18B20.7z

185.28 KB, 下載次數(shù): 0


作者: reking8    時(shí)間: 2024-12-18 14:50
這是文件包

STM32_DS18B20.zip

323.11 KB, 下載次數(shù): 0


作者: reking8    時(shí)間: 2024-12-18 15:58
reking8 發(fā)表于 2024-12-18 14:50
這是文件包

#include "stm32f10x.h"                  // Device header
#include "DS18B20.h"
#include "delay.h"

uint8_t DS18B20_Init(void)
{
  DS18B20_OUT_Mode();
  GPIO_SetBits(GPIOA,GPIO_Pin_0);
  DS18B20_Rst();
  return DS18B20_Check();
}

void DS18B20_Rst(void)
{
  DS18B20_OUT_Mode();
  GPIO_ResetBits(DS18B20_PORT,DS18B20_PIN);//復(fù)位脈沖,即拉低480-750us
  Delay_us(750);
  GPIO_SetBits(DS18B20_PORT,DS18B20_PIN);//釋放總線,即拉高
  Delay_us(30);    //拉高后,DS8B20等待15-60us,再發(fā)送存在脈沖
}
uint8_t DS18B20_Check(void)
{
  uint16_t retry = 0;
  
  DS18B20_IN_Mode();//切換到輸入模式
  //主機(jī)釋放總線后,ds18b20會(huì)等等待15-60us
  while(GPIO_ReadInputDataBit(DS18B20_PORT,DS18B20_PIN)&&retry<100)
  {
    retry ++;
    Delay_us(1);
  }
  if(retry>=100)   return 1;
  else retry = 0;
  
//發(fā)出存在脈沖60-240us后,拉高釋放總線,這里是等待釋放
  while(!GPIO_ReadInputDataBit(DS18B20_PORT,DS18B20_PIN)&&retry<240)
  {
    retry ++;
    Delay_us(1);
  }  
  if(retry >= 240)   return 1;
  else return 0;   
}

void DS18B20_Write_Bit(uint8_t dat)
{
  DS18B20_OUT_Mode();//切換到輸出模式
  if(dat)
  {
    GPIO_WriteBit(DS18B20_PORT,DS18B20_PIN,Bit_RESET);   //寫1
    Delay_us(2);
    GPIO_WriteBit(DS18B20_PORT,DS18B20_PIN,Bit_SET);
    Delay_us(60);
  }
  else
  {
    GPIO_WriteBit(DS18B20_PORT,DS18B20_PIN,Bit_RESET); //寫0
    Delay_us(60);
    GPIO_WriteBit(DS18B20_PORT,DS18B20_PIN,Bit_SET);//拉高釋放總線
    Delay_us(2);
  }
}
void DS18B20_Write_Byte(uint8_t dat)
{
  uint8_t i=0,k=0;
  
  for(i=0;i<8;i++)
  {
    k= dat&0x01;
    dat>>=1;
    Delay_us(2); //位之間有>1us時(shí)間間隙
    DS18B20_Write_Bit(k);
  }
}
uint8_t DS18B20_Read_Bit(void)
{
  uint8_t dat;
  
  DS18B20_OUT_Mode();//切換到輸出模式
  GPIO_WriteBit(DS18B20_PORT,DS18B20_PIN,Bit_RESET); //主機(jī)拉低總線,產(chǎn)生讀取命令
  Delay_us(2);
  GPIO_WriteBit(DS18B20_PORT,DS18B20_PIN,Bit_SET);//主機(jī)拉高釋放總線,等待從機(jī)發(fā)送
  
  DS18B20_IN_Mode();//切換到輸入模式
  Delay_us(10); //延時(shí),主機(jī)必須在15us內(nèi)采樣總線狀態(tài)
  if(GPIO_ReadInputDataBit(DS18B20_PORT,DS18B20_PIN)) //采樣
  {
    dat =1;
  }
  else dat =0;
  Delay_us(50);//每次讀時(shí)序至少需要60us
  return dat;
}
uint8_t DS18B20_Read_Byte(void)
{
  uint8_t i,dat=0,k=0;
  
  for(i=0;i<8;i++)
  {
    k =  DS18B20_Read_Bit();
    dat= (k<<7)|(dat>>1);
  }
  return dat;  
}

void DS18B20_Start(void)
{
   DS18B20_Rst();
   DS18B20_Check();
   DS18B20_Write_Byte(0xcc);//跳過ROM檢測(cè)
   DS18B20_Write_Byte(0x44);//開始轉(zhuǎn)換
}

float DS18B20_Get_Temp(void)
{
  uint16_t value,TL,TH;
  float temp;
  
  DS18B20_Start();
  DS18B20_Rst();
  DS18B20_Check();
  DS18B20_Write_Byte(0xcc);//跳過ROM檢測(cè)
  DS18B20_Write_Byte(0xbe);//開始轉(zhuǎn)換

  TL = DS18B20_Read_Byte();//LSB
  TH = DS18B20_Read_Byte();//MSB
  value = (TH<<8)+ TL;
  
  if((value&0xf800) == 0xf800)
  {
    value = (~value)+1;
    temp=value*(-0.0625);//乘以精度       
  }  
  else
  {
    temp=value*(0.0625);//乘以精度       
  }

  return temp;  
}

void DS18B20_OUT_Mode(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  
  DS18B20_RCC_CMD;
  GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);

}  

void DS18B20_IN_Mode(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  
  DS18B20_RCC_CMD;
  GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
}
作者: WL0123    時(shí)間: 2024-12-18 16:50
ds18b20對(duì)時(shí)序非常敏感,隨便找個(gè)程序要結(jié)合所使用的MCU特性和參數(shù)修改代碼,否則難以成功。
作者: cnos    時(shí)間: 2024-12-18 16:51
存在檢測(cè)的邏輯就是:
你和傳感器隔著一堵墻,有一根棍子。你想要知道傳感器在不在,就先拉一下棍子,至少拉15μS,最長60μS你就得放手了。

傳感器發(fā)現(xiàn)你拉了棍子,會(huì)在15-60μS之后,也拉一下棍子,拉60-240μS。

也就是在放手15-75μS或者15-255μS或者60-120或者60-300μS會(huì)看到傳感器也拉了一下棍子。

那么,如果傳感器在線,也就是在60-75μS之間,傳感器一定會(huì)拉一下棍子。

接下來你就自己對(duì)著干吧。
作者: lkc8210    時(shí)間: 2024-12-19 11:44
  1. void DS18B20_Rst(void)
  2. {
  3.   DS18B20_OUT_Mode();
  4.   GPIO_ResetBits(DS18B20_PORT,DS18B20_PIN);//復(fù)位脈沖,即拉低480-750us
  5.   Delay_us(750);
  6.   GPIO_SetBits(DS18B20_PORT,DS18B20_PIN);//釋放總線,即拉高
  7.   Delay_us(15);    //拉高后,DS8B20等待15-60us,再發(fā)送存在脈沖//<<<<<<<<<<<<<<<<<<<<<<<<<<<
  8. }
復(fù)制代碼



作者: zpwgf    時(shí)間: 2024-12-19 15:50
1.檢查一下你的硬件是否好壞。用標(biāo)準(zhǔn)程序去驗(yàn)證
2.檢查硬件接口,數(shù)據(jù)引腳和程序是否對(duì)應(yīng),如果不對(duì)應(yīng)還是會(huì)報(bào)錯(cuò)
3.檢查軟件時(shí)序是否正確,拉低拉高時(shí)長是否滿足手冊(cè)要求
4.實(shí)在找不出問題,使用標(biāo)準(zhǔn)程序修改管腳即可
作者: capation    時(shí)間: 2024-12-20 16:28
可以自己編寫一個(gè)塊,讓后整合一下




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1