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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、<p><b>  本科畢業(yè)論文</b></p><p>  酒精濃度測試儀的設(shè)計與制作</p><p><b>  目 錄</b></p><p><b>  摘 要I</b></p><p><b>  緒 論1</b></p

2、><p><b>  1 硬件設(shè)計1</b></p><p>  1.1STC89S52單片機1</p><p>  1.2 MQ-3酒精傳感器1</p><p>  1.3 ADC0832芯片1</p><p>  1.4 LCD1602液晶1</p><p&

3、gt;  1.5 報警電路1</p><p><b>  2軟件設(shè)計1</b></p><p>  2.1 編譯語言的選擇1</p><p>  2.2 主程序模塊1</p><p>  2.3 A/D轉(zhuǎn)換模塊1</p><p>  2.4 按鍵輸入模塊1</p>

4、;<p>  2.5 液晶顯示輸出模塊1</p><p>  3 調(diào)試和結(jié)果1</p><p><b>  4 心得體會1</b></p><p><b>  參考文獻1</b></p><p><b>  附錄 1</b></p>

5、<p>  Abstract1</p><p><b>  致 謝1</b></p><p>  酒精濃度測試儀的設(shè)計與制作</p><p>  摘 要:本論文主要是設(shè)計一種用于公共場所具有檢測和報警功能的酒精濃度測試儀。成品可用于交警對汽車駕駛者測試與監(jiān)督,也可以用于司機駕車前的自我檢測。</p><p

6、>  本設(shè)計方案基于STC89S52單片機,MQ-3酒精濃度傳感器。系統(tǒng)將傳感器輸出的4~20mA的標(biāo)準(zhǔn)信號通過以ADO832為核心的A/D轉(zhuǎn)換電路轉(zhuǎn)換為8位的數(shù)字信號,經(jīng)過單片機處理,最后由LCD1602液晶顯示器顯示酒精濃度值以及實現(xiàn)報警功能。論文中清楚地描述了數(shù)據(jù)采集子代碼、數(shù)據(jù)處理過程以及數(shù)據(jù)顯示子程序和報警電路的設(shè)計方法和過程。系統(tǒng)對于測試點超出額定的酒精濃度時,發(fā)光二極管報警提示測試人員,同時操作人員可以通過按鍵對上限

7、酒精濃度的設(shè)定和調(diào)節(jié)。</p><p>  關(guān)鍵詞:酒精濃度傳感器;單片機;1602液晶</p><p><b>  緒 論</b></p><p>  檢測儀向更迅速快捷更方便攜帶等發(fā)展。傳統(tǒng)的機械測試儀和酒精計一般的靈敏度和準(zhǔn)確度比較低或難操作,同時單片機做的系統(tǒng)既有類似于計算機的基本部件,又不同于計算機。它有體積小,實時快速對外部事件做

8、出反應(yīng),作出邏輯判斷與推理后實現(xiàn)被控對象的參數(shù)調(diào)整與控制等優(yōu)點,所以基于單片機的酒濃度測試儀的開發(fā)還是具有一定現(xiàn)實意義的。</p><p>  根據(jù)WHO數(shù)據(jù),全球2003年的人均純酒精消費量為6.2L,其中歐洲地區(qū)人均達11.9L,美洲地區(qū)人均為8.7L。俄羅斯及其周邊的東歐國家酒精消費量最高,其次為歐洲其他國家。在人均國民生產(chǎn)總值(GDP)低于7000美元的低收入國家,酒精消費量與人均GDP相關(guān),GDP越高酒

9、精消費量越高。而隨著我國近年來高速發(fā)展的經(jīng)濟水平和居民生活水平,酒精消費量亦呈直線上升趨勢,隨之而來的是因為飲酒而造成的一系列社會問題。例如酒后駕駛造成的交通意外。</p><p>  當(dāng)酒精在人體血液內(nèi)達到一定濃度時,麻痹神經(jīng),造成大腦反應(yīng)遲緩,肢體不受控制等癥狀。人對外界的反應(yīng)能力及控制能力就會下降,處理緊急情況的能力也隨之下降。對于酒后駕車者而言,其血液中酒精含量越高,發(fā)生撞車的幾率越大。而根據(jù)世界衛(wèi)組織的

10、事故調(diào)查,大約50%—69%的交通事故與酒后駕駛有關(guān),酒后駕駛已經(jīng)被列為車禍致死的主要原因。在中國,每年由于酒后駕車引發(fā)的交通事故達數(shù)萬起,其危害觸目驚心,已成為交通事故的第一大“殺手”。</p><p>  為了實現(xiàn)對人權(quán)的尊重,對生命的關(guān)愛,使更多人的生命權(quán)、健康權(quán)及幸福美滿的家庭能得到更好的保護,需要設(shè)計一智能儀器能夠檢測駕駛員體內(nèi)酒精含量。因此我選擇了酒精濃度測試儀的設(shè)計為畢業(yè)設(shè)計的題目。這種儀器可以準(zhǔn)確

11、的測出喝酒者酒后血液中的酒精濃度,從而可以采取相關(guān)措施,提前預(yù)防交通事故或者災(zāi)難的發(fā)生,從而極大地保護了人民的生命和財產(chǎn)的安全。</p><p>  受20世紀(jì)信息技術(shù)的快速發(fā)展的影響,傳感技術(shù)逐漸走向成熟,在生活生產(chǎn)中的得到了廣泛的應(yīng)用。由于傳感器在各個領(lǐng)域都有著舉足輕重的作用,因此,高精度,高可靠性,微型化,微功耗無源化和智能數(shù)字化成為其發(fā)展方向。</p><p>  為檢查醉駕, 警

12、察常常使用一種便攜式的酒精呼吸檢測儀, 通過檢測駕駛者呼出的氣體判斷駕駛者是否飲酒。而目前使用的酒精呼吸檢測儀只能初步顯示駕駛員是否飲酒, 有醉駕嫌疑的駕駛員還需要接受血檢, 以確定其體內(nèi)酒精含量是否超標(biāo)。為簡化其流程,英國內(nèi)政部已推出一種超級酒精呼吸檢測儀, 能根據(jù)體溫、呼吸頻率等情況, 當(dāng)場判斷出駕駛者體內(nèi)的酒精含量。由此可見,高精度,高可靠性與微型化是酒精濃度檢測儀的主要發(fā)展方向。</p><p>  至今

