基于89C51單片機的遠程數(shù)據(jù)采集系統(tǒng)設計
系統(tǒng)上電即執(zhí)行初始化程序。當操作員按下采樣鍵時執(zhí)行數(shù)據(jù)采樣模塊。從00~07通道間隔每秒采集每個通道的5個值,調(diào)用濾波子程序得到準確值,再通過數(shù)據(jù)轉(zhuǎn)換子程序分別送到6116數(shù)據(jù)區(qū)及8155RAM區(qū),通過字形顯示子程序顯示各通道檢測的數(shù)據(jù)。每采集完一個周期后,89C51單片機通過 MAX232接口PC機查詢有無通信命令,有則響應,無則繼續(xù)采集數(shù)據(jù)。該程序一直按框圖流程循環(huán)執(zhí)行,直至意外掉電或強迫復位后,才能終止數(shù)據(jù)采集。
2.3 故障診斷模塊
數(shù)據(jù)采集過程中,若出現(xiàn)故障會直接影響采樣結(jié)果,所得到的錯誤數(shù)據(jù)不允許存檔,并應該記錄故障原因及持續(xù)時間。故障診斷模塊主要是89C51外圍芯片 MAX691的電源監(jiān)控以及掉電保護電路檢測到硬件故障后向單片機發(fā)出中斷請求INT0所執(zhí)行的外部中斷服務子程序。該程序主要功能是在累加數(shù)據(jù)保存完畢后,置位89C51內(nèi)部的特殊功能寄存器PCON中的PD,使RAM進入掉電模式,保護數(shù)據(jù)不變,同時顯示故障類型和發(fā)生的時間。若為軟件死循環(huán)引起的故障,則MAX691的“看門狗”電路自動使程序跳出陷阱,強迫系統(tǒng)復位。
2.4 數(shù)據(jù)通信模塊
分單片機通信程序和PC機通信程序。
2.4.1 單片機通信程序
流程圖如圖4所示?!?P align=center>
2.4.2 Win98下PC機與89C51通信程序
通訊程序編寫中首先在項目頭文件中嵌入MSComm控件的頭文件MSComm.h及實現(xiàn)文件MSComm.cpp,其次,為了用該控件控制一個串口的通訊操作,還必須在相應程序中插入該控件。為此,設計在某對話框中插入MSComm控件,其ID為IDC_MSComm1,并利用ClassWizard 為其添加變量CCMSComm m_Com1,通訊程序中對串口的所有操作都可以通過m_Com1來實現(xiàn)。
89C51通過中斷方式采集和傳遞數(shù)據(jù)。當其數(shù)據(jù)緩沖區(qū)滿時,向CPU發(fā)出中斷申請,若CPU響應并經(jīng)與PC機握手后便可發(fā)送數(shù)據(jù)。因此PC機采用查詢的通訊方式。設計中將PC機串口每接收一幀數(shù)據(jù)設置成串口要響應的事件EV_RXFLAG事件,通過此事件激活消息處理函數(shù)OnComm(),在OnComm()中加入處理代碼,判斷是否是所需的數(shù)據(jù),再作出相應的顯示、存盤等處理。
下面簡要給出用事件驅(qū)動方式接收89C51單片機發(fā)送數(shù)據(jù)的程序源代碼。通訊時PC機串口與89C51串口參數(shù)的設置必須一致,否則兩者無法進行通訊。設置PC機串口參數(shù)的初始化程序如下:
If(!m_Com1.getportOpen())
m_Com1.SetPortOpen(TRUE);//打開串口
m_Com1.SetSettings("9600,n,11,1");
//串口參數(shù)設置
m_Com1.InputMode(1);
//建立1024字節(jié)輸入隊列
SetCommEvent(m_Com1,EV_RXFLAG);
//設置串口要響應的事件EV_RXFLAG
m_Com1.SetRThreshold(200);
//每接收200幀激活OnComm()事件 ………
3 結(jié)束語
本文通過PC機與89C51單片機組成一簡單的多機系統(tǒng),通過串行通信實現(xiàn)了遠程數(shù)據(jù)采集系統(tǒng)的基本功能。在硬件連接上,為提高傳輸距離,采用了RS- 232C/RS-422A轉(zhuǎn)換電路,以差分傳輸、差分接受的形式解決了這一問題。在軟件編制上,采用流行的VC++6.0下的Active X控件,通過對控件相關屬性及代碼的編寫,實現(xiàn)了Windows 98環(huán)境下PC機與89C51單片機的遠程通信。該方法也可以用于類似的工業(yè)場合中。
參 考 文 獻
1 何立民.單片機應用系統(tǒng)設計.北京:航空航天大學出版社,1998
2 趙仕?。甐C++6.0編程與實例解析.北京:科學出版社,2000
評論