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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機DS18B20測溫系統仿真設計-創新性實驗結題報告

[復制鏈接]
跳轉到指定樓層
樓主
ID:231567 發表于 2017-9-7 09:10 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
山東科技大學電工電子實驗教學中心

創新性實驗結題報告

實驗項目名稱  _基于Proteus的溫度檢測_

組長姓名 婁猛__   學號 _2*01417

手機    159*917

成員姓名    ____         學號   _      _  

成員姓名    ____         學號   _      _  

專    業  電子信息工程_    班級 _  09

指導教師及職稱 ____呂常智______

開課學期      至_學年_1_學期

提交時間      年1月日




一、實驗摘要

根據 DS18B20 的 1-wire 的通信原理,利用單片機匯編(或 C)語言實現一個溫度測試并顯示的電路,在 Proteus 平臺上進行電路設計,并且載入單片機程序進行仿真驗證。


、實驗目的

掌握虛擬仿真軟件 Proteus 的應用,了解溫度傳感器 DS18B20 的 1-wire 的通信原理,學會采用 Proteus 虛擬仿真軟件工具,利用單片機匯編(或 C)語言實現一個溫度測試并顯示的電路,并且在 Proteus 軟件上仿真測試,進行驗證,綜合實驗系統的使用方法,熟悉創新性實驗報告的撰寫方法。


實驗場地及儀器、設備和材料:

實驗場地: 院實驗室318、424
儀器設備: 計算機一臺
軟件:   Proteus軟件

(1)DS18B20特點:
DS18B20采用一線通信接口。因為一線通信接口,必須在先完成ROM設定,否則記憶和控制 功能將無法使用。主要首先提供以下功能命令之一: <1> 讀ROM,<2>ROM匹配,<3>搜索ROM,<4>跳過ROM,<5>報警檢查。這些指令操作作用在沒有一個器件的64位光刻ROM序列號,可以在掛在一線上多個器件選定某一個器件,同時,總線也可以知道總線上掛有有多少,什么樣的設備。
若指令成功地使DS18B20完成溫度測量,數據存儲在DS18B20的存儲器。一個控制功能 指揮指示DS18B20的演出測溫。測量結果將被放置在DS18B20內存中,并可以讓閱讀發出記憶功能的指揮,閱讀內容的片上存儲器。溫度報警觸發器 TH和TL都有一字節EEPROM 的數據。如果DS18B20不使用報警檢查指令,這些寄存器可作為一般的用戶記憶用途。在片上還載有配置字節以理想的解決溫度數字轉換。寫TH,TL指令 以及配置字節利用一個記憶功能的指令完成。通過緩存器讀寄存器。所有數據的讀,寫都是從最低位開始。

DS18B20部分命令設置:
命令
名稱
作用及解釋
0CCH
SKIP ROM命令
這條命令允許總線控制器不用提供 64 位ROM 編碼就使用存儲器操作命令,在單點總線情況下右以節省時間。如果總線上不止一個從機,在 Skip ROM命令之后跟著發一條讀命令,由于多個從機同時傳送信號,總線上就會發生數據沖突(漏極開路下拉效果相當于相與)。
4EH
寫暫存存儲器命令
這個命令向 DS1820 的暫存器中寫入數據,開始位置在地址 2。接下來寫入的兩個字節將被存到暫存器中的地址位置 2 和3。可以在任何時刻發出復位命令來中止寫入。
44H
溫度轉換命令
這條命令啟動一次溫度轉換而無需其他數據。溫度轉換命令被執行,而后 DS1820保持等待狀態。如果總線控制器在這條命令之后跟著發出讀時間隙,而 DS1820 又忙于做時間轉換的話,DS1820 將在總線上輸出“0”,若溫度轉換完成,則輸出“1”。如果使用寄生電源,總線控制器必須在發出這條命令后立即起動強上拉,并保持500ms。
0BEH
讀溫度命令
這個命令讀取暫存器的內容。讀取將從字節 0 開始,一直進行下去,直到第 9(字節 8,CRC)字節讀完。如果不想讀完所有字節,控制器可以在任何時間發出復位命令來中止讀取。
0ECH
告警搜索
這條命令的流程圖和 Search ROM 相同。然而,只有在最近一次測溫后遇到符合報警條件的情況,DS1820才會響應這條命令。報警條件定義為溫度高于TH或低于TL。只要 DS1820 不掉電,報警狀態將一直保持,直到再一次測得的溫度值達不到報警條件。
DS18B20讀寫時序圖:
說明:
主機要生成一個寫時間隙,必須把數據線拉到低電平然后釋放,在寫時間隙開始后的15μs內允許數據線拉到高電平。 主機要生成一個寫 0 時間隙,必須把數據線拉到低電平并保持 60μs。
初始化過程“復位和存在脈沖”:
說明:
DS1820 需要嚴格的協議以確保數據的完整性。協議包括幾種單線信號類型:復位脈沖、存在脈沖、寫0、寫 1、讀0 和讀1。所有這些信號,除存在脈沖外,都是由總線控制器發出的。 和 DS1820 間的任何通訊都需要以初始化序列開始,一個復位脈沖跟著一個存在脈沖表明 DS1820 已經準備好發送和接收數據(適當的 ROM 命令和存儲器操作命令)。