13、為止,對氣體中酒精含量進行檢測的設(shè)備有燃料電池型(電化學(xué))、半導(dǎo)體型、紅外線型、氣體色譜分析型和比色型五種類型。但由于價格和使用方便的原因,目前(截止2013年1月)常用的只有燃料電池型(電化學(xué)型)和半導(dǎo)體型兩種。</p><p>  與半導(dǎo)體型相比,燃料電池型呼氣酒精測試儀具有穩(wěn)定性好,精度高,抗干擾性好的優(yōu)點。但是由于燃料電池酒精傳感器的結(jié)構(gòu)要求非常精密,制造難度相當(dāng)大,目前(2013年)只有美國、英國、德國

14、,中國等少數(shù)幾個國家能夠生產(chǎn),加上材料成本高,因此價格相當(dāng)昂貴,是半導(dǎo)體酒精傳感器的幾十倍。</p><p>  由于經(jīng)費、設(shè)備和時間等因素限制,所以這次設(shè)計與制作的酒精濃度測試儀是以單片機為主控制器,擴展必要的外部電路,設(shè)計制作成的測試儀器。實現(xiàn)對酒精濃度數(shù)據(jù)的采集,最大酒精濃度的設(shè)置,酒精濃度大小的比較,報警和顯示酒精濃度數(shù)據(jù)等功能。系統(tǒng)包括單片機控制模塊,液晶顯示屏顯示模塊,數(shù)據(jù)采集模塊,報警模塊,復(fù)位電路

15、等模塊。單片機控制系統(tǒng)的工作過程,主要由51單片機、液晶顯示屏、按鍵、LED指示燈組成,外部硬件電路有驅(qū)動芯片等。</p><p><b>  1 硬件設(shè)計</b></p><p>  由于本次設(shè)計需要用到單片機,來完成對酒精濃度的檢測,分析了網(wǎng)上的相似課題,有很多是用酒精濃度傳感器MQ-3來完成酒精濃度檢測系統(tǒng)的設(shè)計。鑒于本次時間限制,本次設(shè)計中采用的是STC89

16、S52單片機來控制整個電路,電路中采用的是LCD1602來顯示測試所得的實時數(shù)據(jù),用MQ-3感應(yīng)器來采集數(shù)據(jù)。A/D芯片選擇AD0832,主要是這塊芯片的性能優(yōu)良,時序操作簡單,能很好的解決本次設(shè)計中對實時數(shù)據(jù)轉(zhuǎn)換的要求。系統(tǒng)結(jié)構(gòu)如下:</p><p>  圖1 系統(tǒng)結(jié)構(gòu)框圖</p><p>  構(gòu)成該系統(tǒng)的主要元件和電路有:</p><p>  STC89S52

17、單片機</p><p>  單片機是指一個集成在一塊芯片上的完整計算機系統(tǒng)。盡管他的大部分功能集成在一塊小芯片上,但是它具有一個完整計算機所需要的大部分部件:CPU、內(nèi)存、內(nèi)部和外部總線系統(tǒng),目前大部分還會具有外存。同時集成諸如通訊接口、定時器,實時時鐘等外圍設(shè)備。而現(xiàn)在最強大的單片機系統(tǒng)甚至可以將聲音、圖像、網(wǎng)絡(luò)、復(fù)雜的輸入輸出系統(tǒng)集成在一塊芯片上。</p><p>  單片機也被稱為微

18、控制器(Microcontroler),是因為它最早被用在工業(yè)控制領(lǐng)域。單片機由芯片內(nèi)僅有CPU的專用處理器發(fā)展而來。最早的設(shè)計理念是通過將大量外圍設(shè)備和CPU集成在一個芯片中,使計算機系統(tǒng)更小,更容易集成進復(fù)雜的而對提及要求嚴(yán)格的控制設(shè)備當(dāng)中。INTEL的Z80是最早按照這種思想設(shè)計出的處理器,從此以后,單片機和專用處理器的發(fā)展便分道揚鑣。</p><p>  STC89S52單片機為系統(tǒng)的核心,它是一款低功耗

19、,價格便宜,高速,可靠,有一定抗靜電,抗干擾,功能較強的單片機。STC89S52有40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內(nèi)含2個外中斷口,3個16位可編程定時計數(shù)器,2個全雙工串行通信口,2個讀寫口線,片內(nèi)振蕩器及時鐘電路。同時STC89S52可降至0Hz的靜態(tài)邏輯操作,并支持兩種軟件可選的節(jié)電工作模式??臻e方式停止CPU的工作,但允許RAM,定時/計數(shù)器,串行通信口及中斷系統(tǒng)繼續(xù)工作。掉電方式保存RAM中的內(nèi)容,但振

20、蕩器停止工作并禁止其他所有部件工作直到下一個硬件復(fù)位。其將通用的微處理器和Flash存儲器結(jié)合在一起,特別是可反復(fù)擦寫的Flash存儲器可有效地降低開發(fā)本。STC單片機有PDIP、PQFP/TQFP及PLCC等三種封裝形式,以適應(yīng)不同產(chǎn)品的需求[1]。</p><p>  STC89S52芯片圖</p><p>  圖2 STC89S52引腳圖</p><p> 

21、 1.1.2 STC89S52單片機部分引腳功能說明</p><p>  ?Vcc:電源電壓。</p><p><b>  ?GND:接地。</b></p><p>  ?P0口:P0口是一組8位漏極開路型雙向I/O口,也即地址/數(shù)據(jù)總線復(fù)用口。</p><p>  ?P1口:P1是一個帶內(nèi)部上拉電阻的8位雙向I/O口

