版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 《電子系統(tǒng)設(shè)計與實踐》</p><p><b> 課程設(shè)計報告</b></p><p> 課程設(shè)計題目:多點溫度測量系統(tǒng)設(shè)計</p><p> 專業(yè)班級 :2012級電子信息科學(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è)計4</b></p><p> 1.1 功能要求5</p>
4、;<p> 1.2 總體方案及工作原理5</p><p> 2 系統(tǒng)硬件設(shè)計6</p><p> 2.1 器件選擇6</p><p> 2.1.1主要器件的型號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è)計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實驗步驟29</b></p><p> 4.1匯編語言程序調(diào)試29</p><p> 4.2 C語言程序調(diào)試30</p><p>
8、 4.3實驗仿真31</p><p><b> 5設(shè)計總結(jié)32</b></p><p><b> 6參考文獻:33</b></p><p><b> 摘 要</b></p><p> 溫度是我們生活中非常重要的物理量。隨著科學(xué)技術(shù)的不斷進步與發(fā)展,溫度測量在工業(yè)
9、控制、電子測溫計、醫(yī)療儀器,家用電器等各種控制系統(tǒng)中廣泛應(yīng)用。溫度測量通??梢允褂脙煞N方式來實現(xiàn):一種是用熱敏電阻之類的器件,由于感溫效應(yīng),熱敏電阻的阻值能夠隨溫度發(fā)生變化,當(dāng)熱敏電阻接入電路時,則流過它的電流或其兩端的電壓就會隨溫度發(fā)生相應(yīng)的變化,再將隨溫度變化的電壓或者電流采集過來,進行A/D轉(zhuǎn)換后,發(fā)送到單片機進行數(shù)據(jù)處理,通過顯示電路,就可以將被測溫度顯示出來。這種設(shè)計需要用到A/D轉(zhuǎn)換電路,其測溫電路比較麻煩。第二種方法是用溫
10、度傳感器芯片,溫度傳感器芯片能把溫度信號轉(zhuǎn)換成數(shù)字信號,直接發(fā)送給單片機,轉(zhuǎn)換后通過顯示電路顯示即可。這種方法電路比較簡單,設(shè)計方便,現(xiàn)在使用非常廣泛。</p><p> 關(guān)鍵詞:多點溫度測量 單片機 溫度傳感器 </p><p><b> 1 總體設(shè)計</b></p><p> 多路溫度測量系統(tǒng)的總體結(jié)構(gòu)如圖1所示,根據(jù)要求,
11、整個系統(tǒng)包含以下幾個部分:51單片機、時鐘電路、復(fù)位電路組成的51單片機小系統(tǒng);多塊測溫模塊;顯示溫度值的顯示模塊和按鍵模塊。測溫模塊由溫度傳感器組成,溫度傳感器采用美國Dallas半導(dǎo)體公司推出的智能溫度傳感器DS18B20,溫度測量范圍為-55 -- +125,可編程為9到12位的A/D轉(zhuǎn)換精度,測溫分辨率可達0.0625C,完全能夠滿足系統(tǒng)要求。DS18B20采用單總線結(jié)構(gòu),只需要一根數(shù)據(jù)線DQ即可與單片機通信,多個DS18B20
12、可同時連接在一根數(shù)據(jù)線上與單片機通信。顯示器可采用LCD液晶顯示器,顯示信息量大、效果好、使用方便。</p><p> 圖1 多路溫度測量系統(tǒng)的總體結(jié)構(gòu)</p><p> 系統(tǒng)處理時,由51單片機控制從各個測溫模塊測量出溫度數(shù)字量,存入緩沖區(qū);然后通過按鍵控制,從緩沖區(qū)取出,根據(jù)數(shù)字量和溫度的關(guān)系計算出溫度值,依次送LCD顯示器顯示。</p><p><b
13、> 1.1 功能要求</b></p><p> 多點溫度測量系統(tǒng)的功能要求如下:</p><p> (1) 能夠測量多點溫度;</p><p> (2) 精度0.1C;</p><p> (3) 能夠通過顯示器顯示測量點編號和溫度值;</p><p> ?。?)可輪流顯示各測量點或指定顯示
14、某個測量點。</p><p> 1.2 總體方案及工作原理</p><p> 單片機系統(tǒng)由AT89C51單片機,復(fù)位電路和時鐘電路組成,時鐘采用12MHZ的晶振,溫度模塊由4塊溫度傳感器DS18B20組成,單總線結(jié)構(gòu),所有的DS18B20的DQ連接在一起與單片機的P3.0相連,通過上拉電阻連接電源,每一個DS18B20都有一個唯一的64位ROM地址,只要發(fā)送相應(yīng)的ROM地址,就能夠訪
15、問該器件,要訪問某個DS18B20,就必須知道它的64位ROM地址,可以通過程序讀出它的ROM地址,由于讀ROM地址時,一次只能接入一個DS18B20,因此,4個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è)定了兩個按鍵,K0為功能鍵,與AT89C51的P1.0相連,當(dāng)K0輸入低電平時,讀入DS18B20的ROM地址,當(dāng)K0鍵輸入高電平時,顯示選中DS18B20的溫度值;K1為測量點選中鍵,與AT89C51的P1.1相連,用于測量點選擇,每按一次,測量點號加1,讀入下一個DS18B20的ROM地址或顯示下一個DS18B20的相應(yīng)溫度值。</p>
17、<p><b> 2 系統(tǒng)硬件設(shè)計</b></p><p><b> 2.1 器件選擇</b></p><p> 2.1.1主要器件的型號</p><p> 2.1.2 AT89C51</p><p> AT89C51是一種帶4K字節(jié)閃爍可編程可擦除只讀存儲器(FPEROM
18、-FALSH PROGRAMMABLE AND ERASABLE READ ONLY MEORY)的低電壓,高性能CMOS8位微處理器,俗稱單片機。AT89C51是一種帶4K字節(jié)閃爍可編程可擦除只讀存儲器的單片機,單片機的可擦除只讀存儲器可以反復(fù)擦除100次。該器件采用ATMEL高密度非易失存儲器制造技術(shù)制造,與工業(yè)標(biāo)準的MCS-51指令集和輸出管腳相兼容,</p><p> AT89C51單片機包含中央處理器
19、、程序存儲器(ROM)、數(shù)據(jù)存儲器(RAM)、定時/計數(shù)器、串行接口和中斷系統(tǒng)等幾大單元及數(shù)據(jù)總線、地址總線和控制總線等三大總線。其基本結(jié)構(gòu)如圖2</p><p> 圖 2 AT89C51單片機的基本結(jié)構(gòu)</p><p> AT89C51 是一個低電壓,高性能CMOS 8 位單片機,片內(nèi)含8kB 的可反復(fù)擦寫的Flash 只讀程序存儲器和256B 的隨機存取數(shù)據(jù)存儲器(RAM),器件采
20、用ATMEL公司的高密度、非易失性存儲技術(shù)生產(chǎn),與標(biāo)準MCS-51 指令系統(tǒng)及8052 產(chǎn)品引腳兼容,片內(nèi)置有通用8 位中央處理器(CPU)和Flash 存儲單元。 </p><p> 圖3 AT89C51單片機的引腳</p><p> VCC/GND:供電電源。 </p><p> P0口:可以被定義為數(shù)據(jù)/地址的低八位,能夠
21、用于外部程序/數(shù)據(jù)存儲器。在FIASH編程時,P0 口作為原碼輸入口,當(dāng)FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。 </p><p> P1口:標(biāo)準輸入輸出I/O口,P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入。在FLASH編程和校驗時,P1口作為第八位地址接收。</p><p> P2口:既可用于標(biāo)準輸入輸出I/O,也可用于外部程序存儲器或數(shù)據(jù)存儲器訪問時的高八位
22、地址。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。</p><p> P3口:既可以作標(biāo)準輸入輸出I/O,也可作為AT89C51的一些特殊功能口, 管腳 備選功能 P3.0 RXD(串行輸入口) P3.1 TXD(串行輸出口) P3.2 /INT0(外部中斷0) P3.3 /INT1(外部中斷1) P3.4 T0(記時器0外部輸入) P3.5 T1(記時器1外部輸入) P3.6 /WR(外部數(shù)據(jù)
23、存儲器寫選通) P3.7 /RD(外部數(shù)據(jù)存儲器讀選通) </p><p> RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時,要保持RST腳兩個機器周期的高電平時間。 </p><p> ALE/PROG:當(dāng)訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。&l
24、t;/p><p> PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/PSEN信號將不出現(xiàn)。</p><p> EA / VPP:當(dāng)/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內(nèi)部程序存儲器。注意加密方式1時,/EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平時,此間
25、內(nèi)部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。</p><p> XTAL1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入。 </p><p> XTAL2:來自反向振蕩器的輸出。</p><p> 2.1.3智能溫度傳感器DS18B20電路</p><p> 四個DS18B20分別接一個按鈕開關(guān),便
26、于分別控制溫度,DS18B20的VCC接口接入同一總線且與顯示器VDD接口相連,DQ接口與AT89C51的P3.0接口相連,GND接地,如圖4;</p><p> 圖4 智能溫度傳感器原理圖</p><p> 2.1.4晶振電路方案</p><p> 晶振電路的功能在于給單片機提供振蕩時鐘信號,使單片機正常工作。本設(shè)計中采用了常用的晶振電路組成方案,具體如圖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ù)位電路的功能在于對單片機進行復(fù)位從而達到對整個
28、電路復(fù)位的功能。要達到目的則要求在復(fù)位按鍵按下后在RST引腳上要出現(xiàn)一個維持2個機器周期高電平[4]??紤]到可以利用電容的電壓不能突變(需要一定的充放電時間),于是采用如下復(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è)計</b></p><p><b> 3.1基本原理</b></p><p> 多路溫度測量系統(tǒng)的軟件程序主要由主程序、讀DS18B20模塊ROM地址程序、顯示DS18B20模塊ROM地址、讀DS18B20模塊溫度值程序、顯示DS18
30、B20模塊溫度值程序和LCD、DS18B20模塊驅(qū)動程序等組成。</p><p><b> 3.1.1主程序</b></p><p> 主程序的流程圖如圖9所示。</p><p><b> 圖9 主程序流程圖</b></p><p> 在主程序中,首先對LCD初始化,其次通過檢測按鍵,判斷是
31、讀DS18B20模塊的ROM地址還是讀DS18B20模塊的溫度值,如果是讀ROM地址,則依次調(diào)用讀ROM程序和顯示ROM程序;如果是讀溫度,則調(diào)用測量溫度程序和顯示溫度程序,注意測量某個DS18B20模塊之前,一定要讀出該模塊的ROM并保存到相應(yīng)的存儲單元。</p><p> 3.1.2讀ROM地址程序</p><p> 讀ROM地址程序的流程如圖10所示。讀ROM地址時,一次只能把一
32、片DS18B20模塊連接到單總線上,讀ROM程序?qū)崿F(xiàn)把當(dāng)前連接到總線上的DS18B20的ROM地址讀出。讀ROM地址程序處理過程如下,先計算存放當(dāng)前DS18B20模塊ROM地址的存儲單元的偏移地址,然后依次是DS18B20初始化、發(fā)讀ROM命令和讀ROM地址到存儲單元。</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個步驟,第一是向總線放啟動溫度轉(zhuǎn)換命令,啟動連接總線上的DS18B20模塊溫度轉(zhuǎn)換,由于12位DS18B20溫度轉(zhuǎn)換時間比較長,所以啟動轉(zhuǎn)換后一定要調(diào)用延時程序等待轉(zhuǎn)換完成后才能去讀溫度值;第二根據(jù)當(dāng)前器件號取當(dāng)前DS18B20器件的64位ROM地址,發(fā)送到總線匹配對應(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位,存放在兩個字節(jié)中,其中高字節(jié)的高5位為符號位,如果溫度值是正數(shù),則符號位為0,如果溫度值是負數(shù),則符號位為1。顯示溫度處理程序時,先根據(jù)高字節(jié)的高5位判斷是
36、正數(shù)還是負數(shù),如果是正數(shù),則提取其中的百位、十位、個位及小數(shù)位,轉(zhuǎn)換成字符編碼放入相應(yīng)的顯示緩沖區(qū);如果是負數(shù),則提取其中的負號、十位、個位及小數(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)時鐘頻率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的編號</p
40、><p> NUM2 EQU 3FH ;定義存放顯示通道的編號</p><p> LCD_3 EQU 3DH ;存放通道溫度的百、十、個、小數(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 ;編號初始化為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,默認讀0號,按一次K1編號加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 ;顯示溫度,默認顯示0號,按一次K1編號加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 ;由編號取得緩沖區(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 ;啟動溫度轉(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列顯示編號</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,則溫度為負</p&g
62、t;<p><b> CLR C</b></p><p> MOV A, TEMP_DATA_L</p><p> CPL A ;負溫度將補碼轉(zhuǎ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, #'-' ;負溫度最高位顯示“-”號</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 ;溫度值的個位</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列顯示溫度的個位</p><p> MOV A, #'.'</p><p> ACALL WC51DDR ;第2行第9列顯示小數(shù)點‘.‘</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位序列號<
78、;/p><p> ;**************************************</p><p> READ_ROM: MOV R5, #8</p><p> MOV A, NUM1 ;由編號取得緩沖區(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位序列號顯示在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列顯示編號</p><p> ACALL WC51DDR</p><p> MOV A, #0C0H ;寫入顯示緩沖區(qū)起始地址為第2行第1列</p><p> ACALL WC51R</p><p> MOV A, NUM1 ;由編號取得緩沖區(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位十六進制數(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一個字節(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 ;字符不動,光標(biāo)自動右移一格</p><p&g
107、t; ACALL WC51R</p><p><b> RET</b></p><p><b> ;檢查忙子程序</b></p><p> F_BUSY: PUSH ACC ;保護現(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> ;延時程序</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ù)位的對應(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)時鐘頻率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個DS18B20的64位ROM地址,</p><p>
119、 //0-7單元存放第1個DS18B20,8-15單元存放第2個DS18B20</p><p> //16-23單元存放第3個DS18B20,24-31單元存放第4個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ù)&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ù)位信號</p><p><b> }</b></p><p><b> }</b></p><p> //從單總線上讀取一個字節(jié)</p><p> uchar read_byte(void)</p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 匯編語言課程設(shè)計----電子鬧鐘
- 匯編語言課程設(shè)計
- 匯編語言課程設(shè)計
- 匯編語言課程設(shè)計報告
- 匯編語言課程設(shè)計報告
- 匯編語言課程設(shè)計安排
- 匯編語言課程設(shè)計報告
- 匯編語言課程設(shè)計報告a
- 匯編語言編程實踐及電子鐘設(shè)計課程設(shè)計報告
- 匯編語言課程設(shè)計_提取系統(tǒng)時間
- 匯編語言課程設(shè)計《定時顯示系統(tǒng)》
- 匯編語言課程設(shè)計---系統(tǒng)時間顯示
- 微機原理與匯編語言課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)c語言版課程設(shè)計
- 匯編語言課程設(shè)計--用匯編語言實現(xiàn)顯示系統(tǒng)時間的程序
- 匯編語言程序設(shè)計-課程設(shè)計
- 匯編語言推箱子課程設(shè)計
- 匯編語言程序設(shè)計課程設(shè)計
- 匯編語言動畫設(shè)計課程設(shè)計
- 打字游戲-匯編語言課程設(shè)計
評論
0/150
提交評論