久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4142|回復: 1
打印 上一主題 下一主題
收起左側

智能小區安防系統設計論文下載

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

  56. 數據發送,現場的各傳感器把環境多參數的檢測信號(數字量、模擬量、開關量)進行轉換處理后,發向CAN控制器的發送緩沖區,然后啟動CAN控制器的發送命令,此時CAN控制器將自動向總線發送數據,不再需傳感器的微控制器進行干預。
  57. CAN數據發送的程序代碼為:
  58. void CANW(byte adr,byte dat) //寫CAN數
  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數
  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() /*發送數據部分*/
  80. {
  81. byte i,p;
  82. p=CANR(CAN_SR);
  83. if (p&0x04)
  84. {
  85.   p=CAN_TXB;        /*p指向發送緩存首址*/
  86.   for(i=0;i<10;i++) CANW(p++,TXB[i]);
  87.   CANW(CAN_CMR,0x01);    /*請求發送*/
  88. }
  89. }
  90. 4.1.3CAN接收數據

  91. 數據接收,整個微機測控系統中的CAN控制器檢測到總線上有數據時會自動接收總線上的數據,存入其接收緩沖區,并向AT89C51微控制器發送接收中斷,啟動中斷接收服務程序,AT89C51通過執行中斷接收服務程序,從CAN控制器的接收緩沖區讀取數據,并對其進行進一步處理工作。
  92.     CAN接收數據程序為:
  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); //等待接收完標志
  119.      CANBUS=0;
  120.      TXB[0]=ADDR;  //總線地址
  121.      TXB[1]=8;     //發送數據字節個數!
  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轉換

  134. ADC0809的轉換程序為:
  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 數字顯示

  285. 本模塊功能主要為小區家庭用戶根據自家的情況顯示不同的家庭門牌號碼。具體程序代碼為:
  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. }
復制代碼

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


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


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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 玖玖免费| 在线日韩视频 | 午夜精品久久久久久久99黑人 | 中文字幕国产视频 | 久久综合久久久 | 亚洲精品一区二区 | 欧美精品一区二区三区四区 | 男人天堂视频在线观看 | 夜夜爽99久久国产综合精品女不卡 | 狠狠的干狠狠的操 | 免费看的黄网站 | 午夜丁香视频在线观看 | 欧美色性 | 玖玖爱365| 欧美精品三区 | 久久99精品久久久久久国产越南 | 久久久激情 | 91看片网| 日韩中文字幕一区二区 | 激情综合五月 | 成人免费淫片aa视频免费 | 操视频网站 | www.99re| 亚洲欧洲成人在线 | 国产在线精品一区二区三区 | 日韩在线欧美 | 精品99爱视频在线观看 | 天天草视频 | 久久久久香蕉视频 | 毛片网在线观看 | 精品一区二区三区电影 | 性一交一乱一伦视频免费观看 | 国产视频1区2区 | 国产激情精品视频 | 亚洲精品18 | 免费黄色录像片 | 欧美日本久久 | 五月婷婷丁香婷婷 | 日韩av第一页| 国产99精品| 国产精品一区二区三区四区 |