22、,P1的輸出緩沖級可驅(qū)動(吸收或輸出電流)4個TTL邏輯門電路。</p><p>  ?P2口:P2是一個帶有內(nèi)部上拉電阻的8位雙向I/O口,P2的輸出緩沖級可驅(qū)(吸收或輸出電流)4個TTL邏輯門電路。</p><p>  ?P3口:P3口時一組帶有內(nèi)部上拉電阻的8位雙向I/O口。P3口輸出緩沖級可驅(qū)動(吸收或輸出電流)4個TTL邏輯門電路。</p><p>  ?

23、RST:復(fù)位輸入。當(dāng)振蕩器工作時,RST引腳出現(xiàn)兩個機器周期以上高電平將使單片機復(fù)位。</p><p>  ?ALE :當(dāng)訪問外部程序存儲器或數(shù)據(jù)存儲器時,ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低8位字節(jié)。一般情況下,ALE仍以時鐘振蕩頻率的1/6輸出固定的脈沖信號,因此它可對外輸出時鐘或用于定時目的。</p><p>  ?PSEN:程序儲存允許(PSEN)輸出是外部程序存儲器的讀

24、選通信號,當(dāng)89S52單片機由外部程序存儲器取指令(或數(shù)據(jù))時,每個機器周期兩次PSEN有效,即輸出兩個脈沖。在次期間,當(dāng)訪問外部數(shù)據(jù)存儲器,將跳過兩次 信號。</p><p>  ? EA/VPP:外部訪問允許。欲使CPU僅訪問外部程序存儲器(地址為0000H-FFFH), 端必須保持低電平(接地)。</p><p>  ?XTAL1:振蕩器反相放大器及內(nèi)部時鐘發(fā)生器的輸入端。</

25、p><p>  ?XTAL2:振蕩器反相放大器的輸出端[2]。</p><p>  1.2 MQ-3酒精傳感器</p><p>  MQ-3酒精傳感器對乙醇蒸氣有較高的靈敏度,但響應(yīng)和恢復(fù)需要一定的時間。另外,MQ-3酒精傳感器簡單的驅(qū)動回路和可靠的穩(wěn)定性是相比較于其他型號傳感器的優(yōu)點。MQ-3酒精傳感器可用于機動車駕駛?cè)藛T及其他嚴(yán)禁酒后作業(yè)人員的現(xiàn)場檢測,也可用于其

26、他場所乙醇蒸氣濃度的檢測。</p><p>  MQ-3酒精傳感器有6只針狀管腳,其中4個管腳(兩個A和兩個B)用于信號讀取,兩個H腳用于提供加熱電流。</p><p>  1.2.1 MQ-3酒精傳感器</p><p>  圖3 酒精傳感器管腳示意圖</p><p>  1.2.2 MQ-3酒精傳感器外圍電路</p>&

27、lt;p>  圖4 MQ-3酒精傳感器外圍電路原理圖</p><p>  當(dāng)感應(yīng)器上電后,由于周圍空氣沒有乙醇蒸汽,感應(yīng)器里的感應(yīng)材料不導(dǎo)電,傳回 ADC0832芯片CH0的模擬電流為0,當(dāng)感應(yīng)器周圍有乙醇蒸汽時,感應(yīng)器里的感應(yīng)材料按一定規(guī)律導(dǎo)電,這些模擬電流經(jīng)過MQ-3的6腳傳回ADC0832芯片CH0進行A/D轉(zhuǎn)換。</p><p>  1.3 ADC0832芯片</p

28、><p>  ADC0832 為8位分辨率A/D轉(zhuǎn)換芯片,其最高分辨可達256級,可以適應(yīng)一般的模擬量轉(zhuǎn)換要求。其內(nèi)部電源輸入與參考電壓的復(fù)用,使得芯片的模擬電壓輸入在0~5V之間。芯片轉(zhuǎn)換時間僅為32μS,據(jù)有雙數(shù)據(jù)輸出可作為數(shù)據(jù)校驗,以減少數(shù)據(jù)誤差,轉(zhuǎn)換速度快且穩(wěn)定性能強。獨立的芯片使能輸入,使多器件掛接和處理器控制變的更加方便。通過DI 數(shù)據(jù)輸入端,可以輕易的實現(xiàn)通道功能的選擇[3]。</p>&

29、lt;p>  1.3.1 ADC0832芯片管腳</p><p>  圖5 模數(shù)轉(zhuǎn)換芯片ADC0832管腳圖</p><p>  1.3.2 ADC0832芯片管腳功能說明:</p><p>  · CS_ 片選使能,低電平芯片使能。</p><p>  · CH0 模擬輸入通道0,或作為IN+/-使用。<

30、;/p><p>  · CH1 模擬輸入通道1,或作為IN+/-使用。</p><p>  · GND 芯片參考0 電位(地)。</p><p>  · DI 數(shù)據(jù)信號輸入,選擇通道控制。</p><p>  · DO 數(shù)據(jù)信號輸出,轉(zhuǎn)換數(shù)據(jù)輸出。</p><p>  ·

31、CLK 芯片時鐘輸入。</p><p>  · Vcc/REF 電源輸入及參考電壓輸入(復(fù)用)。</p><p>  通常情況下ADC0832與有4個管腳與單片機相連,分別是CS,CLK,DO,DI。但由于DO端與DI端在通信時并未同時有效,所以電路設(shè)計時可以將DO端和DI端并聯(lián)在一根線上使用。</p><p>  當(dāng)ADC0832未工作時CS輸入端應(yīng)為高

32、電平,此時芯片禁止運行,DO,DI和CLK的電平可以處于任意狀態(tài)。當(dāng)CS端保持低電平時,ADC0832進行轉(zhuǎn)換工作,CLK輸入時鐘脈沖信號,DI輸入通道選擇信號,在第一個時鐘脈沖下降之前DI必須是高電平,表示啟始信號,在第2,3脈沖下降之前DI端應(yīng)輸入兩位數(shù)據(jù)用于通道的選擇,當(dāng)?shù)?個脈沖下降之后DI端電平輸入失去作用。這里采用CHO單通道模式,即在第一個和第二個CLK脈沖下降后分別在DO輸入‘1’,‘0’兩個電平。</p>

