工業生產過程中常常需要對溫度、濕度、壓力、流量等各種工藝參數隨時進行檢測和監控,同時還要將檢測到的數據及時傳遞給上位機,以實現對參數的隨機查詢, 對信息的存儲與處理,及時調整控制方案,提高生產效率和產品質量。為此,筆者以89C51單片機作為主控制器設計了一種簡單易行的遠程數據采集系統。
1 系統硬件電路的設計
遠程數據采集系統框圖,由兩部分組成:一是基于89C51實現的現場數據采集電路,二是PC機與89C51之間的遠程通訊電路。
1.1 89C51數據采集系統
數據采集系統的硬件原理如圖1所示。

該系統選用89C51單片機作為主控制器,此芯片與8051完全兼容,且內部帶有4 KB閃速可編程、可擦除PEROM,工作時鐘可高達24 MHz.
MAX691主要用來實現掉電保護,同時起到“看門狗”的作用。系統電源突然斷電時,MAX691PF0端及時向89C51INT0申請中斷,保護采集 的數據不丟失。若軟件執行中出現故障,89C51P3.2經一定時間間隔沒有脈沖輸出時,MAX691將起“看門狗”的作用,使RST復位有效,重新啟動系統。
數據存儲器6116主要作為數據傳輸的緩沖,顯示電路由8155完成,PA口作鍵盤輸入,PB口作字形顯示,PC口作控制線用。8155內部256 BRAM用于存放8通道采集到的原始數據。
數據采集與轉換由12位A/D轉換器ICL7109來完成。7109是高精度、低噪聲、低漂移的雙積分模數轉換器,其內部帶14位鎖存器和14位三態輸出 寄存器,具有較強的接口處理能力。設定7109為直接接口方式。這種工作方式下,7109可連續進行數據的轉換,轉換結束時由STATUS發出轉換結束信 號送至單片機INT0請求中斷。89C51將轉換后的數據分兩次先低8位后高4位讀取。為了實現對8個通道的參數測量,同時盡量降低成本,簡化系統配置, 設計了利用模擬多路開關CD4051進行通道的切換,共用一片7109由89C51控制,分時完成所有通道的采樣與轉換。
1.2 遠程通訊電路
由于是遠程數據采集系統,對數據傳輸的距離提出了較高的要求。PC機與單片機232C串行口直接相連,傳輸距離只有十幾米,無法滿足系統要求。為此采用 了一個RS232C到RS422A的轉換裝置,PC機與89C51間接相連,以RS422A方式進行通訊,大大增加了傳輸距離。
PC機與89C51串行通訊電路框圖如圖2所示。

RS422A是一種以平衡方式傳輸的標準,可雙端發送、雙端接收。發送端和接收端分別采用平衡發送及差動接收。通過前者把邏輯電平變成電位差,完成始端 信息傳送;通過后者把電位差變成邏輯電平,完成終端信息接收。并且RS422A采用雙線傳輸,大大提高了抗干擾能力。最大傳輸速率可達10 Mb/s(傳輸距離15 m時),傳輸速率降至90 kb/s時,最大傳輸距離可達1200 m,這能充分滿足系統的“遠程”要求。
2 軟件設計
軟件設計采用模塊化程序設計方法,按功能分為4個模塊,其中數據通信模塊又分為單片機串行通信程序和PC機通信程序,除與PC機通信程序使用VC++編程,其余均采用匯編語言編制。
2.1 主程序模塊
主程序主要完成對系統硬件電路的初始化,設置堆棧指針、串行口、T0、T1工作方式、8155顯示指示符,掃描鍵盤獲取鍵值并進行散轉處理。主程序模塊負責管理和調用各子模塊。
2.2 數據采集模塊
該模塊完成對數據的采集及處理,中間調用了數字濾波子程序、數據轉換子程序、字形轉換及顯示子程序等。
系統數據采樣模塊框圖如圖3所示。

系統上電即執行初始化程序。當操作員按下采樣鍵時執行數據采樣模塊。從00~07通道間隔每秒采集每個通道的5個值,調用濾波子程序得到準確值,再通過 數據轉換子程序分別送到6116數據區及8155RAM區,通過字形顯示子程序顯示各通道檢測的數據。每采集完一個周期后,89C51單片機通過 MAX232接口PC機查詢有無通信命令,有則響應,無則繼續采集數據。該程序一直按框圖流程循環執行,直至意外掉電或強迫復位后,才能終止數據采集。
2.3 故障診斷模塊
數據采集過程中,若出現故障會直接影響采樣結果,所得到的錯誤數據不允許存檔,并應該記錄故障原因及持續時間。故障診斷模塊主要是89C51外圍芯片 MAX691的電源監控以及掉電保護電路檢測到硬件故障后向單片機發出中斷請求INT0所執行的外部中斷服務子程序。該程序主要功能是在累加數據保存完畢 后,置位89C51內部的特殊功能寄存器PCON中的PD,使RAM進入掉電模式,保護數據不變,同時顯示故障類型和發生的時間。若為軟件死循環引起的故 障,則MAX691的“看門狗”電路自動使程序跳出陷阱,強迫系統復位。
2.4 數據通信模塊
分單片機通信程序和PC機通信程序。
2.4.1 單片機通信程序
流程圖如圖4所示。

2.4.2 Win98下PC機與89C51通信程序
通訊程序編寫中首先在項目頭文件中嵌入MSComm控件的頭文件MSComm.h及實現文件MSComm.cpp,其次,為了用該控件控制一個串口的通 訊操作,還必須在相應程序中插入該控件。為此,設計在某對話框中插入MSComm控件,其ID為IDC_MSComm1,并利用ClassWizard 為其添加變量CCMSComm m_Com1,通訊程序中對串口的所有操作都可以通過m_Com1來實現。
89C51通過中斷方式采集和傳遞數據。當其數據緩沖區滿時,向CPU發出中斷申請,若CPU響應并經與PC機握手后便可發送數據。因此PC機采用查詢的通訊方式。設計中將PC機串口每接收一幀數據設置成串口要響應的事件EV_RXFLAG事件,通過此事件激活消息處理函數OnComm(),在OnComm()中加入處理代碼,判斷是否是所需的數據,再作出相應的顯示、存盤等處理。
下面簡要給出用事件驅動方式接收89C51單片機發送數據的程序源代碼。通訊時PC機串口與89C51串口參數的設置必須一致,否則兩者無法進行通訊。設置PC機串口參數的初始化程序如下:
If(!m_Com1.getportOpen())
m_Com1.SetPortOpen(TRUE);//打開串口
m_Com1.SetSettings(“9600,n,11,1”);
//串口參數設置
m_Com1.InputMode(1);
//建立1024字節輸入隊列
SetCommEvent(m_Com1,EV_RXFLAG);
//設置串口要響應的事件EV_RXFLAG
m_Com1.SetRThreshold(200);
//每接收200幀激活OnComm()事件 ……
3 結束語
本文通過PC機與89C51單片機組成一簡單的多機系統,通過串行通信實現了遠程數據采集系統的基本功能。在硬件連接上,為提高傳輸距離,采用了RS- 232C/RS-422A轉換電路,以差分傳輸、差分接受的形式解決了這一問題。在軟件編制上,采用流行的VC++6.0下的Active X控件,通過對控件相關屬性及代碼的編寫,實現了Windows 98環境下PC機與89C51單片機的遠程通信。該方法也可以用于類似的工業場合中。
電子發燒友App









評論