找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4149|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

智能小區(qū)安防系統(tǒng)設(shè)計論文下載

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:300215 發(fā)表于 2018-4-1 11:14 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
小區(qū)安防,煙霧,紅外,溫度,煤氣。
引言
中國安居工程需要大力發(fā)展安全文明小區(qū)建設(shè),嚴(yán)峻的社會治安形勢,需要建立并完善安全文明小區(qū)防盜報警網(wǎng)絡(luò)系統(tǒng)體系。如何解決在當(dāng)前每個家庭經(jīng)濟(jì)承受能力有限的情況下,建設(shè)滿足防范功能及可靠性需求的安全文明小區(qū)防范防盜報警網(wǎng)絡(luò)系統(tǒng),是當(dāng)前急需解決的課題。本方案是在考慮以上因素的基礎(chǔ)上,所設(shè)計的可行實施方案。
小區(qū)安全防范報警系統(tǒng)是智能小區(qū)實現(xiàn)安全管理的重要系統(tǒng),主要包括防盜報警、煤氣泄漏報警、消防報警等。小區(qū)管理極為重要的內(nèi)容是確保住宅­,住戶安全,生活中,人人都可能出現(xiàn)一些意想不到的求助情況,現(xiàn)代居住的格局,鄰里常年不來往已是常事,家庭生活穩(wěn)密性、封閉,性越來越強。因此,小區(qū)安全防范­及報警系統(tǒng)是具有先進(jìn)的設(shè)計和設(shè)備,并為小區(qū)住戶的安全提供保障的必要系統(tǒng)。
我國的安防自動報警控制系統(tǒng)經(jīng)歷了從無到有、從簡單到復(fù)雜的發(fā)展過程,其智能化程度也越來越高。在小區(qū)內(nèi)的每個住戶單元安裝一臺報警主機,住戶可選擇安裝在住戶門口、窗戶處安裝聲檢、緊急求助,煙霧/煤氣探頭、瓦斯探頭,等報警感知設(shè)備,報警主機通過總線與管理中心的電腦想連接,進(jìn)行安防信息管理。如果發(fā)生盜賊闖入、搶劫、煙霧、燃汽泄露,聲音過高等緊急事故,傳感器就會立即獲知并由報警系統(tǒng)即刻觸發(fā)聲光警報以有效恫嚇企圖行竊的盜賊;系統(tǒng)還會迅速向報警中心傳送報警信息;報警中心接到警情后立即自動進(jìn)行分辨處理,迅速識別判定警報類型、地點、用戶,中心據(jù)此派出機動力量采取相應(yīng)解救措施;系統(tǒng)具備24小時防破壞等并自我監(jiān)視,一旦有任何被破壞的跡象也會即刻報警。總之,無論白天黑夜,你離家在外還是在家休息,電子保安時時刻刻保護(hù)的安全,這正是能為家人、家庭、財產(chǎn)所做的最有效的安全防盜保護(hù)措施。
1  總體設(shè)計1.1 設(shè)計背景
在當(dāng)今高速發(fā)展的社會中,人們對自身所處的環(huán)境越來越關(guān)心,居家安全已成為當(dāng)今小康之家優(yōu)先考慮的問題。當(dāng)上班家中無人,或者僅有老人孩子在家,或晚上在家熟睡,都必須確保家庭成員和財產(chǎn)的絕對安全。
中國安居工程需要大力發(fā)展安全文明小區(qū)建設(shè),嚴(yán)峻的社會治安形勢,需要建立并完善安全文明小區(qū)防盜報警網(wǎng)絡(luò)系統(tǒng)體系。如何解決在當(dāng)前每個家庭經(jīng)濟(jì)承受能力有限的情況下,建設(shè)滿足防范功能及可靠性需求的安全文明小區(qū)防范防盜報警網(wǎng)絡(luò)系統(tǒng),是當(dāng)前急需解決的課題。本方案是在考慮以上因素的基礎(chǔ)上,所設(shè)計的可行實施方案。一、住宅小區(qū)防盜報警系統(tǒng)要求 當(dāng)前,隨著經(jīng)濟(jì)的發(fā)展,人民的生活日益改善,人們對家庭生命財產(chǎn)安全越來越重視,采取了許多措施來保護(hù)家庭的安全。以往的做法是安裝防盜門、防盜網(wǎng),但也存在有礙美觀,不符合防火要求,不能有效地防止壞人的入侵。現(xiàn)在,全國各地都在如火如荼地開展建設(shè)安全文明小區(qū)的活動,而且很多地方都提出取消防盜網(wǎng)的口號,家庭電子防盜報警系統(tǒng)也就應(yīng)運而生。因為大多數(shù)家庭都是雙職工,白天家里通常沒有人,發(fā)生報警后,必須要有專人來處理,因此,必須設(shè)立報警中心。而且因為國內(nèi)住宅區(qū)大多數(shù)是密集型分布,一個住宅區(qū)往往有幾百上千戶,并且都有自身的保安隊伍,因此當(dāng)用戶防盜報警系統(tǒng)報警時,除了在現(xiàn)場報警外,還需要向當(dāng)?shù)嘏沙鏊蚬卜志诌M(jìn)行報警聯(lián)網(wǎng)外,也需要向住宅小區(qū)的保安中心進(jìn)行聯(lián)網(wǎng)報警,以便警情得到迅速處理。另外,考慮到國內(nèi)普遍收入水平較低,對于每一戶家庭的防盜報警系統(tǒng)成本不可太高,但因為用戶數(shù)量多,也不能采用質(zhì)量差的產(chǎn)品,以免誤報頻繁造成不良影響。根據(jù)以上分析,住宅小區(qū)對防盜報警系統(tǒng)的要求如下:1.廣泛性——即要求小區(qū)內(nèi)每個家庭都能得到保護(hù)。2.實用性——即要求每個家庭的防范系統(tǒng)能在實際可能發(fā)生受侵害的情況下及時報警。并要求操作簡便,環(huán)節(jié)少,易學(xué)。3.系統(tǒng)性——即要求每個家庭的防范系統(tǒng)在案情發(fā)生時,除能自身報警外,必須及時傳到保衛(wèi)部門,并同時上報當(dāng)?shù)毓矆缶行摹?.可靠性——即要求系統(tǒng)所設(shè)計的結(jié)構(gòu)合理產(chǎn)品經(jīng)久耐用、系統(tǒng)是可靠。5.投資可行性------即要求系統(tǒng)投資或造價能控制在小區(qū)家庭能承受的范圍之內(nèi)。
1.2 設(shè)計思想
在小區(qū)內(nèi)的每個住戶單元安裝一臺報警主機,住戶可選擇安裝在住戶門口、窗戶處安裝聲檢、緊急求助,煙霧/煤氣探頭、瓦斯探頭,病毒檢測器,防盜報警器等報警感知設(shè)備,報警主機通過總線與管理中心的電腦想連接,進(jìn)行安防信息管理,本系統(tǒng)具有遠(yuǎn)程報警功能。如果發(fā)生盜賊闖入、搶劫、煙霧、燃汽泄露,聲音過高等緊急事故,傳感器就會立即獲知并由報警系統(tǒng)即刻觸發(fā)聲光警報以有效恫嚇企圖行竊的盜賊;系統(tǒng)還會迅速向報警中心傳送報警信息;報警中心接到警情后立即自動進(jìn)行分辨處理,迅速識別判定警報類型、地點、用戶,中心據(jù)此派出機動力量采取相應(yīng)解救措施;系統(tǒng)具備24小時防破壞等并自我監(jiān)視,一旦有任何被破壞的跡象也會即刻報警?傊瑹o論白天黑夜,你離家在外還是在家休息,電子保安時時刻刻保護(hù)的安全,這正是能為家人、家庭、財產(chǎn)所做的最有效的安全防盜保護(hù)措施。
1.3 系統(tǒng)功能
設(shè)計具有防盜并且兼有防火,防煤氣,防盜毒等功能的小區(qū)防盜報警系統(tǒng),無疑可以使家庭保安自動化。系統(tǒng)采用體積小巧,功能強大,價格便宜的單片微型計算機作為居民家庭第一監(jiān)視端,與單片機連接各種用于家庭安保的傳感器作為收集信號并送給單片機初步處理,單片機實時與遠(yuǎn)方主監(jiān)控計算機通信,將從傳感器接受來的信號實時傳給主機,主機端就可以知道小區(qū)各個居民家庭的異常情況,從而進(jìn)行實時處理。系統(tǒng)利用CAN總線傳輸信息,提高了可靠性,操作更方便,在工程實際中有廣泛的應(yīng)用,因而具有良好的應(yīng)用前景和工程推廣價值。
該系統(tǒng)運用了了單片機AT89C51, CAN總線的主要特性和功能,將主從式微機通信運用于今天的生活,體現(xiàn)了自動化的發(fā)展前景一片光明。對于應(yīng)用區(qū)域:
每個家庭可實現(xiàn):家中無人時,如上班了,可把家庭報警系統(tǒng)設(shè)置在外出布防狀態(tài),使所有的探測器都工作起來。當(dāng)竊賊試圖破門而入或從陽臺闖入,被動紅外探測器探測到動作,警號發(fā)聲,并且保安中心立刻接收到警情,接著在數(shù)秒后公安局報警中心也會收到報警信號。家中有人時,如睡覺時,把系統(tǒng)設(shè)置在留守布防狀態(tài),當(dāng)竊賊企圖從大門闖入時,立刻動作發(fā)出警報;如果主人有緊急情況,如急病或受到挾持時,可按動鍵盤上的緊急按鈕發(fā)出警報。
1.4 系統(tǒng)設(shè)計框圖
圖1.1 系統(tǒng)組成結(jié)構(gòu)圖
1.5 系統(tǒng)實現(xiàn)方法
    (1) 利用各種傳感器接收需要防備外界的異常信號,信號的檢測與轉(zhuǎn)換傳輸。
(2) 單片機接收傳感器檢測信號,進(jìn)行初步處理,如記錄發(fā)生情況的位置,何種報警等等,也可以單片機進(jìn)行現(xiàn)場報警。
(3) 利用CAN總線實現(xiàn)單片機與主控計算機的串口通訊。
(4) 在主控計算機上接收單片機送來的報警信號,發(fā)出報警信息。
2  系統(tǒng)可行性分析2.1 硬件模塊
報警器硬件由溫度煙霧信號采集模塊、煤氣信號采集模塊、防盜報警模塊、光報警模塊,鍵盤顯示模塊以及單片機與CAN總線模塊組成。
2.1.1單片機控制模塊
經(jīng)過比較,作者決定使用常用、廉價的單片機AT89C51作為主控制器。單片機AT89C51是由ATMEL公司生產(chǎn)的51單片機。簡單介紹如下:
AT89C51是一個低電壓,高性能CMOS 8位單片機,片內(nèi)含4k bytes的可反復(fù)擦寫的只讀程序存儲器(PEROM)和128 bytes的隨機存取數(shù)據(jù)存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng),片內(nèi)置通用8位中央處理器和Flash存儲單元,內(nèi)置功能強大的微型計算機的AT89C51提供了高性價比的解決方案。
    AT89C51是一個低功耗高性能單片機,40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內(nèi)含2個外中斷口,2個16位可編程定時計數(shù)器,2個全雙工串行通信口,         AT89C51可以按照常規(guī)方法進(jìn)行編程,也可以在線編程。其將通用的微處理器和Flash存儲器結(jié)合在一起,特別是可反復(fù)擦寫的Flash存儲器可有效地降低開發(fā)成本。
