久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 自己寫的ds18b20程序,找不到器件,請指導 [打印本頁]

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

DS18B20指令流程.docx

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

STM32[STD]-DS18B20.7z

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


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

STM32_DS18B20.zip

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


作者: reking8    時間: 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);//復位脈沖,即拉低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();//切換到輸入模式
  //主機釋放總線后,ds18b20會等等待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時間間隙
    DS18B20_Write_Bit(k);
  }
}
uint8_t DS18B20_Read_Bit(void)
{
  uint8_t dat;
  
  DS18B20_OUT_Mode();//切換到輸出模式
  GPIO_WriteBit(DS18B20_PORT,DS18B20_PIN,Bit_RESET); //主機拉低總線,產(chǎn)生讀取命令
  Delay_us(2);
  GPIO_WriteBit(DS18B20_PORT,DS18B20_PIN,Bit_SET);//主機拉高釋放總線,等待從機發(fā)送
  
  DS18B20_IN_Mode();//切換到輸入模式
  Delay_us(10); //延時,主機必須在15us內(nèi)采樣總線狀態(tài)
  if(GPIO_ReadInputDataBit(DS18B20_PORT,DS18B20_PIN)) //采樣
  {
    dat =1;
  }
  else dat =0;
  Delay_us(50);//每次讀時序至少需要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檢測
   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檢測
  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    時間: 2024-12-18 16:50
ds18b20對時序非常敏感,隨便找個程序要結合所使用的MCU特性和參數(shù)修改代碼,否則難以成功。
作者: cnos    時間: 2024-12-18 16:51
存在檢測的邏輯就是:
你和傳感器隔著一堵墻,有一根棍子。你想要知道傳感器在不在,就先拉一下棍子,至少拉15μS,最長60μS你就得放手了。

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

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

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

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



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




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 在线观看日本高清二区 | 18成人在线观看 | 成人av网站在线观看 | 欧美日本韩国一区二区 | 国产中文字幕av | 操久久| 国产精品视频久久 | av免费网站在线观看 | 在线亚州| 精品一区精品二区 | 亚洲成人精品在线观看 | 亚洲美女一区二区三区 | 亚洲国产精品va在线看黑人 | 九九精品在线 | 成人性生交大片免费看r链接 | av在线播放不卡 | 天堂av资源 | 影音先锋久久 | 中文精品视频 | 成人一级片在线观看 | 午夜激情在线 | 国产在线精品一区二区三区 | 99精品一区 | 一区二区三区国产 | 视频一区中文字幕 | 精品国产鲁一鲁一区二区张丽 | 欧美一级久久久猛烈a大片 日韩av免费在线观看 | 91操操操 | av中文字幕在线播放 | 欧美色人 | 女人毛片a毛片久久人人 | 91深夜福利视频 | 波多野结衣二区 | 99精品视频在线观看 | 成人av片在线观看 | 日本精品一区二区在线观看 | 亚洲一区二区三区在线观看免费 | 黑人巨大精品欧美一区二区免费 | 亚洲成人国产综合 | 久久久精品一区 | www..99re |