2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論