欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 18037|回復: 6
收起左側

基于51單片機的MQ-2煙霧報警設計論文與源碼下載

  [復制鏈接]
ID:350762 發表于 2018-7-12 11:27 | 顯示全部樓層 |閱讀模式
IMG_0387_副本.jpg IMG_0394_副本.jpg
摘要

隨著現代家庭用火、用電量的增加,家庭煙霧發生的頻率越來越高。煙霧報警器也隨之被廣泛應用于各種場合。
本課題所研究的無線多功能煙霧報警器采用STC89C51為核心控制器,利用氣體傳感器MQ-2、ADC0832模數轉換器、DS18B20溫度傳感器等實現基本功能。通過這些傳感器和芯片,當環境中可燃氣體濃度或溫度等發生變化時系統會發出相應的燈光報警信號和聲音報警信號,以此來實現煙霧報警,智能化提示。

目錄
摘要
Abstract
目錄
1 緒論
1.1 課題的研究背景
1.2 課題的研究目的與意義
1.3 煙霧報警器的發展與現狀
1.4課題的研究內容
2 煙霧報警器的總體方案設計
2.1系統的功能要求
2.2 系統的技術要求
2.3 系統的組成及方案設計
3 系統的硬件設計
3.1 主控電路
3.2 煙霧探測電路的設計
3.2.1 MQ-2介紹
3.2.2 ADC0832介紹
3.3 液晶顯示電路設計
3.4 聲光報警提示電路
3.4.1 燈光提示電路
3.4.2 聲音報警電路
3.5 溫度采集電路
3.5.1 DS18B20概述
3.5.2 DS18B20引腳介紹
3.5.3 DS18B20的內部結構
3.5.4 DS18B20的程序流程圖
3.6 按鍵電路
4 系統的軟件設計
4.1 軟件介紹
4.2 系統程序流程圖
5煙霧報警器的測試結果及結論
5.1 調試
5.2 結論
致謝
參考文獻
源程序

1 緒論


1.1 課題的研究背景


煙霧作為一種在時空上失去控制的燃燒所引發的災害,對人類生命財產和社會安全構成了極大的威脅。由此引發的重大安全事故比皆是,所以人類一直也未停止過對它的研究。

煙霧早已成為我國常發性和破壞性以及影響力最強的災害之一。隨著經濟和城市建設的快速發展,城市高層、地下建筑以及大型綜合性建筑日益增多,煙霧隱患也大大增加,煙霧發生的數量及其造成的損失呈逐年上升趨勢。

  在過去的很長一段時間,人類不得不進行專題研究煙霧過程中爆發,截至目前,已形成一個較為成熟的概念。煙霧的發生和發展過程是一個復雜的物理和化學過程,但也與環境很強的相關性。正常情況下,發生火警,伴隨著煙霧,溫度,光照,信號產生的過程。產生不同的環境和不同的火燃燒成分,煙霧粒度組成,溫度分布和光譜的氣體成分是不同的,所以火過程中涉及多個物理和化學參數,特點是強大的,一般的騷亂有著本質的不同。基于上述特點,早起的煙霧探測技術應運而生,特別是多的煙霧探測技術被廣泛采用在煙霧探測領域,如復合材料的物理參數復合煙氣溫度探測器,使用不同的帶光傳感器的復合雙波段火焰探測器。

    在我國,隨著經濟的發展和生活水平的提高,工業與民用建設日趨增多,煙霧發生的可能性也隨之大幅提高。另外,現代建筑物中塑料制品和玻璃的大量應用使火場內外部的求援行為困難重重。現代建筑,尤其是在大型酒店,賓館,商場,圖書館,博物館,檔案館和辦公樓及其他公共場所,對于煙霧報警系統也提出了更高的要求。一旦發生煙霧將很難及時救助,勢必要給國家和個人帶來不可估量的損失。

基于上述情況,煙霧自動報警技術便應運而生,煙霧自動報警系統是始終警惕煙霧報警和輸出聯動忠實的哨兵煙霧信號的有力手段,是一種早期預警。


1.2 課題的研究目的與意義

目的:隨著現代家庭用火,用電增加,家庭煙霧發生的頻率越來越高。家庭煙霧,很容易撲滅不及時,有著缺乏消防設備和在場的人戰斗驚慌失措逃離緩慢的不利因素,最終導致的生命和財產的重大損失。消防部門的統計數據顯示,所有的煙霧比例中,家庭煙霧占全國煙霧的30%。家庭煙霧的原因是多方面的,可能把我們的注意力,也可能隱藏在我們沒有注意到的地方。

綜上所述,許多人因不懂家庭安全常識引起煙霧事故,使好端端的幸福家庭眼間毀于一旦,有的導致家破人亡,而且一旦發生居民家庭煙霧,處置不當、報警遲緩,是造成人員傷亡的重要因素。所以說,人們應該積極了解家庭煙霧的主要起因,還有預防煙霧的發生。這就是我們研究聲光報警器的目的。

意義:在中國的一些大、中型城市,幾乎每一天發生家庭煙霧,所以每一個家庭必須始終關注防火。如果能根據你家的實際情況,提前采取簡單的防火措施,有些悲劇是完全可以避免的。聲音和視覺的報警,對減少煙霧損失具有現實意義。

一系列悲劇性的損失,由國家從社會各界意識到,聲光報警對煙霧的報警的必要性。據調查,在最近的煙霧大部分的房子里還沒有安裝報警器。因此聲光報警,對發生煙霧預防具有重要意義。


1.3 煙霧報警器的發展與現狀


近年來,無線煙霧報警系統在國外已被開發,并走向實用。起初,無線煙霧報警系統不僅是價格貴,還必須連接布線,這是只適合一些特殊的地方,檢測設備的一部分。今天,幾乎所有的電氣裝置,可以通過無線遙控改變,可廣泛應用于各類建筑和場所。美國松柏公司(ITI)成立于1981年,是美國最大的無線報警系統制造商制造,其產品占90%的無線報警器在北美市場的年銷售額已接近一億美元。該公司生產的無線煙霧報警系統還通過了中國的“國家消防電子產品質量監督檢驗測試中心”的監測,該系統可作為煙霧報警系統,但也可作為一個安全的系統,兩者的結合,是一個高科技的無線安全系統。

    煙霧報警系統在中國相對較晚,與發達國家相比, 20世紀70年代末的十年間,中國開始研制生產的煙霧報警系統。 20世紀80年代后,國內各大廠商也大多是模仿國外產品,或引進國外技術生產的,沒有真正意義上的核心技術,市場剛剛開始發展。真正的煙霧報警產品的發展也促進了市場的成熟,政府逐步開放的大門,在同一時間,外國公司開始進入中國的防火市場,帶來先進的技術在20世紀90年代。此期間,中國生產的煙霧報警產品的企業也得到了快速發展,在一些企業中,技術合作,合資生產,并取得了不菲的成績,但今天在市場上創造了許多強大的企業,有些技術已接近或趕上國際標準。

