版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 《電子系統(tǒng)設(shè)計(jì)與實(shí)踐》</p><p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 課程設(shè)計(jì)題目:多點(diǎn)溫度測(cè)量系統(tǒng)設(shè)計(jì)</p><p> 專業(yè)班級(jí) :2012級(jí)電子信息科學(xué)與技術(shù)</p><p> 學(xué)生姓名 :羅濱志(120802010051)</p><p>
2、 張倩(120802010020) </p><p> 馮禮哲(120802010001)</p><p> 吳道林(120802010006)</p><p> 朱棲安(120802010039)</p><p> 指導(dǎo)老師:劉萬松老師</p><p> 成 績 : </
3、p><p> 2015 年6 月 27日</p><p><b> 目 錄</b></p><p><b> 摘 要4</b></p><p><b> 1 總體設(shè)計(jì)4</b></p><p> 1.1 功能要求5</p>
4、;<p> 1.2 總體方案及工作原理5</p><p> 2 系統(tǒng)硬件設(shè)計(jì)6</p><p> 2.1 器件選擇6</p><p> 2.1.1主要器件的型號(hào)6</p><p> 2.1.2 AT89C517</p><p> 2.1.3智能溫度傳感器DS18B209<
5、/p><p> 2.1.4晶振電路方案9</p><p> 2.1.5 LED液晶顯示器10</p><p> 2.1.6復(fù)位電路方案10</p><p> 2.2 硬件原理圖11</p><p> 3 系統(tǒng)軟件設(shè)計(jì)11</p><p> 3.1基本原理11</p>
6、;<p> 3.1.1主程序11</p><p> 3.1.2讀ROM地址程序12</p><p> 3.1.3顯示ROM地址程序13</p><p> 3.1.4讀選中DS18B20溫度的程序13</p><p> 3.1.5顯示溫度程序14</p><p> 3.2軟件清單15
7、</p><p> 3.2.1匯編語言程序15</p><p> 3.2.2 C語言程序24</p><p><b> 4實(shí)驗(yàn)步驟29</b></p><p> 4.1匯編語言程序調(diào)試29</p><p> 4.2 C語言程序調(diào)試30</p><p>
8、 4.3實(shí)驗(yàn)仿真31</p><p><b> 5設(shè)計(jì)總結(jié)32</b></p><p><b> 6參考文獻(xiàn):33</b></p><p><b> 摘 要</b></p><p> 溫度是我們生活中非常重要的物理量。隨著科學(xué)技術(shù)的不斷進(jìn)步與發(fā)展,溫度測(cè)量在工業(yè)
9、控制、電子測(cè)溫計(jì)、醫(yī)療儀器,家用電器等各種控制系統(tǒng)中廣泛應(yīng)用。溫度測(cè)量通常可以使用兩種方式來實(shí)現(xiàn):一種是用熱敏電阻之類的器件,由于感溫效應(yīng),熱敏電阻的阻值能夠隨溫度發(fā)生變化,當(dāng)熱敏電阻接入電路時(shí),則流過它的電流或其兩端的電壓就會(huì)隨溫度發(fā)生相應(yīng)的變化,再將隨溫度變化的電壓或者電流采集過來,進(jìn)行A/D轉(zhuǎn)換后,發(fā)送到單片機(jī)進(jìn)行數(shù)據(jù)處理,通過顯示電路,就可以將被測(cè)溫度顯示出來。這種設(shè)計(jì)需要用到A/D轉(zhuǎn)換電路,其測(cè)溫電路比較麻煩。第二種方法是用溫
10、度傳感器芯片,溫度傳感器芯片能把溫度信號(hào)轉(zhuǎn)換成數(shù)字信號(hào),直接發(fā)送給單片機(jī),轉(zhuǎn)換后通過顯示電路顯示即可。這種方法電路比較簡單,設(shè)計(jì)方便,現(xiàn)在使用非常廣泛。</p><p> 關(guān)鍵詞:多點(diǎn)溫度測(cè)量 單片機(jī) 溫度傳感器 </p><p><b> 1 總體設(shè)計(jì)</b></p><p> 多路溫度測(cè)量系統(tǒng)的總體結(jié)構(gòu)如圖1所示,根據(jù)要求,
11、整個(gè)系統(tǒng)包含以下幾個(gè)部分:51單片機(jī)、時(shí)鐘電路、復(fù)位電路組成的51單片機(jī)小系統(tǒng);多塊測(cè)溫模塊;顯示溫度值的顯示模塊和按鍵模塊。測(cè)溫模塊由溫度傳感器組成,溫度傳感器采用美國Dallas半導(dǎo)體公司推出的智能溫度傳感器DS18B20,溫度測(cè)量范圍為-55 -- +125,可編程為9到12位的A/D轉(zhuǎn)換精度,測(cè)溫分辨率可達(dá)0.0625C,完全能夠滿足系統(tǒng)要求。DS18B20采用單總線結(jié)構(gòu),只需要一根數(shù)據(jù)線DQ即可與單片機(jī)通信,多個(gè)DS18B20
12、可同時(shí)連接在一根數(shù)據(jù)線上與單片機(jī)通信。顯示器可采用LCD液晶顯示器,顯示信息量大、效果好、使用方便。</p><p> 圖1 多路溫度測(cè)量系統(tǒng)的總體結(jié)構(gòu)</p><p> 系統(tǒng)處理時(shí),由51單片機(jī)控制從各個(gè)測(cè)溫模塊測(cè)量出溫度數(shù)字量,存入緩沖區(qū);然后通過按鍵控制,從緩沖區(qū)取出,根據(jù)數(shù)字量和溫度的關(guān)系計(jì)算出溫度值,依次送LCD顯示器顯示。</p><p><b
13、> 1.1 功能要求</b></p><p> 多點(diǎn)溫度測(cè)量系統(tǒng)的功能要求如下:</p><p> ?。?) 能夠測(cè)量多點(diǎn)溫度;</p><p> ?。?) 精度0.1C;</p><p> ?。?) 能夠通過顯示器顯示測(cè)量點(diǎn)編號(hào)和溫度值;</p><p> ?。?)可輪流顯示各測(cè)量點(diǎn)或指定顯示
14、某個(gè)測(cè)量點(diǎn)。</p><p> 1.2 總體方案及工作原理</p><p> 單片機(jī)系統(tǒng)由AT89C51單片機(jī),復(fù)位電路和時(shí)鐘電路組成,時(shí)鐘采用12MHZ的晶振,溫度模塊由4塊溫度傳感器DS18B20組成,單總線結(jié)構(gòu),所有的DS18B20的DQ連接在一起與單片機(jī)的P3.0相連,通過上拉電阻連接電源,每一個(gè)DS18B20都有一個(gè)唯一的64位ROM地址,只要發(fā)送相應(yīng)的ROM地址,就能夠訪
15、問該器件,要訪問某個(gè)DS18B20,就必須知道它的64位ROM地址,可以通過程序讀出它的ROM地址,由于讀ROM地址時(shí),一次只能接入一個(gè)DS18B20,因此,4個(gè)DS18B20的數(shù)據(jù)線DQ通過開關(guān)連接到AT89C51的P3.0.</p><p> 另外,所有DS18B20的VDD引腳接+5V電源,GND接地;顯示器采用LCD1602(LM016L),其數(shù)據(jù)線與AT89C51的P2口相連,RS與P1.7相連,R/
16、W與P1,6相連,E端與P1.5相連。</p><p> 設(shè)定了兩個(gè)按鍵,K0為功能鍵,與AT89C51的P1.0相連,當(dāng)K0輸入低電平時(shí),讀入DS18B20的ROM地址,當(dāng)K0鍵輸入高電平時(shí),顯示選中DS18B20的溫度值;K1為測(cè)量點(diǎn)選中鍵,與AT89C51的P1.1相連,用于測(cè)量點(diǎn)選擇,每按一次,測(cè)量點(diǎn)號(hào)加1,讀入下一個(gè)DS18B20的ROM地址或顯示下一個(gè)DS18B20的相應(yīng)溫度值。</p>
17、<p><b> 2 系統(tǒng)硬件設(shè)計(jì)</b></p><p><b> 2.1 器件選擇</b></p><p> 2.1.1主要器件的型號(hào)</p><p> 2.1.2 AT89C51</p><p> AT89C51是一種帶4K字節(jié)閃爍可編程可擦除只讀存儲(chǔ)器(FPEROM
18、-FALSH PROGRAMMABLE AND ERASABLE READ ONLY MEORY)的低電壓,高性能CMOS8位微處理器,俗稱單片機(jī)。AT89C51是一種帶4K字節(jié)閃爍可編程可擦除只讀存儲(chǔ)器的單片機(jī),單片機(jī)的可擦除只讀存儲(chǔ)器可以反復(fù)擦除100次。該器件采用ATMEL高密度非易失存儲(chǔ)器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集和輸出管腳相兼容,</p><p> AT89C51單片機(jī)包含中央處理器
19、、程序存儲(chǔ)器(ROM)、數(shù)據(jù)存儲(chǔ)器(RAM)、定時(shí)/計(jì)數(shù)器、串行接口和中斷系統(tǒng)等幾大單元及數(shù)據(jù)總線、地址總線和控制總線等三大總線。其基本結(jié)構(gòu)如圖2</p><p> 圖 2 AT89C51單片機(jī)的基本結(jié)構(gòu)</p><p> AT89C51 是一個(gè)低電壓,高性能CMOS 8 位單片機(jī),片內(nèi)含8kB 的可反復(fù)擦寫的Flash 只讀程序存儲(chǔ)器和256B 的隨機(jī)存取數(shù)據(jù)存儲(chǔ)器(RAM),器件采
20、用ATMEL公司的高密度、非易失性存儲(chǔ)技術(shù)生產(chǎn),與標(biāo)準(zhǔn)MCS-51 指令系統(tǒng)及8052 產(chǎn)品引腳兼容,片內(nèi)置有通用8 位中央處理器(CPU)和Flash 存儲(chǔ)單元。 </p><p> 圖3 AT89C51單片機(jī)的引腳</p><p> VCC/GND:供電電源。 </p><p> P0口:可以被定義為數(shù)據(jù)/地址的低八位,能夠
21、用于外部程序/數(shù)據(jù)存儲(chǔ)器。在FIASH編程時(shí),P0 口作為原碼輸入口,當(dāng)FIASH進(jìn)行校驗(yàn)時(shí),P0輸出原碼,此時(shí)P0外部必須被拉高。 </p><p> P1口:標(biāo)準(zhǔn)輸入輸出I/O口,P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入。在FLASH編程和校驗(yàn)時(shí),P1口作為第八位地址接收。</p><p> P2口:既可用于標(biāo)準(zhǔn)輸入輸出I/O,也可用于外部程序存儲(chǔ)器或數(shù)據(jù)存儲(chǔ)器訪問時(shí)的高八位
22、地址。P2口在FLASH編程和校驗(yàn)時(shí)接收高八位地址信號(hào)和控制信號(hào)。</p><p> P3口:既可以作標(biāo)準(zhǔn)輸入輸出I/O,也可作為AT89C51的一些特殊功能口, 管腳 備選功能 P3.0 RXD(串行輸入口) P3.1 TXD(串行輸出口) P3.2 /INT0(外部中斷0) P3.3 /INT1(外部中斷1) P3.4 T0(記時(shí)器0外部輸入) P3.5 T1(記時(shí)器1外部輸入) P3.6 /WR(外部數(shù)據(jù)
23、存儲(chǔ)器寫選通) P3.7 /RD(外部數(shù)據(jù)存儲(chǔ)器讀選通) </p><p> RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時(shí),要保持RST腳兩個(gè)機(jī)器周期的高電平時(shí)間。 </p><p> ALE/PROG:當(dāng)訪問外部存儲(chǔ)器時(shí),地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時(shí),ALE端以不變的頻率周期輸出正脈沖信號(hào),此頻率為振蕩器頻率的1/6。&l
24、t;/p><p> PSEN:外部程序存儲(chǔ)器的選通信號(hào)。在由外部程序存儲(chǔ)器取指期間,每個(gè)機(jī)器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲(chǔ)器時(shí),這兩次有效的/PSEN信號(hào)將不出現(xiàn)。</p><p> EA / VPP:當(dāng)/EA保持低電平時(shí),則在此期間外部程序存儲(chǔ)器(0000H-FFFFH),不管是否有內(nèi)部程序存儲(chǔ)器。注意加密方式1時(shí),/EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平時(shí),此間
25、內(nèi)部程序存儲(chǔ)器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。</p><p> XTAL1:反向振蕩放大器的輸入及內(nèi)部時(shí)鐘工作電路的輸入。 </p><p> XTAL2:來自反向振蕩器的輸出。</p><p> 2.1.3智能溫度傳感器DS18B20電路</p><p> 四個(gè)DS18B20分別接一個(gè)按鈕開關(guān),便
26、于分別控制溫度,DS18B20的VCC接口接入同一總線且與顯示器VDD接口相連,DQ接口與AT89C51的P3.0接口相連,GND接地,如圖4;</p><p> 圖4 智能溫度傳感器原理圖</p><p> 2.1.4晶振電路方案</p><p> 晶振電路的功能在于給單片機(jī)提供振蕩時(shí)鐘信號(hào),使單片機(jī)正常工作。本設(shè)計(jì)中采用了常用的晶振電路組成方案,具體如圖5
27、所示。</p><p><b> 圖5 晶振電路</b></p><p> 2.1.5 LED液晶顯示器</p><p><b> 圖6 液晶顯示器</b></p><p> 2.1.6復(fù)位電路方案</p><p> 復(fù)位電路的功能在于對(duì)單片機(jī)進(jìn)行復(fù)位從而達(dá)到對(duì)整個(gè)
28、電路復(fù)位的功能。要達(dá)到目的則要求在復(fù)位按鍵按下后在RST引腳上要出現(xiàn)一個(gè)維持2個(gè)機(jī)器周期高電平[4]。考慮到可以利用電容的電壓不能突變(需要一定的充放電時(shí)間),于是采用如下復(fù)位電路。</p><p><b> 圖7 復(fù)位電路</b></p><p><b> 2.2 硬件原理圖</b></p><p><b>
29、; 圖8 硬件原理圖</b></p><p><b> 3 系統(tǒng)軟件設(shè)計(jì)</b></p><p><b> 3.1基本原理</b></p><p> 多路溫度測(cè)量系統(tǒng)的軟件程序主要由主程序、讀DS18B20模塊ROM地址程序、顯示DS18B20模塊ROM地址、讀DS18B20模塊溫度值程序、顯示DS18
30、B20模塊溫度值程序和LCD、DS18B20模塊驅(qū)動(dòng)程序等組成。</p><p><b> 3.1.1主程序</b></p><p> 主程序的流程圖如圖9所示。</p><p><b> 圖9 主程序流程圖</b></p><p> 在主程序中,首先對(duì)LCD初始化,其次通過檢測(cè)按鍵,判斷是
31、讀DS18B20模塊的ROM地址還是讀DS18B20模塊的溫度值,如果是讀ROM地址,則依次調(diào)用讀ROM程序和顯示ROM程序;如果是讀溫度,則調(diào)用測(cè)量溫度程序和顯示溫度程序,注意測(cè)量某個(gè)DS18B20模塊之前,一定要讀出該模塊的ROM并保存到相應(yīng)的存儲(chǔ)單元。</p><p> 3.1.2讀ROM地址程序</p><p> 讀ROM地址程序的流程如圖10所示。讀ROM地址時(shí),一次只能把一
32、片DS18B20模塊連接到單總線上,讀ROM程序?qū)崿F(xiàn)把當(dāng)前連接到總線上的DS18B20的ROM地址讀出。讀ROM地址程序處理過程如下,先計(jì)算存放當(dāng)前DS18B20模塊ROM地址的存儲(chǔ)單元的偏移地址,然后依次是DS18B20初始化、發(fā)讀ROM命令和讀ROM地址到存儲(chǔ)單元。</p><p> 如圖10 讀ROM地址程序的流程</p><p> 3.1.3顯示ROM地址程序</p>
33、;<p> 顯示ROM地址程序?qū)崿F(xiàn)依次從當(dāng)前存放ROM地址的緩沖區(qū)中取出地址顯示,顯示ROM地址程序的流程圖如圖11所示。</p><p> 如圖11 顯示ROM地址程序的流程圖</p><p> 3.1.4讀選中DS18B20溫度的程序</p><p> 讀選中DS18B20溫度的程序的流程圖如圖12所示。讀選中DS18B20模塊溫度值的處理
34、過程分3個(gè)步驟,第一是向總線放啟動(dòng)溫度轉(zhuǎn)換命令,啟動(dòng)連接總線上的DS18B20模塊溫度轉(zhuǎn)換,由于12位DS18B20溫度轉(zhuǎn)換時(shí)間比較長,所以啟動(dòng)轉(zhuǎn)換后一定要調(diào)用延時(shí)程序等待轉(zhuǎn)換完成后才能去讀溫度值;第二根據(jù)當(dāng)前器件號(hào)取當(dāng)前DS18B20器件的64位ROM地址,發(fā)送到總線匹配對(duì)應(yīng)的DS18B20模塊;第三向總線發(fā)讀暫存器命令讀匹配的DS18B20模塊轉(zhuǎn)換的溫度值。</p><p> 如圖12讀選中DS18B20溫
35、度的程序的流程圖</p><p> 3.1.5顯示溫度程序</p><p> 顯示溫度程序的流程如圖13所示。</p><p> 顯示溫度程序顯示讀出的溫度值及相應(yīng)的提示信息。DS18B20的溫度值是2位,存放在兩個(gè)字節(jié)中,其中高字節(jié)的高5位為符號(hào)位,如果溫度值是正數(shù),則符號(hào)位為0,如果溫度值是負(fù)數(shù),則符號(hào)位為1。顯示溫度處理程序時(shí),先根據(jù)高字節(jié)的高5位判斷是
36、正數(shù)還是負(fù)數(shù),如果是正數(shù),則提取其中的百位、十位、個(gè)位及小數(shù)位,轉(zhuǎn)換成字符編碼放入相應(yīng)的顯示緩沖區(qū);如果是負(fù)數(shù),則提取其中的負(fù)號(hào)、十位、個(gè)位及小數(shù)位,轉(zhuǎn)換成字符編碼,放入相應(yīng)的顯示緩沖區(qū);最后把顯示緩沖區(qū)的內(nèi)容顯示到LCD顯示器。</p><p> 如圖13 顯示溫度程序的流程</p><p><b> 3.2軟件清單</b></p><p&g
37、t; 3.2.1匯編語言程序</p><p> ;系統(tǒng)時(shí)鐘頻率12MHZ</p><p> ;第一片18B20的ROM地址放在20H-27H</p><p> ;第二片18B20的ROM地址放在30H-37H</p><p> ;第三片18B20的ROM地址放在40H-47H</p><p> ;第二片18
38、B20的ROM地址放在50H-57H</p><p> DQ BIT P3.0 ;定義單總線端口</p><p> E BIT P1.5 ;定義LCD端口</p><p> RW BIT P1.6</p><p> RS
39、BIT P1.7</p><p> K0 BIT P1.0 ;定義功能開關(guān),K0斷開,顯示溫度;K0接通,讀ROM</p><p> K1 BIT P1.1 ;定義通道選擇鍵</p><p> NUM1 EQU 3EH ;定義存放讀ROM的編號(hào)</p
40、><p> NUM2 EQU 3FH ;定義存放顯示通道的編號(hào)</p><p> LCD_3 EQU 3DH ;存放通道溫度的百、十、個(gè)、小數(shù)位</p><p> LCD_2 EQU 3CH</p><p> LCD_1 EQU 3BH</p
41、><p> LCD_0 EQU 3AH</p><p> TEMP_DATA_L EQU 4EH ;存放讀出的18B20的12為編碼 </p><p> TEMP_DATA_H EQU 4FH</p><p> ORG 0000H</p><p> LJMP MAIN<
42、;/p><p> ORG 0030H</p><p> MAIN: MOV SP, #60H</p><p> MOV NUM1, #0 ;編號(hào)初始化為0</p><p> MOV NUM2, #0</p><p> CALL LCD_INIT ;LCD初始化</
43、p><p> AGAIN: JB K0, DISPTEMP ;判讀ROM,還是顯示溫度</p><p> READ: JB K1, NEXT1 ;讀ROM,默認(rèn)讀0號(hào),按一次K1編號(hào)加1</p><p> JNB K1, $</p><p><b> INC NUM1</b&
44、gt;</p><p> MOV A, NUM1</p><p> CJNE A, #4, NEXT1 ;如果加到4,則回到0</p><p> MOV NUM1, #0</p><p> NEXT1: LCALL READ_ROM ;讀當(dāng)前ROM保存</p><p> LCALL D
45、ISP_ROM ;顯示當(dāng)前ROM</p><p> SJMP AGAIN</p><p> DISPTEMP: JB K1, NEXT2 ;顯示溫度,默認(rèn)顯示0號(hào),按一次K1編號(hào)加1</p><p> JNB K1, $</p><p><b> INC NUM2</b></p&g
46、t;<p> MOV A, NUM2</p><p> CJNE A, #4, NEXT2 ;如果加到4,則回到0</p><p> MOV NUM2, #0</p><p> NEXT2: LCALL READ_TEMP ;讀當(dāng)前匹配18B20的溫度,保存</p><p> LCALL DIS
47、P_TEMP ;顯示當(dāng)前匹配18B20的溫度</p><p> SJMP AGAIN</p><p> ;**************************************</p><p> ;匹配ds18b20,讀模塊溫度值到緩沖區(qū)</p><p> ;******************************
48、********</p><p> READ_TEMP: MOV R0, #20H</p><p> MOV A, NUM2</p><p> MOV B, #10H ;由編號(hào)取得緩沖區(qū)地址</p><p><b> MUL AB</b></p><p> AD
49、D A, R0</p><p> MOV R0, A</p><p> LCALL DS18B20_INIT ;18B20初始化</p><p> MOV A, #0CCH ;跳過ROM命令</p><p> LCALL WRITE_BYTE</p><p> MOV A, #44
50、H ;啟動(dòng)溫度轉(zhuǎn)換</p><p> LCALL WRITE_BYTE</p><p> LCALL DELAY</p><p> LCALL DELAY</p><p> LCALL DS18B20_INIT ;18B20初始化</p><p> MOV A,# 55H</p
51、><p> LCALL WRITE_BYTE ;發(fā)匹配命令</p><p> MOV R5, #08H</p><p> LOOPREAD: MOV A, @R0 ;送入匹配的64位ROM地址</p><p> LCALL WRITE_BYTE</p><p><b>
52、 INC R0</b></p><p> DJNZ R5, LOOPREAD</p><p> MOV A, #0BEH</p><p> LCALL WRITE_BYTE ;發(fā)讀暫存器</p><p> LCALL READ_BYTE ;讀出溫度低字節(jié)</p><p&g
53、t; MOV TEMP_DATA_L, A</p><p> LCALL READ_BYTE ;讀出溫度高字節(jié) </p><p> MOV TEMP_DATA_H, A</p><p><b> RET</b></p><p> ;***************************
54、*************</p><p> ;顯示匹配模塊溫度程序</p><p> ;****************************************</p><p> DISP_TEMP: MOV A, #80H ;寫入顯示緩沖區(qū)起始地址為第1行第1列</p><p> ACALL WC5
55、1R</p><p> MOV A, #'A' ;第1行第1列顯示字母A</p><p> ACALL WC51DDR</p><p> MOV A, #'D' ;第1行第2列顯示字母D</p><p> ACALL WC51DDR</p>
56、<p> MOV A, #'D' ;第1行第3列顯示字母D</p><p> ACALL WC51DDR</p><p> MOV A, #'R' ;第1行第4列顯示字母R</p><p> ACALL WC51DDR</p><p>
57、 MOV A, #':' ;第1行第5列顯示字母:</p><p> ACALL WC51DDR</p><p> MOV A, #' ' ;第1行第6列顯示空格</p><p> ACALL WC51DDR</p><p> MOV A,
58、NUM2 ;第1行第7列顯示編號(hào)</p><p> ADD A, #30H</p><p> ACALL WC51DDR</p><p> MOV A, #0C0H ;寫入顯示緩沖區(qū)起始地址為第2行第1列</p><p> ACALL WC51R</p><p> MOV
59、 A, #'T' ;第2行第1列顯示字母T</p><p> ACALL WC51DDR</p><p> MOV A, #'E' ;第2行第2列顯示字母E</p><p> ACALL WC51DDR</p><p> MOV A, #'
60、M' ;第2行第3列顯示字母M</p><p> ACALL WC51DDR</p><p> MOV A, #'P' ;第2行第4列顯示字母P</p><p> ACALL WC51DDR</p><p> MOV A, #':'
61、 ;第2行第5列顯示字母:</p><p> ACALL WC51DDR</p><p> CONVERT_T: MOV A, TEMP_DATA_H</p><p> ANL A, #80H</p><p> JZ TEMPC1 ;如果溫度寄存器里的高位為1,則溫度為負(fù)</p&g
62、t;<p><b> CLR C</b></p><p> MOV A, TEMP_DATA_L</p><p> CPL A ;負(fù)溫度將補(bǔ)碼轉(zhuǎn)成二進(jìn)制,取反再加1</p><p> ADD A, #01H</p><p> MOV TEMP_DATA
63、_L,A</p><p> MOV A, TEMP_DATA_H</p><p><b> CPL A</b></p><p> ADDC A, #00H</p><p> MOV TEMP_DATA_H,A</p><p> MOV A, TEMP_DATA_L</p&
64、gt;<p> ANL A, #0FH</p><p> MOV DPTR, #TABLE2</p><p> MOVC A, @A+DPTR ;查表得小數(shù)位的值</p><p> MOV LCD_0, A</p><p> MOV A, TEMP_DATA_L</p><p&
65、gt; ANL A, #0F0H</p><p><b> SWAP A</b></p><p> MOV TEMP_DATA_L,A</p><p> MOV A, TEMP_DATA_H</p><p> ANL A, #0FH</p><p><b> SWA
66、P A</b></p><p> ORL A, TEMP_DATA_L</p><p> MOV B, #100</p><p><b> DIV AB</b></p><p> MOV LCD_3, #'-' ;負(fù)溫度最高位顯示“-”號(hào)</p>
67、;<p> SJMP TEMPC2</p><p> TEMPC1: MOV A, TEMP_DATA_L</p><p> ANL A, #0FH</p><p> MOV DPTR, #TABLE2</p><p> MOVC A, @A+DPTR</p><p> MO
68、V LCD_0, A ;查表得小數(shù)位的值</p><p> MOV A, TEMP_DATA_L</p><p> ANL A, #0F0H</p><p><b> SWAP A</b></p><p> MOV TEMP_DATA_L, A</p><p&
69、gt; MOV A, TEMP_DATA_H</p><p> ANL A, #0FH</p><p><b> SWAP A</b></p><p> ORL A, TEMP_DATA_L</p><p> MOV B, #100</p><p><b> DIV
70、 AB</b></p><p> MOV DPTR, #TABLE1</p><p> MOVC A, @A+DPTR</p><p> MOV LCD_3, A ;正溫度的百位</p><p> TEMPC2: MOV A, #10</p><p><b
71、> XCH A, B</b></p><p><b> DIV AB</b></p><p> MOV DPTR, #TABLE1</p><p> MOVC A, @A+DPTR</p><p> MOV LCD_2, A ;溫度值的十位</p>
72、<p><b> MOV A, B</b></p><p> MOV DPTR, #TABLE1</p><p> MOVC A, @A+DPTR</p><p> MOV LCD_1, A ;溫度值的個(gè)位</p><p> MOV A, LCD_3</p>
73、<p> ACALL WC51DDR ;第2行第6列顯示溫度的百位或“-”</p><p> MOV A, LCD_2</p><p> ACALL WC51DDR ;第2行第7列顯示溫度的十位</p><p> MOV A, LCD_1</p><p> ACALL WC51DDR
74、 ;第2行第8列顯示溫度的個(gè)位</p><p> MOV A, #'.'</p><p> ACALL WC51DDR ;第2行第9列顯示小數(shù)點(diǎn)‘.‘</p><p> MOV A, LCD_0</p><p> ACALL WC51DDR ;第2行第10列顯
75、示溫度的小數(shù)位</p><p> MOV A, #' '</p><p> ACALL WC51DDR ;第2行后面的顯示空格</p><p> MOV A, #' '</p><p> ACALL WC51DDR</p><p> MOV A,
76、#' '</p><p> ACALL WC51DDR</p><p> MOV A, #' '</p><p> ACALL WC51DDR</p><p> MOV A, #' '</p><p> ACALL WC51DDR</p>
77、<p> MOV A, #' '</p><p> ACALL WC51DDR</p><p><b> RET</b></p><p> ;**************************************</p><p> ;從ds18b20中讀出64位序列號(hào)<
78、;/p><p> ;**************************************</p><p> READ_ROM: MOV R5, #8</p><p> MOV A, NUM1 ;由編號(hào)取得緩沖區(qū)地址</p><p> MOV B, #10H</p><p>
79、;<b> MUL AB</b></p><p> MOV R1, #20H</p><p> ADD A, R1</p><p> MOV R1, A</p><p> LCALL DS18B20_INIT ;18B20初始化</p><p> MOV
80、A, #33H</p><p> LCALL WRITE_BYTE ;發(fā)讀ROM命令</p><p> D1: LCALL READ_BYTE ;讀64位ROM,存入緩沖區(qū)</p><p> MOV @R1,A</p><p><b> INC R1<
81、;/b></p><p> DJNZ R5, D1</p><p><b> RET</b></p><p> ;*************************************</p><p> ;將讀出的64位序列號(hào)顯示在LCD上</p><p> ;*******
82、******************************</p><p> DISP_ROM: MOV A, #80H ;寫入顯示緩沖區(qū)起始地址為第1行第1列</p><p> ACALL WC51R</p><p> MOV A, #'A' ;第1行第2列顯示字母A<
83、/p><p> ACALL WC51DDR</p><p> MOV A, #'D' ;第1行第3列顯示字母D</p><p> ACALL WC51DDR</p><p> MOV A, #'D' ;第1行第4列顯示字母D</p&g
84、t;<p> ACALL WC51DDR</p><p> MOV A, #'R' ;第1行第5列顯示字母R</p><p> ACALL WC51DDR</p><p> MOV A, #':' ;第2行第6列顯示:</p>
85、<p> ACALL WC51DDR</p><p> MOV A, #' ' ;第2行第7列顯示空格</p><p> ACALL WC51DDR</p><p> MOV A, NUM1</p><p> ADD A, #30H
86、 ;第2行第8列顯示編號(hào)</p><p> ACALL WC51DDR</p><p> MOV A, #0C0H ;寫入顯示緩沖區(qū)起始地址為第2行第1列</p><p> ACALL WC51R</p><p> MOV A, NUM1 ;由編號(hào)取得緩沖區(qū)地址</
87、p><p> MOV B, #10H</p><p><b> MUL AB</b></p><p> MOV R1, #20H</p><p> ADD A, R1</p><p> MOV R1, A</p><p> MOV R5, #8</
88、p><p> D2: MOV A, @R1 ;64位ROM地址轉(zhuǎn)換成16位十六進(jìn)制數(shù)顯示</p><p> MOV B, #16</p><p><b> DIV AB</b></p><p> MOV R3, A</p><p><b>
89、 CLR C</b></p><p> SUBB A, #10</p><p> MOV A, R3</p><p><b> JC D3</b></p><p> ADD A, #07H</p><p> D3: ADD A, #30H</
90、p><p> ACALL WC51DDR</p><p><b> MOV A, B</b></p><p> SUBB A, #10H</p><p><b> MOV A, B</b></p><p><b> JC D4</b>&l
91、t;/p><p> ADD A, #07H</p><p> D4: ADD A, #30H</p><p> ACALL WC51DDR</p><p><b> INC R1</b></p><p> DJNZ R5, D2</p><p&g
92、t;<b> RET</b></p><p> ;******************************************</p><p> ;初始化DS18B20</p><p> ;******************************************</p><p> DS18B
93、20_INIT:</p><p><b> SETB DQ</b></p><p><b> NOP</b></p><p><b> NOP</b></p><p><b> CLR DQ</b></p><p>
94、MOV R6, #0A0H</p><p> DJNZ R6, $</p><p> MOV R6, #0A0H</p><p> DJNZ R6, $ </p><p><b> SETB DQ</b></p><p> MOV R6, #32H</p>&l
95、t;p> DJNZ R6, $</p><p><b> MOV C,DQ</b></p><p><b> JC ERROR</b></p><p> MOV R6,#064H</p><p><b> DJNZ R6,$</b></p>&l
96、t;p><b> RET</b></p><p> ERROR: CLR DQ</p><p> SJMP DS18B20_INIT</p><p><b> RET</b></p><p> ;***************************************
97、*</p><p> ;讀DS18B20一個(gè)字節(jié)程序</p><p> ;****************************************</p><p> READ_BYTE: MOV R7,#08H</p><p><b> SETB DQ</b></p><p>&
98、lt;b> NOP</b></p><p><b> NOP</b></p><p> LOOP: CLR DQ</p><p><b> NOP</b></p><p><b> NOP</b></p><p>&
99、lt;b> NOP</b></p><p><b> SETB DQ</b></p><p> MOV R6,#07H</p><p><b> DJNZ R6,$</b></p><p><b> MOV C,DQ</b></p>&
100、lt;p> MOV R6,#3CH</p><p><b> DJNZ R6,$</b></p><p><b> RRC A</b></p><p><b> SETB DQ</b></p><p> DJNZ R7,LOOP</p><p
101、> MOV R6,#3CH</p><p><b> DJNZ R6,$</b></p><p><b> RET</b></p><p> ;***************************************</p><p> ;寫DS10B20程序</p>
102、<p> ;***************************************</p><p> WRITE_BYTE: MOV R7,#08H</p><p><b> SETB DQ</b></p><p><b> NOP</b></p><p><b&
103、gt; NOP</b></p><p> LOOP1: CLR DQ</p><p> MOV R6,#07H</p><p><b> DJNZ R6,$</b></p><p><b> RRC A</b></p><p><b>
104、 MOV DQ,C</b></p><p> MOV R6,#34H</p><p><b> DJNZ R6,$</b></p><p><b> SETB DQ</b></p><p> DJNZ R7,LOOP1</p><p><b>
105、 RET</b></p><p><b> ;LCD初始化程序</b></p><p> LCD_INIT: MOV A,#00000001H ;清屏</p><p> ACALL WC51R</p><p> MOV A,#00111000B ;使用8位數(shù)據(jù),顯示兩行
106、,使用5-7的字型</p><p> ACALL WC51R</p><p> MOV A,#00001100B ;顯示器開,光標(biāo)關(guān),字符不閃爍</p><p> ACALL WC51R</p><p> MOV A,#00000110B ;字符不動(dòng),光標(biāo)自動(dòng)右移一格</p><p&g
107、t; ACALL WC51R</p><p><b> RET</b></p><p><b> ;檢查忙子程序</b></p><p> F_BUSY: PUSH ACC ;保護(hù)現(xiàn)場</p><p> OV P2,#0FFH</p>&l
108、t;p><b> CLR RS</b></p><p><b> SETB RW</b></p><p> WAIT: CLR E</p><p><b> SETB E</b></p><p> JB P2.7,WAIT
109、 ;忙,等待</p><p> POP ACC ;不忙,恢復(fù)現(xiàn)場</p><p><b> RET</b></p><p><b> ;寫入命令子程序</b></p><p> WC51R: ACALL F_BUSY</p><
110、;p><b> CLR E</b></p><p><b> CLR RS</b></p><p><b> CLR RW</b></p><p><b> SETB E</b></p><p> MOV P2,ACC</p>
111、<p><b> CLR E</b></p><p><b> RET</b></p><p><b> ;寫入數(shù)據(jù)子程序</b></p><p> WC51DDR: ACALL F_BUSY</p><p><b> CLR E</
112、b></p><p><b> SETB RS</b></p><p><b> CLR RW</b></p><p><b> SETB E</b></p><p> MOV P2,ACC</p><p><b> CLR E
113、</b></p><p><b> RET</b></p><p> ;**********************************</p><p><b> ;延時(shí)程序</b></p><p> ;**********************************&l
114、t;/p><p> DELAY: MOV R4,#00H</p><p> D5: MOV R5,#00H</p><p><b> DJNZ R5,$</b></p><p> DJNZ R4,D5</p><p><b> RET</b>&
115、lt;/p><p> ;定義0-9的字符編碼</p><p> TABLE1: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,3AH</p><p> ;定義小數(shù)位的對(duì)應(yīng)字符編碼</p><p> TABLE2: DB 30H,31H,31H,32H,33H,33H,34H,34H,
116、35H,36H,36H,37H,38H,38H,39H,39H</p><p><b> END</b></p><p> 3.2.2 C語言程序</p><p> //系統(tǒng)時(shí)鐘頻率12MHZ</p><p> #include<reg51.h></p><p> #incl
117、ude<intrins.h></p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> sbit DQ=P3^0;</p><p> sbit EN=P1^5;</p><p> sbit RW
118、=P1^6;</p><p> sbit RS=P1^7;</p><p> sbit K0=P1^0;</p><p> sbit K1=P1^1;</p><p> uchar NUM1,NUM2;</p><p> //存放4個(gè)DS18B20的64位ROM地址,</p><p>
119、 //0-7單元存放第1個(gè)DS18B20,8-15單元存放第2個(gè)DS18B20</p><p> //16-23單元存放第3個(gè)DS18B20,24-31單元存放第4個(gè)DS18B20</p><p> uchar rom[32];</p><p> uchar code LCDData[]="0123456789"; //定義0-9的字符
120、編碼</p><p> uchar code dot_tab[]="0112334456678899";</p><p> uchar LCD1_line[16]="ADDR: ";</p><p> uchar LCD2_line[16]="TEMP: ";<
121、;/p><p> uchar DATA_L,DATA_H;</p><p> //LCD檢查忙函數(shù)</p><p> void fbusy()</p><p><b> {</b></p><p><b> P2=0xff;</b></p><p&g
122、t;<b> RS=0;</b></p><p><b> RW=1;</b></p><p><b> EN=1;</b></p><p><b> EN=0;</b></p><p> while((P2&0x80))</p&g
123、t;<p><b> {</b></p><p><b> EN=0;</b></p><p><b> EN=1;</b></p><p><b> }</b></p><p><b> }</b></
124、p><p> //LCD寫命令函數(shù)</p><p> void wc51r(uchar j)</p><p><b> {</b></p><p><b> fbusy();</b></p><p><b> EN=0;</b></p>
125、<p><b> RS=0;</b></p><p><b> RW=0;</b></p><p><b> EN=1;</b></p><p><b> P2=j;</b></p><p><b> EN=0;</
126、b></p><p><b> }</b></p><p> //LCD寫數(shù)據(jù)函數(shù)</p><p> void wc51ddr(uchar j)</p><p><b> {</b></p><p><b> fbusy;</b><
127、/p><p><b> EN=0;</b></p><p><b> RS=1;</b></p><p><b> RW=0;</b></p><p><b> EN=1;</b></p><p><b> P2=j
128、;</b></p><p><b> EN=0;</b></p><p><b> }</b></p><p> //LCD1602初始化</p><p> void lcd_init()</p><p><b> {</b><
129、;/p><p> wc51r(0x01);</p><p> wc51r(0x38);</p><p> wc51r(0x0c);</p><p> wc51r(0x06);</p><p><b> }</b></p><p><b> //延時(shí)函數(shù)&l
130、t;/b></p><p> void delay(uint useconds)</p><p><b> {</b></p><p> for(;useconds>0;useconds--);</p><p><b> }</b></p><p><
131、;b> //18b20復(fù)位</b></p><p> void ds18b20_init(void)</p><p><b> {</b></p><p><b> while(1)</b></p><p><b> {</b></p>
132、<p> DQ=1;_nop_();_nop_();</p><p> DQ=0;delay(50);</p><p> DQ=1;delay(3);</p><p> if (!DQ) {</p><p> delay(25);break;</p><p><b> }</b&
133、gt;</p><p> DQ=0; //否則在發(fā)復(fù)位信號(hào)</p><p><b> }</b></p><p><b> }</b></p><p> //從單總線上讀取一個(gè)字節(jié)</p><p> uchar read_byte(void)</p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 匯編語言課程設(shè)計(jì)----電子鬧鐘
- 匯編語言課程設(shè)計(jì)
- 匯編語言課程設(shè)計(jì)
- 匯編語言課程設(shè)計(jì)報(bào)告
- 匯編語言課程設(shè)計(jì)報(bào)告
- 匯編語言課程設(shè)計(jì)安排
- 匯編語言課程設(shè)計(jì)報(bào)告
- 匯編語言課程設(shè)計(jì)報(bào)告a
- 匯編語言編程實(shí)踐及電子鐘設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- 匯編語言課程設(shè)計(jì)_提取系統(tǒng)時(shí)間
- 匯編語言課程設(shè)計(jì)《定時(shí)顯示系統(tǒng)》
- 匯編語言課程設(shè)計(jì)---系統(tǒng)時(shí)間顯示
- 微機(jī)原理與匯編語言課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)c語言版課程設(shè)計(jì)
- 匯編語言課程設(shè)計(jì)--用匯編語言實(shí)現(xiàn)顯示系統(tǒng)時(shí)間的程序
- 匯編語言程序設(shè)計(jì)-課程設(shè)計(jì)
- 匯編語言推箱子課程設(shè)計(jì)
- 匯編語言程序設(shè)計(jì)課程設(shè)計(jì)
- 匯編語言動(dòng)畫設(shè)計(jì)課程設(shè)計(jì)
- 打字游戲-匯編語言課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論