色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于FPGA的DS18B20數字溫度傳感器測溫實例

FPGA設計論壇 ? 來源:CSDN技術社區 ? 2025-03-17 11:06 ? 次閱讀

1、DS18B20數字溫度傳感器

本文將使用三段式狀態機(Moore型)的寫法來對DS18B20進行測溫操作,以便了解DS18B20和熟悉三段式狀態機的寫法。

1.1、概述

溫度傳感器temperature transducer)是指能感受溫度并轉換成可用輸出信號的傳感器, 是各種傳感器中最常用的一種。隨著現代儀器的發展,微型化、集成化、數字化正成為傳感器發展的一個重要方向。

美國DALLAS半導體公司推出的數字化溫度傳感器DS18B20采用單總線協議,即與FPGA接口僅需占用一個I/O端口,無須任何外部元件,直接 將環境溫度轉化成數字信號,以數字碼方式串行輸出,從而大大簡化了傳感器與FPGA的接口設計。

引腳如下圖:

wKgZPGfXkdiAc-gzAAC18hnTOBI003.png

1.2、結構組成

DS18B20測量溫度范圍為-55 ~ +125℃,精度為±0.5℃。現場(實時)溫度直接以“單總線” 的數字方式傳輸,大大提高了系統的抗干擾性。它能直接讀出被測溫度,并且可根據實際要求通過簡單的編程實現9 ~ l2位的數字值讀數方式。它工作在3~5.5V的電壓范圍,采用多種封裝形式,從而使系統設計靈活、方便,設定分辨率及用戶設定的報警溫度存儲在EEPROM中,掉電后 依然保存。其內部結構如圖:

wKgZO2fXkdiAWxjwAAE5oLT1fMM912.png

高速緩存器的結構框圖如下:

wKgZO2fXkdiAEhuNAAHhYGw_ox0809.png

由上圖可知DS18B20的高速緩存器共有9個8位寄存器,其中溫度數據低位(LSB)對應字節 地址0,溫度數據高位(MSB)對應字節地址1,以此類推,配置寄存器的字節地址為4。溫度數據存放的格式如下圖:

wKgZPGfXkdiAVK5VAANk1dzyiCU197.png

DS18B20在出廠時默認配置溫度數據為12位,其中最高位為符號位,即溫度值共11位,最低四位為小數位。FPGA在讀取溫度數據時,一次會讀2字節共16位,讀完后將低11位的二進制 數轉化為十進制數后再乘以0.0625得到所測的實際溫度值。

另外還需要判斷溫度的正負,前5 個數字為符號位,這5位同時變化,我們只需要判斷其中任何一位就可以了。前5位為1時,讀 取的溫度為負值,則測到的數值需要取反加1再乘以0.0625才可得到實際溫度值。前5位為0時, 讀取的溫度為正值,只要將測得的數值乘以0.0625即可得到實際溫度值。

高速緩存器中第四個字節即為配置寄存器,用戶通過改變 R1 和 R0 的值來配置 DS18B20 的分辨率,上電默認為 R1=1 以及 R0=1(12 位分辨率)。需要注意的是轉換時間與分辨率時間是有關系的。另外寄存器中最高位和低 5 位作 為內部使用而保留使用,不可被寫入。轉換時間與位數關系如下表所示:

wKgZPGfXkdiAaALPAADM_YmczXo515.png

1.3、通訊步驟

如何操作 DS18B20 去進行對溫度的轉換以及讀取呢?步驟如下:

初始化

1-Wire 總線上的所有事件都必須以初始化為開始。初始化序列由總線上的主設備發出的復位脈沖以及緊跟著從設備回應的存在脈沖構成。該存在脈沖是讓總線主設備知道 DS18B20 在總線上并準備好運行。所有具體時序都在1.4章節介紹。

ROM命令

當初始化完成之后,就可以執行 ROM 命令。這些命令是對每個設備的 64 位 ROM 編 碼進行操作的,當總線上連接有多個設備時,可以通過這些命令識別各個設備。總共包含 有 5 種 ROM 命令,每個命令的長度都是 8bit。