1.4課題的研究內容


煙霧報警器,主要檢測溫度和煙霧,再通過單片機控制相應的報警和驅動負載。通過液晶顯示當前的煙霧值和溫度值,通過按鍵設定相應的閥值。

該項目主要是為了完成任務,包括:

⑴硬件部分:包括傳感器的選擇,顯示模塊的選擇,煙霧信號轉換電路的設計,報警驅動電路的設計。

(2)軟件部分:包括微處理器控制程序的編制和原理圖的繪制。

(3)系統的綜合調試與分析:在軟硬件完成以后,要對系統進行綜合的測試與實驗,分析系統的可靠性與實用性,調整系統的不足。












2 煙霧報警器的總體方案設計


本課題主要是實現煙霧報警和煙霧發生時的報警及控制,下面分別對系統功能要求、系統技術要求及系統實現方案總體闡述。


2.1系統的功能要求

本系統的研制主要包括以下幾項功能:

(1)火情探測功能:為了提高煙霧報警的準確性和及時性,煙霧報警系統需要使用各種方法進行煙霧探測。在實際使用中,根據不同的防火場所,用戶可以選用溫度探測法、可燃氣體檢測法及煙霧探測法等合適的煙霧探測方法,來有效的探測煙霧;

(2)燈光報警功能:當室內煙霧濃度過大、有火情產生、故障等異常情況發生時,報警器要進行燈光報警。當煙霧超過最大設定值時,可以蜂鳴器報警。


2.2 系統的技術要求

在了解這個系統的工作原理以及功能之后,我們就可以基本確定系統的技術要求。系統采用的單片機處理器成本都比較低,可以滿足批量生產和各類工程的需求。對于完整的一個系統而言,為提高市場的競爭力,這個系統應符合體積小、功耗低、數傳性能可靠和成本低廉等技術要求。具體指標和參數如下:

(1)體積小:探測器的體積要盡可能的小,這樣占用的空間才能減少,使用和更換才會方便;

(2)功耗低:系統可以采用三節5號干電池供電或5v電源供電。

(3)可靠性高:由于不確定的電磁干擾可能存在在系統工作環境中,為了保證系統長時間的可靠工作,以及減少誤報次數,所以選擇多指示燈,指示不同的狀態。

2.3 系統的組成及方案設計

本設計主要由煙霧探測傳感器電路、單片機、燈光報警電路、負載驅動電路、控制程序和編解碼程序等組成。

系統的組成結構如下:














3 系統的硬件設計


總體電路

圖3.1

如圖3.1所示,上面的圖為protel99se所畫,下面的圖為proteus仿真所畫。

實時顯示當前的煙霧值和溫度值,共有2個報警值(可以通過按鍵設定),分別是溫度的上限和煙霧的上限報警值,當煙霧超過的時候紅燈和蜂鳴器聲光報警,當溫度超過時候黃燈和蜂鳴器聲光報警。

3.1 主控電路

STC89C51是一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統可編程Flash 存儲器。在單芯片上,擁有靈巧的8 位CPU 和在系統可編程Flash,使得STC89C51為眾多嵌入式控制應用系統提供高靈活、超有效的解決方案。 具有以下標準功能: 8k字節Flash,512字節RAM, 32位I/O 口線,看門狗定時器,內置4KB EEPROM,MAX810復位電路,三個16 位 定時器/計數器,一個6向量2級中斷結構,全雙工串行口。另外 STC89X51 可降至0Hz 靜態邏輯操作,支持2種軟件可選擇節電模式。空閑模式下,CPU 停止工作,允許RAM、定時器/計數器、串口、中斷繼續工作。掉電保護方式下,RAM內容被保存,振蕩器被凍結,單片機一切工作停止,直到下一個中斷或硬件復位為止。最高運作頻率35Mhz,6T/12T可選。STC89C51主要功能如表1所示,其DIP封裝如圖2所示

表1:STC89C51主要功能

主要功能特性
兼容MCS51指令系統
4K可反復擦寫Flash ROM
32個雙向I/O口
256x8bit內部RAM
3個16位可編程定時/計數器中斷
時鐘頻率0-24MHz
2個串行中斷
可編程UART串行通道
2個外部中斷源
共6個中斷源
2個讀寫中斷口線
3級加密位
低功耗空閑和掉電模式
軟件設置睡眠和喚醒功能

STC89C52引腳介紹

① 主電源引腳(2根)

VCC(Pin40):電源輸入,接+5V電源

GND(Pin20):接地線

②外接晶振引腳(2根)

XTAL1(Pin19):片內振蕩電路的輸入端

XTAL2(Pin20):片內振蕩電路的輸出端

③控制引腳(4根)

RST/VPP(Pin9):復位引腳,引腳上出現2個機器周期的高電平將使單片機復位。

ALE/PROG(Pin30):地址鎖存允許信號

PSEN(Pin29):外部存儲器讀選通信號

EA/VPP(Pin31):程序存儲器的內外部選通,接低電平從外部程序存儲器讀指令,如果接高電平則從內部程序存儲器讀指令。

④可編程輸入/輸出引腳(32根)

STC89C52單片機有4組8位的可編程I/O口,分別位P0、P1、P2、P3口,每個口有8位(8根引腳),共32根。

P0口(Pin39~Pin32):8位雙向I/O口線,名稱為P0.0~P0.7

P1口(Pin1~Pin8):8位準雙向I/O口線,名稱為P1.0~P1.7

P2口(Pin21~Pin28):8位準雙向I/O口線,名稱為P2.0~P2.7

P3口(Pin10~Pin17):8位準雙向I/O口線,名稱為P3.0~P3.7

作頻率35Mhz,6T/12T可選。
圖3.2  STC89C51 DIP封裝圖
最小系統包括單片機及其所需的必要的電源、時鐘、復位等部件,能使單片機始終處于正常的運行狀態。電源、時鐘等電路是使單片機能運行的必備條件,可以將最小系統作為應用系統的核心部分,通過對其進行存儲器擴展、A/D擴展等,使單片機完成較復雜的功能。
STC89C51是片內有ROM/EPROM的單片機,因此,這種芯片構成的最小系統簡單﹑可靠。用STC89C52單片機構成最小應用系統時,只要將單片機接上時鐘電路和復位電路即可,結構如圖2-3所示,由于集成度的限制,最小應用系統只能用作一些小型的控制單元。

