歡迎光臨~深圳市兆為科技有限公司官方網(wǎng)站!
語(yǔ)言選擇:繁體中文 English

行業(yè)咨詢(xún)

單片機(jī)酒精濃度測(cè)試儀設(shè)計(jì)報(bào)告 含源碼與電路原理圖

發(fā)布時(shí)間:2019-07-17 18:50:37
單片機(jī)酒精濃度測(cè)試儀設(shè)計(jì)報(bào)告 含源碼與電路原理圖
一、設(shè)計(jì)意義
二、硬件設(shè)計(jì)
1、設(shè)計(jì)框圖
2、乙醇信號(hào)檢測(cè)及調(diào)理電路
3、單片機(jī)電路
4、顯示電路
5、供電及程序下載電路
三、Protel硬件開(kāi)發(fā)軟件
1.Protel軟件組成
2.PCB板設(shè)計(jì)
四、軟件編程
1、軟件流程圖
2、主程序
五、下載與調(diào)試
1、USB轉(zhuǎn)串口驅(qū)動(dòng)安裝
2、下載程序
參考文獻(xiàn)
程序
一、設(shè)計(jì)意義
自《道路交通安全法》正式實(shí)施,“醉酒駕駛”正式入刑。不僅交警部門(mén),而且很多車(chē)主都期盼能夠有便攜儀器方便地測(cè)量氣體酒精濃度,為安全駕駛提供保障,有效減少重大交通事故的發(fā)生。
本研究設(shè)計(jì)的酒精濃度測(cè)試儀是一款實(shí)用性強(qiáng)、安全可靠的氣體乙醇濃度檢測(cè)工具,采用高精度MQ-3乙醇?xì)怏w傳感器對(duì)空氣中的乙醇濃度進(jìn)行檢測(cè),利用宏晶公司高性能低成本單片機(jī)STC89C52對(duì)檢測(cè)信號(hào)進(jìn)行A/D轉(zhuǎn)換和處理,最后通過(guò)液晶屏顯示輸出。本研究設(shè)計(jì)的酒精濃度測(cè)試儀還具有醉酒閾值設(shè)定功能,可以根據(jù)法律法規(guī)或用戶(hù)需要設(shè)定修改醉酒閾值,并進(jìn)行保存。
二、硬件設(shè)計(jì)
1、設(shè)計(jì)框圖
本研究設(shè)計(jì)的酒精濃度測(cè)試儀框圖如圖1所示。MQ-3乙醇?xì)怏w傳感器輸出信號(hào)經(jīng)信號(hào)調(diào)理電路處理,輸出隨乙醇濃度變化的電壓信號(hào),該電壓信號(hào)送入單片機(jī)系統(tǒng),經(jīng)AD轉(zhuǎn)換,與設(shè)定的醉酒閾值進(jìn)行比較,并顯示或報(bào)警。
圖1酒精濃度測(cè)試儀方框圖
2、乙醇信號(hào)檢測(cè)及調(diào)理電路
MQ-3乙醇?xì)怏w傳感器可以應(yīng)用用于機(jī)動(dòng)車(chē)駕駛?cè)藛T及其他嚴(yán)禁酒后作業(yè)人員的現(xiàn)場(chǎng)檢測(cè),也用于其他場(chǎng)所乙醇蒸汽的檢測(cè)。其技術(shù)特點(diǎn)為:
對(duì)乙醇蒸汽有很高的靈敏度和良好的選擇性
快速的響應(yīng)恢復(fù)特性
長(zhǎng)期的壽命和可靠的穩(wěn)定性
簡(jiǎn)單的驅(qū)動(dòng)回路
主要技術(shù)指標(biāo):
MQ-3乙醇?xì)怏w傳感器靈敏度曲線(xiàn)如圖2所示,其傳感原理為氣敏電阻的輸出阻值隨乙醇?xì)怏w等濃度變化而變化。
圖2MQ-3乙醇?xì)怏w傳感器靈敏度曲線(xiàn)
MQ-3乙醇?xì)怏w傳感器管腳與測(cè)試電路如圖3所示。
(a)管腳圖(b)測(cè)試電路
圖3MQ-3乙醇?xì)怏w傳感器管腳及測(cè)試電路
MQ-3乙醇?xì)怏w傳感器及其調(diào)理電路原理如圖4所示。其外形如圖5所示。經(jīng)過(guò)調(diào)理,檢測(cè)信號(hào)由電阻值轉(zhuǎn)變成電壓值,便于后續(xù)電路進(jìn)行A/D轉(zhuǎn)換和處理。
圖4傳感器及調(diào)理模塊原理圖
該傳感器模塊具有如下特點(diǎn),方便與單片機(jī)系統(tǒng)接口組成檢測(cè)儀器。
具有信號(hào)輸出指示。
雙路信號(hào)輸出(模擬量輸出及TTL電平輸出)
TTL輸出有效信號(hào)為低電平。
(當(dāng)輸出低電平時(shí)信號(hào)燈亮,可直接接單片機(jī))
模擬量輸出0~5V電壓,濃度越高電壓越高。
3、單片機(jī)電路
本設(shè)計(jì)選用宏晶公司高性能單片機(jī)STC89C52,其管腳如圖6所示。
圖6STC89C52單片機(jī)管腳圖
該芯片為52內(nèi)核8位單片機(jī),適用于常用檢測(cè)電路。由STC89C52組成的單片機(jī)系統(tǒng)原理圖如圖7所示。圖中AOUT為MQ-3傳感器模塊輸出的檢測(cè)電壓信號(hào),送入ADC0832采集芯片端口進(jìn)行處理,該信號(hào)可以根據(jù)乙醇?xì)怏w濃度直接輸出報(bào)警信號(hào),報(bào)警閾值通過(guò)模塊上的電位器進(jìn)行調(diào)節(jié)。
圖7單片機(jī)系統(tǒng)原理圖
圖7中,按鍵K2和K3為醉酒閾值調(diào)整鍵,其中K2為“增加”,K3為“減小”按鍵。L2和L3為報(bào)警指示燈,分別可以進(jìn)行酒后和醉酒兩級(jí)報(bào)警。
4、顯示電路
顯示部分采用SMC1602液晶屏進(jìn)行數(shù)據(jù)顯示,其主要技術(shù)參數(shù)為:
表1液晶屏技術(shù)指標(biāo)
接口信號(hào)說(shuō)明如表2所示。
表2液晶屏接口信號(hào)說(shuō)明
與單片機(jī)接口電路如圖8所示。其中J2的3腳為背光引腳,R9和R10電阻用于調(diào)節(jié)背光亮度。J2的4、5、6引腳分別接液晶的RS、E/W和E控制引腳,J2的7—14引腳為數(shù)據(jù)引腳。
圖8LCD與單片機(jī)接口電路
5、供電及程序下載電路
本設(shè)計(jì)采用電池盒接口供電,電源電壓5V。同時(shí),其電路原理如圖10所示。
圖10供電及程序下載電路
三、Protel硬件開(kāi)發(fā)軟件
Protel是目前國(guó)內(nèi)最流行的通用EDA軟件,它是將電路原理圖設(shè)計(jì)、PCB板圖設(shè)計(jì)、電路仿真和PLD設(shè)計(jì)等多個(gè)實(shí)用工具軟件組合后構(gòu)成的EDA工作平臺(tái),是第一個(gè)將EDA軟件設(shè)計(jì)成基于Windows的普及型產(chǎn)品。它集成了軟件界面、仿真功能和PLD設(shè)計(jì)和信號(hào)完整性分析,在此基礎(chǔ)上Protel99SE又增加了一些新的功能,用戶(hù)使用更加方便靈活。Protel的功能十分強(qiáng)大,在電子電路設(shè)計(jì)領(lǐng)域占有極其重要的地位。它以其強(qiáng)大功能和實(shí)用性,逐漸獲得廣大硬件設(shè)計(jì)人員的青睞,是目前眾多EDA設(shè)計(jì)軟件中用戶(hù)最多的產(chǎn)品之一。
1.Protel軟件組成
Protel軟件主要由電路原理圖設(shè)計(jì)模塊、印制電路板設(shè)計(jì)模塊(PCB設(shè)計(jì)模塊)、電路信號(hào)仿真模塊和PLD邏輯器件設(shè)計(jì)模塊等組成,各模塊具有強(qiáng)大的功能,可以很好的實(shí)現(xiàn)電路設(shè)計(jì)與分析。
(1)原理圖設(shè)計(jì)模塊(Schematic模塊)
電路原理圖是表示電氣產(chǎn)品或電路工作原理的重要技術(shù)文件,電路原理圖主要由代表各種電子器件的圖形符號(hào)、線(xiàn)路和結(jié)點(diǎn)組成。圖4.1所示為一張電路原理圖。該原理圖是由Schematic模塊設(shè)計(jì)完成的。Schematic模塊具有如下功能:豐富而靈活的編輯功能、在線(xiàn)庫(kù)編輯及完善的庫(kù)管理功能、強(qiáng)大的設(shè)計(jì)自動(dòng)化功能、支持層次化設(shè)計(jì)功能等。
(2)印制電路板設(shè)計(jì)模塊(PCB設(shè)計(jì)模塊)
印制電路板(PCB)制板圖是由電路原理圖到制作電路板的橋梁。設(shè)計(jì)了電路原理圖后,需要根據(jù)原理圖生設(shè)計(jì)成印制電路板的制板圖,然后在根據(jù)制板圖制作具體的電路板。印制電路板設(shè)計(jì)模塊具有如下主要功能和特點(diǎn):可完成復(fù)雜印制電路板(PCB)的設(shè)計(jì);方便而又靈活的編輯功能;強(qiáng)大的設(shè)計(jì)自動(dòng)化功能;在線(xiàn)式庫(kù)編輯及完善的庫(kù)管理;完備的輸出系統(tǒng)等。
(3)電路信號(hào)仿真模塊
電路信號(hào)仿真模塊是一個(gè)功能強(qiáng)大的數(shù)字/模擬混合信號(hào)電路仿真器,能提供連續(xù)的模擬信號(hào)和離散的數(shù)字信號(hào)仿真。它運(yùn)行在Protel的EDA/Client集成環(huán)境下,與ProtelAdvancedSchematic原理圖輸入程序協(xié)同工作,作為AdvancedSchematic的擴(kuò)展,為用戶(hù)提供了一個(gè)完整的從設(shè)計(jì)到驗(yàn)證仿真設(shè)計(jì)環(huán)境。
在Protel中進(jìn)行仿真,只需從仿真用元器件庫(kù)中放置所需的元器件,連接好原理圖,加上激勵(lì)源,然后單擊防真按鈕即可自動(dòng)開(kāi)始。
2.PCB板設(shè)計(jì)
(1)定元件的封裝
①打開(kāi)網(wǎng)絡(luò)表(可以利用一些編輯器輔助編輯),將所有封裝瀏覽一遍,確保所有元件的封裝都正確無(wú)誤并且元件庫(kù)中包含所有元件的封裝,網(wǎng)絡(luò)表中所有信息全部大寫(xiě),一面載入出問(wèn)題,或PCBBOM不連續(xù)。
②標(biāo)準(zhǔn)元件全部采用公司統(tǒng)一元件庫(kù)中的封裝。
③④⑥⑤元件庫(kù)中不存在的封裝,應(yīng)自己建立元器件庫(kù)。
(2)建立PCB板框
①根據(jù)PCB結(jié)構(gòu)圖,或相應(yīng)的模板建立PCB文件,包括安裝孔、禁布區(qū)等相關(guān)信息。
②尺寸標(biāo)注。在鉆孔層中應(yīng)標(biāo)明PCB的精確結(jié)構(gòu),且不可以形成封閉尺寸標(biāo)注。
(3)載入網(wǎng)絡(luò)表
①載入網(wǎng)表并排除所有載入問(wèn)題,具體請(qǐng)看《PROTEL技術(shù)大全》。其他軟件載入問(wèn)題有很多相似之處,可以借鑒。
②如果使用PROTEL,網(wǎng)表須載入兩次以上(沒(méi)有任何提示信息)才可以確認(rèn)載入無(wú)誤。
(4)布局
①首先要確定參考點(diǎn)。
一般參考點(diǎn)都設(shè)置在左邊和底邊的邊框線(xiàn)的交點(diǎn)(或延長(zhǎng)線(xiàn)的交點(diǎn))上或印制板的插件的第一個(gè)焊盤(pán)。
②一但參考點(diǎn)確定以后,元件布局、布線(xiàn)均以此參考點(diǎn)為準(zhǔn)。布局推薦使用25MIL網(wǎng)格。
③根據(jù)要求先將所有有定位要求的元件固定并鎖定。
④布局的基本原則
A.遵循先難后易、先大后小的原則。
B.布局可以參考硬件工程師提供的原理圖和大致的布局,根據(jù)信號(hào)流向規(guī)律放置主要原器件。
C.總的連線(xiàn)盡可能的短,關(guān)鍵信號(hào)線(xiàn)最短。
D.強(qiáng)信號(hào)、弱信號(hào)、高電壓信號(hào)和弱電壓信號(hào)要完全分開(kāi)。
E.高頻元件間隔要充分。
F.模擬信號(hào)、數(shù)字信號(hào)分開(kāi)。
⑤相同結(jié)構(gòu)電路部分應(yīng)盡可能采取對(duì)稱(chēng)布局。
⑥按照均勻分布、重心平衡、版面美觀(guān)的標(biāo)準(zhǔn)來(lái)優(yōu)化布局。
(5)PCB設(shè)計(jì)遵循的規(guī)則
①地線(xiàn)回路規(guī)則:
圖11地線(xiàn)回路規(guī)則
環(huán)路最小規(guī)則,即信號(hào)線(xiàn)與其回路構(gòu)成的環(huán)面積要盡可能小,環(huán)面積要盡可能小,環(huán)面積越小,對(duì)外的輻射越少,接收外界的干擾也越小。針對(duì)這一規(guī)則,在地平面分割時(shí),要考慮到地平面與重要信號(hào)走線(xiàn)的分布,防止由于地平面開(kāi)槽等帶來(lái)的問(wèn)題;在雙層板設(shè)計(jì)中,在為電源留下足夠空間的情況下,應(yīng)該將留下的部分用參考地填充,且增加一些必要的過(guò)孔,將雙面信號(hào)有效連接起來(lái),對(duì)一些關(guān)鍵信號(hào)盡量采用地線(xiàn)隔離,對(duì)一些頻率較高的設(shè)計(jì),需特別考慮其地平面信號(hào)回路問(wèn)題,建議采用多層板為宜。
②竄擾控制
竄擾(CrossTalk)是指PCB上不同網(wǎng)絡(luò)之間因較長(zhǎng)的平行布線(xiàn)引起的相互干擾,主要是由于平行線(xiàn)間的分布電容和分布電感的作用??朔Z擾的主要措施是:
A.加大平行布線(xiàn)的間距,遵循3W規(guī)則。
B.在平行線(xiàn)間插入接地的隔離線(xiàn)。
C.減少布線(xiàn)層與地平面的距離
③屏蔽保護(hù)
圖12屏蔽保護(hù)
對(duì)應(yīng)地線(xiàn)回路規(guī)則,實(shí)際上也是為了盡量減小信號(hào)的回路面積,多用于一些比較重要的信號(hào),如時(shí)鐘信號(hào),同步信號(hào);對(duì)一些特別重要,頻率特別高的信號(hào),應(yīng)該考慮采用銅軸電纜屏蔽結(jié)構(gòu)設(shè)計(jì),即將所布的線(xiàn)上下左右用地線(xiàn)隔離,而且還要考慮好如何有效的讓屏蔽地與實(shí)際地平面有效結(jié)合。
④走線(xiàn)方向控制規(guī)則
相鄰層的走線(xiàn)方向成正交結(jié)構(gòu),避免將不同的信號(hào)線(xiàn)在相鄰層走成同一方向,以減少不必要的層間竄擾;當(dāng)由于板結(jié)構(gòu)限制(如某些背板)難以避免出現(xiàn)該情況,特別是信號(hào)速率較高時(shí),應(yīng)考慮用地平面隔離各布線(xiàn)層,用地信號(hào)線(xiàn)隔離各信號(hào)線(xiàn)。
⑤電源與地線(xiàn)層的完整性規(guī)則
對(duì)于導(dǎo)通孔密集的區(qū)域,要注意避免孔在電源和地層的挖空區(qū)域相互連接,形成對(duì)平面層的分割,從而破壞平面層的完整性,并進(jìn)而導(dǎo)致信號(hào)線(xiàn)在地層的回路面積增大。
四、軟件編程1、軟件流程圖
本設(shè)計(jì)軟件主程序流程圖如圖13所示。
圖13主程序流程圖
2、主程序
下面介紹main.c主程序編寫(xiě),其他程序略。
頭文件和一些宏定義
五、下載與調(diào)試
當(dāng)程序在uVision環(huán)境下編寫(xiě)完成,并編譯生成.hex文件后,就可以下載并進(jìn)行調(diào)試了。
1、USB轉(zhuǎn)串口驅(qū)動(dòng)安裝
打開(kāi)USB驅(qū)動(dòng)文件夾下的PL2303_Prolific_DriverInstaller_v130.exe安裝文件,按提示安裝USB轉(zhuǎn)串口驅(qū)動(dòng)程序。安裝完成后,插入U(xiǎn)SB下載線(xiàn)后,在[開(kāi)始]-[控制面板]-[打印機(jī)和其他硬件]-[設(shè)備管理器],在“端口”分支下有(ProlificUSB-to-SerialCommPort(COMX)。X表示串口號(hào),如果沒(méi)有說(shuō)明USB轉(zhuǎn)串口驅(qū)動(dòng)沒(méi)有安裝,須重新安裝。記住括號(hào)里的COM口號(hào)。
圖14成功安裝USB轉(zhuǎn)串口驅(qū)動(dòng)示意圖
2、下載程序
打開(kāi)STC單片機(jī)下載軟件文件夾,點(diǎn)擊運(yùn)行STC_ISP_V481.exe程序,出現(xiàn)如下界面。
圖15下載軟件
正確選擇MCU類(lèi)型,COM口(與剛才安裝的COM號(hào)一致),最高波特率和最低波特率都選2400bps或者1200bps(下載線(xiàn)內(nèi)PL2303芯片所限,沒(méi)辦法?。?,并打開(kāi)正確的.hex數(shù)據(jù)文件。
點(diǎn)擊“Download/下載”按紐,窗口出現(xiàn)提示:
Chinese:正在嘗試與MCU/單片機(jī)握手連接...
Connectionisfailure.Youcantry:
1.GiveyourMCUPowerOnReset.
2.Stopoperation,thenre-selectCOMPort.
3.BecausePLCC-DIP/PQFP-DIPSockettracetoolong.
4.UpdatetheSTCISP.exeversion.
5.Ifstillerror,yourMCUFirmwareiserror
ornull.
Chinese:連接失敗,請(qǐng)嘗試以下操作:
1.在單片機(jī)停電狀態(tài)下,點(diǎn)下載按鈕,再給單片機(jī)上電
2.停止下載,重新選擇RS-232串口,接好電纜
3.可能需要先將P1.0/P1.1短接到地
4.可能外部時(shí)鐘未接
5.因PLCC、PQFP轉(zhuǎn)換座引線(xiàn)過(guò)長(zhǎng)而引起時(shí)鐘不振蕩,請(qǐng)
調(diào)整參數(shù)
6.可能要升級(jí)電腦端的STCISP.exe軟件
7.若仍然不成功,可能MCU/單片機(jī)內(nèi)無(wú)ISP系統(tǒng)引導(dǎo)碼,
或需退回升級(jí),或MCU已損壞
8.若使用USB轉(zhuǎn)RS-232串口線(xiàn)下載,可能會(huì)遇到不兼容
的問(wèn)題,可以讓我們幫助購(gòu)買(mǎi)兼容的USB轉(zhuǎn)RS-232
串口線(xiàn)
仍在連接中,請(qǐng)給MCU上電...
按下電路板上的電源按紐,保證其有個(gè)失電至上電的過(guò)程,則窗口顯示開(kāi)始燒錄芯片。
芯片燒錄成功后,程序開(kāi)始運(yùn)行,酒精濃度測(cè)試儀正常工作。

單片機(jī)源碼:
  1. #include                        //調(diào)用單片機(jī)頭文件
  2. #define uchar unsigned char  //無(wú)符號(hào)字符型 宏定義              變量范圍0~255
  3. #define uint  unsigned int              //無(wú)符號(hào)整型 宏定義              變量范圍0~65535
  4.  
  5. #include
  6. //#include "lcd1602.h"
  7.  
  8. sbit CS=P2^4;                            //CS定義為P2口的第4位腳,連接ADC0832CS腳
  9. sbit SCL=P2^3;                            //SCL定義為P2口的第3位腳,連接ADC0832SCL腳
  10. sbit DO=P2^2;                            //DO定義為P2口的第4位腳,連接ADC0832DO腳
  11.  
  12. sbit beep = P3^2;   //蜂鳴器IO口定義
  13. long dengji,s_dengji = 50;     //酒精等級(jí)
  14.  
  15.  
  16. bit flag_300ms ;
  17. uchar key_can;                            //按鍵值的變量
  18. uchar menu_1;        //菜單設(shè)計(jì)的變量
  19. uchar flag_clock;
  20. #include "eeprom52.h"
  21.  
  22. #include "lcd1602.h"
  23.  
  24.  
  25.  
  26. /***********************1ms延時(shí)函數(shù)*****************************/
  27. void delay_1ms(uint q)
  28. {
  29.               uint i,j;
  30.               for(i=0;i
  31.                             for(j=0;j<120;j++);
  32. }
  33.  
  34.  
  35. /******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eeprom中******************/
  36. void write_eeprom()
  37. {
  38.               SectorErase(0x2000);
  39. //              byte_write(0x2000, s_dengji);
  40.               byte_write(0x2001, s_dengji);
  41.               byte_write(0x2060, a_a);             
  42. }
  43.  
  44. /******************把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來(lái)*****************/
  45. void read_eeprom()
  46. {
  47. //              s_dengji   = byte_read(0x2000);
  48.               s_dengji = byte_read(0x2001);
  49.               a_a      = byte_read(0x2060);
  50. }
  51.  
  52. /**************開(kāi)機(jī)自檢eeprom初始化*****************/
  53. void init_eeprom()
  54. {
  55.               read_eeprom();                            //先讀
  56.               if(a_a != 2)                            //新的單片機(jī)初始單片機(jī)內(nèi)問(wèn)eeprom
  57.               {
  58.                             s_dengji = 80;
  59.                             a_a = 2;
  60.                             write_eeprom();
  61.               }             
  62. }
  63.  
  64. /***********讀數(shù)模轉(zhuǎn)換數(shù)據(jù)********************************************************/             
  65. //請(qǐng)先了解ADC0832模數(shù)轉(zhuǎn)換的串行協(xié)議,再來(lái)讀本函數(shù),主要是對(duì)應(yīng)時(shí)序圖來(lái)理解,本函數(shù)是模擬0832的串行協(xié)議進(jìn)行的
  66.                                                                                     //  1  0  0 通道
  67.                                                                                     //  1  1  1 通道
  68. unsigned char ad0832read(bit SGL,bit ODD)
  69. {
  70.               unsigned char i=0,value=0,value1=0;                           
  71.                             SCL=0;
  72.                             DO=1;
  73.                             CS=0;                            //開(kāi)始
  74.                             SCL=1;                            //第一個(gè)上升沿             
  75.                             SCL=0;
  76.                             DO=SGL;
  77.                             SCL=1;                //第二個(gè)上升沿
  78.                             SCL=0;
  79.                             DO=ODD;
  80.                             SCL=1;                  //第三個(gè)上升沿
  81.                             SCL=0;                  //第三個(gè)下降沿
  82.                             DO=1;
  83.                             for(i=0;i<8;i++)
  84.                             {
  85.                                           SCL=1;
  86.                                           SCL=0; //開(kāi)始從第四個(gè)下降沿接收數(shù)據(jù)
  87.                                           value<<=1;
  88.                                           if(DO)
  89.                                                         value++;                                                                                   
  90.                             }
  91.                             for(i=0;i<8;i++)
  92.                             {                                          //接收校驗(yàn)數(shù)據(jù)
  93.                                           value1>>=1;
  94.                                           if(DO)
  95.                                                         value1+=0x80;
  96.                                           SCL=1;
  97.                                           SCL=0;
  98.                             }
  99.                             CS=1;
  100.                             SCL=1;             
  101.                             if(value==value1)                                                        //與校驗(yàn)數(shù)據(jù)比較,正確就返回?cái)?shù)據(jù),否則返回0             
  102.                                           return value;
  103.               return 0;
  104. }
  105.  
  106.  
  107. /*************定時(shí)器0初始化程序***************/
  108. void time_init()               
  109. {
  110.               EA   = 1;                              //開(kāi)總中斷
  111.               TMOD = 0X01;                //定時(shí)器0、定時(shí)器1工作方式1
  112.               ET0  = 1;                              //開(kāi)定時(shí)器0中斷
  113.               TR0  = 1;                              //允許定時(shí)器0定時(shí)
  114. }
  115.  
  116. /****************按鍵處理顯示函數(shù)***************/
  117. void key_with()
  118. {
  119.               if(key_can == 1)
  120.               {
  121.                             s_dengji ++ ;                                //酒精濃度設(shè)置數(shù)加1
  122.                             if(s_dengji > 999)
  123.                                           s_dengji = 999;
  124.               }
  125.               if(key_can == 2)
  126.               {
  127.                                           s_dengji -= 1;              //酒精濃度設(shè)置數(shù)減1
  128.                             if(s_dengji <= 1)
  129.                                           s_dengji = 1 ;
  130.               }
  131.               write_sfm2(2,9,s_dengji);                               //顯示酒精等級(jí)
  132.               write_eeprom();       //保存數(shù)據(jù)                                                                     
  133.                                          
  134.  
  135. /********************獨(dú)立按鍵程序*****************/
  136. uchar key_can;              //按鍵值
  137.  
  138. void key()              //獨(dú)立按鍵程序
  139. {
  140.               static uchar key_new;
  141.               key_can = 20;                   //按鍵值還原
  142.               P1 |= 0x0f;
  143.               if((P1 & 0x0f) != 0x0f)                            //按鍵按下
  144.               {
  145.                             delay_1ms(1);                                 //按鍵消抖動(dòng)
  146.                             if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
  147.                             {                                                                                    //確認(rèn)是按鍵按下
  148.                                           key_new = 0;
  149.                                           switch(P1 & 0x0f)
  150.                                           {
  151.                                                         case 0x0b: key_can = 2; break;                 //得到k3鍵值
  152.                                                         case 0x07: key_can = 1; break;                 //得到k4鍵值
  153.                                           }                           
  154.                             }                                         
  155.               }
  156.               else
  157.                             key_new = 1;             
  158. }
  159.  
  160. /****************報(bào)警函數(shù)***************/
  161. void clock_h_l()
  162. {
  163.               static uchar value;
  164.               if(dengji >= s_dengji )                            //報(bào)警
  165.               {
  166.                             value ++;
  167.                             if(value >= 2)
  168.                             {
  169.                                           value = 10;
  170.                                           beep = ~beep;                //蜂鳴器報(bào)警
  171.                             }
  172.               }else
  173.               {
  174.                             if(dengji < s_dengji)                //取消報(bào)警
  175.                             {
  176.                                           value = 0;
  177.                                           beep = 1;
  178.                             }             
  179.               }
  180. }
  181.  
  182. /***************主函數(shù)*****************/
  183. void main()
  184. {
  185.               beep = 0;                                            //開(kāi)機(jī)叫一聲  
  186.               delay_1ms(150);
  187.               P0 = P1 = P2 = P3 = 0xff;                            //單片機(jī)IO口初始化為1             
  188.               init_eeprom();                                                //讀eeprom數(shù)據(jù)
  189.               time_init();                                                        //初始化定時(shí)器
  190.               init_1602();
  191.               while(1)
  192.               {
  193.                             key();                                                                      //獨(dú)立按鍵程序
  194.                             if(key_can < 10)
  195.                             {
  196.                                           key_with();                                          //按鍵按下要執(zhí)行的程序
  197.                             }
  198.                             if(flag_300ms == 1)
  199.                             {                           
  200.                                           flag_300ms = 0;
  201.                                           clock_h_l();                 //報(bào)警函數(shù)
  202.                                           dengji = ad0832read(1,0);             
  203. ……………………
  204.  
  205. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
  206.  
復(fù)制代碼
 
(以上內(nèi)容來(lái)自互聯(lián)網(wǎng))
深圳兆為科技酒精測(cè)試儀推薦閱讀:

相關(guān)咨詢(xún)

聯(lián)系我們

聯(lián)系人:董女士

手機(jī):13510244649

電話(huà):【售后】0755-23775679 售后服務(wù)時(shí)間:工作日9:00-17:00

郵箱:3209988168@qq.com

地址: 廣東省深圳市龍崗區(qū)五和大道和磡工業(yè)區(qū)A4棟2樓

-->