33、<p>  1.3.3 ADC0832芯片外圍電路</p><p>  圖6 ADC0832芯片外圍電路</p><p>  如上圖所示,AOUT接從MQ-3傳回的模擬電流,經(jīng)ADC083芯片內(nèi)部,同時在控制芯片內(nèi)的代碼(詳見附錄)控制下,通過改變TXD和T0的電平狀態(tài),從RXD端獲取8位數(shù)字電流送回STC89S52控制芯片。</p><p>  1

34、.4 LCD1602液晶</p><p>  LCD1602字符型液晶顯示模塊是一種專門用于顯示字母、數(shù)字、符號等點陣式LCD,目前常用16×1,16×2,20×2和40×2行等的液晶顯示模塊,模塊組件內(nèi)部主要由LCD顯示屏、控制器、列驅(qū)動器和偏壓產(chǎn)生電路構(gòu)成[4]。</p><p>  1.4.1 液晶顯示屏引腳</p><p

35、>  圖7 液晶顯示屏引腳示意圖</p><p>  1.4.2 LCD1602液晶引腳功能:</p><p>  第 1 腳:VSS 為地電源。</p><p>  第 2 腳:VDD 接 5V 正電源。</p><p>  第 3 腳:V0 為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地電源時對比度最高,對比度過高時會產(chǎn)生

36、“鬼影”,使用時可以通過一個 10K 的電位器調(diào)整對比度。</p><p>  第 4 腳:RS 為寄存器選擇,高電平時選擇數(shù)據(jù)寄存器、低電平時選擇指令寄存器。</p><p>  第5腳:RW 為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當(dāng) RS 和 RW 共同為低電平時可以寫入指令或者顯示地址,當(dāng) RS 為低電平 RW 為高電平時可以讀忙信號,當(dāng) RS 為高電平 RW 為低電

37、平時可以寫入數(shù)據(jù)。</p><p>  第6腳:E 端為使能端,當(dāng) E 端由高電平跳變成低電平時,液晶模塊執(zhí)行令。</p><p>  第 7~14 腳:D0~D7 為 8 位雙向數(shù)據(jù)線[5]。</p><p>  1.4.3 LCD1602液晶指令</p><p>  表1 液晶顯示器指令</p><p>  

38、1.4.4 1602液晶顯示器外圍電路</p><p>  圖8 1602液晶顯示器外圍電路 </p><p>  如上圖所示,1602的1腳和6腳都接地,2腳和15腳都接電源7~14腳連接到STC89S52控制芯片的P0口上,4、5、6腳分別連接到STC89S52控制芯片的P2.4、P2.5、P2.6腳上。</p><p><b>  1.5 報

39、警電路</b></p><p>  本畢業(yè)設(shè)計采用發(fā)光二極管來做報警器件。發(fā)光二極管簡稱為LED它是半導(dǎo)體二極管的一種,可以把電能轉(zhuǎn)化成光能;常簡寫為LED。發(fā)光二極管與普通二極管一樣是由一個PN結(jié)組成,也具有單向?qū)щ娦?。?dāng)給發(fā)光二極管加上正向電壓后,從P區(qū)注入到N區(qū)的空穴和由N區(qū)注入到P區(qū)的電子,在PN結(jié)附近數(shù)微米內(nèi)分別與N區(qū)的電子和P區(qū)的空穴復(fù)合,產(chǎn)生自發(fā)輻射的熒光。不同的半導(dǎo)體材料中電子和空穴所

40、處的能量狀態(tài)不同。當(dāng)電子和空穴復(fù)合時釋放出的能量多少不同,釋放出的能量越多,則發(fā)出的光的波長越短。常用的是發(fā)紅光、綠光或黃光的二極管[6]。發(fā)光二極管的反向擊穿電壓約5伏。它的正向伏安特性曲線很陡,使用時必須串聯(lián)限流電阻以控制通過管子的電流,以保證發(fā)光二極管能夠正常工作。</p><p>  圖8 發(fā)光二極管外圍電路原理圖</p><p>  發(fā)光二極管正極直接接電源,負(fù)極通過電阻R3連

41、接到控制芯片的P2.0腳,其功能是當(dāng)系統(tǒng)檢測到酒精濃度低于設(shè)定值時,STC89S52芯片P2.0腳輸出一個持續(xù)的高電平,發(fā)光二極管熄滅,無報警信號。當(dāng)系統(tǒng)檢測到酒精濃度高于設(shè)定值后,STC89S52芯片P2.0腳輸出一個持續(xù)的低電平點亮發(fā)光二極管,產(chǎn)生報警信號。</p><p><b>  1.6 振蕩器</b></p><p>  振蕩器有多種,比如555定時器、

42、對稱式多諧振蕩器,非對稱式多諧振蕩器、環(huán)行振蕩器等。但在許多應(yīng)用場合下都對多諧振蕩器的震蕩頻率穩(wěn)定性有嚴(yán)格的要求,例如,在多諧振蕩器作為數(shù)字鐘的脈沖源使用時,它的頻率穩(wěn)定性直接影響著計時準(zhǔn)確性。在這種情況下,前面所講的幾種多諧振蕩器電路難以滿足要求,因為在這些多諧振蕩器中振蕩頻率主要取決于門路電路輸入電壓在充、放電過程中達到轉(zhuǎn)換電平所需的時間,所以頻率穩(wěn)定性不可能很高。</p><p>  AT89S52單片機允

43、許的振蕩晶體可在1.2~24MHz之間選擇,一般11.0592MHz。電容C1、C2的取值對振動頻率輸出的穩(wěn)定性、大小及振蕩電路起振速度有一定的影響,可在20~100pF之間選擇,典型值為30pF。在本次設(shè)計采用頻率穩(wěn)定性相對、外圍電路相對簡單的石英晶體多諧振蕩器和無極性電容,具體數(shù)值如下,這樣產(chǎn)生的振蕩周期大約1us,大大的方便時鐘計數(shù)。</p><p>  圖9 石英晶振外圍電路連接示意圖</p>