圖3.2單片機最小系統原理框圖

(1) 時鐘電路
STC89C51單片機的時鐘信號通常有兩種方式產生:一是內部時鐘方式,二是外部時鐘方式。內部時鐘方式如圖2-4所示。在STC89C51單片機內部有一振蕩電路,只要在單片機的XTAL1(18)和XTAL2(19)引腳外接石英晶體(簡稱晶振),就構成了自激振蕩器并在單片機內部產生時鐘脈沖信號。圖中電容C1和C2的作用是穩定頻率和快速起振,電容值在5~30pF,典型值為30pF。晶振CYS的振蕩頻率范圍在1.2~12MHz間選擇,典型值為12MHz和6MHz。

圖3.4 STC89C51內部時鐘電路
(2) 復位電路
當在STC89C51單片機的RST引腳引入高電平并保持2個機器周期時,單片機內部就執行復位操作(若該引腳持續保持高電平,單片機就處于循環復位狀態)。
最簡單的上電自動復位電路中上電自動復位是通過外部復位電路的電容充放電來實現的。只要Vcc的上升時間不超過1ms,就可以實現自動上電復位。
除了上電復位外,有時還需要按鍵手動復位。本設計就是用的按鍵手動復位。按鍵手動復位有電平方式和脈沖方式兩種。其中電平復位是通過RST(9)端與電源Vcc接通而實現的。

圖3.5 STC89C51復位電路
(3) STC89C51中斷技術概述
中斷技術主要用于實時監測與控制,要求單片機能及時地響應中斷請求源提出的服務請求,并作出快速響應、及時處理。這是由片內的中斷系統來實現的。當中斷請求源發出中斷請求時,如果中斷請求被允許,單片機暫時中止當前正在執行的主程序,轉到中斷服務處理程序處理中斷服務請求。中斷服務處理程序處理完中斷服務請求后,再回到原來被中止的程序之處(斷點),繼續執行被中斷的主程序。
圖2-6為整個中斷響應和處理過程。

              圖3.6  中斷響應和處理過程
如果單片機沒有中斷系統,單片機的大量時間可能會浪費在查詢是否有服務請求發生的定時查詢操作上。采用中斷技術完全消除了單片機在查詢方式中的等待現象,大大地提高了單片機的工作效率和實時性。

3.2 煙霧探測電路的設計

圖3.7 煙霧探測電路

如圖3.7所示,在這個電路中,有兩個部分,主要是煙霧傳感器檢測煙霧,將電壓信號給ADC0832,模數轉換電路將模擬信號轉換成數字信號給單片機,單片機再讀取相應的數值和處理。

3.2.1 MQ-2介紹

MQ-2型氣體傳感器用于以氫氣為主要成分的城市煤氣、天然氣、液化石油的測量,而且它抗干擾能力強,水蒸氣、煙等干擾氣體對它的影響小。

MQ-2型氣敏元件具有以下特點:

(1) 采用燒結半導體所形成的敏感燒結體,具有穩定的R (即器件在純潔空氣中的阻抗)阻值,從而保證了長期工作的穩定性。

(2) 單電源供電,其功耗僅0.7W左右。

(3) 對所測試的氣體有極高的靈敏度和信噪比。

MQ-2型氣敏元件有兩種型號。MQ-2A型適用于天然氣、城市煤氣、石油液化氣、丙丁烷及氫氣等;MQ-2型適用于煙霧等減光型有害氣體。

器件的靈敏度:S=Ro/Rx為10~30。常見為QM系列的S值僅8左右。Rx為器件在丁烷濃度為0.2%時的阻抗。

電路如右圖所示:

器件的主要參數如下:

響應時間:Tr≤10s

恢復時間:Tn≤60s

加熱電壓:V﹢=5+0.2V

加熱功率::約0.7W

抗干擾能力:丁烷濃度在0.2%時在濕度小于85%RH,在-10℃~+40℃溫度下不會引起誤報。                                                                           

工作環境:溫度-10℃~+50℃     濕度≤85%RH

下圖是元件外形結構圖,基座采用耐高溫酚醛塑料壓制,引腳為鍍鎳銅絲,上罩采用雙層密紋不銹鋼網壓制,有較高的強度和防爆能力。

MQK-2型元件外形結構圖

MQ-2氣敏元件的結構和外形如上圖所示, 由微型AL2O3陶瓷管、SnO2 敏感層,測量電極和加熱器構成的敏感元件固定在塑料或不銹鋼制成的腔體內,加熱器為氣敏元件提供了必要的工作條件。封裝好的氣敏元件有6只針狀管腳,其中4個用于信號取出,2個用于提供加熱電流。

上圖是MQ-2型元件典型氣體濃度測試特性曲線,在丁烷濃度0.6%以下有極高的靈敏度。

上圖是MQ-2型元件通電時間特性曲線。可看出,通電后60~90s,元件即進入穩定待測工作狀態。

MQ-2的特點和工作參數如下:

特點:

⑴ 廣泛的探測范圍               

⑵ 高靈敏度/快速響應恢復

⑶ 優異的穩定性/長壽命         

⑷ 簡單的驅動電路

3.2.2 ADC0832介紹

ADC0832 是美國國家半導體公司生產的一種8 位分辨率、雙通道A/D轉換芯片。由于它體積小,兼容性,性價比高而深受單片機愛好者及企業歡迎,其目前已經有很高的普及率。學習并使用ADC0832 可是使我們了解A/D轉換器的原理,有助于我們單片機技術水平的提高。

分辨率8位

A/D轉換器逐次逼近式

A/D轉換雙通道

· 輸入輸出電平與TTL/CMOS相兼容;

· 5V電源供電時輸入電壓在0~5V之間;

· 工作頻率為250KHZ,轉換時間為32μS;

· 一般功耗僅為15mW;

· 8P、14P—DIP(雙列直插)、PICC 多種封裝;

· 商用級芯片溫寬為0°C to +70°C,工業級芯片溫寬為−40°C to +85°C;

芯片接口說明:

· CS_片選使能,低電平芯片使能。

· CH0 模擬輸入通道0,或作為IN+/-使用。

· CH1 模擬輸入通道1,或作為IN+/-使用。

· GND 芯片參考0 電位(地)。

· DI 數據信號輸入,選擇通道控制。

· DO 數據信號輸出,轉換數據輸出。

· CLK 芯片時鐘輸入。

· Vcc/REF 電源輸入及參考電壓輸入(復用)。

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


3.3 液晶顯示電路設計

圖3.8 液晶顯示電路設計


