IMG_20180128_204646_副本_副本.jpg (87.2 KB, 下載次數: 140)
下載附件
2018-5-22 10:15 上傳
一、 設計意義
二、 硬件設計
1、設計框圖
2、乙醇信號檢測及調理電路
3、單片機電路
4、顯示電路
5、供電及程序下載電路
三、 Protel硬件開發軟件
1.Protel軟件組成
2.PCB板設計
四、 軟件編程
1、軟件流程圖
2、主程序
五、 下載與調試
1、 USB轉串口驅動安裝
2、 下載程序
參考文獻
程序
一、 設計意義自《道路交通安全法》正式實施,“醉酒駕駛”正式入刑。不僅交警部門,而且很多車主都期盼能夠有便攜儀器方便地測量氣體酒精濃度,為安全駕駛提供保障,有效減少重大交通事故的發生。 本研究設計的酒精濃度測試儀是一款實用性強、安全可靠的氣體乙醇濃度檢測工具,采用高精度MQ-3乙醇氣體傳感器對空氣中的乙醇濃度進行檢測,利用宏晶公司高性能低成本單片機STC89C52對檢測信號進行A/D轉換和處理,最后通過液晶屏顯示輸出。本研究設計的酒精濃度測試儀還具有醉酒閾值設定功能,可以根據法律法規或用戶需要設定修改醉酒閾值,并進行保存。 二、 硬件設計
1、設計框圖本研究設計的酒精濃度測試儀框圖如圖1所示。MQ-3乙醇氣體傳感器輸出信號經信號調理電路處理,輸出隨乙醇濃度變化的電壓信號,該電壓信號送入單片機系統,經AD轉換,與設定的醉酒閾值進行比較,并顯示或報警。 圖1 酒精濃度測試儀方框圖 2、乙醇信號檢測及調理電路MQ-3乙醇氣體傳感器可以應用用于機動車駕駛人員及其他嚴禁酒后作業人員的現場檢測,也用于其他場所乙醇蒸汽的檢測。其技術特點為: - 對乙醇蒸汽有很高的靈敏度和良好的選擇性
- 快速的響應恢復特性
- 長期的壽命和可靠的穩定性
- 簡單的驅動回路
主要技術指標: MQ-3乙醇氣體傳感器靈敏度曲線如圖2所示,其傳感原理為氣敏電阻的輸出阻值隨乙醇氣體等濃度變化而變化。 圖2 MQ-3乙醇氣體傳感器靈敏度曲線 MQ-3乙醇氣體傳感器管腳與測試電路如圖3所示。 (a) 管腳圖 (b) 測試電路 圖3 MQ-3乙醇氣體傳感器管腳及測試電路 MQ-3乙醇氣體傳感器及其調理電路原理如圖4所示。其外形如圖5所示。經過調理,檢測信號由電阻值轉變成電壓值,便于后續電路進行A/D轉換和處理。 圖4 傳感器及調理模塊原理圖 該傳感器模塊具有如下特點,方便與單片機系統接口組成檢測儀器。 - 具有信號輸出指示。
- 雙路信號輸出(模擬量輸出及TTL電平輸出)
- TTL輸出有效信號為低電平。
(當輸出低電平時信號燈亮,可直接接單片機) 3、單片機電路本設計選用宏晶公司高性能單片機STC89C52,其管腳如圖6所示。 圖6 STC89C52單片機管腳圖 該芯片為52內核8位單片機,適用于常用檢測電路。由STC89C52組成的單片機系統原理圖如圖7所示。圖中AOUT為MQ-3傳感器模塊輸出的檢測電壓信號,送入ADC0832采集芯片端口進行處理,該信號可以根據乙醇氣體濃度直接輸出報警信號,報警閾值通過模塊上的電位器進行調節。 圖7 單片機系統原理圖 圖7中,按鍵K2和K3為醉酒閾值調整鍵,其中K2為“增加”,K3為“減小”按鍵。L2和L3為報警指示燈,分別可以進行酒后和醉酒兩級報警。 4、顯示電路顯示部分采用SMC 1602液晶屏進行數據顯示,其主要技術參數為: 表1 液晶屏技術指標 接口信號說明如表2所示。 表2 液晶屏接口信號說明 與單片機接口電路如圖8所示。其中J2的3腳為背光引腳,R9和R10電阻用于調節背光亮度。J2的4、5、6引腳分別接液晶的RS、E/W和E控制引腳,J2的7—14引腳為數據引腳。 圖8 LCD與單片機接口電路 5、供電及程序下載電路本設計采用電池盒接口供電,電源電壓5V。同時,其電路原理如圖10所示。 圖10 供電及程序下載電路 三、 Protel硬件開發軟件Protel是目前國內最流行的通用EDA軟件,它是將電路原理圖設計、PCB板圖設計、電路仿真和PLD設計等多個實用工具軟件組合后構成的EDA工作平臺,是第一個將EDA軟件設計成基于Windows的普及型產品。它集成了軟件界面、仿真功能和PLD設計和信號完整性分析,在此基礎上Protel 99SE又增加了一些新的功能,用戶使用更加方便靈活。Protel的功能十分強大,在電子電路設計領域占有極其重要的地位。它以其強大功能和實用性,逐漸獲得廣大硬件設計人員的青睞,是目前眾多EDA設計軟件中用戶最多的產品之一。 1.Protel軟件組成Protel軟件主要由電路原理圖設計模塊、印制電路板設計模塊(PCB設計模塊)、電路信號仿真模塊和PLD邏輯器件設計模塊等組成,各模塊具有強大的功能,可以很好的實現電路設計與分析。 (1) 原理圖設計模塊(Schematic模塊) 電路原理圖是表示電氣產品或電路工作原理的重要技術文件,電路原理圖主要由代表各種電子器件的圖形符號、線路和結點組成。圖4.1所示為一張電路原理圖。該原理圖是由Schematic模塊設計完成的。Schematic模塊具有如下功能:豐富而靈活的編輯功能、在線庫編輯及完善的庫管理功能、強大的設計自動化功能、支持層次化設計功能等。 (2) 印制電路板設計模塊(PCB設計模塊) 印制電路板(PCB)制板圖是由電路原理圖到制作電路板的橋梁。設計了電路原理圖后,需要根據原理圖生設計成印制電路板的制板圖,然后在根據制板圖制作具體的電路板。印制電路板設計模塊具有如下主要功能和特點:可完成復雜印制電路板(PCB)的設計;方便而又靈活的編輯功能;強大的設計自動化功能;在線式庫編輯及完善的庫管理;完備的輸出系統等。 (3) 電路信號仿真模塊 電路信號仿真模塊是一個功能強大的數字/模擬混合信號電路仿真器,能提供連續的模擬信號和離散的數字信號仿真。它運行在Protel的EDA/Client集成環境下,與Protel Advanced Schematic原理圖輸入程序協同工作,作為Advanced Schematic的擴展,為用戶提供了一個完整的從設計到驗證仿真設計環境。 在Protel中進行仿真,只需從仿真用元器件庫中放置所需的元器件,連接好原理圖,加上激勵源,然后單擊防真按鈕即可自動開始。 2.PCB板設計(1) 定元件的封裝 ① 打開網絡表(可以利用一些編輯器輔助編輯),將所有封裝瀏覽一遍,確保所有元件的封裝都正確無誤并且元件庫中包含所有元件的封裝,網絡表中所有信息全部大寫,一面載入出問題,或PCB BOM不連續。 ② 標準元件全部采用公司統一元件庫中的封裝。 ③ ④⑥⑤元件庫中不存在的封裝,應自己建立元器件庫。 (2) 建立PCB板框 ① 根據PCB結構圖,或相應的模板建立PCB文件,包括安裝孔、禁布區等相關信息。 ② 尺寸標注。在鉆孔層中應標明PCB的精確結構,且不可以形成封閉尺寸標注。 (3) 載入網絡表 ① 載入網表并排除所有載入問題,具體請看《PROTEL技術大全》。其他軟件載入問題有很多相似之處,可以借鑒。 ② 如果使用PROTEL,網表須載入兩次以上(沒有任何提示信息)才可以確認載入無誤。 (4) 布局 ① 首先要確定參考點。 一般參考點都設置在左邊和底邊的邊框線的交點(或延長線的交點)上或印制板的插件的第一個焊盤。 ② 一但參考點確定以后,元件布局、布線均以此參考點為準。布局推薦使用25MIL網格。 ③ 根據要求先將所有有定位要求的元件固定并鎖定。 ④ 布局的基本原則 A. 遵循先難后易、先大后小的原則。 B. 布局可以參考硬件工程師提供的原理圖和大致的布局,根據信號流向規律放置主要原器件。 C. 總的連線盡可能的短,關鍵信號線最短。 D. 強信號、弱信號、高電壓信號和弱電壓信號要完全分開。 E. 高頻元件間隔要充分。 F. 模擬信號、數字信號分開。 ⑤ 相同結構電路部分應盡可能采取對稱布局。 ⑥ 按照均勻分布、重心平衡、版面美觀的標準來優化布局。 (5) PCB設計遵循的規則 ① 地線回路規則: 
圖11 地線回路規則 環路最小規則,即信號線與其回路構成的環面積要盡可能小,環面積要盡可能小,環面積越小,對外的輻射越少,接收外界的干擾也越小。針對這一規則,在地平面分割時,要考慮到地平面與重要信號走線的分布,防止由于地平面開槽等帶來的問題;在雙層板設計中,在為電源留下足夠空間的情況下,應該將留下的部分用參考地填充,且增加一些必要的過孔,將雙面信號有效連接起來,對一些關鍵信號盡量采用地線隔離,對一些頻率較高的設計,需特別考慮其地平面信號回路問題,建議采用多層板為宜。 ② 竄擾控制 竄擾(CrossTalk)是指PCB上不同網絡之間因較長的平行布線引起的相互干擾,主要是由于平行線間的分布電容和分布電感的作用。克服竄擾的主要措施是: A.加大平行布線的間距,遵循3W規則。 B.在平行線間插入接地的隔離線。 C.減少布線層與地平面的距離 ③屏蔽保護 
圖12 屏蔽保護 對應地線回路規則,實際上也是為了盡量減小信號的回路面積,多用于一些比較重要的信號,如時鐘信號,同步信號;對一些特別重要,頻率特別高的信號,應該考慮采用銅軸電纜屏蔽結構設計,即將所布的線上下左右用地線隔離,而且還要考慮好如何有效的讓屏蔽地與實際地平面有效結合。 ④ 走線方向控制規則 相鄰層的走線方向成正交結構,避免將不同的信號線在相鄰層走成同一方向,以減少不必要的層間竄擾;當由于板結構限制(如某些背板)難以避免出現該情況,特別是信號速率較高時,應考慮用地平面隔離各布線層,用地信號線隔離各信號線。 ⑤ 電源與地線層的完整性規則 對于導通孔密集的區域,要注意避免孔在電源和地層的挖空區域相互連接,形成對平面層的分割,從而破壞平面層的完整性,并進而導致信號線在地層 的回路面積增大。 四、 軟件編程1、軟件流程圖本設計軟件主程序流程圖如圖13所示。 圖13 主程序流程圖 2、主程序 下面介紹main.c主程序編寫,其他程序略。
五、 下載與調試當程序在uVision環境下編寫完成,并編譯生成.hex文件后,就可以下載并進行調試了。 1、 USB轉串口驅動安裝打開USB驅動文件夾下的PL2303_Prolific_DriverInstaller_v130.exe安裝文件,按提示安裝USB轉串口驅動程序。安裝完成后,插入USB下載線后,在[開始]-[控制面板]-[打印機和其他硬件]-[設備管理器],在“端口”分支下有(Prolific USB-to-Serial Comm Port(COMX)。X表示串口號,如果沒有說明USB轉串口驅動沒有安裝,須重新安裝。記住括號里的COM口號。 圖14 成功安裝USB轉串口驅動示意圖 2、 下載程序打開STC單片機下載軟件文件夾,點擊運行STC_ISP_V481.exe程序,出現如下界面。 圖15 下載軟件 正確選擇MCU 類型,COM口(與剛才安裝的COM號一致),最高波特率和最低波特率都選2400bps或者1200bps (下載線內PL2303芯片所限,沒辦法!),并打開正確的.hex數據文件。 點擊“Download/下載”按紐,窗口出現提示: Chinese:正在嘗試與 MCU/單片機 握手連接 ... Connection is failure. You can try: 1.Give your MCU Power On Reset. 2.Stop operation, then re-select COM Port. 3.Because PLCC-DIP/PQFP-DIP Socket trace too long. 4.Update the STC ISP.exe version. 5.If still error, your MCU Firmware is error or null. Chinese:連接失敗,請嘗試以下操作: 1.在單片機停電狀態下,點下載按鈕,再給單片機上電 2.停止下載,重新選擇 RS-232 串口, 接好電纜 3.可能需要先將 P1.0/P1.1 短接到地 4.可能外部時鐘未接 5.因 PLCC、PQFP 轉換座引線過長而引起時鐘不振蕩,請 調整參數 6.可能要升級電腦端的 STC ISP.exe 軟件 7.若仍然不成功,可能 MCU/單片機內無 ISP 系統引導碼, 或需退回升級,或 MCU 已損壞 8.若使用 USB 轉 RS-232 串口線下載,可能會遇到不兼容 的問題,可以讓我們幫助購買兼容的 USB 轉 RS-232 串口線
仍在連接中, 請給 MCU 上電...
按下電路板上的電源按紐,保證其有個失電至上電的過程,則窗口顯示開始燒錄芯片。 芯片燒錄成功后,程序開始運行,酒精濃度測試儀正常工作。
單片機源碼:
- #include <reg52.h> //調用單片機頭文件
- #define uchar unsigned char //無符號字符型 宏定義 變量范圍0~255
- #define uint unsigned int //無符號整型 宏定義 變量范圍0~65535
- #include <intrins.h>
- //#include "lcd1602.h"
- sbit CS=P2^4; //CS定義為P2口的第4位腳,連接ADC0832CS腳
- sbit SCL=P2^3; //SCL定義為P2口的第3位腳,連接ADC0832SCL腳
- sbit DO=P2^2; //DO定義為P2口的第4位腳,連接ADC0832DO腳
- sbit beep = P3^2; //蜂鳴器IO口定義
- long dengji,s_dengji = 50; //酒精等級
- bit flag_300ms ;
- uchar key_can; //按鍵值的變量
- uchar menu_1; //菜單設計的變量
- uchar flag_clock;
- #include "eeprom52.h"
- #include "lcd1602.h"
- /***********************1ms延時函數*****************************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<120;j++);
- }
- /******************把數據保存到單片機內部eeprom中******************/
- void write_eeprom()
- {
- SectorErase(0x2000);
- // byte_write(0x2000, s_dengji);
- byte_write(0x2001, s_dengji);
- byte_write(0x2060, a_a);
- }
- /******************把數據從單片機內部eeprom中讀出來*****************/
- void read_eeprom()
- {
- // s_dengji = byte_read(0x2000);
- s_dengji = byte_read(0x2001);
- a_a = byte_read(0x2060);
- }
- /**************開機自檢eeprom初始化*****************/
- void init_eeprom()
- {
- read_eeprom(); //先讀
- if(a_a != 2) //新的單片機初始單片機內問eeprom
- {
- s_dengji = 80;
- a_a = 2;
- write_eeprom();
- }
- }
- /***********讀數模轉換數據********************************************************/
- //請先了解ADC0832模數轉換的串行協議,再來讀本函數,主要是對應時序圖來理解,本函數是模擬0832的串行協議進行的
- // 1 0 0 通道
- // 1 1 1 通道
- unsigned char ad0832read(bit SGL,bit ODD)
- {
- unsigned char i=0,value=0,value1=0;
- SCL=0;
- DO=1;
- CS=0; //開始
- SCL=1; //第一個上升沿
- SCL=0;
- DO=SGL;
- SCL=1; //第二個上升沿
- SCL=0;
- DO=ODD;
- SCL=1; //第三個上升沿
- SCL=0; //第三個下降沿
- DO=1;
- for(i=0;i<8;i++)
- {
- SCL=1;
- SCL=0; //開始從第四個下降沿接收數據
- value<<=1;
- if(DO)
- value++;
- }
- for(i=0;i<8;i++)
- { //接收校驗數據
- value1>>=1;
- if(DO)
- value1+=0x80;
- SCL=1;
- SCL=0;
- }
- CS=1;
- SCL=1;
- if(value==value1) //與校驗數據比較,正確就返回數據,否則返回0
- return value;
- return 0;
- }
- /*************定時器0初始化程序***************/
- void time_init()
- {
- EA = 1; //開總中斷
- TMOD = 0X01; //定時器0、定時器1工作方式1
- ET0 = 1; //開定時器0中斷
- TR0 = 1; //允許定時器0定時
- }
- /****************按鍵處理顯示函數***************/
- void key_with()
- {
- if(key_can == 1)
- {
- s_dengji ++ ; //酒精濃度設置數加1
- if(s_dengji > 999)
- s_dengji = 999;
- }
- if(key_can == 2)
- {
- s_dengji -= 1; //酒精濃度設置數減1
- if(s_dengji <= 1)
- s_dengji = 1 ;
- }
- write_sfm2(2,9,s_dengji); //顯示酒精等級
- write_eeprom(); //保存數據
-
- }
- /********************獨立按鍵程序*****************/
- uchar key_can; //按鍵值
- void key() //獨立按鍵程序
- {
- static uchar key_new;
- key_can = 20; //按鍵值還原
- P1 |= 0x0f;
- if((P1 & 0x0f) != 0x0f) //按鍵按下
- {
- delay_1ms(1); //按鍵消抖動
- if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
- { //確認是按鍵按下
- key_new = 0;
- switch(P1 & 0x0f)
- {
- case 0x0b: key_can = 2; break; //得到k3鍵值
- case 0x07: key_can = 1; break; //得到k4鍵值
- }
- }
- }
- else
- key_new = 1;
- }
- /****************報警函數***************/
- void clock_h_l()
- {
- static uchar value;
- if(dengji >= s_dengji ) //報警
- {
- value ++;
- if(value >= 2)
- {
- value = 10;
- beep = ~beep; //蜂鳴器報警
- }
- }else
- {
- if(dengji < s_dengji) //取消報警
- {
- value = 0;
- beep = 1;
- }
- }
- }
- /***************主函數*****************/
- void main()
- {
- beep = 0; //開機叫一聲
- delay_1ms(150);
- P0 = P1 = P2 = P3 = 0xff; //單片機IO口初始化為1
- init_eeprom(); //讀eeprom數據
- time_init(); //初始化定時器
- init_1602();
- while(1)
- {
- key(); //獨立按鍵程序
- if(key_can < 10)
- {
- key_with(); //按鍵按下要執行的程序
- }
- if(flag_300ms == 1)
- {
- flag_300ms = 0;
- clock_h_l(); //報警函數
- dengji = ad0832read(1,0);
- dengji = dengji * 450 / 255.0;
- dengji = dengji - 130; //首先減去零點漂移,一般是1V
- if(dengji < 0)
- dengji = 0;
- dengji = dengji * 2; //將mV轉變成mg/L,系數需要校準
- //電壓每升高0.1V,實際被測氣體的濃度增加20ppm
- //1ppm=1mg/kg=1mg/L=1×10-6 常用來表示氣體濃度,或者溶液濃度。
- write_sfm2(1,9,dengji); //顯示酒精濃度
- }
- }
- }
- /*************定時器0中斷服務程序***************/
- void time0_int() interrupt 1
- {
- static uchar value;
- TH0 = 0x3c;
- TL0 = 0xb0; // 50ms
- value ++;
- if(value % 6 == 0)
- {
- flag_300ms = 1; //300ms
- value = 0;
- }
- }
復制代碼
以上圖文的Word格式文檔下載(內容和本網頁上的一模一樣,方便保存):
酒精濃度測試儀.doc
(954.52 KB, 下載次數: 316)
2018-5-22 10:22 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
酒精濃度檢測 - 硬件電路.pdf
(197.55 KB, 下載次數: 212)
2018-5-22 10:16 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
缺少頭文件,無法編譯大家能修正一下嗎
|