44、;<p><b>  軟件設(shè)計</b></p><p>  2.1 編譯語言的選擇</p><p>  在單片機的開發(fā)過程中,高級語言逐漸被引入進來。匯編語言的可控性較高級語言來說更具優(yōu)越性。程序編寫語言比較常見的有C語言、匯編語言、Java語言等。匯編語言的機器代碼生成效率高,控制性好,但就是移植性不高;Java語言更適合做手機軟件、網(wǎng)頁小游戲和安全

45、性要求較高的安防軟件。</p><p>  C語言編寫的程序比用匯編編寫的程序更符合人們的思考習(xí)慣。還有很多處理器都支持C編譯器,這樣意味著不懂芯片內(nèi)部結(jié)構(gòu)的程序員也能高效快速的編寫程序。且具有良好的模塊化、容易閱讀、維護等優(yōu)點,且編寫的模塊程序易于移植。經(jīng)C語言和匯編語言的優(yōu)缺點比較,本系統(tǒng)采用C語言來編寫代碼。</p><p>  軟件編寫的主體思路是將系統(tǒng)按功能模塊化劃分,然后根據(jù)模

46、塊要實現(xiàn)的功能編寫每個子程序,最后通過主程序調(diào)用外部子程序來實現(xiàn)本次設(shè)計的各項要求。</p><p>  2.2 主程序模塊</p><p>  主程序的功能:與硬件相結(jié)合實現(xiàn)酒精濃度測試系統(tǒng)的各個功能。主要是檢測與顯示,讀按鍵值,門限調(diào)整與報警,檢測數(shù)據(jù)顯示功能子函數(shù)的調(diào)用。</p><p>  圖10 主程序流程</p><p>  

47、程序從宏定義int、char型變量開始,定義K0、K1、K2、K3分別為系統(tǒng)開始測試按鍵、酒精濃度上限值設(shè)定按鍵、上限加按鍵、上限減按鍵和定義P2.0口為光線報警口,然后定義要在液晶上顯示的字符串,接著聲明整個系統(tǒng)要用到的函數(shù),隨后進入主程序設(shè)定初始酒精上限濃度,初始化LCD1602,延時3S以便于系統(tǒng)正常運行,之后用相應(yīng)函數(shù)顯示要顯示的字符和數(shù)字,最后進入按鍵檢測狀態(tài)。</p><p>  2.3 A/D轉(zhuǎn)換

48、模塊</p><p>  (1)模數(shù)轉(zhuǎn)換模塊的主要功能就是將MQ-3傳回的模擬電壓信號轉(zhuǎn)化為單片機能夠處理的數(shù)字信號,并傳送給STC89S52單片機中。</p><p>  圖11 ADC0832轉(zhuǎn)換的流程</p><p>  定義芯片各個管腳拉低CS端電平,拉高CLK的電平啟動A/D轉(zhuǎn)換芯片,執(zhí)行兩個空指令后拉低CLK形成第一個,重復(fù)CLK信號的電平拉高拉低,在

49、第2、3個CLK下降沿前分別DI等于“1”、“0”選通A/D轉(zhuǎn)換芯片的CH0通道,并在第3個CLK下降沿后DI等于1,使控制命令結(jié)束,緊跟著兩個for語句接收數(shù)據(jù),接收完后對比兩個接收到的數(shù)據(jù),完全正確就通過return函數(shù)返回數(shù)據(jù)。</p><p>  2.4 按鍵輸入模塊</p><p>  (1)按鍵是實現(xiàn)人機對話的一個控制按鈕,通過按鍵的操作,對系統(tǒng)進行發(fā)送操作指令,經(jīng)單片機內(nèi)部

50、儲存的代碼處理后,然后在LCD1602液晶上顯示。</p><p><b>  N</b></p><p><b>  Y</b></p><p><b>  N</b></p><p><b>  Y</b></p><p>&l

51、t;b>  Y</b></p><p>  圖12 按鍵查詢式的流程圖</p><p>  進入按鍵檢測程序后運行一個控指令進行延時,如果沒有按鍵按下,則一直循環(huán)控指令循環(huán)同時檢測是否按鍵按下,如果有按鍵按下,則跳到所按按鍵對應(yīng)的程序,執(zhí)行完該按鍵的程序后立即跳出if語句回到while循環(huán)語句繼續(xù)進行死循環(huán)。</p><p>  2.5 液晶顯

52、示輸出模塊</p><p>  LCD1602模塊在本系統(tǒng)中主要起著開界面日期和英文姓名,學(xué)號顯示,和采集回來酒精濃度的顯示。</p><p>  圖13 液晶顯示流程圖</p><p>  液晶顯示D0到D7口接P0.0到 P0.7,單獨使用一個口,為了方便代碼的編寫和降低電平間的干擾,由于P0口沒有上拉電阻,所以加了一個排阻進行電壓的擴大,用以。通常我們說P0

53、口需要接上拉電阻才能正常工作,是因為其內(nèi)部結(jié)構(gòu)與其他三個端口存在差別,沒有上拉電阻的緣故,所以如果不接上拉電阻,P0口的狀態(tài)就不會得到預(yù)期的結(jié)果,或許是某個中間電壓的值,而不是高電平的5V或者低電平的0V。</p><p><b>  3 調(diào)試和結(jié)果</b></p><p>  根據(jù)各個模塊功能的設(shè)計和繪制的整體電路圖,找到各功能模塊的連接點。按照設(shè)計的步驟,并對照

54、總電路圖,仔細(xì)連接電路。電路的連接順序是,先連接好各個模塊,在調(diào)試檢查正確的前提下接通總電源。 </p><p>  打開Keil軟件,新建一個工程,在這個工程下新建一個C記事本,并在記事本上編寫C程序和保存該程序,點擊軟件上方“Output”按鈕,在輸出HEX前面打鉤,保存設(shè)置。單擊軟件左上方“編譯”按鈕,就可以在新建的工程里面的到一個HEX文件。</p><p>  把電路連