DS18B20溫度值格式表:
說明:
  這是12位轉化后得到的12位數據,存儲在18B20的兩個8比特的RAM中,二進制中的前面 5位是符號位,如果測得的溫度大于0, 這5位為0,只要將測到的數值乘于0.0625即可得到實際溫度;如果溫度小于0,這5位為1,測到的數值需要取反加1再乘于0.0625即可得到實際 溫度。 例如+125℃的數字輸出為07D0H,+25.0625℃的數字輸出為0191H,-25.0625℃的數字輸出為FE6FH,-55℃的數字輸出為FC90H 。
(2)數碼顯示:
采用數碼管動態顯示,通過位控線選擇數碼管,同時單片機通過查表送出段選送顯示的段碼,利用人的視覺暫留特點達到顯示的目的。
(3)復位電路:
復位電路采用手動復位,實現單片機系統復位。
(4)震蕩電路;
為單片機提供恒定可靠的震蕩周期。
(5)驅動電路:
由于單片機的驅動能力有限,考慮到數碼管的特點,實際應加上驅動電路,以提供合適的電流。
(6)測溫開關
給單片機信號,給予其開始測溫,關閉測溫指示。
(7)Proteus 虛擬仿真
在keil中編寫單片機程序,生成相應的.Hex文件,將文件復制到一個文件夾下,在Proteus里添加單片機并設置程序的路徑,找到該文件,仿真時就會調用該程序文件。

2、實驗內容
根據設計要求設計硬件電路,根據各項指標選擇合適的原件,在Proteus原理圖中畫出原理圖。本設計采用六個八段數碼段動態顯示,硬件電路主要有單片機,復位電路,數碼顯示,震蕩電路,驅動電路,測溫開關電路,傳感器電路等組成。開機顯示“HELLO”友好界面,測溫控制開關開始關閉測溫,當開關閉合時,處于測溫狀態,顯示的溫度值即為真實溫度,開關打開時為關閉狀態,數碼管組顯示“OFF”與最后一次測量值的交替顯示,警示測溫中斷,開關再次合上時又進行正常測溫。考慮到成本問題單片機選用AT89C52,該單片機為一8位單片機,詳細介紹再次就不過多陳述,具體參數參考技術資料。單片機程序采用匯編語言,在Keil環境下編譯。

3、實驗步驟
(1)根據功能設計硬件電路
<1>數碼管顯示及其驅動電路:
本設計采用的是6位8段共陽數碼管,如下圖所示,ABCDEFG個DP分別是數碼管的八個段,123456是對應的六個線選線,由于單片機的灌電流能力也不是很強,直接驅動幾個數碼管有點困難,因此加上了373鎖存器,跟7407同向驅動芯片。373鎖存p0(開漏輸出)口輸出的段選信號,P2口是線選信號輸出口。P2口雖然內部有上拉電阻,但是由于7407是集電極開路六組驅動器,沒有上拉不能輸出高電平所以還要加上拉電阻。7407的驅動能力比較強,高電平時輸出最大電流可達41mA,而輸入高電平電流只需40uA即可,能夠滿足該六位數碼管正常顯示。

