山東科技大學電工電子實驗教學中心
創新性實驗結題報告 實驗項目名稱 _基于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部分命令設置: 命令 | | | | | 這條命令允許總線控制器不用提供 64 位ROM 編碼就使用存儲器操作命令,在單點總線情況下右以節省時間。如果總線上不止一個從機,在 Skip ROM命令之后跟著發一條讀命令,由于多個從機同時傳送信號,總線上就會發生數據沖突(漏極開路下拉效果相當于相與)。 | | | 這個命令向 DS1820 的暫存器中寫入數據,開始位置在地址 2。接下來寫入的兩個字節將被存到暫存器中的地址位置 2 和3。可以在任何時刻發出復位命令來中止寫入。 | | | 這條命令啟動一次溫度轉換而無需其他數據。溫度轉換命令被執行,而后 DS1820保持等待狀態。如果總線控制器在這條命令之后跟著發出讀時間隙,而 DS1820 又忙于做時間轉換的話,DS1820 將在總線上輸出“0”,若溫度轉換完成,則輸出“1”。如果使用寄生電源,總線控制器必須在發出這條命令后立即起動強上拉,并保持500ms。 | | | 這個命令讀取暫存器的內容。讀取將從字節 0 開始,一直進行下去,直到第 9(字節 8,CRC)字節讀完。如果不想讀完所有字節,控制器可以在任何時間發出復位命令來中止讀取。 | | | 這條命令的流程圖和 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”提醒,閉合開關,又可以進行正常測溫。本設計通過檢查存在標志位的方法進行了測溫開關的控制,避免了使用中斷進行控制,從而避免了中斷導致的測溫時序混亂,測溫不準的結果。 |
程序清單:
- ;===================================
- ;FLAG1: 標志位,為"1"時表示檢測到DS18B20
- ;FLAG2: 標志位,為“1”時測溫,為0時關閉
- ;DQ: DS18B20的數據總線接腳
- ;===================================
- ;RAM
- ByteCnt data 31H ;數據字節計數器
- TEMPER_H EQU 35H ;溫度高八位
- TEMPER_L EQU 36H ;溫度低八位
- TEMPER_NUM EQU 37H ;保存讀出的溫度數據
- ZhengShu EQU 38H ;存放整數部分數據
- Show_Dat EQU 40H ;存儲要顯示的數據
- ;BIT
- FLAG1 EQU 20H ;標志位,為"1"時表示檢測到DS18B20
- DQ BIT P3.3 ;;DS18B20的數據總線接腳
- ;===================================
- ORG 00H ;;給定主函數起始位置
- LJMP MAIN ;;跳至主函數
- ORG 000BH ;;定時器T0中斷服務程序入口
- LJMP INT_T0 ;;跳至T0中斷
- ;===================================
- ;MAIN
- ;主程序
- ;===================================
- MAIN: NOP
- MOV R3,#0C8H ;顯示200次
- MOV 50H,#0 ;顯示緩沖單元
- MOV 51H,#1
- MOV 52H,#2
- MOV 53H,#3
- MOV 54H,#4
- MOV 55H,#5
- CALL HELLO ;;調用開機顯示界面
- NOP
- MOV SP,#0E0H ;;設堆棧指針
- MOV TMOD,#01H ;T0工作在16位定時器
- MOV TH0,#0F8H ;定時2ms初值
- MOV TL0,#50H
- SETB ET0 ;允許定時器0中斷
- CLR EA ;關閉全局中斷
- SETB TR0 ;打開定時器0
- MOV R0,#40H ;該地址是存儲要顯示的數據區首址
- AGAIN: MOV @R0,#0FFH ;;存儲區初始化,置1
- INC R0
- CJNE R0,#48H,AGAIN ;;遍歷
- MAIN_1: CALL INIT_1820 ;;初始化18B20
- CALL RE_CONFIG ;;重新寫DS18B20
- CALL GET_TEMPER ;;讀溫度
- MOV Show_Dat+1,#0FFH ;;存儲區初始化,置1
- MOV Show_Dat+2,#0FFH
- MOV Show_Dat+3,#0FFH
- LCALL Temper_chng ;;數值轉換
- MOV R5,#01H ;;第一個位選
- MOV R0,#40H ;;顯示首址
- SETB EA ;;開全局中斷
- LCALL DELAY ;;延時
- CLR EA ;;關全局中
- JMP MAIN_1 ;;返回主函數
- ;===================================
- ;INIT_1820
- ;DS18B20初始化程序
- ;===================================
- INIT_1820:
- SETB DQ ;;先拉高總線,準備拉低
- NOP ;;等待1us電平轉換狀態完畢
- CLR DQ ;;釋放總線
- MOV R0,#6BH ;為延時送初值
- MOV R1,#03H ;;為延時送初值
- TSR1: DJNZ R0,TSR1 ;延時約700us (480~960)
- MOV R0,#6BH ;;為延時送初值
- DJNZ R1,TSR1
- SETB DQ ;釋放總線
- NOP ;;延時
- NOP
- NOP
- MOV R0,#20H ;;為延時送初值
- TSR2: JNB DQ,TSR3 ;有存在信號跳轉
- DJNZ R0,TSR2 ;延時約70us,70us后如果數據線沒有存在脈沖(低電平)說明DS18B20不存在
- LJMP TSR4 ;;轉到清除標志操作
- TSR3: SETB FLAG1 ;置標志位,表示DS1820存在
- LJMP TSR5 ;;準備延時
- TSR4: CLR FLAG1 ;清標志位,表示DS18B20不存在
- LJMP TSR7 ;;準備釋放總線繼續等
- TSR5: MOV R0,#05CH ;;送延時初值
- TSR6: DJNZ R0,TSR6 ;延時200us
- TSR7: SETB DQ ;釋放總線
- RET
- ;===================================
- ; RE_CONFIG
- ; 重新寫DS18B20暫存存儲器設定值
- ;===================================
- RE_CONFIG:
- JB FLAG1,RE_CONFIG1 ;若DS18B20存在,轉RE_CONFIG1
- MOV R3,#0C8H ;顯示200次
- MOV 60H,#0 ;顯示緩沖單元
- MOV 61H,#1
- MOV 62H,#2
- MOV 63H,#3
- MOV 64H,#4
- MOV 65H,#5
- CALL OFF
- RET
- RE_CONFIG1:
- MOV A,#0CCH ;發SKIP ROM命令
- LCALL WRITE_1820
- MOV A,#4EH ;發寫暫存存儲器命令
- LCALL WRITE_1820
- MOV A,#30H;TH(上限)中寫入00H
- LCALL WRITE_1820
- MOV A,#00H ;TL(下限)中寫入00H
- LCALL WRITE_1820
- MOV A,#1FH ;選擇9位溫度分辨率
- LCALL WRITE_1820
- RET
- ;===================================
- ; 讀出轉換后的溫度值
- ; 數據存儲到TEMPER_H和TEMPER_L中
- ; 包含告警搜索
- ;===================================
- GET_TEMPER:
- SETB DQ ;定時入口
- LCALL INIT_1820 ;初始化1820
- JB FLAG1,TSS2
- RET ;若DS18B20不存在則返回
- TSS2: MOV A,#0CCH ;跳過ROM匹配
- LCALL WRITE_1820 ;;調寫DS18B20的程序
- MOV A,#44H ;發出溫度轉換命令
- LCALL WRITE_1820
- LCALL INIT_1820
- MOV A,#0CCH ;跳過ROM匹配
- LCALL WRITE_1820
- MOV A,#0BEH ;發出讀溫度命令
- LCALL WRITE_1820
- LCALL READ_18200
- MOV TEMPER_NUM,A ;將讀出的溫度數據保存
- MOV A,#0ECH ;告警搜索
- CALL WRITE_1820
- RET
- ;===================================
- ; READ_1820
- ; 讀DS18B20的程序,從DS18B20中讀出一個字節的數據
- ; 讀出的數據在A中
- ;===================================
- READ_1820:
- MOV R2,#8 ;一個字節8位
- RE1:
- CLR C ;清零進借位
- SETB DQ ;數據線拉高
- NOP ;延時
- NOP
- CLR DQ ;數據線拉低
- NOP ;延時
- NOP
- NOP
- SETB DQ;數據線拉高產生讀時間隙
- MOV R3,#3 ;;為延時6us送初值
- DJNZ R3,[ DISCUZ_CODE_7 ]nbsp; ;延時約6us
- MOV C,DQ ;讀入數據
- MOV R3,#23 ;為延時50us送初值
- DJNZ R3,[ DISCUZ_CODE_7 ]nbsp; ;延時約50us
- SETB DQ ;數據線拉高
- NOP
- RRC A
- DJNZ R2,RE1
- RET
- ;===================================
- ;WRITE_1820:
- ; 寫DS18B20的程序
- ;===================================
- WRITE_1820:
- MOV R2,#8 ;;8位
- CLR C ;;清空C
- WR1: CLR DQ ;數據線拉低產生寫時間隙
- MOV R3,#6 ;;為延時送數
- DJNZ R3,[ DISCUZ_CODE_7 ]nbsp; ;延時約6us(要求小于15us)
- RRC A ;;循環右移
- MOV DQ,C ;數據送到數據線
- MOV R3,#23 ;為延時送初值
- DJNZ R3,[ DISCUZ_CODE_7 ]nbsp; ;延時約25us(要求15us-60us)
- SETB DQ ;數據線拉高
- NOP ;延時1.085us(要求連續寫2 位間的間隙大于1us)
- DJNZ R2,WR1 ;判斷是否寫完沒寫完接著寫下一位
- SETB DQ ;;寫完拉高
- RET
- ;===================================
- ; READ_18200
- ; 讀DS18B20的程序,從DS18B20中讀出兩個字節的溫度數據
- ; 數據存儲到TEMPER_H和TEMPER_L中
- ;===================================
- READ_18200:
- MOV R4,#2 ;將溫度高位和低位從DS18B20中讀出
- MOV R1,#36H ;低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
- RE00:
- MOV R2,#8 ;;8位
- RE01:
- CLR C ;;清進借位
- SETB DQ ;;拉高
- NOP
- NOP
- CLR DQ ;;拉低
- NOP
- NOP
- NOP
- SETB DQ ;;釋放總線
- MOV R3,#3 ;;為延時送數
- DJNZ R3,[ DISCUZ_CODE_7 ]nbsp; ;延時約6us
- MOV C,DQ ;;讀數據
- MOV R3,#23 ;;為延時送數
- DJNZ R3,[ DISCUZ_CODE_7 ]nbsp; ;延時約50us
- SETB DQ ;數據線拉高
- NOP
- RRC A ;;移位保存
- DJNZ R2,RE01;;判斷8位是否讀完
- MOV @R1,A ;;將低位數據保存
- DEC R1 ;;轉到存儲高位數據地址
- DJNZ R4,RE00;判斷兩個字節是否讀完
- RET
- Temper_chng:
- MOV DPTR,#TAB ;字形碼表頭地址
- MOV R0,#Show_Dat ;顯示首地址賦給R0
- MOV A,TEMPER_L ;;溫度低八位
- ANL A,#0FH ;取溫度低四位
- CJNE A,#0H,NEXT ;判斷小數部分數據
- MOV @R0,#0C0H ;小數為0
- LJMP NEXT1
- NEXT: MOV @R0,#92H ;小數為5
- NEXT1: INC R0 ;;下一個地址
- MOV A,TEMPER_L ;整數移位到低四位
- RR A
- RR A
- RR A
- RR A
- ANL A,#0FH ;保留低四位
- MOV ZhengShu,A
- MOV A,TEMPER_H ;整數部分移位到高四位
- RL A
- RL A
- RL A
- RL A
- ANL A,#0F0H ;保留高四位
- ADD A,ZhengShu ;相加得到整數部分數據
- MOV ZhengShu,A ;存儲整數部分
- ;===================================
- ;判斷正負數 ,正數可以直接進行轉換,負數取反加1并且加負號
- ;===================================
- PUSH ACC ;;保存A
- ANL A,#80H ;;取符號位
- JZ NEXT12 ;;符號位為零,跳轉至正數處理部分
- POP ACC
- CPL A ;;取反
- ADD A,#01H ;;加1
- PUSH ACC
- MOV R0,#Show_Dat ;顯示首地址賦給R0
- MOV A,TEMPER_L;;溫度低八位
- ANL A,#0FH ;;取溫度低四位
- CPL A ;;取反
- ADD A,#01H ;;加1
- CJNE A,#0H,NEXT13 ;判斷小數部分數據
- MOV @R0,#0C0H ;小數為0
- INC R0 ;;移到下一位
- MOV A,#0BFH ;加負號
- MOV Show_Dat+3,A ;;送回
- POP ACC
- LJMP NEXT2
- NEXT13: MOV @R0,#92H ;小數為5
- INC R0
- MOV A,#0BFH ;加負號
- MOV Show_Dat+3,A ;送回
- POP ACC
- DEC A
- LJMP NEXT2
- NEXT12: POP ACC
- NEXT2: MOV B,#10 ;16進制轉成十進制
- DIV AB
- MOV R6,A ;;得高位
- MOV A,B
- MOVC A,@A+DPTR
- MOV @R0,A;將段碼送到相應的地址空間
- INC R0 ;;轉移到下一個地址
- MOV A,R6
- CJNE A,#0,NEXT2 ;;判斷是否轉換完
- MOV A,Show_Dat+1 ;加小數點
- CLR C ;清除進借位
- SUBB A,#80H ;;加點
- MOV Show_Dat+1,A ;;送回
- RET
- TAB: DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H
- ;;共陽數碼管對應的字符表:0,1,2,3,4,5,6,7,8,9, 負號:0BFH
- TAB1: DB 0C0H,0C7H,0C7H,86H,89H,0FFH
- ;;"HELLO"
- TAB2: DB 0FFH,8EH,8EH,0C0H,0FFH,0FFH
- ;;"OFF"
- ;===================================
- DELAY:
- MOV R3,#10 ;;為延時送初值
- DELAY2: MOV R7,#200 ;;為延時送初值
- DELAY1: MOV R4,#250 ;;為延時送初值
- DJNZ R4,$
- DJNZ R7,DELAY1
- DJNZ R3,DELAY2
- RET
- ;===================================
- INT_T0: MOV TH0,#0F8H ;重賦2ms的定時器時間常數
- MOV TL0,#50H
- MOV P0,#0FFH ;高電位滅碼
- MOV P2,R5 ;送當前顯示數碼管的位選信號
- MOV A,@R0 ;;取數
- MOV P0,A ;送字形代碼
- INC R0 ;顯示數據緩沖器指針加1,為下一個顯示數據作準備
- CJNE R0,#48H,NEXT3 ;判斷是否8個數據全部送完,未送完則不用調整顯示緩沖指針
- MOV R0,#40H ;送完則調整顯示緩沖指針
- NEXT3: MOV A,R5 ;將目前的位選暫存信號左移,為下一個數碼管顯示作準備
- RL A ;左移
- MOV R5,A ;;下一個位選
- RETI
- ;===========顯示開關界面
- ;===================================
- HELLO: MOV R0,#50H ;顯示緩沖首址
- MOV R2,#2H ;位控初始碼(先亮最低位)
- LOOPs: MOV A,#0H ;共陰滅碼
- MOV P2,A
- MOV A,R2 ;送位控信號
- MOV P2,A
- MOV A,@R0 ;從顯示緩沖中取數
- MOV DPTR,#TAB1
- MOVC A,@A+DPTR ;查出字形代碼
- MOV P0,A ;送顯示字符段代碼
- MOV R7,#0FFH
- DJNZ R7,[ DISCUZ_CODE_7 ]nbsp; ;1ms延時,穩定顯示信息
- INC R0 ;取下一個數
- MOV A,R2
- JB ACC.6,EXIT1 ;判斷是否送到最高位?
- RL A
- MOV R2,A ;得到下一個位控信號
- AJMP LOOPs
- EXIT1: DJNZ R3,HELLO;是否顯示完200次
- RET
- OFF: MOV R0,#60H ;顯示緩沖首址
- MOV R2,#2H ;位控初始碼(先亮最低位)
- LOOPs2: MOV A,#0H ;共陰滅碼
- MOV P2,A
- MOV A,R2 ;送位控信號
- MOV P2,A
- MOV A,@R0 ;從顯示緩沖中取數
- MOV DPTR,#TAB2
- MOVC A,@A+DPTR;查出字形代碼
- MOV P0,A ;送顯示字符段代碼
- MOV R7,#0FFH
- DJNZ R7,[ DISCUZ_CODE_7 ]nbsp; ;1ms延時,穩定顯示信息
- INC R0 ;取下一個數
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
完整論文下載(word格式 可編輯):
基于單片機的DS18B20測溫系統的設計.doc
(1.17 MB, 下載次數: 21)
2017-9-7 09:10 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|