55、接好并將調(diào)試程序代碼HEX文件通過progisp軟件燒寫到STC89S52單片機上后,接上+5V電源開始調(diào)試。先把氣體傳感器探頭用一個阻值為50kΩ的定位器替代,復(fù)位單片機,觀察LCD1602液晶上的顯示數(shù)據(jù)。用萬用表測量采樣點的電壓值,看用萬用表測得的電壓值與LCD1602液晶上顯示數(shù)據(jù)是否存在線性關(guān)系。因為各導(dǎo)線和元器件對電壓電流的影響,LCD1602液晶顯示的數(shù)據(jù)與萬用表測得的數(shù)據(jù)存在一定的偏差,但在可接受的范圍內(nèi)。調(diào)節(jié)電位器,觀

56、察LCD1602液晶上數(shù)據(jù)顯示的變化,同樣用萬用表測量電壓值作比較。測量數(shù)據(jù)與LCD1602液晶上顯示數(shù)據(jù)基本吻合,說明除感應(yīng)器部分外其它部分連接正確。然后,再把電位器阻值從0開始逐漸調(diào)大,在每過一個0.02V電壓后觀察到LCD1602液晶上數(shù)字發(fā)生電話,說明LCD1602液晶顯示換算正確。</p><p>  調(diào)試電路其他功能模塊正確后,將預(yù)熱足夠長時間能正常工作的氣體傳感器MQ-3感應(yīng)器模塊換上原來50kΩ的

57、電阻。準(zhǔn)備好若干個不同濃度的酒精氣體樣品,檢測氣體傳感器是否能正常工作。當(dāng)把不同濃度的酒精溶液樣品靠接氣敏傳感器時,各自對應(yīng)一個不同的數(shù)據(jù)顯示,說明整體電路已經(jīng)完全正確。 </p><p>  本次設(shè)計與制作的酒精濃度檢測系統(tǒng),通過設(shè)計相關(guān)的硬件電路及進行相應(yīng)的軟件調(diào)試,最后實現(xiàn)了實時檢測酒精濃度,并能實時在LCD1602液晶顯示屏上顯示的目的。設(shè)計出的硬件電路,基本符合本次畢業(yè)設(shè)計的設(shè)計要求,通過按鍵

58、可以實現(xiàn)調(diào)整門限值,當(dāng)系統(tǒng)檢測到的酒精濃度高于設(shè)定的酒精濃度門限值時,系統(tǒng)會自動啟動光線報警功能,并且在LCD1602液晶顯示屏上顯示當(dāng)前酒精濃度。但有些不足:(1)由于酒精感應(yīng)器不是集成塊,是買回感應(yīng)頭自己做的電路,對于電路中所用到的兩個電阻具體數(shù)值不是很精確,導(dǎo)致感應(yīng)系統(tǒng)在沒有酒精蒸汽的空氣中也顯示有較小的數(shù)值在LCD1602液晶顯示屏上,最后通過對代碼的修改,把小于3的數(shù)字直接視為0處理,這樣就不會出現(xiàn)上面的情況了;(2)由于酒精

59、感應(yīng)器本身硬件問題,感應(yīng)和消退時間有點長。</p><p><b>  4 心得體會</b></p><p>  通過本次畢業(yè)設(shè)計,讓我重新系統(tǒng)復(fù)習(xí)了數(shù)字電子技術(shù)基礎(chǔ)與單片機方面的知識,收獲頗豐。</p><p>  在做板的過程中要非常小心,因為碳粉打印機打印出來的電路可能會有某個地方斷開的,這就要你在燙板后小心的拿油性筆仔細(xì)描畫一下,然后

60、腐蝕之前還要把在燙板時附著在板上的膠紙用橡皮細(xì)心的除掉。硬件調(diào)試過程是相對繁鎖的,要特別注意以下幾點。首先,通電之后看AT89S51晶振是否起振,晶振起振后是標(biāo)準(zhǔn)的正弦波,示波器測得其頻率為11.0592MHz;其次,看酒精感應(yīng)器是否有數(shù)據(jù)傳回;最后,硬件電路的設(shè)計既要追求實際功能的實現(xiàn),也要考慮元器件的購買方便。</p><p>  在本次畢業(yè)設(shè)計中學(xué)到的知識,我會將它們發(fā)揮到其它的學(xué)習(xí)中去,也將會在今后的工作

61、學(xué)習(xí)中不斷的提高和完善;而在此期間發(fā)現(xiàn)的不足,我將努力改善,通過學(xué)習(xí)實踐等方式不斷提高,克服那些知識障礙,以求在今后的工作學(xué)習(xí)過程中獲得更大的進步。</p><p><b>  參考文獻</b></p><p>  [1] 張洪潤等.單片機應(yīng)用設(shè)計200例[M].北京:北京航空航天大學(xué)出版社,2006.</p><p>  [2] 公茂法等.單

62、片機人機接口實例集[M].北京:北京航空航天大學(xué)出版社,1997.</p><p>  [3] 閻石.數(shù)字電子技術(shù)基礎(chǔ)[M].北京:高等教育出版社,2002. </p><p>  [4] 姜志海、黃玉清、劉連鑫.單片機原理及應(yīng)用(第二版)[M].北京:電子工業(yè)出版社,2009.</p><p>  [5] 先鋒工作室.單片機程序設(shè)計實例[M]北京:清華大學(xué)出版社,

63、2003.</p><p>  [6] 趙亮、侯國銳.單片機C語言編程與實例[M].北京:人民郵電出版社,2003.</p><p>  [7] 朱定華、戴汝平.單片微機原理與應(yīng)用[M].北京:清華大學(xué)出版社,2003. </p><p>  [8] 胡乾斌、李光斌、李玲.單片微型計算機原理與應(yīng)用[M].武漢:華中科技大學(xué)出版社,200

64、2. </p><p>  [9] 胡漢才.單片機原理與借口技術(shù)[M].北京:清華大學(xué)出版社,2004. </p><p><b>  附 錄</b></p><p>  圖14 硬件電路部分原理圖</p><p>  圖15 硬件電路部分原理圖</p><p>

