引言
隨著我國經(jīng)濟的蓬勃發(fā)展,國民生產(chǎn)總值的不斷提高,人均可支配財產(chǎn)也大大增加,汽車擁有量持續(xù)增加,與此同時,每年死于交通事故的人數(shù)也在持續(xù)增加,道路交通安全形勢變得十分嚴峻,多部門都對此高度重視。
在全球范圍內(nèi),人均酒精消費量從1990年的5.9L增加到2017年的6.5L,未來還將持續(xù)增加。而人體血液中積累一定程度的酒精,但未及時分解排出體外時,便會影響大腦和中樞神經(jīng),致使神經(jīng)麻痹,大腦反應(yīng)滯后,身體不受控制等癥狀,在處理緊急情況時的反應(yīng)速度和控制能力會有些許下降,嚴重者喪失行動能力。而我國的酒文化歷史悠久,源遠流長,在世界上也是獨領(lǐng)風(fēng)騷,在接待貴賓,親朋好友相聚,酒水必不可少,隨之也帶來了一系列社會問題,例如酒后打架、醉酒駕駛引發(fā)交通事故等,酒后駕駛甚至被列為車禍致死的主要原因之一,一旦發(fā)生,將是一個甚至多個家庭的不幸,為了降低發(fā)生此類事情的概率,使更多人的生命財產(chǎn)安全得到保障,急需一種儀器來判斷駕駛員是否醉酒駕駛。
本文提出并設(shè)計了一種可以實時檢測呼出氣體的酒精含量,且超出設(shè)定值時會聲光報警的測試儀。本文詳細介紹了設(shè)計所提出的背景和研究意義,對于所用到的各個器件做了對比介紹,以及各個硬件電路模塊的工作原理,在軟件程序方面,對于各個模塊做了詳細的流程框圖,可以快速看出程序設(shè)計思路,最后列舉了硬軟件在設(shè)計調(diào)試所出現(xiàn)的一系列問題以及與之對應(yīng)的解決辦法。
1? 課題背景意義及研究內(nèi)容
1.1 課題背景及研究意義
此次畢業(yè)設(shè)計的課題是《基于單片機的酒精檢測儀》,是工程設(shè)計類的課題。
現(xiàn)如今,已全面步入信息化時代,電子設(shè)備充斥著我們生活的方方面面。帶來了巨大的便利,在實際生活中,酒精檢測儀也應(yīng)用于食品加工,釀酒,交通查酒駕等領(lǐng)域,平時見到最多的便是交警查酒駕,而最準確確定人體酒精濃度的方法是抽血化驗檢測,但是這種辦法操作過程過于繁瑣,技術(shù)難度相對較高。測量呼出的氣體來判斷氣體的酒精濃度相對較為實用,一個人在深呼吸2~4秒后,便會釋放出肺部深處的氣體,而血液中的酒精濃度與肺部的比值大致為1:2200,通過這種方式便可來推算人的飲酒量。
根據(jù)酒精檢測儀的原理,可以將其劃分為電化學(xué)、紅外、氣體色譜、比色、半導(dǎo)體型等五大類。受價格等因素的影響,半導(dǎo)體和電化學(xué)型的應(yīng)用較廣。目前,許多國家都使用呼氣酒精檢測儀在現(xiàn)場進行檢測,來判斷駕駛員是否飲酒。其中電化學(xué)型的穩(wěn)定性較好,精確度較高,且抗干擾性強,但是要求結(jié)構(gòu)較為精密,且制造困難,只有個別國家可以生產(chǎn),相反半導(dǎo)體類型的較為廉價,但性能不如燃料電池性的。
酒精檢測儀的現(xiàn)實意義在交通方面主要是可以解決社會上的車禍亂象,可以很大程度的減少車禍的發(fā)生,對道路出行多了一份安全保障,挽救了無數(shù)個家庭,同時也給國家做了巨大的貢獻,樹立了國家安全的良好形象,讓每一個人都能生活在一個良好的社會環(huán)境中,其次在其他如食品加工等領(lǐng)域,可以檢測生產(chǎn)產(chǎn)品的質(zhì)量以及確保生產(chǎn)安全。
1.2 課題研究內(nèi)容
設(shè)計要求:
(1)能對酒精含量進行測量和顯示,并顯示醉酒閾值;
(2)當酒精濃度大于醉酒閾值時,聲光報警;
(3)能夠顯示年、月、日、星期、時、分、秒。
2? 設(shè)計方案選擇
2.1 系統(tǒng)控制芯片選擇
方案一:選擇STC89C52單片機作為主控制芯片。該單片機是8位微控制器,有8K的程序存儲空間,有256個字節(jié)數(shù)據(jù)存儲空間,3個16位定時器/計數(shù)器,4個外部中斷,全雙工串行口,具有高速、低功耗、具有超強抗干擾性的特點,其指令代碼完全兼容8051,市場價格較為廉價,且具有靈活的編程方式。
方案二:選擇MSP430單片機作為主控制芯片。該單片機的匯編語言使用起來較為靈活,有許多尋址方式,且具有強大的處理能力,電壓低,功耗較低,片內(nèi)集成資源豐富,且加密性強,有強抗干擾能力。但是由于工作電壓低,接口電路麻煩,而且I/O口無保護,所以過壓電流會擊穿。其次不易上手,學(xué)習(xí)資料較少。
綜合以上的描述,鑒于STC89C52較為常用,市場上價格相對較低,設(shè)計開發(fā)難度較小,查找學(xué)習(xí)資料便捷,且此單片機已可滿足設(shè)計要求,因此選擇STC89C52作為主控制芯片。
2.2 顯示器件的選擇
方案一:使用LCD1602液晶顯示屏。該顯示屏可以直接和STC89C52直接接口,可顯示32個字符,因是字符型液晶,所以可以較為便捷地顯示字母和數(shù)字,且控制簡單,市場價格低廉,但是所顯示的字體大小不可隨意改動,對于曲線和圖形等也無法顯示。
方案二:使用LCD12864液晶顯示屏。該液晶顯示屏的各個顯示點都與一個二進制數(shù)對應(yīng),因此可自行設(shè)計輸出的圖形和漢字,分辨率較高,功耗較低,且輕薄,由于顯示信息量大,造成電路及程序的設(shè)計較為困難。
綜合以上方案,本設(shè)計主要顯示酒精含量、時間和日期,需要顯示的內(nèi)容較少,選用LCD1602為顯示屏,已可滿足設(shè)計要求,且該顯示屏價格低廉,在網(wǎng)絡(luò)上可查找資料較多,方便學(xué)習(xí)參考,設(shè)計難度相對較小。
2.3 A/D轉(zhuǎn)換芯片的選擇
方案一:采用ADC0832作為模數(shù)轉(zhuǎn)換器件。該芯片是雙通道的模數(shù)轉(zhuǎn)換芯片,在0~5V的電壓下可以正常工作,采用250KHZ的頻率,采用雙輸出方式對數(shù)據(jù)進行嚴格的校對,可有效減少芯片的數(shù)據(jù)錯誤,并具有較好的穩(wěn)定性。獨立的允許輸入模式使得多個設(shè)備的安裝和控制過程更加方便。
方案二:采用ADC0808作為A/D轉(zhuǎn)換器件。該芯片是ADC0809的簡化版,功能大致相同,ADC0808是采樣分辨率為8位的、以逐次逼近原理進行模/數(shù)轉(zhuǎn)換的器件。
這兩種設(shè)備的基本性能相似,因為本次設(shè)計只需一個通道,所以使用ADC0832芯片已可滿足需求,可節(jié)省資源,且此芯片兼容性好,較為劃算。
2.4 酒精檢測傳感器的選擇
半導(dǎo)體型的酒精傳感器MQ-3所處環(huán)境中含有酒精蒸氣時,當乙醇氣體濃度增大時,傳感器的導(dǎo)電性能也隨之提高,接著將檢測到的酒精含量轉(zhuǎn)化為電信號,可以得到關(guān)于周圍環(huán)境中被測氣體狀態(tài)的信息。MQ-3對酒精較為敏感,以及有較強的抗干擾能力,對于油煙水汽有較強的抵抗性,且市場價格較低,適用于多種應(yīng)用,最終方案選擇MQ-3酒精傳感器。
2.5 時鐘芯片的選擇
DS1302時鐘芯片可提供時間等信息,在2V~5.5V之間可以正常工作,具備主電源后備電源雙電源引腳,1腳為主電源接口,8腳作為后備電源接口,可搭配紐扣電池做后備電源,以極低的消耗可保持時鐘運行很長時間,運行時間可達到幾個月甚至幾年,即使斷電后再次上電使用設(shè)備也可做到時間同步標準時間。雖然單片機內(nèi)部也有定時器,但它是對單片機工作節(jié)拍的技術(shù)的精確度較高,但不適合長時間定時。相比之下,選擇DS1302做時鐘芯片更能滿足課題要求。
2.6 系統(tǒng)整體設(shè)計方案
結(jié)合上面選擇的解決方案,確定了總體系統(tǒng)框圖,如圖2-1所示。
圖2-1 總體系統(tǒng)框圖
最終將STC89C52單片機作為系統(tǒng)的主控芯片,人機交互通過獨立按鍵和LCD1602液晶顯示屏來實現(xiàn),并可通過獨立按鍵來設(shè)定醉酒閾值,調(diào)節(jié)時間顯示,與標準時間同步。使用MQ-3酒精傳感器來得到電信號,經(jīng)過電路處理成模擬電壓后輸送給單片機,經(jīng)ADC0832轉(zhuǎn)換器件轉(zhuǎn)化為數(shù)字電壓。模擬信號由A/D轉(zhuǎn)換模塊輸出,用于檢測酒精的濃度,從而降低設(shè)備的使用。將所獲得的數(shù)據(jù)與預(yù)先設(shè)置的醉酒閾值進行比較,超過設(shè)定值值時,LED亮,同時蜂鳴器發(fā)出報警聲。整個電路包括:最小MCU,時鐘,功能按鍵,LCD液晶四大部分。該供電模塊由一個濾波電容,一個自鎖開關(guān),一個LED顯示,可5V直流供電,供電給各模塊;由LCD1602液晶顯示屏和可調(diào)電阻器組成液晶顯示模塊。
3? 系統(tǒng)硬件設(shè)計
3.1 單片機最小系統(tǒng)
3.1.1單片機STC89C52
STC89C52單片機完全兼容8051,該單片機共有四組I/O口,全部提供給用戶(程序長度小于4K)分別是P0、P1、P2、P3。有6個中斷源,3個16位的定時/計數(shù)器,片內(nèi)振蕩器和時鐘電路在5.5V~3.8V之間可正常工作,11.0592MHz和12MHz是常用的時鐘工作頻率,安全性高,功耗低,運行速度快,性能卓越,且市場價格便宜,在多個領(lǐng)域都有應(yīng)用。
3.1.2單片機最小系統(tǒng)
單片機最小系統(tǒng)電路如圖3-1所示
圖3-1 單片機最小系統(tǒng)
該產(chǎn)品采用STC89C52微控制器,以單片機為控制核心,配合晶振、電源、復(fù)位電路,具有優(yōu)異的性能、較低功耗、充分開放的系統(tǒng)資源、靈活的界面,使用者可以通過自己的方式構(gòu)建電路,實現(xiàn)各種功能。在晶振電路中,通常可以選擇1.2-12MHz,甚至24MHz,功率隨著頻率的增大而增大。此次采用了2個30pF陶瓷電容器,12MHz的晶振。
MCS-52單片機通常采用上電復(fù)位和按鍵復(fù)位這兩種復(fù)位方式[1]。RST的上方為一電容,并接一高電平,下方為一個電阻,并接地。在通電的情況下,電容器的兩端就會產(chǎn)生短路,RST管腳就會變成高電平,電源就會對電容充電,RST端的電壓就會緩慢地降低,直到達到一定的水平,單片機才能正常工作。
本設(shè)計改用了USB接口5V供電,通過一雙擲開關(guān)來控制電源的關(guān)斷,可連接充電寶或者手機充電器等,方便攜帶使用,其電路如圖3-2所示。
圖3-2 電源接口電路
3.2 MQ-3酒精氣體傳感器
MQ-3是一種半導(dǎo)體酒精感應(yīng)器,當被測環(huán)境中含有酒精氣體時,該傳感器的導(dǎo)電性會隨著被測環(huán)境中的酒精氣體的濃度而發(fā)生變化,接著通過特定的電路,便可將傳感器的電導(dǎo)率轉(zhuǎn)化為一定的氣體濃度的信號,MQ-3酒精感應(yīng)器對酒精的敏感度很高,能夠抵抗汽油,煙霧,水蒸氣等。傳感器在充電時,輸出電壓會迅速升高,當達到一定的溫度后便會緩慢的下降,因此在使用之前,要先對傳感器進行預(yù)熱1-2分鐘,這樣就可以保證傳感器的正常工作。被測環(huán)境中的酒精濃度與傳感器輸出電壓有著一定的關(guān)系,在無酒精氣體的環(huán)境中,傳感器的輸出電壓大約為1V,在有酒精氣體的環(huán)境中,每提高20 PPM (2毫克/100毫升)的酒精濃度,傳感器的電壓提高0.1V,該模塊內(nèi)部電路圖如圖3-3所示。
圖3-3 MQ-3酒精檢測模塊內(nèi)部電路圖
3.3 ADC0832電路設(shè)計
ADC0832是一款雙通道的A/D轉(zhuǎn)換芯片,該芯片的模擬輸入電壓范圍為0-5V,基于有雙輸出的數(shù)據(jù),可以進行數(shù)據(jù)的校驗,從而降低了數(shù)據(jù)的錯誤,具有較高的轉(zhuǎn)換速度和較好的穩(wěn)定性。獨立的晶片允許輸入,使得多個裝置的連接與處理單元的控制更為便利。利用DI的數(shù)據(jù)輸入,可以較為方便地進行信道功能的選取。如果ADC0832不工作,則其CS輸入為高電平,此時,可將此芯片關(guān)閉,CLK及 DO/DI可供選擇。與單片機的接口應(yīng)為CS、CLK、DO、DI四條數(shù)據(jù)線路.由于DO和DI在通信過程中不能同時進行,并且與單片機之間的接口也是雙向的,所以在電路上,DO和DI并聯(lián)為一條數(shù)據(jù)線。圖3-4顯示了特定的電路。
圖3-4 ADC0832電路圖
3.4 時鐘電路設(shè)計
在DS1302時鐘電路中,管腳1用作主電源接口,管腳8提供低功率和低功耗的情況下的備用電源接口,當主電源斷電時,Vccl可保證其正常工作,保存資料,保持時鐘的正常運轉(zhuǎn),做到時間同步。并外加頻率為32.768Hz晶振,提高時鐘的穩(wěn)定性。圖3-5為本設(shè)計的時鐘電路。
圖3-5 時鐘電路
3.5 報警電路設(shè)計
經(jīng)A/D轉(zhuǎn)換后所得的數(shù)字信號若比所設(shè)的閾值大,單片機的P2.3口輸出低電平,此口與報警電路相連,當其為低電時,三極管導(dǎo)通,蜂鳴器通電,發(fā)出蜂鳴聲,若為高電平時,三極管無法導(dǎo)通,保持靜默。蜂鳴器報警電路如圖3-6所示。
圖3-6 報警模塊電路圖
3.6 功能按鍵模塊
在按鍵上,一般采用獨立的按鍵和矩陣的方式,各有利弊,而單獨的按鍵電路則比較簡單,編程也比較方便,一般用于一些簡單的硬件電路。矩陣電路恰恰相反,編寫程序不易,與獨立按鍵相比更加節(jié)省IO口,多用于8個按鍵以上的硬件電路。本設(shè)計只需四個按鍵,因此該方案采用了獨立按鍵電路,采用了多個單獨的按鍵進行人機對話。通過按鍵操作,向系統(tǒng)發(fā)出操作指令,再與MCU進行串口通訊,顯示在液晶顯示屏上,按鍵的一端與單片機的輸入/輸出端口相連。
這個設(shè)計是因為在懸置狀態(tài)下,單片機的I/O是置1,不按按鍵的話,I/O就等于懸空,按下按鈕后,此端口的電壓會降低,單片機可以根據(jù)輸入/輸出接口是否存在低電平來判定是否按下了按鈕,當然,該按鍵使用的是金屬開鎖,會出現(xiàn)抖動,因此在程序中要加上一個延遲消除。此外,再按下按鍵時會產(chǎn)生抖動,所以在程序中要加一個延遲消除程序。三個按鍵的功能分別是:按鍵2按下后進入設(shè)置模式,可以選擇需要調(diào)節(jié)的參數(shù),可連續(xù)選擇。在設(shè)置的模式下,按鍵2按下后,對應(yīng)的參數(shù)加一,按鍵3按下后對應(yīng)參數(shù)減一。功能按鍵電路如圖3-7所示。
圖3-7 功能按鍵電路
3.7 LCD1602液晶顯示模塊
顯示LCD1602總共有11個指令,通過MCU將其傳輸?shù)絃CD1602中,可以實現(xiàn)諸如屏幕清屏、切換、顯示等功能。LCD1602本身就有一個字庫,可以在顯示的時候直接調(diào)用字庫來顯示,當然,如果字庫里沒有的字符也可以按照自己的要求寫在CGROM里,比如5*8個字符,但是定制的字符數(shù)量是有限制的,所以要按照一定的順序來設(shè)置,最多可以設(shè)置8個字符。在LCD的CGROM中寫入定制的字符之后,可以任意調(diào)用,調(diào)用方法與普通的顯示字符相同。通過讀狀態(tài)操作、寫指令操作、讀數(shù)據(jù)操作可以控制液晶顯示器,其中寫數(shù)據(jù)操作有固定的對應(yīng)引腳電平。電路圖如圖3-8所示。
圖3-8 液晶顯示電路
4? 系統(tǒng)軟件設(shè)計
4.1 程序語言及軟件開發(fā)環(huán)境
本課題的編寫涉及到軟體的編程,所以必須選用程式語言和軟體的開發(fā)環(huán)境。在編程語言上,選擇了C。C語言是一種面向過程、抽象的通用編程語言??梢哉f,這是一種具有兩種語言特性的語言,同時也是一個優(yōu)秀的程序設(shè)計工具,可以使用模塊化的方法編寫代碼,方便調(diào)試,同時,C語言還具有很強的數(shù)據(jù)處理能力,可根據(jù)不同的指針,直接對硬件進行訪問,從而實現(xiàn)對存儲和硬件的訪問。
KeilC51是一個可以兼容51系列單片機和C的軟件開發(fā)平臺,與C語言的編程十分契合,它的集成環(huán)境簡單、方便,軟件調(diào)試的功能強大,大大增加了程序的成功概率。而Proteus則是一個EDA的開發(fā)工具,可以通過計算機模擬單片機的電路來模擬實際的工作狀況。通過對系統(tǒng)的模擬,可以對系統(tǒng)的整體功能進行檢驗。
4.2 主函數(shù)的設(shè)計
程序開始運行后,LCD1602液晶顯示器和定時器開始初始化,單片機開始讀取EEPROM存儲的限制數(shù)據(jù),接著判斷一分鐘預(yù)熱是否完成,保障傳感器可以正常工作,預(yù)熱完成后,程序要檢測是否有按鍵按下,若按下便進行數(shù)據(jù)處理,并判斷顯示是否正常,若不正常則跳到顯示界面,正常則繼續(xù)下一步,單片機讀取經(jīng)A/D轉(zhuǎn)換后的數(shù)字信號,并發(fā)送給液晶顯示器,最終顯示出酒精濃度。系統(tǒng)框圖如圖4-1所示。
圖4-1 系統(tǒng)程序流程圖
4.3 LCD1602顯示程序
LCD1602的顯示只要嚴格按照生產(chǎn)廠商的時間順序進行程序設(shè)計即可實現(xiàn)。顯示器首先要用指令寫出要顯示的位置,再按照一定的順序?qū)懴聰?shù)據(jù)。在第一次寫時,會自動增加一個地址。參數(shù)為x,y,*s,其中的x,y表示在液晶顯示屏上的位置坐標,*s是需要顯示的字符數(shù)組。軟件通過所輸入的坐標來確定所要顯示的地址。具體的流程圖如圖4-2所示。
4.4 ADC0832轉(zhuǎn)換函數(shù)的設(shè)計
單片機控制ADC0832采集電壓,首先要發(fā)送初始化信號,接著選擇需要采集的通道,選擇完通道后單片機發(fā)送下降沿開始讀數(shù)據(jù),數(shù)據(jù)是一位位的串行傳輸并且高位在前,低位在后,直到將八位數(shù)據(jù)都采集完畢后將采集到的數(shù)據(jù)返回。具體流程圖如圖4-3所示。
5? 系統(tǒng)調(diào)試
5.1 系統(tǒng)軟件調(diào)試
此次課題是基于單片機的酒精檢測儀,設(shè)計主要要求是檢測酒精濃度,超出閾值便聲光報警,隨后查找參考文獻及學(xué)習(xí)資料,了解所使用元器件的功能和使用原理,開始設(shè)計電路,將設(shè)計好的電路在Proteus仿真軟件上畫好仿真原理圖,模擬各個模塊的功能,其中使用一個滑動變阻器來模擬酒精傳感器的變化。
使用Keil uVision4軟件編寫程序,主要采用模塊化的方式,編寫出各個模塊的功能子函數(shù),再將寫好的子函數(shù)調(diào)用到主函數(shù)中,一步步的完善編程,全部寫完后,編譯沒有報錯,然后生成hex文件,打開仿真軟件燒錄進單片機檢查功能是否正確,在仿真時發(fā)現(xiàn)液晶顯示屏不顯示,按下按鍵也不能顯示出文字字母,以為是LCD602液晶顯示模塊電路畫錯,在查找資料對比后發(fā)現(xiàn)無誤,又仔細其檢查代碼,發(fā)現(xiàn)有一兩個控制端的定義出錯,修改后重新編譯生成hex文件,重新下載后測試成功顯示,之后又發(fā)現(xiàn)星期顯示往右偏移導(dǎo)致不完整顯示,又仔細查找LCD1602的相關(guān)資料,考慮是顯示位置語句的參數(shù)未設(shè)置好,修改后變的正常,要計算好每條信息的位置,利用好顯示屏的空間,使得參數(shù)可以完整顯示。
5.2 硬件制作與調(diào)試
原理圖的繪制主要使用的軟件是AD15,一些器件的封裝不在現(xiàn)有的器件封裝庫中,需查找相關(guān)器件的封裝資料,畫好所需要的全部器件封裝后,將事先設(shè)計好的電路圖繪制出來,畫出各個模塊后使用網(wǎng)絡(luò)標號連接,之后導(dǎo)入pcb,發(fā)現(xiàn)通過網(wǎng)絡(luò)標號連接的電路,pcb中并未連接,經(jīng)檢查發(fā)現(xiàn)是芯片引腳引出來的線用錯,修改后再次導(dǎo)入,開始繪制pcb,布局始終遵循緊湊的原則,線寬盡量不要太細,防止后續(xù)腐蝕時出現(xiàn)斷路短路,安全距離盡量大一些,焊盤大小在不影響其他引腳的情況下,盡可能的大一點,方便后續(xù)鉆孔,防止將焊盤打掉造成器件無法焊接,接著將電路圖打印在熱轉(zhuǎn)印紙上,通過熨斗印在腐蝕板上,接著通過腐蝕劑等進行手工制板,打完孔后使用數(shù)字萬用表的蜂鳴檔測量地線、電源線和信號線是否連通,焊接時先焊小器件,再焊大器件,使成品更加美觀。
焊接完成后,對未插芯片的板子進行測試,防止因電壓過高而燒壞芯片,并檢查是否有缺焊漏焊,接著使用數(shù)字萬用表的直流電壓檔測量芯片插座處的電壓,發(fā)現(xiàn)STC89C52單片機的20引腳和40引腳電壓為4.9V,LCD1602液晶顯示屏的1腳和16腳電壓為4.9V,DS1302時鐘芯片的1腳和4腳的電壓為4.8V,均在可正常工作電壓范圍內(nèi),可將芯片插上。
接著將單片機和電腦相連,使用STC-ISP燒錄軟件將程序燒錄進單片機芯片中,之后在板子上插上芯片上電后,撥動雙擲開關(guān)看到電源指示燈亮起,液晶顯示器可以正常顯示,顯示年、月、日、周、時、分、秒,并開始初始化一分鐘倒計時,演示圖如圖5-1所示。
圖5-1 上電初始化演示圖
但在使用過程中有時顯示亂碼,考慮到有時使用是沒問題的,猜測是工作不穩(wěn)定,可能是寫代碼的時序太快,致使LCD工作不穩(wěn)定,查找資料后在寫指令時加一些延時,試了幾次后恢復(fù)正常,之后也正常使用。調(diào)節(jié)好時間后拔掉電源,過一段時間后再次連通電源,發(fā)現(xiàn)時間仍與實際時間同步,表明時鐘芯片使用的后備電源生效。通過按鍵來調(diào)節(jié)時間和設(shè)置酒精閾值,具體的演示圖如圖5-2所示。
當檢測環(huán)境中的酒精含量超過了規(guī)定的酒精閾值,則LED燈將點亮,蜂鳴器會持續(xù)地發(fā)出聲音,LCD屏幕將會實時顯示被檢測的環(huán)境中的酒精含量,當檢測到的酒精含量超過規(guī)定范圍時,光亮和聲音將會自動關(guān)閉,將一瓶酒精湊到MQ-3酒精傳感器前,因酒精濃度較高,顯示屏所顯示數(shù)值會迅速升高,拿開酒精后,會慢慢下降直至清零,演示圖如圖5-3所示。
部分程序展示:
sbit led???? = P1^7;
sbit buzz??? = P1^6;
sbit key_set = P1^0;
sbit key_jia = P1^1;
sbit key_jian= P1^2;
/*********************全局變量定義***************************/
#define K_MG_MV 2
#define IN_V 500
long ALValue;
uchar K_ZERO;
uint jiujia_up;
uint? set_f;
uchar num;
/********************************************************
函數(shù)名稱:void display1()
函數(shù)作用:顯示實際濃度值
參數(shù)說明:
********************************************************/
void display1()
{
uchar xq;
xq=GetWeekDay(time[6],time[4],time[3]);
switch(xq)
{
case 1:lcd1602_write_character(11,1,"Mon"); break;
case 2:lcd1602_write_character(10,1,"Tues"); break;
case 3:lcd1602_write_character(9,1,"Wednes"); break;
case 4:lcd1602_write_character(10,1,"Thurs"); break;
case 5:lcd1602_write_character(10,1,"Frid"); break;
case 6:lcd1602_write_character(10,1,"Satur"); break;
case 7:lcd1602_write_character(11,1,"Sun"); break;
default: break;
}
//顯示時間
LCD_disp_char(0,2,ASCII[time[2]/10]);
LCD_disp_char(1,2,ASCII[time[2]%10]);
LCD_disp_char(2,2,':');
LCD_disp_char(3,2,ASCII[time[1]/10]);
LCD_disp_char(4,2,ASCII[time[1]%10]);
LCD_disp_char(5,2,':');
LCD_disp_char(6,2,ASCII[time[0]/10]);
LCD_disp_char(7,2,ASCII[time[0]%10]);
LCD_disp_char(0,1,ASCII[time[6]/10]);
LCD_disp_char(1,1,ASCII[time[6]%10]);
LCD_disp_char(2,1,'/');
LCD_disp_char(3,1,ASCII[time[4]/10]);
LCD_disp_char(4,1,ASCII[time[4]%10]);
LCD_disp_char(5,1,'/');
LCD_disp_char(6,1,ASCII[time[3]/10]);
LCD_disp_char(7,1,ASCII[time[3]%10]);
if(wait_f==1)
{
if(K_ZERO>ADC_date)
K_ZERO=ADC_date;
if(ADC_date>K_ZERO)
ALValue=(long)IN_V*(ADC_date-K_ZERO)/255;
else
ALValue=0;
if(ALValue<0)
ALValue=0;
ALValue=ALValue*K_MG_MV;
if(ALValue<30)
ALValue=0;
else
ALValue=ALValue-30;
LCD_disp_char(11,2,ASCII[ALValue/100]);??? //顯示實際濃度值
LCD_disp_char(12,2,ASCII[ALValue%100/10]);
LCD_disp_char(13,2,ASCII[ALValue%10]);
if(jiujia_up<=ALValue)
{
led=0;
buzz=0;
}
else
{
led=1;
buzz=1;
}
}
else
{
LCD_disp_char(11,2,ASCII[(60-time2)/10]);
LCD_disp_char(12,2,ASCII[(60-time2)%10]);
LCD_disp_char(13,2,'S');
ADC0832_read(0);
K_ZERO=ADC_date;
}
}
/********************************************************
函數(shù)名稱:void display2(void)
函數(shù)作用:顯示設(shè)置時醉酒上限值
參數(shù)說明:
********************************************************/
void display2(void)
{
lcd1602_write_character(0,1,"Set AlcoholLimit");
LCD_disp_char(2,2,ASCII[jiujia_up/100]);
LCD_disp_char(3,2,ASCII[jiujia_up%100/10]);
LCD_disp_char(4,2,ASCII[jiujia_up%10]);
lcd1602_write_character(5,2,"mg/100ml"); }
/********************************************************
函數(shù)名稱:void display3()
函數(shù)作用:顯示調(diào)整日期、時間函數(shù)
參數(shù)說明:
********************************************************/
void display3()
{
num++;
lcd1602_write_character(1,1,"Date:");
lcd1602_write_character(1,2,"Time:");
if(num%2==0)
{
LCD_disp_char(6,1,ASCII[time[6]/10]);
LCD_disp_char(7,1,ASCII[time[6]%10]);
LCD_disp_char(8,1,'/');
LCD_disp_char(9,1,ASCII[time[4]/10]);
LCD_disp_char(10,1,ASCII[time[4]%10]);
LCD_disp_char(11,1,'/');
LCD_disp_char(12,1,ASCII[time[3]/10]);
LCD_disp_char(13,1,ASCII[time[3]%10]);
LCD_disp_char(6,2,ASCII[time[2]/10]);
LCD_disp_char(7,2,ASCII[time[2]%10]);
LCD_disp_char(8,2,':');
LCD_disp_char(9,2,ASCII[time[1]/10]);
LCD_disp_char(10,2,ASCII[time[1]%10]);
LCD_disp_char(11,2,':');
LCD_disp_char(12,2,ASCII[time[0]/10]);
LCD_disp_char(13,2,ASCII[time[0]%10]);
}
else
{
switch(set_f)
{
case 2: lcd1602_write_character(6,1,"? "); break;
case 3: lcd1602_write_character(9,1,"? "); break;
case 4: lcd1602_write_character(12,1,"? "); break;
case 5: lcd1602_write_character(6,2,"? "); break;
case 6: lcd1602_write_character(9,2,"? "); break;
case 7: lcd1602_write_character(12,2,"? "); break;
default: break;
}
}
}
內(nèi)容包括:
需要完整的資料可在我的資源里下載,也可以加入我的紛傳圈子,里面有資源壓縮包的百度網(wǎng)盤下載地址及提取碼。
紛傳點擊打開即可看到。