呂志龍
摘要:從RS422串口發送的廣播信息中截取有效信息,并以LED指示火警信息。
關鍵詞:消防 樓層顯示器 單片機
一、功能要求及總體設計
某型火災主機預留有一個RS422A全雙工異步串口,并開放通訊協議。通過該串口向外廣播所有操作信息及探測器的故障、火警信息。本次設計的樓層顯示器(以下簡稱“樓顯”),即是為了從此廣播信息中截取有效火警信息,并發出聲光提示。
樓顯應具有以下功能:最多32臺樓顯通過RS422串口與火警主機組成主從式網絡。在樓顯群中唯一指定一臺與火警主機進行全雙工通訊;其余樓顯僅單工接收。采用異步通訊方式,波特率可調。采用一個8位二進制撥碼開關:其低五位設定網絡地址,第六、第七位設定波特率,第八位設定單/雙工通訊方式。樓顯應能根據內置的工程數據,從廣播信息中自行截取本樓層的火警信息。樓顯應有監視、報警等不同狀態及相應指示。報警狀態優先顯示。報警狀態應有聲光提示,用戶可消音;新發報警應能再次鳴響。樓顯應能隨火警主機同步復位。授權用戶也可手動復位。樓顯死機時應能自動重啟。監視狀態下可自檢,自檢結束后應自動回到監視狀態。采用64個LED顯示火警位置。振蕩頻率選定為11.0592MHz。
二、硬件設計
1 主控及存儲單元
采用89C52作為CPU及程序存儲器(片內ROM),采用6264(容量8KB)作為片外RAM;采用W27C512(容量64KB)作為工程存儲器(片外ROM)。
2 串口轉換單元
RS422與TTL采用一塊MAX491芯片轉換。在RS422端還設計有隔離保護電路。
3 通訊設定單元
(略)
4 復位及看門狗單元
正常運行時,CPU的P1.0位向MAX705的WDI端定時輸出Watch Dog信號;當CPU死機或按下復位按鈕后,MAX705的WDO端會向CPU的RST端輸出一個復位脈沖信號。
5 面板按鍵及狀態指示單元
面板上設計有電源、通訊、監視、預警、火警等狀態指示LED、蜂鳴器及自檢、消音鍵,分別由CPU的P1.1~P1.7位驅動。
6 火警位置LED驅動單元
將64個火警位置LED拆分成2塊完全相同的32個火警位置LED驅動板,通過74HC688比較器的高6位對驅動板尋址,低2位經2/4線譯碼后對驅動板上的4組74HC373鎖存器尋址。
7 片選信號分配
我們發現RAM(6264,8KB)的地址線只有13根,CPU對撥碼開關的總線收發器(74HC245)只執行讀操作,對火警位置LED驅動板執行寫操作時不須輸出地址。利用這個特性設計了一個特殊的譯碼電路,解決了片選線的不足。
8 供電單元(略)
三、軟件設計
1 選用27C512芯片存儲工程數據,建議用戶采用ASM96語言按下述格式編寫“cseg at(報警回路地址*510+報警設備地址*4+番號)*2 dcb樓顯網絡地址,報警位置LED地址;”,并編譯、燒寫。
2 程序采用C51語言編寫,模塊化設計,由主函數及自檢、清顯示、串口中斷、通訊信息分析、火警信息處理、火警信息顯示等子函數組成,下面分別介紹:
2.1 串口中斷響應子函數Serial
程序對串口信息采用“中斷”方式優先響應。
在Serial中,程序首先將接收緩沖器SBUF內的字符賦給局部變量RecvByte:如果RecvByte等于ENQ空閑呼號,則雙工樓顯回送ACK握手信號;如果RecvByte等于NAK錯誤標識,則雙工樓顯重發;如果RecvByte等于0xff或其它字符,則保存,以待進一步處理。
火警主機的復位信息及探測器的火警信息將被保存在全局二維字符數組RecvChar[RecvCount][RecvIndex]中。字符序號計數器RecvIndex隨著當前信息組中已接收字符的增多而不斷自增,當7個字符全部接收后回零。信息組計數器RecvCount隨著有效信息組的增多而不斷自增。
至此,Serial結束,閃爍一次通訊狀態指示LED后,程序返回原中斷點。
2.2 信息分析子函數Analyse
如果接收的是復位指令,則程序同步復位至監視狀態。如是火警信息且在本樓顯的范圍,則調用AlarmProcs進一步處理。如是其它信息,則放棄。
2.3 火警信息處理子函數AlarmProcs
程序中定義了一個全局字符數組變量AlarmPost[AlarmCount]作為火警位置LED的狀態表,表征著各個火警位置LED所對應的探測器的火警狀態(1——火警;0——正常)。全局字符變量AlarmCount作為火警計數器,累計本樓顯的火警總數,最大值64。初始化時,該兩變量全部清零。
當Analyse調用AlarmProcs后,程序首先根據外置ROM中的對照表來修改AlarmPost[64]的狀態值,然后根據狀態值的變化驅動面板指示LED及蜂鳴器,并調用ScanAlarm刷新顯示。
2.4 火警位置LED顯示子函數ScanAlarm
ScanAlarm首先根據AlarmPost[64]來計算8個火警位置LED顯示數組AlarmGroup[8]的值,再逐組輸出。
2.5 主函數main
程序上電后,自動執行主函數main,首先初始化,讀入撥碼開關的設置值并對本機網絡地址NetAddr、波特率BaudRate、單/雙工通訊Answer賦值,啟動相關定時器,置樓顯初始狀態為監視Monite等,最后進入無限主循環語句While(1)。
每次循環,程序都要檢查是否有已接收待分析的信息。為此,程序定義了兩個全局變量:已接收信息組計數器RecvCount、已處理信息組計數器ProcsCount。初始化階段,該兩變量全部清零。
如果RecvCount和ProcsCount均不為0,且RecvCount大于ProcsCount,表明有已接收未分析處理的信息,則程序將調用Analyse進行分析處理。在Analyse中,按照“先接收,先處理”的原則,程序提取最早接收到的一組信息RecvChar[ProcsCount][0]~ RecvChar[ProcsCount][6]進行分析處理。每處理完一組信息后,程序即返回主函數的原調用點,并將ProcsCount增1。如果此時RecvCount等于ProcsCount,表明接收信息已全部被分析處理,則程序將RecvCount和ProcsCount全部清零,隨后接收到的信息組將覆蓋RecvChar[0][0]~RecvChar[0][6]。
每次循環,程序還要查詢一次自檢鍵和消音鍵。如果監視狀態下按下了自檢鍵,則轉入自檢狀態;如果自檢結束,或自檢狀態下再次按下了自檢鍵,或自檢狀態下發生了報警,則返回監視狀態。報警狀態下,按自檢鍵不予響應。如果按下了消音鍵,則停止蜂鳴器的鳴動。
每隔500ms,程序還將執行一次“喂狗”指令。
如此,則完成了一次循環。
2.6 自檢子函數SelfCheck
(略)
2.7 關于定時器
在程序中設置了一個硬件定時器T0(50ms)作為基礎定時器,并設置了若干定時計數器變量作為軟定時器。每當基礎定時器溢出時,各定時計數器增1;當各定時計數器值達到其設定值時,則視為其軟定時器溢出,程序對該定時計數器清零,并執行相應的定時操作,這樣就實現了無限量的軟定時器。
結束語
此型樓顯屬量產的初級產品,還存在著一些不足之處,可在后續的產品中得到改進。
參考文獻:
[1]《單片機高級語言C51應用程序設計》 徐愛鈞 彭秀華著
[2]《MCS51系列單片機實用接口技術》 李華 主編