65、;  圖16 控制電路PCB圖</p><p>  圖17 檢測電路PCB圖</p><p>  圖18 酒精濃度測試儀實物圖</p><p><b>  部分程序清單</b></p><p>  主程序 main.c</p><p>  #include<reg52.h><

66、;/p><p>  #include<intrins.h></p><p>  /*******************宏定義**********************/ </p><p>  #define uint unsigned int</p><p>  #define uchar unsigned char</p&

67、gt;<p>  sbit k0=P1^0; //start the system</p><p>  sbit k1=P1^1; //setup the stand_value</p><p>  sbit k2=P1^2; //the stand_value up</p><p>  sbit k3=P1^3; //the stand_v

68、alue down</p><p>  sbit alarm=P2^0; //the alarm port</p><p>  /*************************變量及字符串的定義*************************/</p><p>  uchar LCD_Char[]="0123456789ABCDEF-."

69、;</p><p>  uchar LCD_string0[]="welcome to guet";</p><p>  uchar LCD_string1[]="102021226";</p><p>  uchar M_Time[]="2011--9--8";// show time</p>

70、;<p>  uchar M_Detect[]="Detect:"; //檢測 </p><p>  uchar M_Detect1[]="Alcohol:"; </p><p>  uchar M_Detect2[]="set_val:"; </p><p>  //uchar

71、 M_time1[]={"Time"}; //時間</p><p>  //uchar M_Storage[]={"Storage"}; //memory</p><p>  uint data_temp=0;</p><p>  uint flag=0;</p><p>  /**

72、*****************函數(shù)聲明**********************/ </p><p>  extern void initial_lcd1602(void); </p><p>  extern void Display_List_Char(uchar x,uchar y,uchar *str); //the extern have no mean

73、,only to explain the function is in the other file</p><p>  extern void write_lcd_command( uchar write_data); //the function of write command</p><p>  extern void

74、 Display_One_Char(uchar x,uchar y,uchar dat); </p><p>  extern void write_lcd_command( uchar write_data); </p><p>  extern void xs_int(unsigned int shuju,bit t); </p><p>  extern

75、 unsigned char ADconv(void);</p><p>  extern void display(unsigned int shuju,bit t);</p><p>  /*******************子函數(shù)**********************/ </p><p>  void delay_ms(uint n)</p&g

76、t;<p>  { uint i,j; //delay 10ms</p><p>  for(i=n;i>0;i--)</p><p><b>  {</b></p><p>  for(j=1200;j>0;j--) </p><p><b>  {</

77、b></p><p>  _nop_(); </p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /******************主函數(shù)********

78、**************/ </p><p>  void main()</p><p><b>  {</b></p><p>  uint set_value=200; //is mean 20.0mg/ml alcohol drive is 20.0mg/100ml=0.2mg/ml</p><p

79、>  uchar data_char=0;</p><p>  initial_lcd1602();</p><p>  delay_ms(100);</p><p>  Display_List_Char(0,0,LCD_string0); //welcome </p><p>  delay_ms

80、(100); //delay 3s</p><p>  Display_List_Char(1,0,LCD_string1); //welcome </p><p>  delay_ms(300);</p><p>  write_lcd_command(0x01); //c

81、lean screen </p><p>  Display_List_Char(0,0,M_Time); //show time </p><p>  delay_ms(30);</p><p>  Display_List_Char(0,0,M_Time); //show t

82、ime </p><p>  delay_ms(100);</p><p>  Display_List_Char(1,0,M_Detect); //show detect interface</p><p>  delay_ms(100);</p><p>  // Display_List_Char(1,0,M_Det

83、ect); //show detect interface</p><p>  // delay_ms(300);</p><p><b>  while(1)</b></p><p><b>  {</b></p><p><b>  _nop_();</b>

84、;</p><p>  if(k0==0||k1==0||k2==0||k3==0)</p><p><b>  {</b></p><p><b>  if(k0==0)</b></p><p><b>  { </b></p><p><b&g

85、t;  flag=0;</b></p><p>  Display_List_Char(1,0,M_Detect1); //show detect interface</p><p>  delay_ms(50);</p><p>  data_char= Adc0832 (0);</p><p>  data_temp

86、=data_char;</p><p>  delay_ms(10);</p><p>  xs_int(data_temp,1);</p><p>  delay_ms(10);</p><p>  if(data_temp>=set_value)</p><p><b>  {</b>&

87、lt;/p><p><b>  alarm=0;</b></p><p><b>  }</b></p><p>  else { alarm=1;}</p><p><b>  }</b></p><p><b>  if(k1==0)<

88、/b></p><p><b>  {</b></p><p>  Display_List_Char(1,0,M_Detect2); </p><p>  xs_int(set_value,1);</p><p><b>  flag=1;</b></p><p>&

89、lt;b>  }</b></p><p>  if(k2==0&&flag==1)</p><p><b>  {</b></p><p>  delay_ms(10);</p><p><b>  if(k2==0)</b></p><p>

90、;<b>  { </b></p><p>  set_value=set_value+10;</p><p>  xs_int(set_value,1); </p><p><b>  }</b></p><p>  delay_ms(50);</p><p><b&

91、gt;  }</b></p><p>  if(k3==0&&flag==1)</p><p><b>  {</b></p><p>  delay_ms(10);</p><p><b>  if(k3==0)</b></p><p><

92、b>  {</b></p><p>  set_value=set_value-10;</p><p>  xs_int(set_value,1); </p><p><b>  }</b></p><p>  delay_ms(50);</p><p><b>  }

93、</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  顯示程序 LCD1602.c</p><p>  #include<reg52.h&g

94、t;</p><p>  #include<string.h></p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int </p><p>  #define LCDPORT P0</p><p>  sbit RS=

95、P2^5;//RS數(shù)據(jù)命令選擇端,高電平數(shù)據(jù),低電平命令</p><p>  sbit RW=P2^6;//RW讀寫選擇端,高電平讀操作,低電平寫操作</p><p>  sbit EN=P2^7;//EN使能控制端,E高電平跳變?yōu)榈碗娖綍rLCD執(zhí)行命令</p><p>  /*****************************

96、*LCD1602驅(qū)動程序*************************************/</p><p>  void lcd_delay(uchar delaytime)</p><p><b>  {</b></p><p>  while(delaytime)delaytime--;</p><p>&

97、lt;b>  }</b></p><p>  void write_lcd_command(uchar write_command)</p><p><b>  {</b></p><p>  lcd_delay(40);</p><p><b>  RS=0;</b></p

98、><p><b>  RW=0;</b></p><p>  LCDPORT=write_command;</p><p><b>  EN=1;</b></p><p><b>  EN=0;</b></p><p><b>  }</b&

99、gt;</p><p>  void write_lcd_data(uchar write_data)</p><p><b>  {</b></p><p>  lcd_delay(40);</p><p><b>  RS=1;</b></p><p><b>

100、  RW=0;</b></p><p>  LCDPORT=write_data;</p><p><b>  EN=1;</b></p><p><b>  EN=0;</b></p><p><b>  }</b></p><p>  v

101、oid Display_One_Char( uchar x,uchar y,uchar dat) //x表示行,y表示列</p><p><b>  {</b></p><p><b>  switch(x)</b></p><p><b>  {</b></p><p>&l

102、t;b>  case 0:</b></p><p>  write_lcd_command(0x80+y);</p><p><b>  break;</b></p><p><b>  case 1:</b></p><p>  write_lcd_command(0xc0+y)

103、;</p><p><b>  break;</b></p><p><b>  }</b></p><p>  write_lcd_data(dat); </p><p><b>  } </b></p><p>  void Display_Li