搜索 ROM[F0h]:當系統上電初始化后,主設備可識別該總線上所有的從設備的 ROM 編碼,這樣就可以使得主設備確定總線上的從設備的類型以及數量。

讀 ROM[33h] :該命令允許主設備讀取 DS18B20 的 64 位 ROM 編碼,只有在總線上只有一個 DS18B20 時才能使用這個命令。如果總線上存在多個從設備,發送此命令,則當所有從設 備都會回應時,將會引起數據沖突。

匹配 ROM[55h] :該匹配 ROM 命令之后接著發出 64 位 ROM 編碼,使主設備在多點總線上定位一只特定的 DS18B20。只有和 64 位 ROM 序列完全匹配的 DS18B20 才會做出響應。總線上的其 他從設備都將等待下一個復位脈沖。此命令在總線上有單個或多個器件時都可以使用。

跳過 ROM[CCh] :這條命令可以不用提供 64 位 ROM 編碼就進行下一步操作,在單點總線(一個 DS18B20 傳感器)情況下可以節省時間。如果總線上不止一個從設備,在跳過 ROM 命令 之后跟著發一條讀命令,則所有從設備將會同時執行溫度轉換,總線上就會發生數據沖突。

警報搜索[ECh] :該命令的操作與跳過 ROM 命令基本相同,但是不同的是只有溫度高于 TH 或低于 TL (達到報警條件)的從設備才會響應。只要不掉電,警報狀態將一直保持,直到溫度不在警報范圍內為止。

功能命令

當總線上的主設備通過 ROM 命令確定了哪個 DS18B20 可以進行通信時,主設備就可 以向其中一個從設備發送功能命令。這些命令可以使得主設備操控從設備進行一系列的操作。

溫度轉換[44h]:此命令為初始化單次溫度轉換,溫度轉換完后,轉換的溫度數據會寄存在高速緩存器 的 byte0(溫度數據低八位)和 byte1(溫度數據高八位)中,之后 DS18B20 恢復到低功耗 的閑置狀態。如果總線在該命令后發出讀時隙,若 DS18B20 正在進行溫度轉換則會響應 “0”,若完成了溫度轉換則響應“1”。如果是用的“寄生電源”供電模式,則在命令發 出后應立即強制拉高總線,拉高時間應大于時序要求。

寫入暫存器[4Eh] :該命令使得主設備向高速緩存器寫入 3 個字節的數據。第一個字節寫入高速緩存器的 byte2 中(TH 寄存器),第二個字節的數據寫入 byte3 中(TL 寄存器),第三個字節的數據寫入 byte4 中(配置寄存器)。所有的數據都是由低位到高位的順序寫入。復位可隨時中斷寫入。

讀取高速緩存器[BEh] :讀取高速緩存器里的值,從 byte0(溫度低八位)開始一直讀到 byte8(CRC 校驗),每個字節的數據從低位開始傳送。若是不想讀取這么多數據則在讀取數據時隨時可以通過復位來終止。

復制高速緩存器[48h] :該命令是將高速緩存器中的 TH(byte2)、TL(byte3)以及配置寄存器(byte4)里的 值拷貝到非易失性的存儲器 EEPROM 里。如果總線控制器在這條命令之后跟著發出讀時 隙,而 DS18B20 又正在忙于把暫存器拷貝到 EEPROM 存儲器,DS18B20 就會輸出一個 “0”,如果拷貝結束的話,DS18B20 則輸出“1”。如果設備采用“寄生電源”供電模 式,則在該命令發送后,必須立即強制拉高總線至少 10ms。

召回 EEPROM[B8h] :該命令將溫度報警觸發值(TH 和 TL)及配置寄存器的數據從 EEPROM 中召回至高速 緩存器中。這個操作會在上電后自動執行一次,所以在上電期間暫存器中一直會存在有效 的數據。若在召回命令之后啟動讀時隙,若 DS18B20 正在進行召回 EEPROM 則會響應 “0”,若召回完成則響應“1”。

讀取供電模式[B4h] :該命令可以讀取總線上的 DS18B20 是否是由“寄生電源”供電。在讀取數據時序中 “0”表示“寄生電源供”模式供電,“1”表示外部電源供電。