<2>振蕩電路
該振蕩電路外部由兩個電容C1,C2跟晶振X1組成,如下圖連接接地,并接到單片機的XTAL1跟XTAL2引腳上。由于51單片機內部有一個用于構成振蕩器的可控高增益反向放大器,兩個引腳XTAL1,XTAL2分別是該放大器的輸入端跟輸出端。按下圖所示,就可構成一個自激振蕩器,匹配電容根據晶振的要求選取,一般選用20~30pF瓷片電容即可。

<3>復位電路
下圖是一個簡單手動復位與上電復位的綜合復位電路。R2,R3構成手動復位電路,R2一般取1~5KΩ。在實際電路中,當R3=200Ω,R2=800Ω時,按下按鍵實現可靠復位電壓為4V.即Urst=U*R2/(R2+R3)。由于仿真軟件的問題,當R2大于1K時,上電后RST引腳不能實現低電平,因此不能滿足復位的條件,采用800Ω電阻時能夠實現。但實際電路中R2取到1K才能實現可靠的上電復位。(相關公式:Urst=5*e^(-t/τ), τ=R2*C,當復位電壓大于等于3V時是可靠復位電壓。帶入上式,t=τ*ln(5/3) ≈0.15τ,當R2=1KΩ,C=22uF時,t≈11.2ms.即復位時間約為11.2ms。為保證可靠復位,復位時間大于10ms即可。)
<4>測溫開關:
測溫開關的實現時利用檢驗其是否存在的原理進而轉換顯示狀態,故可以設置在DS18B20跟單片機相連的路徑之間(接在P3.3引腳),開關斷開,單片機就會檢測不到傳感器,轉換到關閉測溫狀態,開關閉合,單片機又能檢測到傳感器,自動轉到測溫顯示狀態。由于DS1820 的單總線端口(I/O 引腳)是漏極開路式的,一個多點總線由一個單線總線和多個掛于其上的從機構成。在發出任何涉及拷貝到 E2存儲器或啟動溫度轉換的協議之后,必須在最多 10μs之內把 I/O 線轉換到強上拉,因此單線總線需要一個約 5KΩ的上拉電阻。
實際電路如下圖所示:

(2)設計單片機程序,畫出流程圖
通過單線總線端口訪問 DS1820 的協議如下:
• 初始化   
• ROM 操作命令   
• 存儲器操作命令
• 執行/數據
程序組成:
主程序
子程序:
HELLO與OFF開關顯示、DS18B20初始化、重寫DB18B20、讀溫度、溫度數值轉換等。

主程序流程圖:
HELLO與OFF開關顯示流程圖:

DS18B20初始化流程圖:
重寫DB18B20流程圖:





讀溫度流程圖:
溫度數值轉換流程圖:

(3)編寫程序
根據硬件電路編寫程序,程序見實驗結果部分的程序清單。
(4)仿真調試
在Keil編譯環境下編譯匯編程序,設置晶振12MHz,生成.Hex文件。打開用Proteus畫好的原理圖,雙擊單片機,設置震蕩頻率12MHz,與硬件電路相對應,瀏覽找到生成的該程序的.Hex文件作為其程序。設置完成,打開仿真按鈕,進行仿真調試,打開閉合測溫開關觀察現象,調節DS18B20的溫度調節部分調節溫度,觀察數碼顯示溫度值。


、實驗結果與分析
1、實驗現象、數據記錄
當仿真開始時,顯示開機界面“HELLO”:
測溫時,當測試零下溫度時顯示零下溫度值:
當測試零上溫度時顯示正的溫度值:
當測溫開關打開時,顯示“OFF”與最后一次測溫值交替顯示界面:


2、對實驗現象、數據及觀察結果的分析與討論:
    開機時顯示“HELLO”問候,采用200次動態掃描顯示,顯示完之后自動轉到下面的初始化及測溫程序,傳感器存在時,進行正常測溫,零上溫度入上面圖示,顯示零上溫度,無效位消隱,實現方法是每次遍歷存儲空間,將無效位的段選置空,有效的位用數據填充,小數點另加到倒數第二個數碼管的小數點處。當測試零下溫度時,數值轉換要取反加1,還要在前面加負號,考慮到負數最多顯示兩位,故將負號固定在倒數第四位,省去了判斷的麻煩。當測溫開關斷開時,由于檢測不到DS18B20的存在,故程序轉到顯示“OFF”界面,由于要不斷地檢測存在位,所以要循環檢測,循環顯示,由于時序的原因,會使OFF與最后一次測溫結果交替顯示。開關閉合,又能檢測到標志位,程序自動進入正常測溫序列。