104、st_Char(uchar x,uchar y,uchar *str)</p><p><b>  {</b></p><p>  /*switch(x)</p><p><b>  {</b></p><p><b>  case 0:</b></p><

105、;p>  write_lcd_command(0x80+y);</p><p><b>  break;</b></p><p><b>  case 1:</b></p><p>  write_lcd_command(0xc0+y);</p><p><b>  break;&l

106、t;/b></p><p><b>  }</b></p><p>  while (*str!='\0')</p><p><b>  {</b></p><p>  write_lcd_data(*str);</p><p><b>  s

107、tr++;</b></p><p><b>  }</b></p><p><b>  */</b></p><p>  while (*str!='\0')</p><p><b>  {</b></p><p>  Dis

108、play_One_Char(x,y,*str);</p><p><b>  str++;</b></p><p><b>  y++;</b></p><p><b>  if(y==16)</b></p><p>  { //若y等于16,進入if語句&

109、lt;/p><p>  y=0;x^=1; // y賦0,x與1按位異或取反</p><p><b>  } </b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void display(

110、unsigned int shuju,bit t) //顯示一個數(shù)字</p><p>  {unsigned int huancun[6]={0};</p><p>  unsigned char biaozhi=0,i;</p><p>  if (shuju < 10) biaozhi = 1;</p><p>  else

111、 if(shuju < 100) biaozhi = 2;</p><p>  else if(shuju < 1000) biaozhi = 3;</p><p>  else if(shuju < 10000) biaozhi = 4;</p><p>  else if(shuju <=65535) biaozhi = 5;</p

112、><p>  switch(biaozhi)</p><p>  {case 5:huancun[5] = shuju/10000; </p><p>  case 4:huancun[4] = shuju%10000/1000;</p><p>  case 3:huancun[3] = shuju%1000/100;</p>&

113、lt;p>  case 2:huancun[2] = shuju%100/10;</p><p>  case 1:huancun[1] = shuju%10; </p><p><b>  break;</b></p><p>  default:break;</p><p><b>  }</b

114、></p><p>  for(i=6;i>1;i--)</p><p><b>  {</b></p><p>  Display_One_Char(t,15-i,0x30+huancun[i-1]);</p><p><b>  } </b></p><p>

115、  Display_One_Char(t,14,'*');</p><p>  Display_One_Char(t,15,'g'); </p><p><b>  } </b></p><p>  void initial_lcd1602(void) //初始化LCD1602</p>

116、<p><b>  {</b></p><p><b>  uchar i;</b></p><p><b>  EN=0;</b></p><p>  for(i=200;i>0;i--)</p><p>  lcd_delay(248);</p>

117、<p>  write_lcd_command(0x38);//0x38命令,雙行顯示,顯示5x7的點陣字符</p><p>  for(i=4;i>0;i--)</p><p>  lcd_delay(248);</p><p>  write_lcd_command(0x38);//再寫一次0x38命令,雙行顯示,顯示5x7的

118、點陣字符</p><p>  for(i=4;i>0;i--)</p><p>  lcd_delay(248);</p><p>  write_lcd_command(0x0c); //無光標(biāo),不閃爍</p><p>  for(i=4;i>0;i--)</p><p>  lcd_de

119、lay(248);</p><p>  write_lcd_command(0x06); //光標(biāo)右移,文字不移動</p><p>  for(i=4;i>0;i--)</p><p>  lcd_delay(248);</p><p>  write_lcd_command(0x01);//清屏</p>

120、<p>  for(i=4;i>0;i--)</p><p>  lcd_delay(248);//[5]</p><p><b>  }</b></p><p>  /*A/D轉(zhuǎn)換程序AD0832.c*/</p><p>  #include<reg52.h></p>&

121、lt;p>  #include <intrins.h></p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  sbit ADCLK = P3^4; /* AD時鐘信號 */</p><p&

122、gt;  sbit ADCS = P3^1; /* AD片選信號 */</p><p>  sbit ADD0 = P3^0; /* 數(shù)據(jù)輸入 */</p><p>  sbit ADDI = P3^0; /* 數(shù)據(jù)輸出 */</p><p>  uchar adc_result = 0;

123、 /* AD計算結(jié)果 */</p><p>  /* 讀取AD輸出的8bit數(shù)據(jù) */</p><p>  uchar Adc0832(unsigned char channel) //AD轉(zhuǎn)換,返回結(jié)果</p><p><b>  {</b></p><p>  uchar i=0;</p&g

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論