1.4、總線時序

初始化—復位和存在脈沖

與 DS18B20 所有的通信都是由初始化開始的,初始化由主設備發出的復位脈沖及 DS18B20 響應的存在脈沖組成。如下圖 所示。當 DS18B20 響應復位信號的存在脈沖 后,則其向主設備表明其在該總線上,并且已經做好了執行命令的準備。在初始化狀態,總線上的主設備通過拉低 1-Wire 總線最少 480us 來表示發送復位脈 沖。發送完之后,主設備要釋放總線進入接收模式。當總線釋放后,上拉電阻將 1- Wire 總線拉至高電平。當 DS18B20 檢測到該上升沿信號后,其等待 15us 至 60us 后將總線 拉低 60us 至 240us 來實現發送一個存在脈沖。

wKgZO2fXkdiANo52AACjxf_QsmA214.png

寫時隙

主設備通過寫時隙將命令寫入 DS18B20 中,寫時隙有兩種情況:寫“1”和寫“0”時 隙。主設備通過寫 1 時隙來向 DS18B20 中寫入邏輯 1,通過寫 0 時隙來向 DS18B20 中寫入 邏輯 0。當主設備將總線從高電平拉至低電平時,啟動寫時隙,所有的寫時隙持續時間最 少為 60us,每個寫時隙間的恢復時間最少為 1us。當總線(DQ)拉低后,DS18B20 在 15us 至 60us 之間對總線進行采樣,如果采的 DQ 為高電平則發生寫 1,如果為低電平則發生寫 0,如下圖所示(圖中的總線控制器即為主設備)。如果要產生寫 1 時隙,必須先將總線拉至邏輯低電平然后釋放總線,允許總線在寫 隙開始后 15us 內上拉至高電平。若要產生寫 0 時隙,必須將總線拉至邏輯低電平并保持不 變最少 60us。

wKgZPGfXkdiAPKYIAADCFd5DULI870.png

讀時隙

當我們發送完讀取供電模式[B4h]或讀高速緩存器[BEh]命令時,必須及時地生成讀時隙,只有在讀時隙 DS18B20 才能向主設備傳送數據。每個讀時隙最小必須有 60us 的持續 時間以及每個讀時隙間至少要有 1us 的恢復時間。當主設備將總線從高電平拉至低電平超 過 1us,啟動讀時隙,如下圖所示。當啟動讀時隙后,DS18B20 將會向主設備發送“0”或者“1”。DS18B20 通過將總線 拉高來發送 1,將總線拉低來發送 0 。當讀時隙完成后,DQ 引腳將通過上拉電阻將總線拉高至高電平的閑置狀態。從 DS18B20 中輸出的數據在啟動讀時隙后的 15us 內有效,所以,主設備在讀時隙開始后的 15us 內必須釋放總線,并且對總線進行采樣。

wKgZO2fXkdiAYt1_AADVfTEGKjM042.png

2、采用三段式狀態機測試

接下來將采用三段式狀態機對DS18B20進行測溫操作。

2.1、整體設計

因為本文只寫DS18B20的驅動,不涉及到其他模塊(如數碼管),所以模塊框圖如下:

wKgZO2fXkdiACHfdAAAIveVkBQI000.png

信號說明如下:

sys_clk:系統時鐘,50M

rst_n:低電平有效的復位信號

dq:單總線(雙向信號)

temp_data:輸出的有效數據,位寬20

sign:輸出給數碼管的正負信號,1表示數據為負數;0表示數據為正數

根據上面對DS18B20的介紹,可以概括出整個的測溫流程如下:

wKgZO2fXkdiAIQIHAABlPKmQeyw479.png

2.2、狀態機設計

三段式狀態機的概念可以參考:狀態機(一段式、二段式、三段式)、摩爾型(Moore)和米勒型(Mealy)

當知道了 DS18B20 的控制流程之后,我們可以借助狀態機來進一步了解它是如何跳轉的:

wKgZPGfXkdiAIFjEAABTG9ty98E656.png

下面對各狀態說明:

INIT1:每次操作前都需要進行初始化操作。在這個狀態主機會使用一個計數器從0計數到1000us。一開始就先拉低總線500us,然后釋放總線;在570us處采集總線電平,若為0,則說明總線進行了響應,初始化完成。

WR_CMD:在這個狀態一起發送跳過ROM和溫度轉換指令。使用一個計數器計時,使用另一個計數器則對發送的數據個數計數,當成功發送16個數據后,發送命令完成

WAIT:這個狀態為延時狀態,滿足發送溫度轉換指令后的等待時間750ms。使用一個計數器計時,時間滿足750ms則說明計時完成。

INIT2:第二次操作前的初始化操作。所有操作同INIT1,不贅述。

RD_CMD:在這個狀態一起發送跳過ROM和讀取溫度指令。使用一個計數器計時,使用另一個計數器則對發送的數據個數計數,當成功發送16個數據后,發送命令完成

RD_DATA:在這個狀態讀取從機返回的16位溫度數據。使用一個計數器計時,使用另一個計數器則對讀取的數據個數計數,使用一個寄存器寄存讀取到的溫度數據,當成功讀取16個數據后,接收命令完成

需要注意:信號線dq是一個雙向信號,所以使用時要用使用三態門的方法來操作,具體方法參考:如何規范地使用雙向(inout)信號?

2.3、Verilog代碼

根據上面的狀態分析圖,編寫Verilog代碼如下:(這里就不寫分析了,注釋已經寫得很詳細了,如果你看到了這邊文章且這段代碼又不懂的地方,可以評論給我)

//==================================================================
//--3段式狀態機(Moore)實現的DS18B20驅動
//==================================================================

//------------<模塊及端口聲明>----------------------------------------
module ds18b20_dri(
input clk,//系統時鐘,50M
inputrst_n,       //低電平有效的復位信號

inoutdq,//單總線(雙向信號)
output reg [19:0]   temp_data  ,   // 轉換后得到的溫度值
    output reg          sign // 符號位
);

//------------<參數定義>----------------------------------------------
//狀態機狀態定義
localparamINIT1= 6'b000001 ,
WR_CMD      = 6'b000010 ,
WAIT  = 6'b000100 ,
INIT2  = 6'b001000 ,
RD_CMD  = 6'b010000 ,
RD_DATA  = 6'b100000 ;

//時間參數定義
localparamT_INIT = 1000,//初始化最大時間,單位us
T_WAIT = 780_000;//轉換等待延時,單位us

//命令定義
localparam WR_CMD_DATA = 16'h44cc, //跳過 ROM 及溫度轉換命令,低位在前
RD_CMD_DATA = 16'hbecc; //跳過 ROM 及讀取溫度命令,低位在前

//----------------------------------------------------------
reg[5:0]cur_state;//現態
reg[5:0]next_state;//次態
reg[4:0]cnt;//50分頻計數器,1Mhz(1us)
regdq_out;//雙向總線輸出
regdq_en;//雙向總線輸出使能,1則輸出,0則高阻態
regflag_ack;//從機響應標志信號
regclk_us;//us時鐘
reg [19:0]cnt_us;//us計數器,最大可表示1048ms
reg [3:0]bit_cnt;//接收數據計數器
reg [15:0]data_temp;//讀取的溫度數據寄存
reg [15:0]data;//未處理的原始溫度數據

//----------------------------------------------------------
wiredq_in;//雙向總線輸入

