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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1656|回復: 8
打印 上一主題 下一主題
收起左側

自己寫的ds18b20程序,找不到器件,請指導

[復制鏈接]
跳轉到指定樓層
樓主
ID:929517 發表于 2024-12-18 11:38 來自手機 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
100黑幣
結合網上其他程序,自己又寫的,但是存在檢測返回1,不知道怎么回事,自己又檢查不出來,請幫忙看一下

最佳答案

查看完整內容

這是我當時在VET6上寫的(標準庫),里面貼了源程序,再附上工程文件
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1140385 發表于 2024-12-18 11:38 | 只看該作者
這是我當時在VET6上寫的(標準庫),里面貼了源程序,再附上工程文件

DS18B20指令流程.docx

17.11 MB, 下載次數: 0

STM32[STD]-DS18B20.7z

185.28 KB, 下載次數: 0

回復

使用道具 舉報

板凳
ID:929517 發表于 2024-12-18 14:50 | 只看該作者
這是文件包

STM32_DS18B20.zip

323.11 KB, 下載次數: 0

回復

使用道具 舉報

地板
ID:929517 發表于 2024-12-18 15:58 來自手機 | 只看該作者
reking8 發表于 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,再發送存在脈沖
}
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;
  
//發出存在脈沖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); //主機拉低總線,產生讀取命令
  Delay_us(2);
  GPIO_WriteBit(DS18B20_PORT,DS18B20_PIN,Bit_SET);//主機拉高釋放總線,等待從機發送
  
  DS18B20_IN_Mode();//切換到輸入模式
  Delay_us(10); //延時,主機必須在15us內采樣總線狀態
  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);//開始轉換
}

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);//開始轉換

  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);
}
回復

使用道具 舉報

5#
ID:1133081 發表于 2024-12-18 16:50 | 只看該作者
ds18b20對時序非常敏感,隨便找個程序要結合所使用的MCU特性和參數修改代碼,否則難以成功。
回復

使用道具 舉報

6#
ID:688692 發表于 2024-12-18 16:51 | 只看該作者
存在檢測的邏輯就是:
你和傳感器隔著一堵墻,有一根棍子。你想要知道傳感器在不在,就先拉一下棍子,至少拉15μS,最長60μS你就得放手了。

傳感器發現你拉了棍子,會在15-60μS之后,也拉一下棍子,拉60-240μS。

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

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

接下來你就自己對著干吧。
回復

使用道具 舉報

7#
ID:161164 發表于 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,再發送存在脈沖//<<<<<<<<<<<<<<<<<<<<<<<<<<<
  8. }
復制代碼


回復

使用道具 舉報

8#
ID:583948 發表于 2024-12-19 15:50 | 只看該作者
1.檢查一下你的硬件是否好壞。用標準程序去驗證
2.檢查硬件接口,數據引腳和程序是否對應,如果不對應還是會報錯
3.檢查軟件時序是否正確,拉低拉高時長是否滿足手冊要求
4.實在找不出問題,使用標準程序修改管腳即可
回復

使用道具 舉報

9#
ID:1136761 發表于 2024-12-20 16:28 | 只看該作者
可以自己編寫一個塊,讓后整合一下
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品女优 | 99精品99| 国产在线视频一区二区 | 亚洲日韩中文字幕一区 | 一区二区三区免费观看 | 一级毛片免费看 | 一级片aaa | 国产高清一二三区 | 99久热| 亚洲精品久久久久中文字幕欢迎你 | 日韩av在线播 | 午夜影院在线观看 | 中文字幕一区二区三区在线观看 | 麻豆视频在线免费观看 | 欧美成视频 | 国产乱码精品一区二区三区中文 | 91精品国产综合久久香蕉922 | 成人网视频 | 精品国产一区二区三区观看不卡 | 国产精品2区 | 精品一区二区在线观看 | 欧美亚洲高清 | 一级免费毛片 | 色婷婷国产精品 | 玖玖玖在线观看 | 中文字幕日本一区二区 | 欧美视频一区二区三区 | 丝袜久久| 日韩精品一区在线观看 | 午夜影院 | 亚洲精品女优 | 日韩精品 电影一区 亚洲 | 成人精品一区 | 超碰在线人人干 | 在线第一页 | 国产又色又爽又黄又免费 | 久久草视频 | 成人在线一区二区 | 免费a v网站 | 麻豆一区二区三区 | 久久综合久久久 |