AT89C51具有PDIP、PQFP/TQFP及PLCC等三種封裝形式,以適應(yīng)不同產(chǎn)品的需求。
AT89C51的引腳圖如下圖所示:
圖2.1AT89C51芯片的引腳圖
VCC:供電電壓。
GND:接地。
P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當(dāng)P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時,P0 口作為原碼輸入口,當(dāng)FIASH進(jìn)行校驗時,P0輸出原碼,此時P0外部必須被拉高。
P1口:P1口是一個內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。
P2口:P2口為一個內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當(dāng)P2口被寫“1”時,其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存儲器或16位地址外部數(shù)據(jù)存儲器進(jìn)行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內(nèi)部上拉優(yōu)勢,當(dāng)對外部八位地址數(shù)據(jù)存儲器進(jìn)行讀寫時,P2口輸出其特殊功能寄存器的內(nèi)容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。
P3口:P3口管腳是8個帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。
P3口也可作為AT89C51的一些特殊功能口,如下所示:
P3.0 RXD(串行輸入口)
P3.1 TXD(串行輸出口)
P3.2 /INT0(外部中斷0)
P3.3 /INT1(外部中斷1)
P3.4 T0(記時器0外部輸入)
P3.5 T1(記時器1外部輸入)
P3.6 /WR(外部數(shù)據(jù)存儲器寫選通)
P3.7 /RD(外部數(shù)據(jù)存儲器讀選通)
P3口同時為閃爍編程和編程校驗接收一些控制信號。
RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時,要保持RST腳兩個機器周期的高電平時間。
ALE/PROG:當(dāng)訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時, ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。
/PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/PSEN信號將不出現(xiàn)。
/EA/VPP:當(dāng)/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內(nèi)部程序存儲器。注意加密方式1時,/EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平時,此間內(nèi)部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。
XTAL1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入。
XTAL2:來自反向振蕩器的輸出。
此單片機主要用于控制,包括響應(yīng)中斷、延時、判斷、發(fā)送對方號碼等等。
2.1.2溫度煙霧信號采集模塊
要準(zhǔn)確的進(jìn)行火災(zāi)報警,選擇合適的溫度傳感器和煙霧傳感器是準(zhǔn)確報警的前提。綜合考慮各種因素,作者選擇集成數(shù)字溫度傳感器DS18B20和煙霧傳感器NIS-09C用作采集系統(tǒng)的敏感元件。
2.1.3煤氣信號采集模塊
煤氣泄露報警:一當(dāng)室內(nèi)煤氣超過正常標(biāo)準(zhǔn)時,它將通過傳感器向家庭控制器發(fā)出報警信號。對于密度大于空氣的氣體,感應(yīng)器放在氣體源的下方。對于密度小于空氣的氣體,感應(yīng)器放在氣體源的上方,當(dāng)煤氣泄露報警啟動,就通知管理中心。綜合考慮各種因素,作者選用氣敏傳感器TP-1.1A,用作煤氣報警。
2.1.4防盜報警模塊
防盜報警:在小區(qū)每一住戶內(nèi)安裝防盜報警裝置。當(dāng)住戶家中無人時,可把家庭內(nèi)的防盜報警系統(tǒng)設(shè)置為布防狀態(tài),當(dāng)竊賊闖入時,報警系統(tǒng)自動發(fā)出警報并向小區(qū)安保中­心報警。綜合考慮各種因素,選用熱電釋紅外傳感器RE200B來進(jìn)行防盜報警。
2.1.5光報警模塊
    由AT89C51的P1口的P1.4~P1.7分別控制4個發(fā)光二極管,予以光報警。P1.4~P1.7控制的燈依次為正常信號燈、煤氣信號燈、火災(zāi)信號燈和防盜信號燈。當(dāng)這些輸出端輸出低電平時,對應(yīng)的信號燈便會發(fā)光報警。