3、主要關鍵和創新點:
  在Proteus仿真環境下,使用DS18B20進行一路測溫,測溫精度達到到0.5攝氏度開機顯示友好界面“HELLO”問候,當測溫關閉時,會顯示“OFF”提醒,閉合開關,又可以進行正常測溫。本設計通過檢查存在標志位的方法進行了測溫開關的控制,避免了使用中斷進行控制,從而避免了中斷導致的測溫時序混亂,測溫不準的結果。

程序清單:
  1. ;===================================
  2. ;FLAG1: 標志位,為"1"時表示檢測到DS18B20
  3. ;FLAG2: 標志位,為“1”時測溫,為0時關閉
  4. ;DQ:    DS18B20的數據總線接腳
  5. ;===================================
  6. ;RAM
  7.         ByteCnt  data 31H ;數據字節計數器
  8.                             TEMPER_H EQU 35H ;溫度高八位
  9.         TEMPER_L  EQU 36H  ;溫度低八位
  10.         TEMPER_NUM EQU  37H                 ;保存讀出的溫度數據
  11.         ZhengShu  EQU 38H  ;存放整數部分數據
  12.         Show_Dat  EQU 40H ;存儲要顯示的數據                           
  13. ;BIT
  14.         FLAG1  EQU  20H              ;標志位,為"1"時表示檢測到DS18B20
  15.         DQ   BIT   P3.3                 ;;DS18B20的數據總線接腳
  16. ;===================================
  17.         ORG  00H              ;;給定主函數起始位置
  18.         LJMP   MAIN              ;;跳至主函數
  19.         ORG  000BH              ;;定時器T0中斷服務程序入口
  20.         LJMP   INT_T0  ;;跳至T0中斷            
  21. ;===================================
  22. ;MAIN
  23. ;主程序
  24. ;===================================
  25. MAIN:   NOP
  26.                    MOV              R3,#0C8H              ;顯示200次
  27.                    MOV  50H,#0     ;顯示緩沖單元
  28.         MOV    51H,#1
  29.         MOV    52H,#2
  30.         MOV    53H,#3
  31.         MOV    54H,#4
  32.         MOV    55H,#5
  33.                             CALL  HELLO ;;調用開機顯示界面
  34.                             NOP
  35.         MOV    SP,#0E0H              ;;設堆棧指針
  36.         MOV   TMOD,#01H  ;T0工作在16位定時器
  37.         MOV  TH0,#0F8H   ;定時2ms初值
  38.         MOV    TL0,#50H
  39.         SETB    ET0   ;允許定時器0中斷
  40.         CLR    EA         ;關閉全局中斷
  41.         SETB    TR0        ;打開定時器0
  42.         MOV    R0,#40H                 ;該地址是存儲要顯示的數據區首址
  43. AGAIN: MOV    @R0,#0FFH              ;;存儲區初始化,置1
  44.         INC    R0
  45.         CJNE   R0,#48H,AGAIN                ;;遍歷
  46. MAIN_1: CALL   INIT_1820              ;;初始化18B20
  47.         CALL   RE_CONFIG                ;;重新寫DS18B20
  48.         CALL   GET_TEMPER              ;;讀溫度
  49.         MOV    Show_Dat+1,#0FFH   ;;存儲區初始化,置1
  50.         MOV    Show_Dat+2,#0FFH
  51.         MOV    Show_Dat+3,#0FFH
  52.         LCALL  Temper_chng              ;;數值轉換
  53.         MOV    R5,#01H                            ;;第一個位選
  54.         MOV    R0,#40H                            ;;顯示首址
  55.         SETB    EA                              ;;開全局中斷
  56.         LCALL  DELAY                ;;延時
  57.         CLR     EA                                          ;;關全局中            
  58.         JMP     MAIN_1                            ;;返回主函數
  59. ;===================================
  60. ;INIT_1820
  61. ;DS18B20初始化程序
  62. ;===================================
  63. INIT_1820:
  64.         SETB   DQ              ;;先拉高總線,準備拉低
  65.         NOP              ;;等待1us電平轉換狀態完畢
  66.         CLR     DQ                                          ;;釋放總線
  67.         MOV    R0,#6BH              ;為延時送初值
  68.         MOV    R1,#03H                            ;;為延時送初值
  69. TSR1:   DJNZ   R0,TSR1    ;延時約700us (480~960)
  70.         MOV    R0,#6BH  ;;為延時送初值
  71.         DJNZ   R1,TSR1
  72.         SETB   DQ         ;釋放總線
  73.         NOP                                                                      ;;延時
  74.         NOP
  75.         NOP
  76.         MOV    R0,#20H                            ;;為延時送初值
  77. TSR2:   JNB    DQ,TSR3  ;有存在信號跳轉
  78.         DJNZ   R0,TSR2   ;延時約70us,70us后如果數據線沒有存在脈沖(低電平)說明DS18B20不存在
  79.         LJMP   TSR4              ;;轉到清除標志操作
  80. TSR3:   SETB   FLAG1   ;置標志位,表示DS1820存在
  81.         LJMP   TSR5              ;;準備延時
  82. TSR4:   CLR    FLAG1     ;清標志位,表示DS18B20不存在
  83.         LJMP   TSR7 ;;準備釋放總線繼續等
  84. TSR5:   MOV    R0,#05CH              ;;送延時初值
  85. TSR6:   DJNZ   R0,TSR6      ;延時200us
  86. TSR7:   SETB   DQ           ;釋放總線
  87.         RET
  88. ;===================================
  89. ; RE_CONFIG
  90. ; 重新寫DS18B20暫存存儲器設定值
  91. ;===================================
  92. RE_CONFIG:
  93.         JB  FLAG1,RE_CONFIG1 ;若DS18B20存在,轉RE_CONFIG1
  94.                             MOV                R3,#0C8H              ;顯示200次
  95.                    MOV    60H,#0     ;顯示緩沖單元
  96.         MOV    61H,#1
  97.         MOV    62H,#2
  98.         MOV    63H,#3
  99.         MOV    64H,#4
  100.         MOV    65H,#5
  101.                             CALL   OFF
  102.         RET
  103. RE_CONFIG1:
  104.         MOV  A,#0CCH ;發SKIP ROM命令
  105.         LCALL  WRITE_1820
  106.         MOV  A,#4EH ;發寫暫存存儲器命令
  107.         LCALL  WRITE_1820
  108.        MOV A,#30H;TH(上限)中寫入00H
  109.         LCALL  WRITE_1820
  110.         MOV  A,#00H  ;TL(下限)中寫入00H
  111.         LCALL  WRITE_1820
  112.         MOV  A,#1FH ;選擇9位溫度分辨率
  113.         LCALL  WRITE_1820
  114.         RET
  115. ;===================================
  116. ; 讀出轉換后的溫度值
  117. ; 數據存儲到TEMPER_H和TEMPER_L中
  118. ; 包含告警搜索
  119. ;===================================
  120. GET_TEMPER:
  121.         SETB   DQ          ;定時入口
  122.         LCALL  INIT_1820   ;初始化1820
  123.         JB     FLAG1,TSS2
  124.         RET     ;若DS18B20不存在則返回
  125. TSS2:   MOV    A,#0CCH ;跳過ROM匹配
  126.         LCALL  WRITE_1820                   ;;調寫DS18B20的程序
  127.         MOV    A,#44H ;發出溫度轉換命令
  128.         LCALL  WRITE_1820
  129.         LCALL  INIT_1820
  130.         MOV    A,#0CCH  ;跳過ROM匹配
  131.         LCALL  WRITE_1820
  132.         MOV    A,#0BEH  ;發出讀溫度命令
  133.         LCALL  WRITE_1820
  134.         LCALL  READ_18200
  135.         MOV  TEMPER_NUM,A   ;將讀出的溫度數據保存
  136.         MOV    A,#0ECH       ;告警搜索
  137.         CALL   WRITE_1820
  138.         RET
  139. ;===================================
  140. ; READ_1820
  141. ; 讀DS18B20的程序,從DS18B20中讀出一個字節的數據
  142. ; 讀出的數據在A中
  143. ;===================================
  144. READ_1820:
  145.         MOV    R2,#8                            ;一個字節8位
  146. RE1:
  147.         CLR    C                                          ;清零進借位
  148.         SETB   DQ         ;數據線拉高
  149.         NOP                                            ;延時
  150.         NOP
  151.         CLR    DQ        ;數據線拉低
  152.         NOP                                            ;延時
  153.         NOP
  154.         NOP
  155.         SETB DQ;數據線拉高產生讀時間隙
  156.         MOV    R3,#3  ;;為延時6us送初值
  157.         DJNZ    R3,[        DISCUZ_CODE_7        ]nbsp;       ;延時約6us
  158.         MOV    C,DQ          ;讀入數據
  159.         MOV    R3,#23              ;為延時50us送初值
  160.         DJNZ    R3,[        DISCUZ_CODE_7        ]nbsp;       ;延時約50us
  161.         SETB    DQ         ;數據線拉高
  162.         NOP
  163.         RRC    A
  164.         DJNZ   R2,RE1
  165.         RET
  166. ;===================================
  167. ;WRITE_1820:
  168. ; 寫DS18B20的程序
  169. ;===================================
  170. WRITE_1820:
  171.         MOV    R2,#8                            ;;8位
  172.         CLR     C                                          ;;清空C
  173. WR1:  CLR   DQ ;數據線拉低產生寫時間隙
  174.       MOV    R3,#6                            ;;為延時送數
  175.    DJNZ  R3,[        DISCUZ_CODE_7        ]nbsp; ;延時約6us(要求小于15us)
  176.     RRC     A                                          ;;循環右移
  177.     MOV    DQ,C     ;數據送到數據線
  178.     MOV    R3,#23                 ;為延時送初值
  179.    DJNZ  R3,[        DISCUZ_CODE_7        ]nbsp; ;延時約25us(要求15us-60us)
  180.         SETB    DQ        ;數據線拉高
  181.         NOP                ;延時1.085us(要求連續寫2 位間的間隙大于1us)
  182.         DJNZ    R2,WR1    ;判斷是否寫完沒寫完接著寫下一位
  183.         SETB    DQ                                          ;;寫完拉高
  184.         RET
  185. ;===================================
  186. ; READ_18200
  187. ; 讀DS18B20的程序,從DS18B20中讀出兩個字節的溫度數據
  188. ; 數據存儲到TEMPER_H和TEMPER_L中
  189. ;===================================
  190. READ_18200:
  191.         MOV    R4,#2  ;將溫度高位和低位從DS18B20中讀出
  192.         MOV    R1,#36H    ;低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
  193. RE00:
  194.         MOV    R2,#8       ;;8位
  195. RE01:
  196.         CLR    C                                            ;;清進借位
  197.         SETB    DQ                                           ;;拉高
  198.         NOP
  199.         NOP
  200.         CLR     DQ                                          ;;拉低
  201.         NOP
  202.         NOP
  203.         NOP
  204.         SETB    DQ                                          ;;釋放總線
  205.         MOV    R3,#3                            ;;為延時送數
  206.         DJNZ   R3,[        DISCUZ_CODE_7        ]nbsp;        ;延時約6us
  207.         MOV    C,DQ                                          ;;讀數據
  208.         MOV    R3,#23                            ;;為延時送數
  209.         DJNZ    R3,[        DISCUZ_CODE_7        ]nbsp;        ;延時約50us
  210.         SETB   DQ         ;數據線拉高
  211.         NOP
  212.         RRC    A                               ;;移位保存
  213.         DJNZ   R2,RE01;;判斷8位是否讀完
  214.         MOV    @R1,A ;;將低位數據保存
  215.         DEC    R1              ;;轉到存儲高位數據地址
  216.       DJNZ R4,RE00;判斷兩個字節是否讀完
  217.         RET
  218. Temper_chng:
  219.         MOV  DPTR,#TAB ;字形碼表頭地址
  220.         MOV  R0,#Show_Dat ;顯示首地址賦給R0
  221.         MOV  A,TEMPER_L  ;;溫度低八位
  222.         ANL    A,#0FH                            ;取溫度低四位            
  223.       CJNE  A,#0H,NEXT ;判斷小數部分數據
  224.         MOV    @R0,#0C0H     ;小數為0
  225.         LJMP   NEXT1
  226. NEXT:   MOV    @R0,#92H     ;小數為5
  227. NEXT1:  INC    R0                            ;;下一個地址
  228.        MOV A,TEMPER_L ;整數移位到低四位
  229.         RR     A
  230.         RR     A
  231.         RR     A
  232.         RR     A
  233.         ANL     A,#0FH      ;保留低四位
  234.         MOV    ZhengShu,A      
  235.         MOV    A,TEMPER_H  ;整數部分移位到高四位
  236.         RL     A
  237.         RL     A
  238.         RL     A
  239.         RL     A
  240.         ANL    A,#0F0H      ;保留高四位
  241.         ADD    A,ZhengShu   ;相加得到整數部分數據
  242.         MOV    ZhengShu,A ;存儲整數部分                           
  243. ;===================================
  244. ;判斷正負數              ,正數可以直接進行轉換,負數取反加1并且加負號
  245. ;===================================
  246.                               PUSH   ACC                            ;;保存A
  247.                               ANL    A,#80H              ;;取符號位
  248.                               JZ                            NEXT12              ;;符號位為零,跳轉至正數處理部分
  249.                               POP    ACC
  250.                               CPL    A              ;;取反
  251.                               ADD    A,#01H                            ;;加1
  252.                               PUSH   ACC
  253.                               MOV    R0,#Show_Dat    ;顯示首地址賦給R0
  254.          MOV    A,TEMPER_L;;溫度低八位
  255.          ANL     A,#0FH ;;取溫度低四位            
  256.                               CPL     A              ;;取反
  257.                               ADD    A,#01H                                               ;;加1
  258.          CJNE    A,#0H,NEXT13  ;判斷小數部分數據
  259.          MOV    @R0,#0C0H    ;小數為0
  260.                               INC    R0              ;;移到下一位
  261.                               MOV    A,#0BFH        ;加負號
  262.          MOV    Show_Dat+3,A                ;;送回
  263.                               POP   ACC
  264.         LJMP   NEXT2
  265. NEXT13: MOV     @R0,#92H      ;小數為5
  266.         INC    R0
  267.                               MOV    A,#0BFH        ;加負號
  268.         MOV    Show_Dat+3,A                 ;送回
  269.                               POP    ACC
  270.                               DEC    A
  271.                               LJMP   NEXT2
  272. NEXT12: POP    ACC
  273. NEXT2:  MOV    B,#10 ;16進制轉成十進制
  274.         DIV      AB
  275.         MOV     R6,A                            ;;得高位
  276.         MOV    A,B
  277.         MOVC   A,@A+DPTR
  278.   MOV   @R0,A;將段碼送到相應的地址空間
  279.         INC      R0                            ;;轉移到下一個地址
  280.         MOV    A,R6
  281.     CJNE   A,#0,NEXT2              ;;判斷是否轉換完
  282.         MOV    A,Show_Dat+1   ;加小數點
  283.         CLR    C                                          ;清除進借位
  284.         SUBB    A,#80H                                            ;;加點
  285.         MOV    Show_Dat+1,A                ;;送回
  286.         RET
  287. TAB:    DB     0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H
  288. ;;共陽數碼管對應的字符表:0,1,2,3,4,5,6,7,8,9,              負號:0BFH
  289. TAB1:   DB    0C0H,0C7H,0C7H,86H,89H,0FFH
  290. ;;"HELLO"
  291. TAB2:   DB                0FFH,8EH,8EH,0C0H,0FFH,0FFH
  292. ;;"OFF"
  293. ;===================================
  294. DELAY:
  295.         MOV    R3,#10   ;;為延時送初值
  296. DELAY2: MOV    R7,#200  ;;為延時送初值
  297. DELAY1: MOV    R4,#250   ;;為延時送初值
  298.         DJNZ   R4,$
  299.         DJNZ   R7,DELAY1
  300.         DJNZ   R3,DELAY2
  301.         RET
  302. ;===================================
  303. INT_T0: MOV    TH0,#0F8H    ;重賦2ms的定時器時間常數
  304.         MOV    TL0,#50H
  305.         MOV    P0,#0FFH              ;高電位滅碼
  306.         MOV    P2,R5      ;送當前顯示數碼管的位選信號
  307.         MOV    A,@R0                                            ;;取數
  308.         MOV    P0,A          ;送字形代碼
  309.         INC    R0     ;顯示數據緩沖器指針加1,為下一個顯示數據作準備
  310.         CJNE    R0,#48H,NEXT3    ;判斷是否8個數據全部送完,未送完則不用調整顯示緩沖指針
  311.         MOV    R0,#40H          ;送完則調整顯示緩沖指針
  312. NEXT3: MOV     A,R5           ;將目前的位選暫存信號左移,為下一個數碼管顯示作準備
  313.         RL      A                                                           ;左移
  314.         MOV    R5,A                            ;;下一個位選
  315.         RETI                              
  316. ;===========顯示開關界面
  317. ;===================================
  318. HELLO: MOV    R0,#50H     ;顯示緩沖首址
  319.                   MOV    R2,#2H    ;位控初始碼(先亮最低位)
  320. LOOPs: MOV                A,#0H          ;共陰滅碼
  321.                   MOV    P2,A     
  322.                   MOV                A,R2        ;送位控信號
  323.                   MOV    P2,A
  324.                   MOV    A,@R0 ;從顯示緩沖中取數
  325.                   MOV    DPTR,#TAB1
  326.                  MOVC  A,@A+DPTR ;查出字形代碼
  327.                   MOV    P0,A    ;送顯示字符段代碼
  328.                   MOV    R7,#0FFH
  329.    DJNZ   R7,[        DISCUZ_CODE_7        ]nbsp;   ;1ms延時,穩定顯示信息
  330.                   INC                 R0        ;取下一個數
  331.                   MOV                A,R2         
  332.                   JB                    ACC.6,EXIT1  ;判斷是否送到最高位?                 
  333.        RL                A
  334.                   MOV              R2,A  ;得到下一個位控信號
  335.                             AJMP   LOOPs
  336. EXIT1: DJNZ    R3,HELLO;是否顯示完200次
  337.        RET            
  338. OFF:   MOV    R0,#60H    ;顯示緩沖首址
  339.                   MOV    R2,#2H    ;位控初始碼(先亮最低位)
  340. LOOPs2: MOV                A,#0H        ;共陰滅碼
  341.                   MOV    P2,A     
  342.                   MOV                A,R2        ;送位控信號
  343.                   MOV    P2,A
  344.                   MOV    A,@R0 ;從顯示緩沖中取數
  345.                   MOV    DPTR,#TAB2
  346.                   MOVC              A,@A+DPTR;查出字形代碼
  347.                   MOV    P0,A   ;送顯示字符段代碼
  348.                   MOV    R7,#0FFH
  349.     DJNZ R7,[        DISCUZ_CODE_7        ]nbsp; ;1ms延時,穩定顯示信息
  350.                   INC                 R0        ;取下一個數

  351. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