//==================================================================
//===========================
=========================== //================================================================== //----------------------------------------------------------------------- //--雙向端口使用方式 //----------------------------------------------------------------------- assigndq_in = dq;//高阻態的話,則把總線上的數據賦給dq_in assigndq = dq_en ? dq_out : 1'bz;//使能1則輸出,0則高阻態 //----------------------------------------------------------------------- //--us時鐘生成,因為時序都是以us為單位,所以生成一個1us的時鐘會比較方便 //----------------------------------------------------------------------- //50分頻計數 always @(posedge clk or negedge rst_n)begin if(!rst_n) cnt <= 5'd0; else if(cnt == 5'd24)//每25個時鐘500ns清零 cnt <= 5'd0; else cnt <= cnt + 1'd1; end //生成1us時鐘 always @(posedge clk or negedge rst_n)begin if(!rst_n) clk_us <= 1'b0; else if(cnt == 5'd24)//每500ns clk_us <= ~clk_us; //時鐘反轉 else clk_us <= clk_us; end //----------------------------------------------------------------------- //--三段式狀態機 //----------------------------------------------------------------------- //狀態機第一段:同步時序描述狀態轉移 always @(posedge clk_us or negedge rst_n)begin if(!rst_n) cur_state <= INIT1; else cur_state <= next_state; end //狀態機第二段:組合邏輯判斷狀態轉移條件,描述狀態轉移規律以及輸出 always @(*)begin next_state = INIT1; case(cur_state) INIT1:begin if(cnt_us == T_INIT && flag_ack)//滿足初始化時間且接收到了從機的響應信號 next_state = WR_CMD;//跳轉到寫狀態 else next_state = INIT1;//不滿足則保持原有狀態 end WR_CMD :begin if(bit_cnt == 4'd15 && cnt_us == 20'd62)//寫完了16個數據,寫跳過ROM和寫溫度轉換命令 next_state = WAIT;//跳轉到等待狀態,等待溫度轉換完成 else next_state = WR_CMD;//不滿足則保持原有狀態 end WAIT :begin if(cnt_us == T_WAIT)//等待時間結束 next_state = INIT2; else next_state = WAIT; end INIT2 :begin if(cnt_us == T_INIT && flag_ack)//再進行初始化,時序同INIT1 next_state = RD_CMD; else next_state = INIT2; end RD_CMD :begin if(bit_cnt == 4'd15 && cnt_us == 20'd62)//寫完了16個數據,寫跳過ROM和寫讀取溫度轉換命令 next_state = RD_DATA;//跳轉到讀取溫度數據狀態 else next_state = RD_CMD; end RD_DATA :begin if(bit_cnt == 4'd15 && cnt_us == 20'd62)//讀取完了16個數據 next_state = INIT1;//跳轉到初始化狀態,開始新一輪溫度采集 else next_state = RD_DATA; end default:next_state = INIT1;//默認初始化狀態 endcase end //狀態機第三段:時序邏輯描述輸出 always @(posedge clk_us or negedge rst_n)begin if(!rst_n)begin//默認輸出 dq_en <= 1'b0; dq_out <= 1'b0; flag_ack <= 1'b0; cnt_us <= 20'd0; bit_cnt <= 4'd0; end else begin case(cur_state) INIT1:begin if(cnt_us == T_INIT)begin//時間計數到最大值(初始化時間) cnt_us <= 20'd0;//計數器清零 flag_ack <= 1'b0;//從機響應標志信號拉低 end else begin//沒有計數到最大值 cnt_us <= cnt_us + 1'd1;//計數器計數 if(cnt_us <= 20'd499)begin//小于500us時 dq_en <= 1'b1;//控制總線 dq_out <= 1'b0;//輸出0,即拉低總線 end else begin//在500us處 dq_en <= 1'b0;//釋放總線,等待從機響應 if (cnt_us == 20'd570 && !dq_in)//在570us處采集總線電平,如果為0則說明從機響應了 flag_ack <= 1'b1;//拉高從機響應標志信號 end end end WR_CMD:begin if(cnt_us == 20'd62)begin//一個寫時隙周期63us,滿足計時條件則 cnt_us <= 20'd0;//清空計數器 dq_en <= 1'b0;//釋放總線 if(bit_cnt == 4'd15)//如果數據已經寫了15個 bit_cnt <= 4'd0;//則清空 else//沒寫15個 bit_cnt <= bit_cnt + 1'd1;//則數據計數器+1,代表寫入了一個數據 end else begin//一個寫時隙周期63us未完成 cnt_us <= cnt_us + 1'd1;//計數器一直計數 if(cnt_us <= 20'd1)begin//0~1us(每兩個寫數據之間需要間隔2us) dq_en <= 1'b1;//拉低總線 dq_out <= 1'b0; end else begin if (WR_CMD_DATA[bit_cnt] == 1'b0)begin//需要寫入的數據為0 dq_en <= 1'b1;//拉低總線 dq_out <= 1'b0;// end else if(WR_CMD_DATA[bit_cnt] == 1'b1)begin dq_en <= 1'b0;//需要寫入的數據為1 dq_out <= 1'b0;//釋放總線 end end end end WAIT:begin//等待溫度轉換完成 dq_en <= 1'b1;//拉低總線兼容寄生電源模式 dq_out <= 1'b1; if(cnt_us == T_WAIT)//計數完成 cnt_us <= 20'd0; else cnt_us <= cnt_us + 1'd1; end INIT2:begin//第二次初始化,時序同INIT1 if(cnt_us == T_INIT)begin cnt_us <= 20'd0; flag_ack <= 1'b0; end else begin cnt_us <= cnt_us + 1'd1; if(cnt_us <= 20'd499)begin dq_en <= 1'b1; dq_out <= 1'b0; end else begin dq_en <= 1'b0; if (cnt_us == 20'd570 && !dq_in) flag_ack <= 1'b1; end end end RD_CMD:begin//寫16個數據,時序同WR_CMD if(cnt_us == 20'd62)begin cnt_us <= 20'd0; dq_en <= 1'b0; if(bit_cnt == 4'd15) bit_cnt <= 4'd0; else bit_cnt <= bit_cnt + 1'd1; end else begin cnt_us <= cnt_us + 1'd1; if(cnt_us <= 20'd1)begin dq_en <= 1'b1; dq_out <= 1'b0; end else begin if (RD_CMD_DATA[bit_cnt] == 1'b0)begin dq_en <= 1'b1; dq_out <= 1'b0; end else if(RD_CMD_DATA[bit_cnt] == 1'b1)begin dq_en <= 1'b0; dq_out <= 1'b0; end end end end RD_DATA:begin//讀16位溫度數據 if(cnt_us == 20'd62)begin//一個讀時隙周期63us,滿足計時條件則 cnt_us <= 20'd0;//清空計數器 dq_en <= 1'b0;//釋放總線 if(bit_cnt == 4'd15)begin//如果數據已經讀取了15個 bit_cnt <= 4'd0;//則清空 data <= data_temp;//臨時的數據賦值給data end else begin//如果數據沒有讀取15個 bit_cnt <= bit_cnt + 1'd1;//則數據計數器+1,意味著讀取了一個數據 data <= data; end end else begin//一個讀時隙周期還沒結束 cnt_us <= cnt_us + 1'd1;//計數器累加 if(cnt_us <= 20'd1)begin//0~1us(每兩個讀數據之間需要間隔2us) dq_en <= 1'b1;//拉低總線 dq_out <= 1'b0; end else begin//2us后 dq_en <= 1'b0;//釋放總掉線 if (cnt_us == 20'd10)//在10us處讀取總線電平 data_temp <= {dq,data_temp[15:1]};//讀取總線電平 end end end default:; endcase end end //----------------------------------------------------------------------- //--12位溫度數據處理 //----------------------------------------------------------------------- always @(posedge clk_us or negedge rst_n)begin if(!rst_n)begin//初始狀態 temp_data <= 20'd0; sign <= 1'b0; end else begin if(!data[15])begin//最高位為0則溫度為正 sign <= 1'b0;//標志位為正 temp_data <= data[10:0] * 11'd625 /7'd100;//12位溫度數據處理 end else if(data[15])begin//最高位為1則溫度為負 sign <= 1'b1;//標志位為負 temp_data <= (~data[10:0] + 1'b1)* 11'd625 /7'd100;//12位溫度數據處理 end end end endmodule