LCD1602A 是一種工業字符型液晶,能夠同時顯示16x02 即32個字符。(16列2行)。在日常生活中,我們對液晶顯示器并不陌生。液晶顯示模塊已作為很多電子產品的通過器件,如在計算器、萬用表、電子表及很多家用電子產品中都可以看到,顯示的主要是數字、專用符號和圖形。在單片機的人機交流界面中,一般的輸出方式有以下幾種:發光管、LED數碼管、液晶顯示器。發光管和LED數碼管比較常用,軟硬件都比較簡單。
在單片機系統中應用晶液顯示器作為輸出器件有以下幾個優點:
由于液晶顯示器每一個點在收到信號后就一直保持那種色彩和亮度,恒定發光,而不像陰極射線管顯示器(CRT)那樣需要不斷刷新新亮點。因此,液晶顯示器畫質高且不會閃爍。
液晶顯示器都是數字式的,和單片機系統的接口更加簡單可靠,操作更加方便。
液晶顯示器通過顯示屏上的電極控制液晶分子狀態來達到顯示的目的,在重量上比相同顯示面積的傳統顯示器要輕得多。
相對而言,液晶顯示器的功耗主要消耗在其內部的電極和驅動IC上,因而耗電量比其它顯示器要少得多。
(1)引腳說明:
第1腳:VSS為地電源。
第2腳:VDD接5V正電源。
第3腳:VL為液晶顯示器對比度調整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會產生“鬼影”,使用時可以通過一個10K的電位器調整對比度。
第4腳:RS為寄存器選擇,高電平時選擇數據寄存器、低電平時選擇指令寄存器。
第5腳:R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RS和R/W共同為低電平時可以寫入指令或者顯示地址,當RS為低電平
R/W為高電平時可以讀忙信號,當RS為高電平R/W為低電平時可以寫入數據。
第6腳:E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執行命令。
第7~14腳:D0~D7為8位雙向數據線。
第15腳:背光源正極。
第16腳:背光源負極。
(2)1602LCD的RAM地址映射以及標準字庫表
LCD1602液晶模塊內部的字符發生存儲器已經存儲了160個不同的點陣字符圖形,這些字符圖有:阿拉伯數字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時模塊把地址41H中的點陣字符圖形顯示出來,我們就能看到字母。
它的讀寫操作、屏幕和光標的操作都是通過指令編程來實現的(說明:1為高電平,0為低電平)。
指令1:清顯示,指令碼01H,光標復位到地址00H位置。
指令2:光標復位,光標返回到地址00H 。
指令3:光標和顯示模式設置 I/D:光標移動方向,高電平右移,低電平左移 。S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效 。
指令4:顯示開關控制。 D:控制整體顯示的開與關,高電平表示開顯示,低電平表示關顯示。 C:控制光標的開與關,高電平表示有光標,低電平表示無光標。 B:控制光標是否閃爍,高電平閃爍,低電平不閃爍 。
指令5:光標或顯示移位 S/C:高電平時移動顯示的文字,低電平時移動光標 。
指令6:功能設置命令 DL:高電平時為4位總線,低電平時為8位總線。      N:低電平時為單行顯示,高電平時雙行顯示。 F:低電平時顯示5X7的點陣字符,高電平時顯示5x10的點陣字符 (有些模塊是 DL:高電平時為8位總線,低電平時為4位總線)。
指令7:字符發生器RAM地址設置 。
指令8:DDRAM地址設置 。
指令9:讀出忙信號和光標地址。 BF為忙標志位,高電平表示忙,此時模塊不能接收命令或者數據,如果為低電平表示不忙,模塊就能接收相應的命令或者數據。
指令10:寫數據 。
指令11:讀數據 。
液晶顯示模塊是一個慢顯示器件,所以在執行每條指令之前一定要確認模塊的忙標志為低電平,表示不忙,否則此指令失效。要顯示字符時要先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符。
1602 內部顯示地址如圖3-6所示:
                         圖3-6 1602內部顯示地址
例如第二行第一個字符的地址是40H,那么是否直接寫入40H 就可以將光標定位在第二行第 一個字符的位置呢?這樣不行,因為寫入顯示地址時要求最高位D7恒定為高電平1,所以實際寫入的數據應該是01000000B(40H)+10000000B(80H)=11000000B(C0H) 。在對液晶模塊的初始化中要先設置其顯示模式,在液晶模塊顯示字符時光標是自動右移的,無需人工干預。每次輸入指令前都要判斷液晶模塊是否處于忙的狀態。1602 液晶模塊內部的字符發生存儲器(CGROM)已經存儲了160個不同的點陣字符圖形,如下圖所示,這些字符有:阿拉伯數字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時模塊把地址41H 中的點陣字符圖形顯示出來,我們就能看到字母“A”。

液晶顯示的原理是利用液晶的物理特性, 通過電壓對其顯示區域進行控制,有電就有顯示,這樣即可以顯示出圖形。液晶顯示器具有厚度薄、適用于大規模集成電路直接驅動、易于實現全彩色顯示的特點,目前已經被廣泛應用在便攜式電腦、數字攝像機、PDA移動通信工具等眾多領域。

3.4 聲光報警提示電路

3.4.1 燈光提示電路

圖3.9燈光提示電路

LED英文單詞的縮寫,主要含義:LED = Light Emitting Diode,發光二極管,是一種能夠將電能轉化為可見光的固態的半導體器件,它可以直接把電轉化為光;它改變了白熾燈鎢絲發光與節能燈三基色粉發光的原理,而采用電場發光。據分析,LED的特點非常明顯,壽命長、光效高、輻射低與功耗低。作為目前全球最受矚目的新一代光源,LED因其高亮度、低熱量、長壽命、無毒、可回收再利用等優點,被稱為是21世紀最有發展前景的綠色照明光源。我國的LED產業起步于20世紀70年代,經過近40年的發展,產品廣泛應用于景觀照明和普通照明領域,我國已成為世界第一大照明電器生產國和第二大照明電器出口國。近幾年來,隨著人們對半導體發光材料研究的不斷深入,LED制造工藝的不斷進步和新材料(氮化物晶體和熒光粉)的開發和應用,各種顏色的超高亮度LED取得了突破性進展,其發光效率提高了近1000倍,色度方面已實現了可見光波段的所有顏色,其中最重要的是超高亮度白光LED的出現,使LED應用領域跨越至高效率照明光源市場成為可能。曾經有人指出,高亮度LED將是人類繼愛迪生發明白熾燈泡后,最偉大的發明之一。 本設計利用不同顏色的LED指示不同的煙霧濃度報警。

3.4.2 聲音報警電路

圖3.10聲音報警電路

