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

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

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

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

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









評(píng)論