完整論文下載(word格式 可編輯):
基于單片機的DS18B20測溫系統的設計.doc (1.17 MB, 下載次數: 21)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:747812 發表于 2020-5-9 17:20 | 只看該作者
有C語言的程序嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国内精品在线视频 | av在线一区二区三区 | 欧美一级特黄aaa大片在线观看 | 亚洲视频在线观看 | a毛片| 日本久久久久久 | 国产天天操 | 国产一区久久久 | 99综合在线 | 国产精品永久久久久久久www | 成人伊人| 免费天天干| 国产在线精品一区二区三区 | 天天天天操 | 韩国精品一区 | 午夜影院操 | 国产最新视频在线 | 日韩精品视频一区二区三区 | 99精品国自产在线 | 日本a在线| 一区二区日韩精品 | 中文字幕1区2区 | 国产精品久久久久久久7电影 | 久久久久久久久久久福利观看 | 特黄毛片 | 国产精品久久久久久久久久久久 | 久久久久国产精品午夜一区 | 国产xxx在线观看 | 黄频免费 | 久久国产精品精品 | 国产精品免费一区二区三区四区 | 欧美成人a∨高清免费观看 91伊人 | 国产精品久久久久久久一区二区 | 日韩中文字幕在线观看 | 欧美日韩一卡 | 亚洲精品国产第一综合99久久 | 黄色毛片在线看 | 国产欧美一区二区久久性色99 | 91视视频在线观看入口直接观看 | 日韩电影一区二区三区 | 美女张开腿露出尿口 |