圖2.2 光報警電路圖
2.1.6數(shù)據(jù)采集模塊
A/D轉(zhuǎn)換是本系統(tǒng)比較關(guān)鍵的一步,通過A/D轉(zhuǎn)換,成功的把所要測量和控制的數(shù)據(jù)采集過來,是保證系統(tǒng)功能可以實現(xiàn)的第一步。為了設(shè)計好A/D轉(zhuǎn)換模塊,使它達(dá)到預(yù)想的A/D轉(zhuǎn)換效果,必須選定合適的A/D轉(zhuǎn)換器。
A/D轉(zhuǎn)換電路采用了常用的8位8通道數(shù)模轉(zhuǎn)換專用芯片ADC0809,ADC0809由8路模擬開頭、地址鎖存與譯碼器、8位A/D轉(zhuǎn)換器和三態(tài)輸出鎖存緩沖器組成。
(1) 其主要性能指標(biāo)為:
①分辨率為8位。
②最大不可調(diào)誤差:0808為1/2LSB,0809為1LSB。
③單電源+5v供電,基準(zhǔn)電壓由外部提供,典型值為+5v,此時允許輸入模擬電壓為0—5V。
④具有鎖存控制的8路模擬選通開關(guān)。
⑤可鎖存三態(tài)輸出,輸出電平與TTL電平兼容。
功耗15mW。
⑥轉(zhuǎn)換速度取決于芯片的時鐘頻率。時鐘頻率范圍500KHz時,轉(zhuǎn)換時間為128μs。
(2)ADC0809引腳功能
圖2.3為ADC0809引腳圖,說明如下;
圖2.3 ADC0809芯片引腳
①IN0—IN7——8路模擬信號輸入端。
②ADDA、ADDB、ADDC——3位地址碼輸入端。8路模擬信號轉(zhuǎn)換選擇由A、B、C決定。A為低位,C為高位。與低8位地址中A0—A2連接。由A0—A2地址000-111選擇INO-IN7八路A/D通道。其中模擬開關(guān)與輸入通道的關(guān)系見表3.1。
③CLK——外部時鐘輸入端。時鐘頻率高,A/D轉(zhuǎn)換速度快。允許范圍為10—1280KHz,典型值為640KHz,此時A/D轉(zhuǎn)換時間為100μs通常由MCS-51型單片機ALE端直接或分頻后與0809CLK端相連接。當(dāng)MCS-51型單片機無讀寫外RAM操作時,ALE信號固定為CPU時鐘頻率的1/6。若晶振為6MHz,則1/6為1MHz時.A/D轉(zhuǎn)換時間為64μs。
表2.1路模擬開關(guān)與輸入通道的關(guān)系表
通入通道
IN0
IN1
IN2
IN3
IN4
IN5
IN6
IN7
A
0
1
0
1
0
1
0
1
B
0
0
1
1
0
0
1
1
C
0
0
0
0
1
1
1
1
④D0—D7——數(shù)字量輸出端。
——A/D轉(zhuǎn)換結(jié)果輸出允許控制端。當(dāng)面端為高電平時,允許將A/D轉(zhuǎn)換結(jié)果從Do—D7端輸出。通常由MCS- 51型單片機的端與0809片選端(例如P2.0)通過或非門與0809端相連接。當(dāng)DPTR為FEFFH,且執(zhí)行MOVX  A,@DPTR指令
后,RD和P2.0均有效,或非后產(chǎn)生高電平,使0809端有效,0809將A/D轉(zhuǎn)換結(jié)果送入數(shù)據(jù)總線Po口,CPU再讀入A中。
⑥ALE——地址鎖存允許信號。8路模擬通道地址由A、B、C輸入,在0809的ALE信號有效時將該8路地址鎖存(注意0809ALE與803lALE的區(qū)別)。
⑦START——啟動A/D轉(zhuǎn)換信號。當(dāng)START端輸入一個正脈沖時,立即啟動0809進(jìn)行A/D轉(zhuǎn)換。START端與ALE端連在一起,由MCS-51型單片機WR與0809片選端(例如P2.0)通過或非門相連,當(dāng)DPTR為EFF8H,執(zhí)行“MOVX@DPTR,A”指令后,將啟動0809模擬通道0的A/D轉(zhuǎn)換。FEF8H—FEFFH分別為8路模擬輸入通道的地址。執(zhí)行MOVX寫指令,井非真的將A中內(nèi)容寫進(jìn)0809,而是產(chǎn)生WR信號和P2.o有效,從而使0809的START和ALE有效,且輸出A/D通道0地址A0—A2。事實上也無法將A內(nèi)容寫進(jìn)0809,0809中沒有一個寄存器能容納A中內(nèi)容,0809的輸入通道是IN0—IN7,輸出通道是D0—D7,因此,執(zhí)行“MOVX@DPTR,A”指令與A中內(nèi)容無關(guān),但DPTR地址應(yīng)指向當(dāng)前A/D的通道地址。
⑧EOC——A/D轉(zhuǎn)換結(jié)束信號。當(dāng)啟動0809A/D轉(zhuǎn)換后;EOC輸出低電平;轉(zhuǎn)換結(jié)束后,EOC輸出高電平,表示可以讀取A/D轉(zhuǎn)換結(jié)果。該信號取反后,若與MCS-51型單片機引腳INT0或連接,可引發(fā)CPU中斷,在中斷服務(wù)程序中讀A/D轉(zhuǎn)換的數(shù)字信號。若MC5—51型單片機兩個中斷源已用完,則EOC也可與P1口或四口的一條端線相連,不采用中斷方式,采用查詢方式,查得EOC為高電平后,再讀A/D轉(zhuǎn)換值。
⑨VREF+、VREF- ——正負(fù)基準(zhǔn)電壓輸入端;鶞(zhǔn)電壓的典型值為+5v,可與電源電壓(+5v)相連,但電源電壓往往有一定波動,將影響A/D精度。因此,精度要求較高時,可用高穩(wěn)定度基準(zhǔn)電源輸入。當(dāng)模擬信號電壓較低時,基準(zhǔn)電壓也可取低于5v的數(shù)值。
⑩Vcc——正電源電壓(+5v)。GND——接地端。
ADC0809的A/D轉(zhuǎn)換過程是在時鐘信號的協(xié)調(diào)下進(jìn)行的。ADC0809的時鐘信號由CLOCK端送入,其最高頻率為640MHz,在這個最高頻率下ADC0809的A/D轉(zhuǎn)換時間為100uS左右。
A/D轉(zhuǎn)換結(jié)束后,A/D轉(zhuǎn)換的結(jié)果(8位數(shù)字量)送到三態(tài)鎖存輸出緩沖器,此時A/D轉(zhuǎn)換結(jié)果還沒有現(xiàn)在DB0—DB7八條數(shù)字量輸出線上,單片機不能獲取之。單片機要想讀到A/D轉(zhuǎn)換結(jié)果,必須使ADC0809的允許輸出控制端OE為高電平,打開三態(tài)輸出鎖存器,A/D轉(zhuǎn)換結(jié)果出現(xiàn)在DB0—DB7上。
圖2.4 ADC0809的讀、寫、啟動以及A/D轉(zhuǎn)換時序圖
圖2.4中EOC為轉(zhuǎn)換結(jié)束輸出信號。在A/D轉(zhuǎn)換期間,EOC維持高電平,當(dāng)A/D轉(zhuǎn)換結(jié)束時,EOC變成高電平。ADC0809的START端收到下降沿后,并不立即進(jìn)行A/D轉(zhuǎn)換,EOC=1,而是延遲10uS后,才開始A/D轉(zhuǎn)換,EOC變?yōu)榈碗娖。單片機讀取A/D轉(zhuǎn)換結(jié)果的方法有三種(1)延遲法:單片機啟動ADC0809后,延時130uS以上,可以讀到正確的A/D轉(zhuǎn)換結(jié)果。(2)查詢法:EOC必須接到AT89C51的一條I/O線上。單片機啟動ADC0809后,延遲10uS,檢測EOC,若EOC=0則A/D轉(zhuǎn)換沒有結(jié)束,繼續(xù)檢測EOC直到EOC=1。當(dāng)EOC=1時,A/D轉(zhuǎn)換已經(jīng)結(jié)束,單片機讀取A/D轉(zhuǎn)換結(jié)果。(3)中斷法:EOC必須經(jīng)過非門接到AT89C51的中斷請求輸入線INT0或INT1上,AT89C51的中斷觸發(fā)方式為下降沿觸發(fā)。單片機啟動A/D轉(zhuǎn)換后可以做其它工作,當(dāng)A/D轉(zhuǎn)換結(jié)束時,EOC由0—1經(jīng)過非門傳到INT端,AT89C51收到中斷請求信號,若AT89C51開中斷,則進(jìn)入中斷服務(wù)程序,在中斷服務(wù)程序中單片機讀取A/D轉(zhuǎn)換的結(jié)果。
數(shù)據(jù)采集的電路如圖2.5所示。溫度、煙霧、煤氣、防盜傳感器的輸出分別接到ADC0809的IN4、IN5、IN6和IN7。ADC0809的通道選擇地址A,B,C分別由AT89C51的P0.0~P0.2經(jīng)地址鎖存器74LS373輸出提供。當(dāng)P2.0=0時,與寫信號WR共同選通ADC0809。圖中ALE信號與ST信號連在一起,在WR信號的前沿寫入地址信號,在其后沿啟動轉(zhuǎn)換。例如,輸出地址7FF8H可選通通道IN4,實現(xiàn)對溫度傳感器輸出的模擬量進(jìn)行轉(zhuǎn)換;輸出地址7FF9H可選通通道IN1,實現(xiàn)對煙霧傳感器輸出的模擬量進(jìn)行轉(zhuǎn)換。圖中ADC0809的轉(zhuǎn)換結(jié)束狀態(tài)信號EOC接到89C51的INT1引腳,當(dāng)A/D轉(zhuǎn)換完成后,EOC變?yōu)楦唠娖,表示轉(zhuǎn)換結(jié)束,產(chǎn)生中斷。在中斷服務(wù)程序中,將轉(zhuǎn)換好的數(shù)據(jù)送到指定的存儲單元。
圖2.5 數(shù)據(jù)采集模塊
2.1.7鍵盤顯示模塊
單片機系統(tǒng)所用的鍵盤有編碼鍵盤和非編碼鍵盤兩種。
編碼鍵盤是只要按下它的某一個鍵,就能產(chǎn)生這個鍵的代碼,與此同時還產(chǎn)生一個脈沖信號,以通知CPU接收鍵碼。編碼鍵盤使用方便,也不用編寫太復(fù)雜的程序。但硬件電路復(fù)雜,比非編碼簡易鍵盤成本要高。
非編碼鍵盤也稱簡易鍵盤,它的按鍵是排列成行、列矩陣形式的。按鍵的作用只是簡單地實現(xiàn)接點的接通或斷開,因此必須有一套相應(yīng)的程序與之配合,才能產(chǎn)生相應(yīng)的鍵碼,它基本上不需要附加什么硬件電路。但需要通過軟件來解決按的識別、防抖動以及如何產(chǎn)生鍵碼的問題。
為了節(jié)約成本,本系統(tǒng)選用簡易鍵盤作為撥號輸入。
單片機所用的顯示有LED和LCD兩種,從設(shè)計的難度和成本造價來說LCD都要高于LED。本作品要顯示的是要撥的號碼和來電顯示對方機子的號碼,為數(shù)字顯示。因此,本作品選用了由LED組成的7段發(fā)光顯示器,它有簡單、經(jīng)濟(jì)、易于與單片機接口等優(yōu)點。7段LED選用的是共陽極的。
2.1.8CAN總線協(xié)議
CAN(Controller Area Network)總線,又稱控制器局域網(wǎng),是Bosch公司在現(xiàn)代汽車技術(shù)中領(lǐng)先推出的一種多主機局域網(wǎng)。由于其卓越的性能,極高的可靠性,獨特靈活的設(shè)計和低廉的價格,現(xiàn)已廣泛應(yīng)用于工業(yè)現(xiàn)場控制、智能大廈、小區(qū)安防、交通工具、醫(yī)療儀器、環(huán)境監(jiān)控等眾多領(lǐng)域。
CAN的通信協(xié)議主要由CAN控制器完成。CAN控制器主要由實現(xiàn)CAN總線協(xié)議的部分和實現(xiàn)與微處理器接口部分的電路組成。對于不同型號的CAN總線通信控制器,實現(xiàn)CAN協(xié)議部分電路的結(jié)構(gòu)和功能大多相同,而與微處理器接口部分的結(jié)構(gòu)和方式存在一些差異。
CAN控制器選用SJA1000作為控制器。SJA1000是高集成度CAN控制器。具有多主結(jié)構(gòu)、總線訪問優(yōu)先權(quán)、成組與廣播報文功能及硬件濾波功能。輸入時鐘頻率為16MHZ時鐘,輸出可編程控制。由以下幾部分構(gòu)成:接口管理邏輯、發(fā)送緩存器、接收緩存器、位流處理器、位定時邏輯、收發(fā)邏輯、錯誤管理邏輯、控制器接口邏輯等。
SJA1000在電路中是一個總線接口芯片,通過它實現(xiàn)上位機與現(xiàn)場微處理器之間的數(shù)據(jù)通信。該電路的主要功能是通過CAN總線接收來自上位機的數(shù)據(jù)進(jìn)行分析組態(tài)然后下傳給下位機的控制電路實現(xiàn)控制功能,當(dāng)CAN總線接口接收到下位機的上傳數(shù)據(jù),SJA1000就產(chǎn)生一個中斷,引發(fā)微處理器產(chǎn)生中斷,通過中斷處理程序接收每一幀信息并通過CAN總線上傳給上位機進(jìn)行分析。AT89C51是CAN總線接口電路的核心,其承擔(dān)CAN控制器的初始化、CAN的收發(fā)控制等任務(wù)。
CAN總線收發(fā)器選用PCA82C250作為總線收發(fā)器。 PCA82C250是CAN 協(xié)議控制器和物理總線之間的接口。82C250 可以為總線提供不同的發(fā)送性能,為CAN 控制器提供不同的接收性能。而且它與“ISO 11898”標(biāo)準(zhǔn)完全兼容。PCA82C250的目的是為了增大通信距離,提高系統(tǒng)的瞬間抗干擾能力,保護(hù)總線,降低射頻干擾(RFI)實現(xiàn)熱防護(hù)等。
接口主要元件電路原理圖見圖2.6,在進(jìn)行電路設(shè)計時應(yīng)注意以下幾點,否則達(dá)不到預(yù)期的效果。
(1)總線兩端必須接兩個終端匹配電阻RT,忽略掉它們,會使數(shù)據(jù)通信的抗干擾性及可靠性大大降低。
(2)PCA82C250為CAN控制器和物理總線之間的接口,它可以提供向總線的
差動發(fā)送能力和CAN控制器的差動接收能力,TXD和RXD引腳分別發(fā)送經(jīng)過驅(qū)動后的發(fā)送和接收信號。其引腳8(RS)可以選擇2種不同的工作方式:把該引腳直接與地相連,系統(tǒng)將處于高速工作方式,在這種方式下,為避免射頻干擾,建議使用屏蔽電纜作總線;而在波特率較低,總線較短時,一般采用斜率控制方式,上升及下降的斜率取決于RS的阻值,實踐表明15-200k為RS較理想的取值范圍,在這種方式下,可以使用雙絞線作總線(本系統(tǒng)采用該工作方式)。
(3)SJA1000的TX1腳懸空,RX1引腳的電位必須維持在約0.5VCC上,否則,
將不能形成CAN協(xié)議要求的電平邏輯。因本系統(tǒng)傳輸距離近,環(huán)境干擾小,可以不用電流隔離,這樣可以直接把82C250的VREF端(約為0.5VCC)與SJA1000的RX1相連,從而簡化了電路。
(4)設(shè)計時將SJA1000的CLOCKOUT的時鐘信號接至AT89C51的時鐘電路輸
入端,作為AT89C51的外部時鐘輸入,解決了時鐘同步問題;SJA1000中斷輸出信號/INT接至AT89C51的/INT0端,通過中斷方式與AT89C51通信。
    AT89C51                 SJA1000
   圖2.6 接口主要元器件電路圖