蜂鳴器是一種一體化結構的電子訊響器,采用直流電壓供電,廣泛應用于計算機、打印機、復印機、報警器、電子玩具、汽車電子設備、電話機、定時器等電子產品中作發聲器件。 ;蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。蜂鳴器在電路中用字母“H”或“HA”(舊標準用“FM”、“LB”、“JD”等)表示。1.壓電式蜂鳴器 壓電式蜂鳴器主要由多諧振蕩器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組成。有的壓電式蜂鳴器外殼上還裝有發光二極管。
多諧振蕩器由晶體管或集成電路構成。當接通電源后(1.5~15V直流工作電壓),多諧振蕩器起振,輸出1.5~2.5kHZ的音頻信號,阻抗匹配器推動壓電蜂鳴片發聲。
壓電蜂鳴片由鋯鈦酸鉛或鈮鎂酸鉛壓電陶瓷材料制成。在陶瓷片的兩面鍍上銀電極,經極化和老化處理后,再與黃銅片或不銹鋼片粘在一起。
電磁式蜂鳴器 電磁式蜂鳴器由振蕩器、電磁線圈、磁鐵、振動膜片及外殼等組成。
接通電源后,振蕩器產生的音頻信號電流通過電磁線圈,使電磁線圈產生磁場。振動膜片在電磁線圈和磁鐵的相互纏繞
蜂鳴器驅動電路一般都包含以下幾個部分:一個三極管、一個蜂鳴器、一個限流電阻。
蜂鳴器為發聲元件,在其兩端施加直流電壓(有源蜂鳴器)或者方波(無源蜂鳴器)就可以發聲,其主要參數是外形尺寸、發聲方向、工作電壓、工作頻率、工作電流、驅動方式(直流/方波)等。這些都可以根據需要來選擇。本設計采用有源蜂鳴器。
三極管Q1起開關作用,其基極的低電平使三極管飽和導通,使蜂鳴器發聲;而基極高電平則使三極管關閉,蜂鳴器停止發聲。

3.6 按鍵電路

本設計采用按鍵接低的方式來讀取按鍵,單片機初始時,因為為高電平,當按鍵按下的時候,會給單片機一個低電平,單片機對信號進行處理

單片機鍵盤有獨立鍵盤和矩陣式鍵盤兩種:獨立鍵盤每一個I/O 口上只接一個按鍵,按鍵的另一端接電源或接地(一般接地),這種接法程序比較簡單且系統更加穩定;而矩陣式鍵盤式接法程序比較復雜,但是占用的I/O少。根據本設計的需要這里選用了獨立式鍵盤接法。

獨立式鍵盤的實現方法是利用單片機I/O口讀取口的電平高低來判斷是否有鍵按下。將常開按鍵的一端接地,另一端接一個I/O 口,程序開始時將此I/O口置于高電平,平時無鍵按下時I/O口保護高電平。當有鍵按下時,此I/O 口與地短路迫使I/O 口為低電平。按鍵釋放后,單片機內部的上拉電阻使I/O口仍然保持高電平。我們所要做的就是在程序中查尋此I/O口的電平狀態就可以了解我們是否有按鍵動作了。

在用單片機對鍵盤處理的時候涉及到了一個重要的過程,那就是鍵盤的去抖動。這里說的抖動是機械的抖動,是當鍵盤在未按到按下的臨界區產生的電平不穩定正常現象,并不是我們在按鍵時通過注意可以避免的。這種抖動一般10~200毫秒之間,這種不穩定電平的抖動時間對于人來說太快了,而對于時鐘是微秒的單片機而言則是慢長的。硬件去抖動就是用部分電路對抖動部分加之處理,軟件去抖動不是去掉抖動,而是避抖動部分的時間,等鍵盤穩定了再對其處理。所以這里選擇了軟件去抖動,實現法是先查尋按鍵當有低電平出現時立即延時10~200毫秒以避開抖動(經典值為20毫秒),延時結束后再讀一次I/O 口的值,這一次的值如果為1 表示低電平的時間不到10~200 毫秒,視為干擾信號。當讀出的值是0時則表示有按鍵按下,調用相應的處理程序。硬件電路如圖3.12所示:

圖3.15 按鍵電路


4 系統的軟件設計


4.1 軟件介紹

Keil C51是美國Keil Software公司出品的51系列兼容單片機C語言軟件開發系統,與匯編相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優勢,因而易學易用。用過匯編語言后再使用C來開發,體會更加深刻。   Keil C51軟件提供豐富的庫函數和功能強大的集成開發調試工具,全Windows界面。另外重要的一點,只要看一下編譯后生成的匯編代碼,就能體會到Keil C51生成的目標代碼效率非常之高,多數語句生成的匯編代碼很緊湊,容易理解。在開發大型軟件時更能體現高級語言的優勢。下面詳細介紹Keil C51開發系統各部分功能和使用。Keil_c軟件界面如圖

圖4.1 Keil_c軟件界面

Protel99SE是PORTEL公司在80年代末推出的EDA軟件。Protel99SE是應用于Windows9X/2000/NT操作系統下的EDA設計軟件,采用設計庫管理模式,可以網設計,具有很強的數據交換能力和開放性及3D模擬功能,是一個32位的設計軟件,可以完成電路原理圖設計,印制電路板設計和可編程邏輯器件設計等工作,可以設計32個信號層,16個電源--地層和16個機加工層。

Protel99SE軟件的特點:

  • 可生成30多種格式的電氣連接網絡表;
  • 強大的全局編輯功能;
  • 在原理圖中選擇一級器件,PCB中同樣的器件也將被選中;
  • 同時運行原理圖和PCB,在打開的原理圖和PCB圖間允許雙向交叉查找元器件、引腳、網絡
  • 既可以進行正向注釋元器件標號(由原理圖到PCB),也可以進行反向注釋(由PCB到原理圖),以保持電氣原理圖和PCB在設計上的一致性;
  • 滿足國際化設計要求(包括國標標題欄輸出,GB4728國標庫); * 方便易用的數模混合仿真(兼容SPICE 3f5);
  • 支持用CUPL語言和原理圖設計PLD,生成標準的JED下載文件; * PCB可設計32個信號層,16個電源-地層和16個機加工層;
  • 強大的“規則驅動”設計環境,符合在線的和批處理的設計規則檢查;
  • 智能覆銅功能,覆鈾可以自動重鋪;
  • 提供大量的工業化標準電路板做為設計模版;

圖17 Prtel99SE軟件界面

Protel99SE的工作界面是一種標準的Windows界面,如圖所示,包括:標題欄、主菜單、標準工具欄、繪圖工具欄、狀態欄、對象選擇按鈕、預覽對象方位控制按鈕、仿真進程控制按鈕、預覽窗口、對象選擇器窗口、圖形編輯窗口。

4.2 系統程序流程圖(見附件)

5煙霧報警器的測試結果及結論

