基于DS18B20数字温度传感器的温度计设计
基于DS18B20數字溫度傳感器的溫度計設計
本報告為哈爾濱工業大學電子與信息工程學院大二學期微機原理課程的課設報告。請注意,本文所述代碼均在Quartus II 13.0程序內使用匯編語言運行。
一、課程設計任務要求
利用數字溫度傳感器DS18B20與AT89C51單片機結合來測量溫度,并在LED數碼管上顯示相應的溫度值。溫度測量范圍為-55~125℃,精確至0.5℃。測量的溫度采用數字顯示,用三位共陽極LED數碼管來實現溫度顯示。
二、工作原理
DS18B20數字溫度傳感器是美國DALLAS半導體公司推出的一種改進型具有單總線接口的智能溫度傳感器。與傳統的熱敏電阻等測溫元件相比,它能直接讀出被測溫度,并且可根據實際要求通過簡單的編程實現9~12位的數字讀數方式。DS18B20的基本性能及詳細資料請參考相關資料。
三、單片機應用系統設計及原理圖
DS18B20數字溫度傳感器數據端口DQ接于P1.7,單片機接電源和晶振,八位共陽數碼管位選接于P1.2~P1.6,斷碼接于P0.0~P0.7并連接排阻。
四、實現方法及擴展創新
基本功能實現方法
利用 DS18B20 數字溫度傳感器的數據傳輸機制編寫程序,將溫度數值從溫度傳感器中取回到 AT89C51 之中,再根據數據的轉換形式,在單片機中對數據進行處理變換成十進制,并動態顯示在數碼管中。
擴展創新設計
根據實驗要求:精度在 0.5℃范圍內,則不必四舍五入,取出整數部分直接處理,只需考查數據的小數第一位,來決定小數點顯示位置顯示 0 或者 5,便可保證精度;并且在個位位置附加上小數點;最后補充符號位,負溫度時顯示負號。
五、實現步驟
首先需要了解 DS18B20 的數據傳輸方式,因為這一芯片只有一個數據通信口,需要遵守嚴格的時序,脈沖的規則,介紹如下。
首先設定 DQ 為總線數據位,連接于 P1.7。
DQ BIT P1.71.復位功能
主機首先發出一個 480~960us 的低電平脈沖,然后釋放總線變為高電平,并在隨后的480us 時間內對總線進行檢測,如果有低電平出現說明總線上有器件已做出應答。若無低電平出現一直都是高電平說明總線上無器件應答。
作為從器件的 DS18B20 在一上電后就一直在檢測總線上是否有 480-960 us 的低電平出現,如果有,在總線轉為高電平后等待 15-60us 后將總線電平拉低60~240us 做出響應存在脈沖,告訴主機本器件已做好準備。若沒有檢測到就一直在檢測等待。
這一段程序設計加入 FLAG 位變量作為傳感器是否相應,正常工作的標志:
FLAG BIT F0 INIT_1:SETB DQ NOP CLR DQ MOV R0,#0FBH TSR1: DJNZ R0,TSR1 SETB DQ MOV R0,#25H TSR2: JNB DQ,TSR3 DJNZ R0,TSR2 TSR3: SETB FLAG MOV R0,#06BH TSR4: DJNZ R0,TSR4 SETB DQ RET2.寫入操作
寫周期最少為 60us,最長不超過 120us。寫周期一開始做為主機先把總線拉低1us 表示寫周期開始。隨后若主機想寫 0,則繼續拉低電平最少 60us 直至寫周期結束,然后釋放總線為高電平。若主機想寫 1,在一開始拉低總線電平 1us 后就釋放總線為高電平,一直到寫周期結束。而做為從機的 DS18B20 則在檢測到總線被拉底后等待 15 us 然后從 15us 到 45us 開始對總線采樣,在采樣期內總線為高電平則為1,若采樣期內總線為低電平則為 0。
寫入要遵守規則,需要先復位,跳過 ROM,才能進行讀寫,更改初值等操作。
WRITE:MOV R2,#8 CLR C WR1: CLR DQ MOV R3,#6 DJNZ R3,$ RRC A MOV DQ,C MOV R3,#23 DJNZ R3,$ SETB DQ NOP DJNZ R2,WR1 SETB DQ RET3.讀數操作
對于讀數據操作時序也分為讀 0 時序和讀 1 時序兩個過程。讀時隙是從主機把單總線拉低之后,在 1us 之后就得釋放單總線為高電平,以讓 DS18B20 把數據傳輸到單總線上。DS18B20 在檢測到總線被拉低 1us 后,便開始送出數據,若是要送出0 就把總線拉為低電平直到讀周期結束。若要送出 1 則釋放總線為高電平。主機在一開始拉低總線 1us 后釋放總線,然后在包括前面的拉低總線電平 1us在內的 15us 時間內完成對總線進行采樣檢測,采樣期內總線為低電平則確認為0。采樣期內總線為高電平則確認為 1。完成一個讀時序過程,至少需要 60us 才能完成。
讀數代碼如下,在讀數的時候要同樣要復位,跳 ROM,寫入操作碼再讀寫。
READ: MOV R4,#2 MOV R1,#29H REE0: MOV R2,#8 REE1: CLR C SETB C NOP NOP CLR DQNOPNOPNOPSETB DQMOV R3,#7 DJNZ R3,$ MOV C,DQ MOV R3,#23 DJNZ R3,$ RRC A DJNZ R2,REE1 MOV @R1,A DEC R1 DJNZ R4,REE0 RET4.設定溫度分辨率
由于溫度傳感器的溫度精度為 0.0625℃,對于要求的精度太高,可以適當減少精度,使小數點后四位僅余一位有效,在符合條件的情況下理想化后三位。
FBLCHANGE: LCALL INIT_1 MOV A,#0CCH LCALL WRITE MOV A,#1FH LCALL WRITE RET5.主程序編寫
主程序應完全按照通信規則進行。
DS18B20 單線通信功能是分時完成的,他有嚴格的時隙概念,如果出現序列混亂,1-WIRE 器件將不響應主機,因此讀寫時序很重要。系統對 DS18B20 的各種操作必須按協議進行。根據 DS18B20 的協議規定,微控制器控制 DS18B20 完成溫度的轉換必須經過以下三個步驟 :
現在我們做的是讓DS18B20進行一次溫度轉換,那具體操作如下:
讀取 RAM 內的溫度數據同樣也要接照三個步驟:
故主函數設置如下:
MAIN: LCALL INIT_1LCALL FBLCHANGE LCALL GET_TEMP AJMP CHANGE GET_TEMP:SETB DQ LCALL INIT_1 JB FLAG,TSS2 RET TSS2: MOV A,#0CCH LCALL WRITEMOV A,#44H LCALL WRITE LCALL DISPLAY LCALL INIT_1 MOV A,#0CCH LCALL WRITE MOV A,#0BEH LCALL WRITE LCALL READ RET6.數據處理與顯示
對于傳回的數據,DS18B20 的數據格式如下:
| +125 | 00000111 11010000 | 07D0H |
| +25.0625 | 00000001 10010001 | 0191H |
| +10.125 | 00000000 10100010 | 00A2H |
| +0.5 | 00000000 00001000 | 0008H |
| 0 | 00000000 00000000 | 0000H |
| -0.5 | 11111111 11111000 | FFF8H |
| -10.125 | 11111111 01011110 | FF5EH |
| -25.0625 | 11111110 01101111 | FE6FH |
| -55 | 11111100 10010000 | FC90H |
故我們可以由如下步驟分析:
實際代碼如下:
CHANGE: MOV A,29H MOV 26H,29H MOV 25H,28H MOV 24H,28H MOV C,25H.7 JNC SN1 MOV A,25H CPL A MOV 25H,A MOV A,26H CPL A INC A MOV 26H,A MOV 29H,26H MOV 28H,25H SN1: MOV C,28H.0 RRC A MOV C,28H.1 RRC A MOV C,28H.2 RRC A MOV C,28H.3 RRC A JC SL0 MOV 27H,#00H AJMP SL5 SL0: MOV 27H,#05H SL5: MOV 29H,A LCALL DISPLAY LJMP MAIN DISPLAY:MOV A,29H MOV B,#10 DIV AB MOV ABIT,B MOV B,#10 DIV AB MOV BBIT,B MOV CBIT,A MOV R0,#4 DPL1: MOV R1,#250 DPL2: MOV C,24H.7JNC DPL3 MOV P0,#0BFH SETB P1.2 LCALL DELAY CLR P1.2 AJMP DPL4 DPL3: MOV P0,#0FFH SETB P1.2 LCALL DELAY CLR P1.2 DPL4: MOV DPTR,#TAB MOV A,27H MOVC A,@A+DPTR MOV P0,A SETB P1.6 LCALL DELAY CLR P1.6 MOV A,ABIT MOV DPTR,#TAB1 MOVC A,@A+DPTR MOV P0,A SETB P1.5 LCALL DELAY CLR P1.5 MOV A,BBIT MOV DPTR,#TAB MOVC A,@A+DPTR MOV P0,A SETB P1.4 LCALL DELAY CLR P1.4 MOV A,CBIT MOVC A,@A+DPTR MOV P0,A SETB P1.3 LCALL DELAY CLR P1.3 DJNZ R1,DPL2 DJNZ R0,DPL1 RET DELAY:MOV R5,#10 DEL0: MOV R6,#1 DEL1: MOV R7,#20 DEL2: DJNZ R7,DEL2DJNZ R6,DEL1 DJNZ R5,DEL0 RET TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H TAB1: DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H至此,課程設計原理全部介紹完畢。
六、數據記錄與結果分析
經過試驗得到如下仿真結果:
-32.3℃顯示結果
49.6℃顯示結果
113.2℃顯示結果
七、實驗程序
完整程序代碼:
;=================================================================================== ; Main.asm file generated by New Project wizard ; ; Created: 周四 6 月 7 2018 ; Processor: 80C51 ; Compiler: ASEM-51 (Proteus) ;=================================================================================== $NOMOD51 $INCLUDE (8051.MCU) ;=================================================================================== ; DEFINITIONS ;=================================================================================== ;=================================================================================== ; VARIABLES ;=================================================================================== ;=================================================================================== ; RESET and INTERRUPT VECTORS ;===================================================================================FLAG BIT F0 ; 聲明傳感器復位返回的標志位 DQ BIT P1.7 ; 定義DQ 作為數據傳輸端口名 ABIT EQU 35H BBIT EQU 36H CBIT EQU 37H ; 固定個,十,百位的存儲位置,名稱ORG 0000H AJMP MAIN ORG 0100H ;主程序 MAIN: LCALL INIT_1 ; 復位 LCALL FBLCHANGE ; 改變溫度的初始分辨率為9位LCALL GET_TEMP ; 得到溫度AJMP CHANGE ; 跳轉到數據處理子程序 ;復位程序INIT_1:SETB DQ ; 總線釋放 NOP ; 保持高電平,延時CLR DQ ; 總線置 0,請求響應MOV R0,#0FBH TSR1: DJNZ R0,TSR1 ; 延時SETB DQ ; 再釋放MOV R0,#25H TSR2: JNB DQ,TSR3 ; 改變為 0,則代表得到對應DJNZ R0,TSR2 ; 未得到則繼續等待,判斷 TSR3: SETB FLAG ; 得到相應則標志位置 1,代表傳感器正常存在 MOV R0,#06BH TSR4: DJNZ R0,TSR4 ; 延時SETB DQ ; 釋放總線,完成復位 RET ;改變溫度分辨率 FBLCHANGE:LCALL INIT_1 ; 復位MOV A,#0CCH ; 跳過ROMLCALL WRITE ; 把A寫入傳感器MOV A,#1FH ; 改變溫度分辨率為9LCALL WRITE ; 把A寫入傳感器 RET:得到溫度并轉換 GET_TEMP:SETB DQ ; 釋放總線LACALL INIT_1 ; 復位JB FLAG,TSS1 ; 若傳感器不存在,則直接返回主程序 RETTSS2: MOV A,#0CCHLCALL WRITE ; 執行跳過ROM指令MOV A,#44HLCALL WRITE ; 執行測溫指令LCALL DISPLAY ; 不僅延時,還讓程序完全生效前數碼管置零LCALL INIT_1 ; 復位MOV A,#0CCH LCALL WRITE ; 執行跳過ROM置零MOV A,#0BEH LCALL WRITE ; 執行讀取溫度數據指令LCALL READ ; 跳轉至通信子程序 RET ;寫入數據 ; 注:不可超過120us,否則無法寫入 WRITE:MOV R2,#8 ; 寫入八位二進制碼,即循環次數CLR C ; 進位標志位初始置零 WR1: CLR DQ ; 拉低總線為寫入做準備MOV R3,#6 DJNZ R3,$ ; 快速延時RRC A MOV DQ,C ; 將A又循環寫入C,寫入總線以輸入到傳感器MOV R3,#23 DJNZ R3,$ ; 快速延時SETB DQ ; 釋放,表示此位寫入完畢NOP DJNZ R2,WR1 ; 循環八次,一次寫入八位SETB DQ ; 釋放總線 RET ;讀入數據 READ: MOV R4,#2 ; 讀取兩個八位數據,是外層循環次數MOV R1,#29H ; 立即數尋址給定存儲位置 REE0: MOV R2,#8 ; 給定數據位數,是內層循環次數 REE1: CLR C ; 進位標志位初始置零SETB C NOPNOP CLR DQ NOP NOP NOP SETB DQ ; 輸入脈沖并持續2-3個機器周期MOV R3,#7 DJNZ R3,$ ; 快速延時,等待傳感器響應MOV C,DQ ; 按位讀出MOV R3,#23DJNZ R3,$ ; 快速延時RRC A ; 把C存入A內DJNZ R2,REE1 ; 循環8次MOV @R1,A ; 存儲ADEC R1 ; 更換地址DJNZ R4,REE0 ; 循環2次 RET;數據處理函數 CHANGE: MOV A,29H MOV 26H,29HMOV 25H,28H MOV 24H,28H ; 在24H存儲原始數據防止丟失MOV C,25H.7 ; 存儲符號位進CJNC SN1 ; 判斷溫度的正負,正數則跳過轉補碼程序MOV A,25HCPL A ; 取補碼,由于無效位置1,25H不必擔心數據溢出MOV 25H,A MOV A,26H CPL A INC A ; 由于是末位,需要加一MOV 26H,A MOV 29H,26H MOV 28H,25H ; 在26H,25H中操作后放回29H,28H SN1: MOV C,28H.0 ; 正負溫度到此均得到整數部分絕對值RRC A MOV C,28H.1 RRC A MOV C,28H.2 RRC A MOV C,28H.3 ; 分別循環,存入A內,連續4次濾掉小數部分RRC A ; 可分析A內八位恰為整數部分(最高位為0)JC SL0 MOV 27H,#00H AJMP SL5 SL0: MOV 27H,#05H SL5: MOV 29H,A ; 為小數部分顯示0和5做準備LCALL DISPLAY ; 轉入顯示函數 LJMP MAIN ; 返回主函數,程序執行完畢;顯示函數 DISPLAY:MOV A,29H MOV B,#10 DIV AB MOV ABIT,B MOV B,#10 DIV AB MOV BBIT,B MOV CBIT,A ; 此時可知CBA即為百十個位MOV R0,#4 ; 循環顯示 DPL1: MOV R1,#250 ; 長時間延時循環 DPL2: MOV C,24H.7 JNC DPL3 MOV P0,#0BFH SETB P1.2 LCALL DELAY CLR P1.2 AJMP DPL4 DPL3: MOV P0,#0FFH SETB P1.2 LCALL DELAY CLR P1.2 ; 符號位判斷顯示 DPL4: MOV DPTR,#TAB MOV A,27H MOVC A,@A+DPTR MOV P0,A SETB P1.6 LCALL DELAY CLR P1.6 ; 小數位判斷顯示MOV A,ABIT MOV DPTR,#TAB1 MOVC A,@A+DPTR MOV P0,A SETB P1.5 LCALL DELAY CLR P1.5 MOV A,BBIT MOV DPTR,#TAB MOVC A,@A+DPTR MOV P0,A SETB P1.4 LCALL DELAY ; 個十百位顯示CLR P1.4 MOV A,CBIT MOVC A,@A+DPTR MOV P0,A SETB P1.3 LCALL DELAY CLR P1.3 DJNZ R1,DPL2 DJNZ R0,DPL1 RET ;延遲函數 DELAY:MOV R5,#10 DEL0: MOV R6,#1 DEL1: MOV R7,#20 DEL2: DJNZ R7,DEL2DJNZ R6,DEL1 DJNZ R5,DEL0 RET TAB: ; 正常陽極數碼0-9DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H TAB1: ; 帶小數點的個位顯示數碼0-9DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H LOOP:JMP LOOP ;==================================================================== END總結
以上是生活随笔為你收集整理的基于DS18B20数字温度传感器的温度计设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML5作业自我评价,最新简历自我评价
- 下一篇: NOIP初赛知识点