2.4、調試

因為通訊過程涉及到從機的響應,我又找不到相應的器件模型,仿真就不搞了。

直接使用signaltap抓下波形:

wKgZO2fXkkOAKV7kAAEIrvBPNsA831.png

上圖中:

狀態機開始運行,進入INTI1的初始化狀態

dht11_en拉高同時dht11_out為0,說明主機拉低了總線

主機拉低總線后在500us處釋放了總線,總線被上拉電阻拉高

在528us處總線被從機拉低,直至637us從機才釋放了總線,說明從機發送了響應

在570us處因為總線被從機拉低,所以拉高了響應信號flag_ack,直到進入下個狀態才將flag_ack拉低

1cf9e31e-fcc2-11ef-9310-92fbcf53809c.png

上圖中:

狀態機從INTI1的初始化狀態跳轉到寫入ROM和溫度轉換命令的狀態WR_CMD

bit_cnt從0計數到F,說明寫入了16個數據;與此同時,總線上也在分別寫入“0”和“1”

wKgZPGfXkkSATQ7BAABu2EveLgc894.png

上圖中:

狀態機從WAIT狀態跳轉到初始化狀態INIT2

cnt_us計數器從780000清零,說明此時延時了780ms的時間以便完成溫度轉換

1d276348-fcc2-11ef-9310-92fbcf53809c.png