2.1.9傳感器模塊
上述所說的各種信號采集模塊都是經(jīng)過傳感器來進(jìn)行信號采集,再送到ADC0809。
傳感器是一個從系統(tǒng)接收功率,通常以另一種形式將功率送到第二個系統(tǒng)中的器件。按照這一定義,可以說傳感器是一種吸收(提取)、轉(zhuǎn)換和傳送能量的器件。嚴(yán)格地說,應(yīng)該區(qū)別檢測和變換這兩個概念。前者只是將被測量轉(zhuǎn)移到系統(tǒng)中去,而后者從字面上說是將被測量的種類加以改變。有時,對被測量只進(jìn)行一次變換還不夠,必須進(jìn)行第二次、第三次變換,一直到所希望的能量形式為止。傳感器轉(zhuǎn)換能量的理論基礎(chǔ)都是利用物理學(xué)、化學(xué)等各種現(xiàn)象和效應(yīng)來進(jìn)行能量形式的變換。隨著微電子和計算機技術(shù)的發(fā)展,傳感器輸出信號的形式應(yīng)盡可能是電量。
傳感器的組成按其定義一般是由敏感元件、變換元件和測量電路三部分組成。除自源型傳感器外,還需外加輔助電源,用框圖表示,如圖2.7所示。由圖可知,傳感器由以下幾個部分組成:
圖2.7 傳感器的組成框圖
(1)敏感元件(預(yù)變換器)  直接感受被測量(一般為非電量)并將其轉(zhuǎn)換為與被測量有確定關(guān)系的易變成電量(包括電量)的其它量的元件。
(2)轉(zhuǎn)換元件(變換器)  它能將其它物理量直接轉(zhuǎn)換為有確定關(guān)系的電量的元件。
(3)測量電路(變換電路)  把轉(zhuǎn)換元件輸出的電信號變?yōu)楸阌谔幚怼@示、記錄、控制的可用電信號的電路。測量電路的類型視轉(zhuǎn)換元件的不同而定.經(jīng)常采用的有電橋電路和其它特殊電路,加高阻抗輸入電路、脈沖電路、振蕩電路等。
(4)輔助電源  供給轉(zhuǎn)換能量。
2.2 軟件模塊
通過上面分析,決定選用C51系列單片機作為控制器,那么它的軟件編寫就要按照單片機語言:C語言或匯編語言來編寫,這里選用執(zhí)行效率高的匯編語言編寫。 開發(fā)工具為keil c51,它的功能強大,支持c語言和匯編語言的編寫與調(diào)試,其軟件模擬I/O口也會給軟件調(diào)試帶來極大的方便。
2.2.1溫度煙霧信號采集模塊
進(jìn)行火災(zāi)報警,需要溫度和煙霧兩個傳感器,當(dāng)溫度達(dá)到一定的度數(shù)和煙霧的濃度達(dá)到一定的百分比時,就進(jìn)行火災(zāi)報警。在本設(shè)計中,作者選用了數(shù)字溫度傳感器AS18B20和煙霧傳感器NIS-09C來進(jìn)行報警。
把數(shù)字溫度傳感器AS18B20和煙霧傳感器NIS-09C分別接到ADC0809IN4口和IN5口。當(dāng)進(jìn)行火災(zāi)報警時,ADC0809就將采集到的數(shù)據(jù)信號存儲在數(shù)據(jù)區(qū),進(jìn)行A/D轉(zhuǎn)換,并將指針指向下一個通道。
2.2.2煤氣信號采集模塊
進(jìn)行煤氣報警,作者選用了常用的家庭煤氣報警傳感器TP-1.1A。將煤氣傳感器TP-1.1A接到ADC0809的IN6口。當(dāng)進(jìn)行煤氣報警時,ADC0809就將采集到的數(shù)據(jù)信號存儲在數(shù)據(jù)區(qū),進(jìn)行A/D轉(zhuǎn)換,并將指針指向下一個通道。
2.2.3防盜報警信號采集模塊
人體有恒定的體溫,一般在37攝氏度,所以會發(fā)出特定波長的紅外線。熱電釋紅外傳感器探頭就是靠探測人體發(fā)射的紅外線而進(jìn)行工作。人體發(fā)出的紅外線,通過菲涅爾濾光片增強后,聚集到紅外感應(yīng)源上。熱電式元件在接收到人體紅外輻射溫度發(fā)生變化時將會失去電荷平衡,向外釋放電荷,后續(xù)電路經(jīng)檢測處理后產(chǎn)生報警信號。進(jìn)行防盜報警時,作者選用了價格比較合適的熱電釋紅外傳感器RE200B。當(dāng)人體靠近熱電釋紅外傳感器RE200B到一定距離時,熱電釋紅外傳感器就會報警,ADC0809就會將采集的信號存儲在數(shù)據(jù)區(qū),進(jìn)行A/D轉(zhuǎn)換。
2.2.4光報警
把四個發(fā)光二極管分別接在AT89C51的P1.4~P1.7口。P1.4~P1.7口控制的燈依次為正常信號燈、煤氣信號燈、火災(zāi)信號燈和防盜信號燈。當(dāng)這些輸出端輸出低電平時,對應(yīng)的信號燈便會發(fā)光報警。
2.2.5信號采集模塊
數(shù)據(jù)采集部分的程序設(shè)計包括:驅(qū)動ADC0809的IN4,IN5,IN6和IN7進(jìn)行A/D轉(zhuǎn)換,分別由子程序ADC1(溫度轉(zhuǎn)換),ADC2(煙霧濃度轉(zhuǎn)換),ADC3(煤氣濃度轉(zhuǎn)換)和ADC4(防盜轉(zhuǎn)換)完成;單片機接收轉(zhuǎn)換好的數(shù)據(jù),存入指定內(nèi)存單元,由INT1中斷服務(wù)程序完成。每次驅(qū)動A/D轉(zhuǎn)換后等待外部中斷1,中斷到來說明A/D轉(zhuǎn)換已經(jīng)完成,通過中斷服務(wù)程序讀取轉(zhuǎn)換得到的數(shù)據(jù)。
數(shù)據(jù)采集模塊的工作原理:各類傳感器采集到數(shù)據(jù)后模擬量傳送到ADC0809,0809將轉(zhuǎn)換成的數(shù)字量傳給89C51,最后單片機將采集到的數(shù)據(jù)送到SJA1000通過CAN總線收發(fā)器82C250傳上總線,完成數(shù)據(jù)采集工作,并由CAN 總線通過RS232傳給上位機。
2.2.6鍵盤顯示模塊
    本單元需要兩個并行口:一個作為行信號輸出,它與顯示器的位選碼共享一個口,這里作者選用P2口的P2.2和P2.3;另一個作為列信號的讀入口,這里選用P0口的前四位P2.4至P2.7。