5.1 調試

調試過程中首先要檢測的就是硬件電路的設計原理是否正確、能否達到預期效果以及實現方法是否簡便等等;其次在焊接好難有線電路之后,認真檢查電路的焊接情況。這次采用的是分塊調試的方法,煙霧探測電路,控制電路以及單片機控制電路進行調試。在對每個模塊的進行調試過程中又采用了由局部到整體,由簡單到復雜的調試方法,最后再將各個模塊總和成一個整體。

在調試過程中遇到的問題有:

  •                 由于在焊電路之前沒有認真的查看STC89C51的管腳,使得管腳的順序全部焊錯了,最后只好重新買器件重焊;
  •                 煙霧值一直顯示很高,經過查閱資料和換元件測試發現,煙霧傳感器初次使用得通電幾小時以上才可以正常使用,要做老化試驗。
  •                 在解碼程序的編寫過程中,隨著理解的深入也作了相應的修改。

5.2 結論

煙霧為一種由于燃燒失去控制所引發的災害,對人類的生命財產和社會安全穩定構成了極大的威脅。由此引發的重大安全事故比比皆是,所以人類一直也未停止過對煙霧的研究。

本文在參考了國內外大量資料的基礎上,針對傳統的一系列煙霧報警探測器存在的問題,合理地提出了煙霧報警器的設計方法。極大地提高了產品的實用性和市場競爭力。

本課題中設計的煙霧報警探測器由傳感器電路與無線通信電路兩大部分構成。控制處理器是以管腳資源豐富的STC89C51為核心,實現對探測器寫入信號和對信號進行編譯等人機交互功能。應用程序以C語言編寫,充分利用芯片的內部資源,提高了代碼執行效率,減小了代碼的容量。由于該探測器具有體積小、功耗低、安裝調試簡單、可靠性高等優點,因此,該煙霧探測器有著良好的市場前景。

但是,由于本人在各方面的知識不夠全面,再加上時間緊迫以及實驗條件的限制,該報警器還有較多需要提高的地方。比如:添加感應溫度的傳感器,通過多方面判斷煙霧。

致謝

這次畢業設計得到了很多人的幫助,其中**老師對我的關心和支持尤為重要,每次遇到難題,我首先想到的就是向金老師尋求幫助。另外,他嚴謹的作風使我的論文即使在謹小細微處也給予了糾正,讓我的論文無論是結構還是內容變得更加公整、緊湊,感謝金老師對我的悉心指導。

感謝校方給予我這樣一次機會,能夠獨立地完成這樣一個設計,作為檢驗這些年來學習的成果,在這個過程當中,學校給予我們各種方便,使我們在即將離校的最后一段時間里,能夠更多學習一些實踐應用知識,增強了我們實踐操作和動手應用能力,提高了獨立思考的能力。再一次對我的母校表示感謝。

感謝在整個畢業設計期間和我密切合作的同學,和曾經在各個方面給予過我幫助的伙伴們,正是因為有了你們的幫助,才讓我不僅學到了本次課題所涉及的新知識,更讓我感覺到了知識以外的東西,那就是團結的力量。