上圖中:

狀態機從狀態RD_CMD跳轉到數據讀取狀態RD_DATA

bit_cnt從0計數到F,說明讀取了16個數據;與此同時,總線上也在分別輸出“0”和“1”

wKgZO2fXkkOAJa-YAADs-q-BajY681.png

上圖中:

data是直接從DS18B20溫度寄存器中讀取的數據0000000111111001

temp_data是處理后發送給數碼管顯示的數據3156,對應攝氏度31.56

3、上板調試

添加數碼管顯示模塊,編譯工程,板卡顯示如下:

wKgZPGfXkkOAYUiyAAJn15EbezI348.jpg

和用調試軟件抓取的結果一致。

原文連接:https://gitcode.csdn.net/65ed75e21a836825ed799ef4.html

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1637

    文章

    21848

    瀏覽量

    608750
  • DS18B20
    +關注

    關注

    10

    文章

    782

    瀏覽量

    81432
  • 狀態機
    +關注

    關注

    2

    文章

    493

    瀏覽量

    27801
  • 數字溫度傳感器

    關注

    0

    文章

    191

    瀏覽量

    15577

原文標題:基于FPGA的DS18B20數字溫度傳感器測溫實例

文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。

收藏 0人收藏

    評論

    相關推薦

    DS18B20溫度傳感器工作原理及其應用電路圖

    DS18B20溫度傳感器的應用電路    1.DS18B20溫度傳感器寄生電源供電方式電路圖 
    發表于 02-21 14:43

    基于單總線數字溫度傳感器DS18B20測溫系統方案

      摘要:設計了一種基于單總線數字溫度傳感器DS18B20測溫系統,給出了DS18B20
    發表于 11-06 15:18

    DS18B20溫度傳感器是什么

    DALLAS最新單線數字溫度傳感器DS18B20簡介新的“一線器件”體積更小、適用電壓更寬、更經濟 Dallas 半導體公司的數字
    發表于 04-27 08:14

    DS18B20溫度傳感器簡介

    文章目錄DS18B20 簡介硬件設計軟件設計下載驗證DS18B20 簡介DS18B20 是由 DALLAS 半導體公司推出的一種的“一線總線”接口的溫度
    發表于 12-17 07:47

    DS18B20數字溫度傳感器介紹

    由于做比賽,所以寫了溫度傳感器,記錄一下一.介紹DS18B20是常用的數字溫度傳感器,其輸出的是
    發表于 01-05 07:26

    DS18B20數字溫度傳感器介紹

    DS18B20介紹DS18B20是常用的數字溫度傳感器,具有體積小,硬件開銷低,抗干擾能力強,精度高的特點。
    發表于 03-02 06:26

    新型溫度傳感器DS18B20高精度測溫的實現

    介紹了一種數字式的溫度傳感器DS18B20, 提出了一種基于89C2051 的測溫電路及軟件框圖在內的實現方法。關鍵詞 
    發表于 07-03 10:14 ?62次下載

    數字溫度傳感器DS18B20的設計及應用

    數字溫度傳感器DS18B20的設計及應用 1引言 DS18B20是DALLAS公司生產的一線式數字
    發表于 04-02 18:00 ?2893次閱讀
    <b class='flag-5'>數字</b><b class='flag-5'>溫度</b><b class='flag-5'>傳感器</b><b class='flag-5'>DS18B20</b>的設計及應用

    DS18B20數字溫度傳感器

    本設計基于單片機STM32開發板,對DS18B20數字溫度傳感器進行控制,有源代碼
    發表于 05-11 14:54 ?42次下載

    智能溫度傳感器DS18B20的原理與應用

    DS18B20是DALLAS公司生產的單線數字溫度傳感器,他具有獨特的單線總線接口方式。文章詳細的介紹了單線數字
    發表于 10-11 18:19 ?49次下載

    ds18b20的特性_ds18b20溫度傳感器應用

    本文首先介紹了ds18b20的特性,其次介紹了DS18B20工作原理,最后介紹了ds18b20溫度傳感器應用。
    發表于 04-24 09:10 ?1.1w次閱讀
    <b class='flag-5'>ds18b20</b>的特性_<b class='flag-5'>ds18b20</b><b class='flag-5'>溫度</b><b class='flag-5'>傳感器</b>應用

    DS18B20溫度傳感器測溫實驗詳細說明

    在前面,我們學習了DS18B20新型數字溫度傳感器的基礎理論知識,對DS18B20的特性及應用有了較全面的了解,本課我們就結合S51增強型實
    的頭像 發表于 10-06 18:13 ?1.2w次閱讀
    <b class='flag-5'>DS18B20</b><b class='flag-5'>溫度</b><b class='flag-5'>傳感器</b>的<b class='flag-5'>測溫</b>實驗詳細說明

    DS18B20溫度傳感器數字溫度計設計案例

    本設計采用的主控芯片是ATMEL公司的AT89S52單片機,數字溫度傳感器是DALLAS公司的DS18B20。本設計用數字
    發表于 05-09 16:02 ?57次下載

    ds18b20溫度傳感器如何使用

    DS18B20是一款廣泛使用的數字溫度傳感器,它具有高精度、低功耗和易于使用的特點。 DS18B20溫度
    的頭像 發表于 09-03 16:51 ?982次閱讀

    基于FPGA溫度傳感器(ds18b20)驅動設計

    數字溫度傳感器,其輸出的是數字信號,具有體積小,硬件開銷低,抗干擾能力強,精度高的特點。 DS18B20
    的頭像 發表于 01-16 14:08 ?505次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>溫度</b><b class='flag-5'>傳感器</b>(<b class='flag-5'>ds18b20</b>)驅動設計
    主站蜘蛛池模板: 无套日出白浆在线播放 | 新版孕妇bbwbbwbbw | 91亚洲精品福利在线播放 | 把英语老师强奷到舒服动态图 | 伊人久久亚洲综合天堂 | 99久久免费国产精品特黄 | 国产99视频精品免费播放 | 护士日本ⅹxxx丰满hd | 黑色丝袜美腿美女被躁翻了 | 蜜桃成熟时33D在线嘟嘟网 | 国产成人永久免费视频 | 亚洲中久无码永久在线 | 超碰免费视频在线观看 | 91国在线啪精品一区 | 国产精品欧美亚洲 | 欧美精品久久久久久久久大尺度 | 乐乐亚洲精品综合影院 | 日本XXXXZZX片免费观看 | 超碰 无码 中文字幕 | 欧美18videosex性欧美老师 | 一区二区中文字幕在线观看 | CHINA末成年VIDEO学生 | 亚洲手机在线人成视频 | av影音先锋影院男人站 | 久久久久婷婷国产综合青草 | 欧美一级久久久久久久大 | 国产在线精品亚洲一品区 | 亚洲精品无码不卡 | 寂寞夜晚视频高清观看免费 | 精品九九视频 | 麻豆XXXX乱女少妇精品-百度 | 久久伊人男人的天堂网站 | 亚洲欧美色综合影院 | 国产精品久久久久久亚洲影视 | 99青草青草久热精品视频 | 午理论理影片被窝 | good神马电影伦理午夜 | 国产传媒18精品A片在线观看 | 亚欧乱亚欧乱色视频 | 国产人妻人伦精品1国产 | 超大号黑吊magnet |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品