2.2.7CAN總線通訊模塊
CAN總線測控系統(tǒng)的通信軟件分為3部分:CAN初始化、數(shù)據(jù)發(fā)送和數(shù)據(jù)接收。
CAN初始化,其主要是設(shè)置CAN的通信參數(shù)。需要初始化的寄存器有:模式寄存器(Peli CAN模式)、時分寄存器、接收代碼寄存器、屏蔽寄存器、總線定時寄存器、輸出控制寄存器等。需要注意的是,這些寄存器僅能在復(fù)位期間可寫訪向,因此,在對這些寄存器初始化前,必須確保系統(tǒng)進(jìn)入了復(fù)位狀態(tài),并且系統(tǒng)中各CAN控制器的總線定時寄存器的初始化字必須相同。
數(shù)據(jù)發(fā)送,現(xiàn)場的各傳感器把環(huán)境多參數(shù)的檢測信號(數(shù)字量、模擬量、開關(guān)量)進(jìn)行轉(zhuǎn)換處理后,發(fā)向CAN控制器的發(fā)送緩沖區(qū),然后啟動CAN控制器的發(fā)送命令,此時CAN控制器將自動向總線發(fā)送數(shù)據(jù),不再需傳感器的微控制器進(jìn)行干預(yù)。
數(shù)據(jù)接收,整個微機測控系統(tǒng)中的CAN控制器檢測到總線上有數(shù)據(jù)時會自動接收總線上的數(shù)據(jù),存入其接收緩沖區(qū),并向AT89C51微控制器發(fā)送接收中斷,啟動中斷接收服務(wù)程序,AT89C51通過執(zhí)行中斷接收服務(wù)程序,從CAN控制器的接收緩沖區(qū)讀取數(shù)據(jù),并對其進(jìn)行進(jìn)一步處理工作。
3  硬件單元電路設(shè)計3.1 ADC0809和四個報警傳感器的接口電路設(shè)計
ADC0809和四個報警傳感器的接口電路設(shè)計圖如圖3.1所示。
圖3.1 ADC0809和傳感器的接口電路圖
上圖所示的四個插針分別代表溫度傳感器,煙霧傳感器,煤氣傳感器和防盜傳感器。因為傳感器進(jìn)行報警時,要將傳感器放于不同的位子,所以在設(shè)計電路圖時,作者就選用插針,這樣,用軟線把插針與傳感器連接起來,顯得更加方便,可以將傳感器放于需要的位子。
元器件的選取:
ADC0809芯片一塊
插針?biāo)膫(三排插針兩個,兩排插折兩個)
47K的電阻一個,51歐姆的電阻一個,50K的電阻兩個
3.2 AT89C51與ADC0809接口電路
AT89C51與ADC0809接口電路如3.2所示。
圖3.2 AT89C51與ADC0809接口電路圖
ADC0809的通道選擇地址A,B,C分別由AT89C51的P0.0~P0.2經(jīng)地址鎖存器74LS373輸出提供。當(dāng)P2.7=0時,與寫信號WR共同選通ADC0809。圖中ALE信號與ST信號連在一起,在WR信 號的前沿寫入地址信號,在其后沿啟動轉(zhuǎn)換。ADC0809的轉(zhuǎn)換結(jié)束狀態(tài)信號EOC接到AT89C51的INT1引腳,當(dāng)A/D轉(zhuǎn)換完成后,EOC變?yōu)楦唠娖剑硎巨D(zhuǎn)換結(jié)束,產(chǎn)生中斷。在中斷服務(wù)程序中,將轉(zhuǎn)換好的數(shù)據(jù)送到指定的存儲單元。
AT89C51的頻率跟ADC0809的頻率不一致,所以選用74LS74進(jìn)行二分頻。
元器件的選取:
AT89C51單片機一塊
ADC0809芯片一塊
74LS74芯片一塊
74LS02芯片一塊
74LS04芯片兩塊
3.3 AT89C51與光報警接口電路
AT89C51與光報警接口電路如圖3.3所示
圖3.3 AT89C51與光報警接口電路圖
把四個發(fā)光二極管分別接在AT89C51的P1.4~P1.7口。P1.4~P1.7口控制的燈依次為正常信號燈、煤氣信號燈、火災(zāi)信號燈和防盜信號燈。當(dāng)進(jìn)行一種報警時,所對應(yīng)的發(fā)光二極管就會亮。例如,當(dāng)進(jìn)行火災(zāi)報警時,P1.6口的發(fā)光二極管就會亮。
元器件的選取:
四個340歐姆的電阻
四個發(fā)光二極管
3.4 鍵盤顯示接口電路
鍵盤顯示接口電路如圖3.4所示。
圖3.4 鍵盤顯示接口電路圖
具體掃描法:(1)將全部行線Y0-Y3(行)置低電平,然后檢測列的狀態(tài)。只要有一列的電平為低,則表示按鍵中有鍵被按下,而且閉合的鍵位于低電平與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中沒有鍵按下。(2)判斷閉合鍵所在的位置。在確定有按鍵按下以后,就可以進(jìn)入確定具體閉合鍵的過程。其方法是:依次將行線置低電平,即在置某根行線為低電平時,其線為高電平。在確定某根行線位置為低電平后,再將行檢測各列的電平狀態(tài)。若為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。
元器件的選取:
按鍵選用我們熟悉的四腳矩形按鍵8個
9012PNP放大三極管4個
四位共陽LED數(shù)碼管一塊
4.7k的限流電阻4個
3.5 AT89C51與CAN總線接口電路
AT89C51與CAN總線接口電路圖如圖3.5所示。
圖3.5 AT89C51與CAN總線接口電路圖
在系統(tǒng)中,SJA1000的片選信號一般由地址總線經(jīng)譯碼獲得,并由此決定出CAN控制器各寄存器的地址。在本設(shè)計中,作者用單片機AT89C51的P2.7為片選信號。所以,SJA1000的地址為:7F00-7F32H。
SJA1000的TX1腳懸空,RX1引腳的電位必須維持在約0.5Vcc上,否則,將不能形成CAN協(xié)議所要求的電平邏輯。如果系統(tǒng)傳輸距離近,環(huán)境干擾小,可以不用電流隔離,這樣可直接把82C250的VREF端(約為0.5 Vcc)與RX1腳相連,從而簡化了電路。
當(dāng)上電復(fù)位時,AT89C52的上電復(fù)位,需要從低到高的電平變化來激活,而SJA1000的17腳RST被激活,需要出現(xiàn)一個由高電平到低電平的跳變,因此,這必須加一個反相器。
82C50第8腳與地之間的電阻Rs稱為斜率電阻,它的取值決定了系統(tǒng)處于高速工作方式還是斜率控制方式。而在波特率較低、總線較短時,一般采用斜率控制方式,上升及下降的斜率取決于民的阻值,實驗數(shù)據(jù)表明15~200kΩ為Rs較理想的取值范圍,在該方式下,可以使用平行線或雙絞線作總線。在本設(shè)計中,Rs選用150K。
元器件的選。
SJA1000芯片一塊
PCA82C250芯片一塊
74LS04芯片一塊
16MHZ晶振一個
22PF的二極管兩個
60歐姆的電阻一個
150K的電阻一個
4  軟件設(shè)計
本系統(tǒng)的軟件設(shè)計主要是采集四個報警傳感器的報警信號,再通過發(fā)光二極管顯示,每一個發(fā)光二極管亮就表示有一種報警傳感器報警。用戶可以根據(jù)自己家庭的具體情況來設(shè)置報警的最高限度,用鍵盤顯示來實現(xiàn)。單片機還要把采集的信號通過CAN總線傳輸?shù)缴衔粰C,在上位機上顯示出來。
4.1 CAN總線程序
CAN總線測控系統(tǒng)的通信軟件分為3部分:CAN初始化、數(shù)據(jù)發(fā)送和數(shù)據(jù)接收。
4.1.1CAN初始化
CAN初始化,其主要是設(shè)置CAN的通信參數(shù)。需要初始化的寄存器有:模式寄存器(Peli CAN模式)、時分寄存器、接收代碼寄存器、屏蔽寄存器、總線定時寄存器、輸出控制寄存器。
CAN初始化程序代碼為:
  1. #include <reg52.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <absacc.h>
  5. #define byte unsigned char
  6. #define word unsigned int
  7. #define time0  65536-2000
  8. #define BAUD  -13
  9. #define MAIN    1  ///定義主機,從機地址
  10. #define ADDR    2
  11. #define READ   'R'
  12. #define WRIT   'W'
  13. #define CAN_PORT P0
  14. #define CAN_CR   0    //控制
  15. #define CAN_CMR  1    //命令
  16. #define CAN_SR   2    //狀態(tài)
  17. #define CAN_IR   3    //中斷
  18. #define CAN_ACR  4    //驗收
  19. #define CAN_AMR  5    //屏蔽
  20. #define CAN_BTR0 6    //時序0
  21. #define CAN_BTR1 7    //時序1
  22. #define CAN_OCR  8    //輸出
  23. #define CAN_TXB  10   //發(fā)送緩沖
  24. #define CAN_RXB  20   //接收緩沖
  25. #define CAN_CDR  31   //分頻

  26. sbit CAN_WR  = P2^5;
  27. sbit CAN_RD  = P2^6;
  28. sbit CAN_ALE = P2^7;
  29. sbit CAN_RST = P1^0;

  30. sbit da_in   = P3^7;
  31. sbit da_clk  = P3^6;
  32. sbit da_cs   = P3^5;

  33. sbit KEY1    = P2^0;
  34. sbit KEY2    = P2^1;
  35. sbit LED1    = P1^3;
  36. sbit LED2    = P1^4;
  37. sbit LED7    = P1^7;
  38. sbit beer    = P1^1;
  39. bit CANBUS;
  40. byte bdata Acc ;
  41. sbit Acc7=Acc^7;
  42. byte idata TXB[10]={1,2,3,4,5,6,7,8,9,10}; //第一個為報文標(biāo)志碼
  43.       
  44. byte idata RXB[10];
  45. void CAN_INI()  /*初始化部分*/
  46. {
  47.   CANW(CAN_CR,0x01);  
  48.   CANW(CAN_ACR,MAIN); //驗收濾波器需與報文標(biāo)志碼(從機的發(fā)送的第一個字節(jié))一致
  49.   CANW(CAN_AMR,0x00);   
  50.   CANW(CAN_BTR0,0x42);   //125k-BPS
  51.   CANW(CAN_BTR1,0x1c);
  52.   CANW(CAN_OCR,0x1A);   //0xaa,0xd2,0xfa
  53.   CANW(CAN_CR,0x02);    //**中斷使能   
  54. }
  55. 4.1.2CAN數(shù)據(jù)發(fā)送

  56. 數(shù)據(jù)發(fā)送,現(xiàn)場的各傳感器把環(huán)境多參數(shù)的檢測信號(數(shù)字量、模擬量、開關(guān)量)進(jìn)行轉(zhuǎn)換處理后,發(fā)向CAN控制器的發(fā)送緩沖區(qū),然后啟動CAN控制器的發(fā)送命令,此時CAN控制器將自動向總線發(fā)送數(shù)據(jù),不再需傳感器的微控制器進(jìn)行干預(yù)。
  57. CAN數(shù)據(jù)發(fā)送的程序代碼為:
  58. void CANW(byte adr,byte dat) //寫CAN數(shù)
  59. {
  60.   CAN_ALE=1;
  61.   CAN_PORT=adr;
  62.   CAN_ALE=0;
  63.   CAN_WR=0;
  64.   CAN_PORT=dat;
  65.   CAN_WR=1;
  66. }

  67. byte CANR(byte adr)  //讀CAN數(shù)
  68. {
  69.   byte dat;
  70.   CAN_ALE=1;
  71.   CAN_PORT=adr;
  72.   CAN_ALE=0;
  73.   CAN_PORT=0xff;
  74.   CAN_RD=0;  
  75.   dat=CAN_PORT;
  76.   CAN_RD=1;
  77.   return dat;
  78. }

  79. void CAN_SEND() /*發(fā)送數(shù)據(jù)部分*/
  80. {
  81. byte i,p;
  82. p=CANR(CAN_SR);
  83. if (p&0x04)
  84. {
  85.   p=CAN_TXB;        /*p指向發(fā)送緩存首址*/
  86.   for(i=0;i<10;i++) CANW(p++,TXB[i]);
  87.   CANW(CAN_CMR,0x01);    /*請求發(fā)送*/
  88. }
  89. }
  90. 4.1.3CAN接收數(shù)據(jù)

  91. 數(shù)據(jù)接收,整個微機測控系統(tǒng)中的CAN控制器檢測到總線上有數(shù)據(jù)時會自動接收總線上的數(shù)據(jù),存入其接收緩沖區(qū),并向AT89C51微控制器發(fā)送接收中斷,啟動中斷接收服務(wù)程序,AT89C51通過執(zhí)行中斷接收服務(wù)程序,從CAN控制器的接收緩沖區(qū)讀取數(shù)據(jù),并對其進(jìn)行進(jìn)一步處理工作。
  92.     CAN接收數(shù)據(jù)程序為:
  93.      void CAN_INT() interrupt 0 using 1/*接收中斷*/
  94. {
  95.     byte i,p;
  96.     p=CANR(CAN_IR);
  97.      if(p&0x01)
  98.     {
  99.      p=CAN_RXB;
  100.     for(i=0;i<10;i++)
  101.     {
  102.      RXB[i]=CANR(p++);
  103.     }
  104.      CANW(CAN_CMR,0x04);     /*釋放接收緩存*/
  105.     CANBUS=1;// LED2=1;
  106.     }
  107. }
  108. void CAN_SCAN()
  109. {
  110.      TXB[0]=ADDR;
  111.      TXB[1]=8;
  112.    TXB[2]=ADDR;
  113.      TXB[3]=WRIT;
  114.      TXB[4]=2;
  115.      if(KEY1==0) TXB[5]=0; else TXB[5]=1;
  116.      if(KEY2==0) TXB[6]=0; else TXB[6]=1;
  117.      CAN_SEND();
  118. //  while(!CANBUS); //等待接收完標(biāo)志
  119.      CANBUS=0;
  120.      TXB[0]=ADDR;  //總線地址
  121.      TXB[1]=8;     //發(fā)送數(shù)據(jù)字節(jié)個數(shù)!
  122.      TXB[2]=ADDR;
  123.      TXB[3]=READ;
  124.    TXB[4]=2;
  125.      CAN_SEND();
  126. //  while(!CANBUS);
  127.    CANBUS=0;
  128.      if(RXB[5]==0) LED1=0; else LED1=1;
  129.      if(RXB[6]==0) LED2=0; else LED2=1;                                                                                                                                         
  130. }
  131. 4.2 溫度傳感器18B20

  132.    DS18B20的程序見附錄三。
  133. 4.3 ADC0809轉(zhuǎn)換

  134. ADC0809的轉(zhuǎn)換程序為:
  135. #include <reg51.h>
  136. #define uchar unsigned char
  137. #define uint unsigned int
  138. //#define t0 65536-50000
  139. //#define t1 65536-30000
  140. sbit key3 =P2^3;
  141. sbit key2 =P2^2;
  142. sbit key1 =P2^1;
  143. sbit key0 =P2^0;
  144. sbit P30= P3^0;
  145. sbit P31= P3^1;
  146. sbit P32= P3^2;
  147. sbit P33= P3^3;
  148. sbit P34= P3^4;

  149. //uchar scan=0,dis=0,keyx=1,key;
  150. uchar now;
  151. uchar code              scantab[4]              ={0x80,0x40,0x20,0x10};
  152. uchar code              disptab[4]              ={0x01,0x80,0x40,0x20};
  153. uchar                            n[4]                            ={0x00,0x00,0x00,0x00};
  154. uchar code              trantab[18]              =
  155.               {              0x28,0xEE,0x32,0xA2,0xE4,0xA1,0x21,
  156.                             0xEA,0x20,0xA0,0x60,0x25,0x39,0x26,
  157.                             0x31,0x71,0x29,0xff
  158.               };
  159. int              dispnum;
  160. sbit start=P3^1;
  161. sbit oe=P3^2;
  162. #define t0 65536-1000
  163. bit flag;
  164. unsigned long uin,udis;
  165. /*
  166. int temp;
  167. int  get_p1()                            {P1=0xff;return P1;}
  168. int  get_p3()                            {P3=0xff;return P3;}
  169. void put_p1(int h1)              {P1=h1;}
  170. void put_p3(int h2)              {P3=h2;}
  171. */
  172. void delay(uint t)
  173. {              uint i;
  174.               for(i=0;i<t;i++);
  175. }
  176. /*
  177. void dealkey()
  178. {              if(key>0)
  179.               {              switch(key)
  180.                             {              case              1: P3^0=0;                                          break;
  181.                                           case              5: P3^0=1;                                          break;
  182.                                           case              2: P3^1=0;                                          break;
  183.                                           case              6: P3^1=1;                                          break;
  184.                                           case              3: clock=0;                                          break;
  185.                                           case              7: clock=1;                                          break;
  186.                                           case              4: P3^3=0xff;dispnum=P3^3;              break;
  187.                                           case              8: P3^3=temp;                                                        break;
  188.                                           case              9: P31=1;                                                                      break;
  189.                                           case   13: P31=1;                                                                      break;
  190.                                           case   10: P33=1;dispnum=P33;                                                        break;
  191.                                           case   14: temp=get_p1(); dispnum=temp;                            break;
  192.                                           case   11: temp=get_p1(); dispnum=5*P1/255;            
  193.                                                         break;
  194.                                           case   15:              break;
  195.                                           case   12: P32=0;              break;
  196.                                           case   16: P32=!P32;              break;
  197.                             }
  198.                             if(dispnum<0)              dispnum=0;
  199.                             if(dispnum>9999)              dispnum=9999;
  200.                             distran(dispnum);
  201.               }
  202.               key=0;
  203. }
  204. */
  205. void distran(int  dispnum)
  206. {              n[0]              =trantab[dispnum                            %10];
  207.               n[1]              =trantab[(dispnum/10)              %10];
  208.               n[2]              =trantab[(dispnum/100)              %10];
  209.               n[3]              =trantab[(dispnum/1000)              %10];
  210. }
  211. void display()
  212. {              P2=~disptab[now];
  213.               P0=n[now];
  214. }/*
  215. void scankey()
  216. {              P0=trantab[17];
  217.               now=(now+1)%4;
  218.               P2=~scantab[now];
  219.               key0=key1=key2=key3=1;
  220.               if(!key0)keyx=now+1;
  221.               if(!key1)keyx=now+5;
  222.               if(!key2)keyx=now+9;
  223.               if(!key3)keyx=now+13;
  224. }
  225. */
  226. void t0_sever() interrupt 1
  227. {              TH0=t0>>8;TL0=t0;
  228. //              scankey();
  229. //              dealkey();
  230.               display();
  231.               flag=0;
  232. }

  233. /*
  234. void t1_sever() interrupt 2
  235. {              TH1=t1>>8;TL1=t1;
  236. //scankey();
  237. //dealkey();
  238.               display();
  239. }
  240. */
  241. void deal0809()
  242. {              unsigned long u;
  243.               u=(unsigned long)uin;
  244.               udis=((u*5*1000)/256);
  245.               distran(udis);
  246. }
  247. void get0809()
  248. {              //delay(80);
  249.               start=1;//f=(double)((fxx*200000000)/(fcc*16));
  250.               delay(8);
  251.               start=0;
  252.               delay(50);
  253.               oe=1;
  254.               P1=1;
  255.               uin=P1;
  256.               oe=0;
  257. }
  258. void main()
  259. {
  260.               start=0;
  261.               oe=0;
  262.               flag=0;
  263. EA=1;
  264.               ET0=1;              TH0=t0>>8;              TL0=t0;              TR0=1;
  265.               now=0;
  266.               while(1)
  267.               {
  268.                                           if(flag)display();
  269.                                           else
  270.                                           {              get0809();
  271.                                                         deal0809();
  272.                                                         //display();
  273.                                           }
  274.               }
  275. }
  276.                             /*            
  277.                             if(keyx>0)
  278.                             {              key=keyx;
  279.                                           while(keyx!=0){keyx=0;time(10000);}
  280.                                           dealkey();
  281.                             }
  282.                             time(10000);
  283. */
  284. 4.4 數(shù)字顯示

  285. 本模塊功能主要為小區(qū)家庭用戶根據(jù)自家的情況顯示不同的家庭門牌號碼。具體程序代碼為:
  286.     #include <reg51.h>
  287. #define uint unsigned int
  288. #define uchar unsigned char
  289. #define tim 65536-3000
  290. sbit dis0 =P2^7;
  291. sbit dis1 =P2^6;
  292. sbit dis2 =P2^5;
  293. sbit dis3 =P2^4;
  294. sbit key1 =P2^3;
  295. sbit key0 =P2^2;
  296. int i;
  297. uchar disp[4],dis;
  298. uchar key,keyx,ts;
  299. uint para[8],ptr;
  300. uchar code numtab[4]={0x80,0x40,0x20,0x10};
  301. uchar code distab[16]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,
  302.                                   0x20,0xa0,0x60,0x25,0x39,0x26,0x31,0x71};
  303. int  code param[8]={300,255,300,255,255,255,255,8};
  304. void time(uint t)
  305. {
  306.           uint j;
  307.             for(j=0;j<t;j++);
  308. }

  309. void distran()
  310. {
  311.            disp[0]=distab[para[ptr]%10];
  312.          disp[1]=distab[(para[ptr]/10)%10];
  313.          disp[2]=distab[(para[ptr]/100)%10];
  314.            disp[3]=distab[(para[ptr]/1000)%10];
  315. }
  316. void display()
  317. {
  318.            dis=(dis+1)%4;
  319.            P2=0xff;
  320.            P0=disp[dis];
  321.          P2=~numtab[dis];
  322.          key0=1; key1=1;
  323.            if(!key0) keyx=dis+1;//*************************鍵盤掃描
  324.          if(!key1) keyx=dis+5;
  325. }
  326. void keyproc()
  327. {
  328.   if(key>0)
  329.        {
  330.           switch(key)
  331.             {
  332.                   case 1: para[ptr]--;      break;
  333.                    case 5: para[ptr]++;      break;  //************個位
  334.                    case 2: para[ptr]-=10;     break;
  335.                    case 6: para[ptr]+=10;     break;  //*************十
  336.                    case 3: para[ptr]-=100;    break;
  337.                    case 7: para[ptr]+=100;    break;  //**************百
  338.                    case 4: ptr--;             break;   
  339.                    case 8: ptr++;             break;      //*********千位
  340.              }
  341.           if(ptr>7) ptr=0;
  342.            if(ptr<0) ptr=7;
  343.            if(para[ptr]<0)   para[ptr]=0;
  344.           if(para[ptr]>param[ptr])   para[ptr]=param[ptr];
  345.            distran();  
  346.          key=0;
  347. }
  348. }
  349. void timer0() interrupt 1
  350. {
  351.              TH0=tim>>8; TL0=tim; display();
  352. }
  353. void main()
  354. {
  355.              TMOD=0x11;IE=0x82;
  356.              dis=0;
  357.              ptr=0;
  358.            distran();
  359.              TH0=tim>>8;  TL0=tim; TR0=1;
  360.            for(i=0;i<7;i++)   para[i]=i;
  361.              for(;;)
  362.                 {
  363. if(keyx>0)                 //有鍵按下
  364.                             {
  365.                                key=keyx;  
  366.                                while(keyx!=0) {keyx=0; time(1000);}
  367.                                  if(keyx!=0)
  368.                             {
  369.      /// if(!key0) {keyx=dis+1;}//*************************鍵盤掃描
  370.     ////  if(!key1) {keyx=dis+5;}
  371.                            }
  372.         keyproc();
  373.        }
  374.       time(1000);
  375.      }
  376. }