單片機源程序如下:


  1. <font color="rgb(0, 0, 0)">#include <reg52.h>                 //調用單片機頭文件
  2. #define uchar unsigned char  //無符號字符型 宏定義        變量范圍0~255
  3. #define uint  unsigned int         //無符號整型 宏定義        變量范圍0~65535

  4. #include <intrins.h>
  5. //#include "lcd1602.h"

  6. sbit CS=P1^3;                //CS定義為P2口的第4位腳,連接ADC0832CS腳
  7. sbit SCL=P1^0;                //SCL定義為P2口的第3位腳,連接ADC0832SCL腳
  8. sbit DO=P1^1;                //DO定義為P2口的第4位腳,連接ADC0832DO腳

  9. sbit beep = P2^0;   //蜂鳴器IO口定義
  10. long dengji,s_dengji = 50;     //濃度等級


  11. bit flag_300ms ;
  12. uchar key_can;                 //按鍵值的變量
  13. uchar menu_1;        //菜單設計的變量
  14. uchar flag_clock;

  15. //這三個引腳參考資料
  16. sbit rs=P1^2;         //1602數據/命令選擇引腳 H:數據              L:命令
  17. //sbit rw=P2^6;         //1602讀寫引腳                 H:數據寄存器          L:指令寄存器
  18. sbit e =P1^4;         //1602使能引腳          下降沿觸發
  19. uchar code table_num[]="0123456789abcdefg";

  20. /********************************************************************
  21. * 名稱 : delay_uint()
  22. * 功能 : 小延時。
  23. * 輸入 : 無
  24. * 輸出 : 無
  25. ***********************************************************************/
  26. void delay_uint(uint q)
  27. {
  28.         while(q--);
  29. }

  30. /********************************************************************
  31. * 名稱 : write_com(uchar com)
  32. * 功能 : 1602命令函數
  33. * 輸入 : 輸入的命令值
  34. * 輸出 : 無
  35. ***********************************************************************/
  36. void write_com(uchar com)
  37. {
  38.         e=0;
  39.         rs=0;
  40. //        rw=0;
  41.         P0=com;
  42.         delay_uint(3);
  43.         e=1;
  44.         delay_uint(25);
  45.         e=0;
  46. }

  47. /********************************************************************
  48. * 名稱 : write_data(uchar dat)
  49. * 功能 : 1602寫數據函數
  50. * 輸入 : 需要寫入1602的數據
  51. * 輸出 : 無
  52. ***********************************************************************/
  53. void write_data(uchar dat)
  54. {
  55.         e=0;
  56.         rs=1;
  57. //        rw=0;
  58.         P0=dat;
  59.         delay_uint(3);
  60.         e=1;
  61.         delay_uint(25);
  62.         e=0;        
  63. }

  64. /********************************************************************
  65. * 名稱 : write_sfm2(uchar hang,uchar add,uchar date)
  66. * 功能 : 顯示2位十進制數,如果要讓第一行,第五個字符開始顯示"23" ,調用該函數如下
  67.                   write_sfm1(1,5,23)
  68. * 輸入 : 行,列,需要輸入1602的數據
  69. * 輸出 : 無
  70. ***********************************************************************/
  71. void write_sfm2(uchar hang,uchar add,uint date)
  72. {
  73.         if(hang==1)   
  74.                 write_com(0x80+add);
  75.         else
  76.                 write_com(0x80+0x40+add);
  77.         if(date >= 100)
  78.         {
  79.                 write_data(0x30+date/100%10);
  80.                 write_data(0x30+date/10%10);
  81.         }
  82.         else
  83.         {
  84.                 write_data(' ');
  85.                 write_data(0x30+date/10%10);
  86.         }
  87.         write_data(0x30+date%10);        
  88. }

  89. /********************************************************************
  90. * 名稱 : write_string(uchar hang,uchar add,uchar *p)
  91. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調用該函數如下
  92.                   write_string(1,5,"ab cd ef;")
  93. * 輸入 : 行,列,需要輸入1602的數據
  94. * 輸出 : 無
  95. ***********************************************************************/
  96. void write_string(uchar hang,uchar add,uchar *p)
  97. {
  98.         if(hang==1)   
  99.                 write_com(0x80+add);
  100.         else
  101.                 write_com(0x80+0x40+add);
  102.                 while(1)
  103.                 {
  104.                         if(*p == '\0')  break;
  105.                         write_data(*p);
  106.                         p++;
  107.                 }        
  108. }

  109. /********************************************************************
  110. * 名稱 : clear_1602()
  111. * 功能 : 清除1602顯示
  112. * 輸入 : 無
  113. * 輸出 : 無
  114. ***********************************************************************/
  115. void clear_1602()
  116. {
  117.         write_string(1,0,"                ");
  118.         write_string(2,0,"                ");
  119. }

  120. /***********************lcd1602上顯示特定的字符************************/
  121. void write_zifu(uchar hang,uchar add,uchar date)
  122. {
  123.         if(hang==1)   
  124.                 write_com(0x80+add);
  125.         else
  126.                 write_com(0x80+0x40+add);
  127.         write_data(date);        
  128. }


  129. /********************************************************************
  130. * 名稱 : init_1602()
  131. * 功能 : 初始化1602液晶
  132. * 輸入 : 無
  133. * 輸出 : 無
  134. ***********************************************************************/
  135. void init_1602()
  136. {
  137.         write_com(0x38);
  138.         write_com(0x0c);
  139.         write_com(0x06);
  140.         write_string(1,0," thickne: 00    ");
  141.         write_string(2,0," Thresho: 80    ");
  142.         write_sfm2(2,9,s_dengji);                   //顯示濃度等級
  143. }

  144. uchar a_a;

  145. /********STC89C51扇區分布*******
  146. 第一扇區:1000H--11FF
  147. 第二扇區:1200H--13FF
  148. 第三扇區:1400H--15FF
  149. 第四扇區:1600H--17FF
  150. 第五扇區:1800H--19FF
  151. 第六扇區:1A00H--1BFF
  152. 第七扇區:1C00H--1DFF
  153. 第八扇區:1E00H--1FFF
  154. *****************/

  155. /********STC89C52扇區分布*******
  156. 第一扇區:2000H--21FF
  157. 第二扇區:2200H--23FF
  158. 第三扇區:2400H--25FF
  159. 第四扇區:2600H--27FF
  160. 第五扇區:2800H--29FF
  161. 第六扇區:2A00H--2BFF
  162. 第七扇區:2C00H--2DFF
  163. 第八扇區:2E00H--2FFF
  164. *****************/


  165. #define RdCommand 0x01 //定義ISP的操作命令
  166. #define PrgCommand 0x02
  167. #define EraseCommand 0x03
  168. #define Error 1
  169. #define Ok 0
  170. #define WaitTime 0x01 //定義CPU的等待時間
  171. sfr ISP_DATA=0xe2;  //寄存器申明
  172. sfr ISP_ADDRH=0xe3;
  173. sfr ISP_ADDRL=0xe4;
  174. sfr ISP_CMD=0xe5;
  175. sfr ISP_TRIG=0xe6;
  176. sfr ISP_CONTR=0xe7;

  177. /* ================ 打開 ISP,IAP 功能 ================= */
  178. void ISP_IAP_enable(void)
  179. {
  180.          EA = 0;       /* 關中斷   */
  181.          ISP_CONTR = ISP_CONTR & 0x18;       /* 0001,1000 */
  182.          ISP_CONTR = ISP_CONTR | WaitTime; /* 寫入硬件延時 */
  183.          ISP_CONTR = ISP_CONTR | 0x80;       /* ISPEN=1  */
  184. }
  185. /* =============== 關閉 ISP,IAP 功能 ================== */
  186. void ISP_IAP_disable(void)
  187. {
  188.          ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
  189.          ISP_TRIG = 0x00;
  190.          EA   =   1;   /* 開中斷 */
  191. }
  192. /* ================ 公用的觸發代碼 ==================== */
  193. void ISPgoon(void)
  194. {
  195.          ISP_IAP_enable();   /* 打開 ISP,IAP 功能 */
  196.          ISP_TRIG = 0x46;  /* 觸發ISP_IAP命令字節1 */
  197.          ISP_TRIG = 0xb9;  /* 觸發ISP_IAP命令字節2 */
  198.          _nop_();
  199. }
  200. /* ==================== 字節讀 ======================== */
  201. unsigned char byte_read(unsigned int byte_addr)
  202. {
  203.         EA = 0;
  204.          ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址賦值 */
  205.          ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
  206.          ISP_CMD   = ISP_CMD & 0xf8;   /* 清除低3位  */
  207.          ISP_CMD   = ISP_CMD | RdCommand; /* 寫入讀命令 */
  208.          ISPgoon();       /* 觸發執行  */
  209.          ISP_IAP_disable();    /* 關閉ISP,IAP功能 */
  210.          EA  = 1;
  211.          return (ISP_DATA);    /* 返回讀到的數據 */
  212. }
  213. /* ================== 扇區擦除 ======================== */
  214. void SectorErase(unsigned int sector_addr)
  215. {
  216.          unsigned int iSectorAddr;
  217.          iSectorAddr = (sector_addr & 0xfe00); /* 取扇區地址 */
  218.          ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
  219.          ISP_ADDRL = 0x00;
  220.          ISP_CMD = ISP_CMD & 0xf8;   /* 清空低3位  */
  221.          ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3  */
  222.          ISPgoon();       /* 觸發執行  */
  223.          ISP_IAP_disable();    /* 關閉ISP,IAP功能 */
  224. }
  225. /* ==================== 字節寫 ======================== */
  226. void byte_write(unsigned int byte_addr, unsigned char original_data)
  227. {
  228.          EA  = 0;
  229. //         SectorErase(byte_addr);
  230.          ISP_ADDRH = (unsigned char)(byte_addr >> 8);  /* 取地址  */
  231.          ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
  232.          ISP_CMD  = ISP_CMD & 0xf8;    /* 清低3位 */
  233.          ISP_CMD  = ISP_CMD | PrgCommand;  /* 寫命令2 */
  234.          ISP_DATA = original_data;   /* 寫入數據準備 */
  235.          ISPgoon();       /* 觸發執行  */
  236.          ISP_IAP_disable();     /* 關閉IAP功能 */
  237.          EA =1;
  238. }


  239. /***********************1ms延時函數*****************************/
  240. void delay_1ms(uint q)
  241. {
  242.         uint i,j;
  243.         for(i=0;i<q;i++)
  244.                 for(j=0;j<120;j++);
  245. }


  246. /******************把數據保存到單片機內部eeprom中******************/
  247. void write_eeprom()
  248. {
  249.         SectorErase(0x2000);
  250. //        byte_write(0x2000, s_dengji);
  251.         byte_write(0x2001, s_dengji);
  252.         byte_write(0x2060, a_a);        
  253. }

  254. /******************把數據從單片機內部eeprom中讀出來*****************/
  255. void read_eeprom()
  256. {
  257. //        s_dengji   = byte_read(0x2000);
  258.         s_dengji = byte_read(0x2001);
  259.         a_a      = byte_read(0x2060);
  260. }

  261. /**************開機自檢eeprom初始化*****************/
  262. void init_eeprom()
  263. {
  264.         read_eeprom();                //先讀
  265.         if(a_a != 2)                //新的單片機初始單片機內問eeprom
  266.         {
  267.                 s_dengji = 80;
  268.                 a_a = 2;
  269.                 write_eeprom();
  270.         }        
  271. }

  272. /***********讀數模轉換數據********************************************************/        
  273. //請先了解ADC0832模數轉換的串行協議,再來讀本函數,主要是對應時序圖來理解,本函數是模擬0832的串行協議進行的
  274.                                                 //  1  0  0 通道
  275.                                                 //  1  1  1 通道
  276. unsigned char ad0832read(bit SGL,bit ODD)
  277. {
  278.         unsigned char i=0,value=0,value1=0;               
  279.                 SCL=0;
  280.                 DO=1;
  281.                 CS=0;                //開始
  282.                 SCL=1;                //第一個上升沿        
  283.                 SCL=0;
  284.                 DO=SGL;
  285.                 SCL=1;          //第二個上升沿
  286.                 SCL=0;
  287.                 DO=ODD;
  288.                 SCL=1;            //第三個上升沿
  289.                 SCL=0;            //第三個下降沿
  290.                 DO=1;
  291.                 for(i=0;i<8;i++)
  292.                 {
  293.                         SCL=1;
  294.                         SCL=0; //開始從第四個下降沿接收數據
  295.                         value<<=1;
  296.                         if(DO)
  297.                                 value++;                                                
  298.                 }
  299.                 for(i=0;i<8;i++)
  300.                 {                        //接收校驗數據
  301.                         value1>>=1;
  302.                         if(DO)
  303.                                 value1+=0x80;
  304.                         SCL=1;
  305.                         SCL=0;
  306.                 }
  307.                 CS=1;
  308.                 SCL=1;        
  309.                 if(value==value1)                                //與校驗數據比較,正確就返回數據,否則返回0        
  310.                         return value;
  311.         return 0;
  312. }


  313. /*************定時器0初始化程序***************/
  314. void time_init()         
  315. {
  316.         EA   = 1;                   //開總中斷
  317.         TMOD = 0X01;          //定時器0、定時器1工作方式1
  318.         ET0  = 1;                  //開定時器0中斷
  319.         TR0  = 1;                  //允許定時器0定時
  320. }

  321. /****************按鍵處理顯示函數***************/
  322. void key_with()
  323. {
  324.         if(key_can == 1)
  325.         {
  326.                 s_dengji ++ ;                    //濃度設置數加1
  327.                 if(s_dengji > 999)
  328.                         s_dengji = 999;
  329.         }
  330.         if(key_can == 2)
  331.         {
  332.                         s_dengji -= 1;        //濃度設置數減1
  333.                 if(s_dengji <= 1)
  334.                         s_dengji = 1 ;
  335.         }
  336.         write_sfm2(2,9,s_dengji);                   //顯示濃度等級
  337.         write_eeprom();       //保存數據                                       
  338.                         
  339. }  

  340. /********************獨立按鍵程序*****************/
  341. uchar key_can;         //按鍵值
  342. sbit key1=P1^5;
  343. sbit key2=P3^3;
  344. void key()         //獨立按鍵程序
  345. {
  346.         static uchar key_new;
  347.         key_can = 20;                   //按鍵值還原
  348.         key1 = 1;
  349.         key2 = 1;
  350.         if((key1==0)||(key2==0))                //按鍵按下
  351.         {
  352.                 delay_1ms(1);                     //按鍵消抖動
  353.                 if(((key1==0)||(key2==0)) && (key_new == 1))
  354.                 {                                                //確認是按鍵按下
  355.                         key_new = 0;
  356.                         if(key1==0) key_can = 1;
  357.                         if(key2==0) key_can = 2;
  358.                 }                        
  359.         }
  360.         else
  361.                 key_new = 1;        
  362. }

  363. /****************報警函數***************/
  364. void clock_h_l()
  365. {
  366.         static uchar value;
  367.         if(dengji >= s_dengji )                //報警
  368.         {
  369.                 value ++;
  370.                 if(value >= 2)
  371.                 {
  372.                         value = 10;
  373.                         beep = ~beep;          //蜂鳴器報警
  374.                 }
  375.         }else
  376.         {
  377.                 if(dengji < s_dengji)          //取消報警
  378.                 {
  379.                         value = 0;
  380.                         beep = 1;
  381.                 }        
  382.         }
  383. }
  384. ……………………

  385. …………限于本文篇幅 余下代碼請從51黑下載附件…………
  386. </font>
復制代碼

1.png 1_副本.png

0.png


所有資料51hei提供下載:

基于51的燃氣報警.zip (1.69 MB, 下載次數: 364)




評分

參與人數 3黑幣 +67 收起 理由
a464066411 + 12 很給力!
任來瘋 + 5 絕世好帖!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:323384 發表于 2018-11-23 21:36 | 顯示全部樓層
真的很厲害
回復

使用道具 舉報

ID:323384 發表于 2018-11-23 21:36 | 顯示全部樓層
非常棒,向大佬學習                        
回復

使用道具 舉報

ID:297670 發表于 2018-11-28 21:44 | 顯示全部樓層
很不錯,就是沒有protels自己仿真試下!
回復

使用道具 舉報

ID:431770 發表于 2018-12-23 12:48 | 顯示全部樓層
這里面有PCB原理圖嗎?
回復

使用道具 舉報

ID:323384 發表于 2019-1-13 10:53 | 顯示全部樓層
制板不行啊,調試不出來
回復

使用道具 舉報

ID:469250 發表于 2019-1-27 13:32 | 顯示全部樓層
很好用,
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表