復(fù)制代碼

5  系統(tǒng)可靠性設(shè)計
小區(qū)安防系統(tǒng)的報警要求準(zhǔn)確無誤,必須是可靠的,因此可靠性是一個很重要的指標(biāo),因此,系統(tǒng)的硬件電路、軟件系統(tǒng)的設(shè)計均應(yīng)圍繞這個中心進(jìn)行。
5.1 系統(tǒng)抗干擾性設(shè)計
小區(qū)安防系統(tǒng)主要進(jìn)行小區(qū)內(nèi)各個住戶的各種突發(fā)事件的報警。信號會受到各種干擾,使系統(tǒng)不能正常工作。
在抗干擾方面,有硬件措施和軟件措施,也有軟硬件結(jié)合的措施。硬件抗干擾有效率高的有優(yōu)點,但是增加系統(tǒng)的投資和設(shè)備的體積;軟件抗干擾有投資低的優(yōu)點,但會降低系統(tǒng)的工作效率。
5.1.1硬件抗干擾措施
干擾的渠道有:供電系統(tǒng)的干擾,過程通道的干擾,空間的干擾等。在印刷電路板設(shè)計時,考慮到電路板過大時,印刷線條長,抗噪聲能力下降;過小時,散熱不好,容易受鄰近線干擾。所有本系統(tǒng)設(shè)計電路板時,把相關(guān)的器件盡量放靠近些,容易產(chǎn)生噪聲的器件、電流電路、大電流電路盡量遠(yuǎn)離單片機。同時整個系統(tǒng)用一個電源,并保證其良好的共地。
5.1.2軟件抗干擾措施
軟件抗干擾屬于單片機系統(tǒng)自身防御行為,其前提條件是:系統(tǒng)中抗干擾軟件不會因干擾而損壞。
(1)程序結(jié)構(gòu)化,功能模塊化
編程時不能讓程序任意跳轉(zhuǎn),否則整個程序會糾纏在一起,便于程序維護(hù),而且對軟件抗干擾方案的實施有著十分重要的意義。在系統(tǒng)中把整個程序分解為若干個功能模塊,每個功能模塊是一個正規(guī)程序。
(2)狀態(tài)信號的抗干擾輸入方法
干擾信號多呈毛刺狀,作用時間短,在采集某一狀態(tài)信號時,可以多次重復(fù)采集,只有連續(xù)兩次采集結(jié)果一致時才視為有效;在各次采集狀態(tài)信號之間增加一段延時,能對抗較寬的干擾。
(3)CPU抗干擾技術(shù)
CPU屬于高速數(shù)字器件,易受干擾的有運算器、控制器以及控制寄存器,當(dāng)外界干擾串入時,很可能通過三總線改寫CPU寄存器的內(nèi)容,導(dǎo)致初始化錯誤。尋址失敗乃至系統(tǒng)癱瘓;當(dāng)程序受到干擾后,和可能打亂CPU的正常執(zhí)行程序。如果攔截失去控制的程序流程,如果使系統(tǒng)的損失減少,盡可能恢復(fù)系統(tǒng)的正常狀態(tài)是本系統(tǒng)需要考慮的一項重要內(nèi)容。
系統(tǒng)采取的措施是在各段程序中,對單片機及片外擴展器件的各種功能、斷口、方式、狀態(tài)等采集永久性或臨時性的設(shè)置。系統(tǒng)不僅要保證上電后系統(tǒng)要初始化,而且在程序中每次使用某種功能,都要再一次對相應(yīng)的控制寄存器設(shè)定動作模式。
5.2 提高元器件的可靠性
提高單片機應(yīng)用系統(tǒng)中所有元件的質(zhì)量,以提高系統(tǒng)內(nèi)在的可靠性,這也是關(guān)鍵性的措施。采取的措施有:
(1)選用質(zhì)量好的接插件,并設(shè)計好工藝結(jié)構(gòu),如選用帶屏蔽的接插件;
(2)選用合格的電子元件,并進(jìn)行嚴(yán)格的測試、篩選;
(3)設(shè)計時,技術(shù)參數(shù)留有一定的余量;
(4)提高印刷板的組裝質(zhì)量。
5.3 容錯技術(shù)
在提高系統(tǒng)可靠性的同時,采取一些容錯技術(shù),當(dāng)系統(tǒng)工作出錯時,系統(tǒng)可自動糾正錯誤。在系統(tǒng)中主要應(yīng)用了信息冗余技術(shù)。
(1)奇偶校驗。系統(tǒng)通信時采用偶校驗,收方根據(jù)校驗結(jié)果,決定是否要求對方重發(fā)。
   (2)循環(huán)碼校驗。在發(fā)送數(shù)據(jù)時按一定的規(guī)則產(chǎn)生循環(huán)冗余碼,并附加在數(shù)據(jù)后一起發(fā)送;接收方按同樣的規(guī)則根據(jù)接收的數(shù)據(jù)產(chǎn)生循環(huán)冗余碼,并和接收到的循環(huán)冗余碼進(jìn)行必比較,校驗數(shù)據(jù)傳送是否正確。
6  系統(tǒng)調(diào)試6.1 整體調(diào)試分析
整個調(diào)試所使用的測試儀器儀表和工具:
  • 微機一臺;
  • 示波器;
  • 萬用表;
  • 直流穩(wěn)壓電源;
  • 單片機開發(fā)系統(tǒng)一套;
本系統(tǒng)的調(diào)試主要分為硬件調(diào)試、軟件調(diào)試和聯(lián)機調(diào)試三大部分。
經(jīng)過初步的分析設(shè)計后,在制作硬件電路的同時,軟件調(diào)試也在穿插進(jìn)行。這樣有利于問題的分析和解決,不會造成問題的積累,而且不會因為一個小問題而需要檢查整體電路,從而可以節(jié)約大量的調(diào)試時間。軟件編程中,作者首先完成的是單元功能模塊的調(diào)試,然后進(jìn)行系統(tǒng)調(diào)試,整體上與硬件調(diào)試的方法差不多。聯(lián)機調(diào)試是最重要的一部分,同時也是本裝置成功的關(guān)鍵,有許多問題都比較棘手。
6.2 硬件單元電路調(diào)試6.2.1最小系統(tǒng)板調(diào)試
首先檢測所制作的電路板是否有虛焊,短路等現(xiàn)象。然后接上+5V電源,檢測各個芯片的電源是否為+5V,如果是+5V的話,說明供電正確。接上電壓,看單片機是否發(fā)熱,如不發(fā)熱說明電源連接正確。測單片機30腳(ALE)是否有脈沖波形輸出,如果有說明單片機正常工作。
6.2.2A/D轉(zhuǎn)換電路調(diào)試
先對A/D進(jìn)行編程調(diào)試,通過后才能繼續(xù)完成其他模塊的調(diào)試,這一步很關(guān)鍵,也是最難調(diào)試的一步。
給AT89C51燒入A/D轉(zhuǎn)換程序先調(diào)試A/D轉(zhuǎn)換電路。A/D轉(zhuǎn)換電路調(diào)試步驟如下:
1)、給四路模擬電壓輸入信號和一路數(shù)字電壓輸入信號分別輸入相應(yīng)的直流電壓,用萬用表檢測電壓是否采集過來,也就是輸入端電壓與電源所給電壓是否一致。
2)檢測ADC0809的啟動信號和輸出使能信號輸出是否正確。
3)測得輸入端電壓與電源所給電壓一致后,再檢測ADC0809的通道選擇是否正確:如:給IN5輸入0~5V的電壓,ADC0809的通道選擇端,如果addrc=5V,addrb=0V,addra=5V, 也即:addrc=1,addrb=0,addra=1;表示該通道選擇正確,否則不正確。如果不正確,檢查程序是否正確,如果程序沒有問題,再檢查電路是否接對了。
4)測得通道選擇正確后,再測量數(shù)字量輸出,也即ADC0809的D0~D7輸出端的數(shù)字量是否與輸入模擬量相對應(yīng)。改變模擬電壓量輸入,看數(shù)字信號變化是否和模擬量變化對應(yīng),如果輸出數(shù)字量與輸入模擬量相對應(yīng)說明A/D轉(zhuǎn)換正確。
6.2.3光報警電路調(diào)試
首先先檢查發(fā)光二極管的正負(fù)極有沒有接錯,發(fā)光二極管有缺口的是負(fù)極。當(dāng)出現(xiàn)低電平時,發(fā)光二極管亮。
當(dāng)接收到傳感器所檢測的信號有異樣時,所相應(yīng)的發(fā)光二極管是否亮。例如,當(dāng)溫度傳感器所檢測到的溫度高于所設(shè)定的最高溫度時,所對應(yīng)的發(fā)光二極管就發(fā)亮。
6.2.4鍵盤顯示電路調(diào)試
在調(diào)試前,值得提到的是三極管的幾個極的判斷和數(shù)碼管的a至g所對應(yīng)的管腳的測試,這是十分重要的,這直接關(guān)系到此部分的成敗。1、判斷基極和管子類型(PNP或NPN):由于基極與發(fā)射極、基極與集電極,分別是兩上PN結(jié),它們之間的反向電阻值都很小,所以用萬用表歐姆檔(R×100或R×1K)測量時,先將任一表黑筆接到某一個認(rèn)定的管腳上,另一表筆先后接到其余兩個管腳上。如果測量得到的阻值都很大(或都很。,然后對換表筆,重復(fù)上述測量時,阻值恰好與上述相反。都很。ɑ蚨己艽螅。則可斷定所認(rèn)定的管腳為基極。若不符合上述結(jié)果,應(yīng)另換一個認(rèn)定管腳重新測量,直至符合上述結(jié)果為止。測量時注意管腳和表筆的極性。當(dāng)黑筆接在基極,紅表筆分別接在其它兩極時,測得的電阻值都較小,則可判定該三極管為NPN型,反之即為PNP型。2、判斷集電極和發(fā)射極:判斷集電極和發(fā)射極的基本原理是把三極管接成基本單管放大電路。利用測量管子的電流放大系數(shù)β的大小來判斷集電極和發(fā)射極。對于常用的NPN型小功率硅管。若集電極接電源正極,發(fā)射極接電源負(fù)極,這時表針偏較大。如果電壓極性反接,則表針偏轉(zhuǎn)就比較小。由此即可判斷出集電極和發(fā)射極。另一種更可靠的辦法是,當(dāng)肯定被測為NPN型硅管后,將黑表筆接于一個待測的管腳,紅表筆接另一個管腳,基極懸空,觀察表針偏轉(zhuǎn)情況。然后將黑表筆所接管腳與已斷定的基極用手捏。ㄗ⒁獠荒苁蛊湎嗯觯@時的人體電阻相當(dāng)于電阻Rb,比較測量出的阻值變化。然后更換黑、紅表筆,再觀察阻值變化。如前者的變化比較大,則前者黑表筆所接管腳就是集電極。紅表筆所接管腳為發(fā)射極。如為PNP管子與上述情況相反。根據(jù)上面的方法,測得所使用的三極管是PNP管,其管腳平面對向自己,管腳從左到右為e,b,c。數(shù)碼管腳的測試就顯得比較簡單:如果是共陰極的數(shù)碼管就讓位選接地,然后點亮其它的管腳,通過顯示結(jié)果來斷定引腳是a,b,c等,位選也是拿萬用表的黑表筆去探試的。如果是共陽極的話就用紅表筆來探試位選,其它的與共陰極的一致。經(jīng)過以上的判斷,得到正確的管腳接入電路中。
具體調(diào)試步驟為:
(1)鍵盤是否工作正常
(2)當(dāng)按下鍵盤時,數(shù)碼管顯示的數(shù)字是否與軟件設(shè)計的一樣。
6.2.5傳感器電路調(diào)試
在進(jìn)行傳感器調(diào)試時,首先檢查各個傳感器的接線電路是否正確,特別是有三個腳的傳感器。傳感器接到ADC0809時,要接負(fù)載電阻,負(fù)載電阻的阻值大小有傳感器本身決定。
當(dāng)四個傳感器接收到各種異常信號時,如,溫度過高時,溫度傳感器就接收到信號了,通過ADC0809將溫度轉(zhuǎn)換成電壓,送單片機,與設(shè)定的溫度進(jìn)行比較,高于設(shè)定溫度時,給發(fā)光二極管一個低電平,發(fā)光二極管就亮,顯示報警。
其他傳感器的調(diào)試也是如此。當(dāng)四個傳感器都能接收異常信號時,說明傳感器電路是正確的,調(diào)試以后就沒問題了。
6.3 軟件程序調(diào)試6.3.1軟件系統(tǒng)設(shè)置
對于本系統(tǒng)而言,軟件程序所實現(xiàn)的功能比較少,程序的調(diào)試顯得比較簡單。整個程序使用的是匯編語言,在keil c51下編寫調(diào)試完成的。Keil C51是美國Keil Software公司出品的51系列兼容單片機的軟件開發(fā)系統(tǒng),其中uVision與Ishell分別是C51 for Windows和for Dos的集成開發(fā)環(huán)境(IDE),可以完成編輯、編譯、連接、調(diào)試、仿真等整個開發(fā)流程。開發(fā)人員可用IDE本身或其它編輯器編輯C或匯編源文件。然后分別由C51及A51編譯器編譯生成目標(biāo)文件(.OBJ)。目標(biāo)文件可由LIB51創(chuàng)建生成庫文件,也可以與庫文件一起經(jīng)L51連接定位生成絕對目標(biāo)文件(.ABS)。ABS文件由OH51轉(zhuǎn)換成標(biāo)準(zhǔn)的Hex文件,以供調(diào)試器dScope51或tScope51使用進(jìn)行源代碼級調(diào)試,也可由仿真器使用直接對目標(biāo)板進(jìn)行調(diào)試,也可以直接寫入程序存貯器如EPROM中。
程序要通過燒寫器燒寫到芯片里。燒寫的過程為:假定要寫入的文件是“test.hex”。首先,連接編程器主板到計算機并口。然后連接電源。編程器指示燈亮,將89C51插入ZIF插座,鎖緊手柄。(請注意芯片的插入方向:缺口向上,朝扳手方向! 否則會損壞芯片)然后啟動軟件,鼠標(biāo)單擊在右邊的“芯片”下拉框,選擇好芯片類型,這里選“89C51”。在“文件”菜單選擇“打開Hex文件”,找到“test.hex”文件,單擊“打開”。窗口中顯示文件內(nèi)容,右下角顯示校驗和。單擊“寫芯片”按鈕,編程器的燒寫指示燈亮,燒寫完畢后報告結(jié)果,寫入之前會自動擦除芯片內(nèi)容,寫入完畢會自動校驗。如果是需要加密,可以選擇加密級別。到此為止整個軟件程序調(diào)試環(huán)境就已經(jīng)配好了。
6.3.2單片機系統(tǒng)軟件調(diào)試
雖然在前面的硬件電路調(diào)試過程中每個模塊的調(diào)試已經(jīng)穿插了部分模塊的軟件調(diào)試。但是整體單片機系統(tǒng)的調(diào)試還是有一定的困難的。例如,在對A/D轉(zhuǎn)換電路的硬件進(jìn)行測試時,是分別對單通道采樣測試。而整體系統(tǒng)要求的是分時顯示三個參數(shù)以及他們的上下限。因為要顯示的數(shù)據(jù)比較多,所以比較麻煩。剛開始時由于編程時沒有設(shè)置好各通道顯示的標(biāo)志位,實現(xiàn)不了數(shù)碼管分時顯示的功能。于是從主程序開始檢查,發(fā)現(xiàn)A/D轉(zhuǎn)換子程序所用的標(biāo)志位與主程序?qū)ψ映绦蛘{(diào)用的標(biāo)志位不一致。
6.3.3CAN總線軟件調(diào)試
    在調(diào)試CAN總線的程序時,剛開始是在keil c51下進(jìn)行調(diào)試,編譯老是同不過,后來,改了一些程序后,在CAN總線的發(fā)送程序和接收程序的開頭都加上初始化程序,這樣程序就沒有錯了。
6.4 調(diào)試過程中發(fā)現(xiàn)的問題及解決方法
(1)硬件電路的詳細(xì)檢測問題。硬件電路的正確接線是整個系統(tǒng)能夠工作的最基本的前提。在調(diào)試前,一定要詳細(xì)檢查電路的焊接和接線。杜絕虛焊、短路和斷路等現(xiàn)象。使硬件調(diào)試達(dá)到事半功倍的效果。
在檢查過程中,由于有幾跟焊線比較細(xì),焊盤比較小,在焊的過程中,跟其他線接觸到了,引起了短路。在發(fā)現(xiàn)問題后,又重新焊了一遍,最后檢查無誤。
(2)接地問題。作者原先就由于沒有處理好接地問題而嚴(yán)重影響了調(diào)試的進(jìn)程。地沒有接好,影響了數(shù)據(jù)的正確輸出和顯示。
所有的地線都應(yīng)該接在一起,這樣就不會引起干擾。
(3)ADC0809通道選擇問題。通道選擇不正確,就不能把數(shù)據(jù)采集過來。在調(diào)A/D轉(zhuǎn)換的過程中,開始不能把數(shù)據(jù)采集過來,通過檢查發(fā)現(xiàn)通道選擇不對應(yīng)。重新修改程序,改正通道選擇標(biāo)記,使數(shù)據(jù)得以采集過來。
(4)延時問題。本系統(tǒng)為了串口通信的方便采用12M的晶振,延時要比用6M的晶振時要長。如果延時不夠,有可能使得系統(tǒng)顯示不穩(wěn)定。
(5)鍵盤顯示程序問題。在第一次把程序燒入到芯片時,接上5V電源后,發(fā)現(xiàn)什么都沒有,檢查硬件電路,是四個三極管的E極沒有接上電源。把四個三極管的E極接上5V電源后,數(shù)碼管有顯示。但是不是原先設(shè)計的那樣。后來,作者檢查軟件,改了一些程序后,就顯示正確了。
(6)CAN總線通信問題。CAN控制器SJA1000的RESET腳是低電平的,AT89C51的RESET是高電平,因此,在連接時要接一個非門。作者在設(shè)計電路的時候,忽略了這一點,接上去以后,就正確了。
6.5 聯(lián)機調(diào)試
下位機調(diào)試完成后,就進(jìn)行聯(lián)機調(diào)試。
聯(lián)機調(diào)試所需要的設(shè)備:
直流穩(wěn)壓電源兩臺;
單機兩件;
排線若干;
聯(lián)機調(diào)試是本系統(tǒng)比較關(guān)鍵的部分。在整個聯(lián)機調(diào)試過程中也遇到了不少問題。例如,沒注意將程序與上位機的接收程序相聯(lián)系,導(dǎo)致數(shù)據(jù)不能通過CAN總線傳給上位機。
在進(jìn)行聯(lián)機調(diào)試時,把所有的程序結(jié)合起來,燒到芯片上。在進(jìn)行編譯時,有一些程序不能匹配,作者就另外修改了一些程序,這樣編譯就通過了。在本系統(tǒng)中,作者所設(shè)計的鍵盤用來顯示小區(qū)住戶的門牌房間號,在單獨調(diào)試鍵盤時,鍵盤顯示正常。但是,聯(lián)機調(diào)試時,發(fā)現(xiàn)鍵盤顯示不正常,確定硬件電路沒問題時,作者就看程序,發(fā)現(xiàn)鍵盤的程序里,存儲器跟ADC0809的存儲器用了同一個。發(fā)現(xiàn)問題后,作者就另外設(shè)了一個變量,用來存儲鍵盤的變量。重新編譯后,燒到芯片里,上電后,就顯示正常了。
7  系統(tǒng)使用說明
本系統(tǒng)使用起來非常方便,下面作者就系統(tǒng)的使用方法作一個簡單的介紹。首先
小區(qū)的使用用戶將各個傳感器接在自家的合適位置,例如,將煤氣報警傳感器接在廚
房,將溫度傳感器和煙霧傳感器接在客廳,將紅外傳感器接在門口。然后接上電源就能工作了。
當(dāng)有報警時,小區(qū)控制中心的報警燈就會亮。例如當(dāng)溫度傳感器檢測到室內(nèi)溫度過高時,就會將這個異常信號由ADC0809采集,送單片機處理,此時,與溫度傳感器相對應(yīng)的發(fā)光二極管就會亮。其他情況也是如此。
當(dāng)有報警信號時,小區(qū)的住戶可以按下裝在家里的按鍵,按下自己家里的房間號,這樣,房間號就會顯示在小區(qū)控制中心,小區(qū)控制中心就可以知道發(fā)生的具體情況和具體房間號。
本裝置使用起來簡單易學(xué),而且功能比較強大。
8  結(jié)論
本文設(shè)計和實現(xiàn)了一種基于單片機AT89C51的小區(qū)安防報警系統(tǒng)。該系統(tǒng)主要以方便、廉價、可靠和實用等為目的,主要以小區(qū)各個住戶為主要對象,采用了ADC0809數(shù)據(jù)采集,利用AT89C51作為控制器,通過簡易鍵盤設(shè)置報警上限,共陽極四位數(shù)碼顯示,由二極管發(fā)光進(jìn)行報警。同時,此系統(tǒng)與另外一個同學(xué)的小區(qū)網(wǎng)站組合成一個完整的系統(tǒng),能在小區(qū)網(wǎng)站上實現(xiàn)安防實時監(jiān)控。
本文的重點是ADC0809的四路模擬電壓采集以及單片機鍵盤顯示最小系統(tǒng)。在實際的實現(xiàn)過程中,遵循從易到難,從硬件到軟件的過程。首先理解設(shè)計任務(wù)以及系統(tǒng)要求實現(xiàn)的功能,有針對性地查閱相關(guān)的資料,熟悉所需芯片以及元器件的工作原理,再著手設(shè)計硬件電路并根據(jù)硬件電路的設(shè)計特點,有步驟地對硬件電路進(jìn)行分模塊調(diào)試。
本系統(tǒng)有四個傳感器來監(jiān)測家庭異常情況,如有異常情況發(fā)生時,傳感器就將檢測到的信號經(jīng)過ADC0809采集后,送到AT89C51進(jìn)行處理,同時,報警燈亮,顯示報警。在此系統(tǒng)中,鍵盤用來設(shè)置小區(qū)家庭報警的門牌房間號,數(shù)碼管用來顯示。
由于本人的知識和能力有限,對其中的某些問題,如對本系統(tǒng)對講的保密性等,未能進(jìn)行深入分析研究,此系統(tǒng)也只達(dá)到了一部分的實際效果。
文中定有許多不足之處,敬請各位老師和讀者不吝賜教。
謝  辭
揮手間四年已逝,回首近四年的學(xué)習(xí)生活,其間有失落也有收獲,有艱辛也有快樂,有迷茫也有方向。在桂林電子科技大學(xué)這最美好、最寶貴的四年學(xué)習(xí)生活中,我由一個當(dāng)初少不更事的孩子成長為一個對社會、對人生充滿自信的青年。在這里需要感謝的有很多。
真心地感謝各位老師四年來的傳道、授業(yè)和解惑,給了我人生一筆永恒的財富。
本次畢業(yè)設(shè)計,是大學(xué)生涯結(jié)束最后一堂結(jié)業(yè)課,有幸龍超老師作為指導(dǎo)老師,整個做畢業(yè)設(shè)計階段,由于平時多理論,少實踐的學(xué)習(xí),導(dǎo)致做畢業(yè)設(shè)計過程中,常常遇到這樣那樣的問題,當(dāng)然除了自己看書,查資料解決問題外,也常常求助龍老師,龍老師在幫助學(xué)生解決問題的過程中,態(tài)度親和,并且循循善誘的提示去啟發(fā)學(xué)生自己思考,老師“授之于魚不若授之于漁”的良苦用心學(xué)生體會很深,故一直心存感激。
感謝畢業(yè)設(shè)計過程中所有給我真誠幫助的老師和同學(xué)們。
最后感謝我的母校桂林電子科技大學(xué),給我提供學(xué)習(xí)和生活的空間,真心地希望它的明天更加美好!
參考文獻(xiàn)
[1] 尹建華 張惠群 劉魯源 劉迎澍編著.微型計算機原理與接口技術(shù)[M].北京:高等教育出版社,2002.
[2] 范逸之編著.Visual Basic與RS-232串行通信控制[M].北京:中國青年出版社, 2002.
[3] 江思敏編著.Protel電路設(shè)計教程[M].北京:清華出版社,2002.
[4] 余海生等編著.微型計算機控制技術(shù)[M].北京:清華大學(xué)出版社,2003.
[5] 靳達(dá)編著.單片機應(yīng)用系統(tǒng)開發(fā)實例導(dǎo)航[M].北京:人民郵電出版社,
2003.
[6] 謝自美編著.電子線路設(shè)計.實驗.測試[M].武漢:華中科技大學(xué)出版社,2000.
[7] 閆玉德 俞虹編著.MCS-51系列單片機原理與應(yīng)用(C語言版)[M].北京:
北京機械工業(yè)出版社,2002.
[8] 李朝青編著.PC機及單片機數(shù)據(jù)通信技術(shù)[M].北京:北京航空航天大學(xué)出版社, 2000.
[9] 張增強等編著.突破Delphi 7.0 編程百例[M].北京:中國水利水電出版社 ,2003.
[10] 石東海編著.單片機應(yīng)用系統(tǒng)設(shè)計從入門到精通[M].西安:西安電子科技大學(xué)出版社, 2002.
[11] 崔建華 郭瑞軍編著.Delphi串口通信工程開發(fā)實例導(dǎo)航[M].北京:人民郵
電出版社,2004.
[12] 李學(xué)海編著.EM78單片機實用教程—基礎(chǔ)篇[M].北京:電子工業(yè)出版社,2003.
[13] M . Herry. Analog Integrate Circuits WILEY.2001.
附  錄
附錄一  系統(tǒng)原理圖
附錄二     系統(tǒng)PCB圖


完整的Word格式文檔51黑下載地址:
智能小區(qū)安防系統(tǒng)畢業(yè)設(shè)計論文.doc (347 KB, 下載次數(shù): 43)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2018-4-5 04:03 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表