|
摘要:介紹了利用89C2051 單片機(jī)開(kāi)發(fā)某熱表的通訊模塊,并將其應(yīng)用于實(shí)驗(yàn)用主從分布式控制系統(tǒng)中,實(shí)現(xiàn)了工控機(jī)同多個(gè)熱表的串行通訊。闡述了串行通訊規(guī)程,利用單片機(jī)的普通I/ O 端口實(shí)現(xiàn)串行口功能的方法,從而解決了該單片機(jī)在實(shí)際的串行通訊應(yīng)用中串口資源少的問(wèn)題。通訊模塊通過(guò)RS - 485 通訊方式實(shí)現(xiàn)了熱表與工控機(jī)的遠(yuǎn)距離通訊。在充分利用單片機(jī)端口資源的基礎(chǔ)上完成了工控機(jī)與多臺(tái)單片機(jī)通訊。
1 引言 集中供熱方式的普及以及計(jì)量供熱的實(shí)施是建筑節(jié)能的有效手段,但需要通過(guò)供熱系統(tǒng)運(yùn)行管理的自動(dòng)化來(lái)實(shí)現(xiàn)。為了研究熱網(wǎng)的控制調(diào)節(jié)方法,建立了熱網(wǎng)模擬實(shí)驗(yàn)平臺(tái),并且配置了自動(dòng)監(jiān)測(cè)控制系統(tǒng)。在設(shè)備選型時(shí),采用了丹麥Kamstrup 熱量表作為實(shí)驗(yàn)管網(wǎng)中各主要管段輸送熱量及實(shí)驗(yàn)系統(tǒng)熱量的測(cè)量采集裝置,但該熱表配備的數(shù)據(jù)通訊接口模塊只能通過(guò)專用外接插口與計(jì)算機(jī)或相應(yīng)的數(shù)據(jù)終端進(jìn)行一對(duì)一的RS - 232 串行通訊,難以滿足現(xiàn)場(chǎng)的通訊要求。
2 通訊模塊的核心器件 在系統(tǒng)中,單片機(jī)一般稱為下位機(jī),通常用來(lái)完成數(shù)據(jù)的采集和上傳,由PC 機(jī)、網(wǎng)絡(luò)設(shè)備、數(shù)據(jù)庫(kù)服務(wù)器組成的后臺(tái)應(yīng)用部分則統(tǒng)稱為上位機(jī),對(duì)下位機(jī)的上傳數(shù)據(jù)進(jìn)行分析并處理。系統(tǒng)充分發(fā)揮了單片機(jī)在實(shí)時(shí)數(shù)據(jù)采集和微機(jī)對(duì)圖形處理、顯示以及數(shù)據(jù)庫(kù)管理上的優(yōu)勢(shì),使得單片機(jī)的應(yīng)用不局限于自動(dòng)監(jiān)測(cè)或控制,而形成了向以網(wǎng)絡(luò)為核心的分布式多點(diǎn)系統(tǒng)發(fā)展。在實(shí)驗(yàn)臺(tái)監(jiān)測(cè)控制系統(tǒng)中,選用單片機(jī)同工控機(jī)配合建立了如圖1 所示的通訊網(wǎng)絡(luò),實(shí)現(xiàn)對(duì)熱表采集數(shù)據(jù)的讀取。
圖1 工控機(jī)、熱表通訊網(wǎng)絡(luò) RS - 485 通訊標(biāo)準(zhǔn)針對(duì)RS - 232 存在的通訊距離近、抗干擾性能差等缺陷在提高傳輸速率和距離、抗干擾特性上都做了很大改進(jìn)。所以考慮到通訊的可靠性,為工控機(jī)選配了RS - 485 的串口卡建立通訊。 單片機(jī)數(shù)字信號(hào)遵循CMOS 電平協(xié)議,傳輸距離短,達(dá)不到分布式控制系統(tǒng)傳輸距離的要求,需要電平轉(zhuǎn)換芯片構(gòu)成接口電路與上位機(jī)連接。同時(shí),單片機(jī)與熱表連接時(shí)也要通過(guò)相應(yīng)的接口電路達(dá)到電平的匹配。 另外,單片機(jī)是工控機(jī)與熱表進(jìn)行數(shù)據(jù)交換的通訊樞紐,擔(dān)負(fù)著同時(shí)與工控機(jī)和熱表進(jìn)行串行通訊的責(zé)任,因此需要兩個(gè)串行通訊端口。有3 種方法供選擇:
- 采用多串口的單片機(jī);
- 采用通用異步串口擴(kuò)展芯片;
- 采用普通I/ O 端口模擬實(shí)現(xiàn)串行通信。
第3 種方法最簡(jiǎn)單經(jīng)濟(jì),并且可以實(shí)現(xiàn)高速率通信。另外,考慮到對(duì)硬件資源的充分利用,選用ATMEL 公司生產(chǎn)的89C2051 單片機(jī)進(jìn)行開(kāi)發(fā)。
3 通信模塊的開(kāi)發(fā) 3.1 硬件接口 理論上,利用軟件的方法可使普通I/ O 口擴(kuò)展成的串行口與標(biāo)準(zhǔn)的串行口具有同樣的功能。但是,根據(jù)實(shí)際情況,單片機(jī)自帶的串行口容易通過(guò)專用的電平轉(zhuǎn)換芯片實(shí)現(xiàn)RS - 485 電平與上位機(jī)連接;熱表數(shù)據(jù)通訊接口對(duì)發(fā)送和接收數(shù)據(jù)有不同的波特率要求,在模擬串口的程序中只要作相應(yīng)的延時(shí)處理,就能滿足。因此,用標(biāo)準(zhǔn)串口通過(guò)電平轉(zhuǎn)換連接上位機(jī)(見(jiàn)圖2) ,用普通I/ O 口模擬的串口經(jīng)相應(yīng)的接口電路與熱表相連(見(jiàn)圖3) 。
圖2 RS - 485 電平轉(zhuǎn)換 圖2 中單片機(jī)的標(biāo)準(zhǔn)串口通過(guò)75176 芯片轉(zhuǎn)換為RS - 485 電平,75176 為8 個(gè)管腳,DIP 封裝。RO 為數(shù)據(jù)接收端;RE 為數(shù)據(jù)接收允許端,低電平有效;DI 為數(shù)據(jù)發(fā)送端;DE 為數(shù)據(jù)發(fā)送允許端,高電平有效;DT+ 、DT - 腳為電流環(huán)回路端。圖2 中把RE、DE 腳連結(jié)在一起,當(dāng)P3. 7 腳為高電平時(shí),允許數(shù)據(jù)發(fā)送,當(dāng)P3. 7 為低電平時(shí),允許數(shù)據(jù)接收。R 為電路匹配電阻,可增強(qiáng)系統(tǒng)抗差模干擾的能力。
圖3 單片機(jī)與熱表接口電路 圖3 中虛線框內(nèi)為熱表本身的數(shù)據(jù)通訊接口電路,熱表通過(guò)該接口連接專用的外接插頭可以同計(jì)算機(jī)或相應(yīng)的數(shù)據(jù)終端進(jìn)行RS - 232 通訊。利用示波器檢測(cè)熱表在與計(jì)算機(jī)一對(duì)一的通訊過(guò)程中收發(fā)端的電平信號(hào)特征,采用分立元器件搭建了接口電路,使之與單片機(jī)端口達(dá)到電平的匹配。在單片機(jī)同熱表的通訊過(guò)程中,為保證通訊的可靠且能保證單片機(jī)及時(shí)地接收熱表傳來(lái)的數(shù)據(jù),采用中斷的接收方式,P3. 2 為中斷觸發(fā)端,所以選用該端口作為模擬串口的接收端,選用了P3. 4 作為模擬串口的發(fā)送端。
3.2 串行通信軟件 普通I/ O 口模擬串口的軟件編程實(shí)質(zhì)上就是模擬異步通訊規(guī)程。異步通信規(guī)程是把一個(gè)字符看作一個(gè)獨(dú)立的信息單元,并且字符出現(xiàn)在數(shù)據(jù)流中的相對(duì)時(shí)間是任意的。而每個(gè)字符中各數(shù)據(jù)位以固定的時(shí)間傳送,因此這種傳送在同一字符內(nèi)部是同步的,而字符間是異步的。異步通信收發(fā)取得同步的方法,是采用在字符格式中設(shè)置起始位和停止位。但由于發(fā)送器和接收器不是使用同一個(gè)時(shí)鐘,而是以各自時(shí)鐘來(lái)劃分每位的寬度,收發(fā)時(shí)鐘的誤差必然影響數(shù)據(jù)的正確采樣,所以要求準(zhǔn)確識(shí)別起始位的前沿。實(shí)際的做法是利用1 個(gè)16 倍波特率的時(shí)鐘,在1 個(gè)位周期的1/ 16 時(shí)間內(nèi)確定出字符的開(kāi)始,接收器在每個(gè)時(shí)鐘的上升沿采樣數(shù)據(jù)輸入線。若發(fā)現(xiàn)低電平,緊接著又連續(xù)采樣到8 次均為低電平,則認(rèn)定為起始位,以后每隔16 個(gè)時(shí)鐘采樣1 次數(shù)據(jù)。字符再同步過(guò)程見(jiàn)圖4。
圖4 f = 16 倍波特率的字符再同步過(guò)程 在軟件編程中,根據(jù)熱表發(fā)送數(shù)據(jù)的波特率計(jì)算出數(shù)據(jù)位周期,而后再根據(jù)單片機(jī)的晶振頻率編寫數(shù)據(jù)位周期延遲程序和半位周期延遲程序。當(dāng)單片機(jī)檢測(cè)到INT0 (即P3. 2 端口) 為低電平時(shí),外部中斷觸發(fā),進(jìn)入中斷處理程序。首先,調(diào)用半位周期延時(shí)程序,判斷是否為起始位,若是則再調(diào)用位周期延時(shí)程序,進(jìn)行數(shù)據(jù)位的判斷與接收,最后判斷接收停止位。只要延時(shí)程序能準(zhǔn)確地保證延時(shí)時(shí)間,就能完成對(duì)圖4 中工作時(shí)序的模擬。另外,在接收數(shù)據(jù)幀各個(gè)位時(shí),都連續(xù)地采樣3 次,并遵循3 中取2 的原則來(lái)確定所檢測(cè)的值。這樣做很大程度上抑制了干擾,提高了信 號(hào)傳輸?shù)目煽啃。同?單片機(jī)發(fā)送數(shù)據(jù)時(shí)只要調(diào)整好發(fā)送數(shù)據(jù)幀各數(shù)據(jù)位之間的傳輸時(shí)間間隔,滿足熱表接收數(shù)據(jù)的波特率,就能完成熱表對(duì)單片機(jī)發(fā)送數(shù)據(jù)的接收,程序流程圖如圖5 所示。
3.3 通信協(xié)議 單片機(jī)的串行口工作于方式2 或方式3 時(shí),數(shù)據(jù)幀由11 位數(shù)據(jù)組成:1 位起始位、9 位數(shù)據(jù)位、1 位停止位。在這兩種方式下,第9 位數(shù)據(jù)是可控的標(biāo)志位,只有第9 位的數(shù)據(jù)是“1”(代表地址幀) 時(shí),串行口接口電路才會(huì)在接收完1 個(gè)數(shù)據(jù)后,向CPU 請(qǐng)求中斷。因?yàn)镻C 機(jī)的異步通信功能沒(méi)有這樣的通信格式,所以這種方式只適合單片機(jī)之間的多機(jī)通信。一般情況下,實(shí)現(xiàn)兩種異型機(jī)之間的通信常采用以下幾種方式: (1) 用1 臺(tái)單片機(jī)作為上位PC 機(jī)和下位單片機(jī)之間的“橋梁”,實(shí)現(xiàn)數(shù)據(jù)格式的轉(zhuǎn)換; (2) 在PC 機(jī)內(nèi)安裝異步通信適配卡,通過(guò)設(shè)計(jì)可編程芯片的運(yùn)行方式,使之與單片機(jī)的多機(jī)通信方式一致; (3) 設(shè)置上位機(jī)編程環(huán)境提供的串行通訊控件的屬性來(lái)區(qū)分尋址指令和數(shù)據(jù)傳送指令,進(jìn)而實(shí)現(xiàn)通訊。 方法1 和方法2 硬件結(jié)構(gòu)復(fù)雜,方法3 軟件代碼編寫繁瑣。在系統(tǒng)不復(fù)雜、任務(wù)不重、通信數(shù)據(jù)量不大的情況下,這些方法還不會(huì)有明顯的缺陷,否則方法1 中的“橋梁”單片機(jī)和方法2 中的通信異步適配器將會(huì)成為通信信道的瓶頸,而方法3 中數(shù)據(jù)幀中的奇偶校驗(yàn)位通常用作發(fā)送地址碼(通道號(hào)) 或數(shù)據(jù)的特征位,這樣數(shù)據(jù)通信的校核會(huì)采用累加和校驗(yàn)的方法,采用這種方法不但軟件開(kāi)銷和進(jìn)行通信的數(shù)據(jù)量增加了,而且實(shí)時(shí)性也受到影響。 根據(jù)實(shí)際情況,采用了通信信息幀不區(qū)分?jǐn)?shù)據(jù)幀和地址幀的方法,這樣做不必使單片機(jī)工作在11 位異步收發(fā)方式下,使單片機(jī)和PC 機(jī)的串口工作方式一致。受到通信格式的啟發(fā),設(shè)計(jì)信息幀見(jiàn)圖6 ,用1~3 個(gè)字節(jié)作為數(shù)據(jù)通信的“報(bào)頭”,起同步作用;用1個(gè)或多個(gè)字節(jié)作為單片機(jī)的地址區(qū)別碼來(lái)標(biāo)識(shí)某個(gè)單片機(jī)(根據(jù)系統(tǒng)中下位機(jī)的個(gè)數(shù)決定) ;用來(lái)標(biāo)志下位機(jī)工作性質(zhì)的信息碼可根據(jù)實(shí)際的情況在信息幀中靈活設(shè)置。
圖6 信息幀一般格式 上位機(jī)發(fā)送信息幀時(shí),下位機(jī)全部收到上位機(jī)的信息幀,然后判斷信息幀中的地址碼,如果是自己的地址碼,則根據(jù)數(shù)據(jù)幀中的信息碼內(nèi)容作出相應(yīng)的反應(yīng)。信息幀的長(zhǎng)度不限(根據(jù)系統(tǒng)中下位機(jī)的個(gè)數(shù)以及信息碼的形式?jīng)Q定) ,是多個(gè)字節(jié)的。在這種通信格式中還可以用軟件的方式進(jìn)行一些通信數(shù)據(jù)的校驗(yàn)。 工控機(jī)與下位機(jī)通訊模塊之間的通信協(xié)議,如圖7 所示。
圖7 工控機(jī)與下位機(jī)通訊模塊間的通信協(xié)議 上位機(jī)工控機(jī)向下位機(jī)發(fā)出的信息幀中應(yīng)包含地址和控制指令信息,以便下位機(jī)的通訊模塊能辨識(shí)出是否及如何應(yīng)答;通訊模塊,向上位機(jī)回復(fù)的信息幀中應(yīng)包含自身地址及對(duì)應(yīng)控制指令的數(shù)據(jù);同步字和結(jié)束字是完成異步通訊必須的,因此無(wú)論上位機(jī)信息幀還是下位機(jī)信息幀都不可少。具體的信息幀格式如下(括號(hào)里標(biāo)注為字節(jié)數(shù),未標(biāo)出的字節(jié)數(shù)為1) : 整個(gè)收發(fā)數(shù)據(jù)的互控流程如下: 上位機(jī):按照一定的時(shí)間發(fā)送指令給下位機(jī); 下位機(jī):收到信息幀后,判斷信息幀中的地址是否為本機(jī)地址,若是則將本機(jī)地址發(fā)回上位機(jī),并根據(jù)控制字向熱表發(fā)出相應(yīng)的指令,等待模擬串口中斷,將熱表數(shù)據(jù)傳給單片機(jī),之后轉(zhuǎn)發(fā)給上位機(jī);反之則退出中斷程序; 上位機(jī):根據(jù)串口引發(fā)的事件接受數(shù)據(jù),判斷來(lái)源后存入數(shù)據(jù)庫(kù)并通過(guò)人機(jī)界面顯示。 按照上述通信協(xié)議,綜合串口模擬過(guò)程對(duì)通訊模塊(下位機(jī)) 進(jìn)行編程。編寫的程序主要包括主程序和中斷程序;中斷程序有模擬串口中斷接收程序和串行中斷程序。其中主程序完成各個(gè)特殊寄存器及通信參數(shù)、格式的初始化工作,分析判斷串行中斷,接受信息向熱表發(fā)出相應(yīng)的指令;模擬串口中斷程序具體完成熱表數(shù)據(jù)的接收;串行中斷程序完成對(duì)上位機(jī)發(fā)出信息幀的接收。另外,考慮到實(shí)際應(yīng)用當(dāng)中各種隨機(jī)干擾,在編寫程序時(shí)作了適當(dāng)?shù)募m錯(cuò)處理,即通訊模塊收到上位機(jī)指令后對(duì)熱表進(jìn)行操作,若在一定時(shí)間內(nèi)沒(méi)有收到回應(yīng),則使程序復(fù)位。 每臺(tái)熱表對(duì)應(yīng)的通訊模塊地址的標(biāo)識(shí)方法如圖8所示。充分利用了該型號(hào)單片機(jī)的硬件資源,以跳線的方式設(shè)定P1 端口各個(gè)管腳的電平作為地址標(biāo)識(shí),8個(gè)管腳不同的通斷組合可以表示不同的地址。
圖8 通信模塊地址標(biāo)識(shí) 通訊模塊的編程都是利用仿真器提供的環(huán)境進(jìn)行模擬并調(diào)試成功的。
4 與上位機(jī)軟件接口 通過(guò)通訊模塊最終實(shí)現(xiàn)工控機(jī)對(duì)熱表數(shù)據(jù)的讀取還需要對(duì)上位機(jī)進(jìn)行通訊接口程序的編寫。上位機(jī)通訊程序的編寫也同樣有多種方法: (1) 通過(guò)調(diào)用WINDOWS 提供的API 函數(shù)實(shí)現(xiàn); (2) 采用匯編語(yǔ)言和C 語(yǔ)言混合編寫動(dòng)態(tài)連接庫(kù)函數(shù)實(shí)現(xiàn); (3) 利用VB 語(yǔ)言及其提供的串行通信控件實(shí)現(xiàn)。第3 種方法最簡(jiǎn)單, 開(kāi)發(fā)周期短, 經(jīng)濟(jì)實(shí)用。只需在工程中添加MSCOMM控件, 然后進(jìn)行相應(yīng)的屬性設(shè)置, 便可完成數(shù)據(jù)的收發(fā)。但VB 中的數(shù)據(jù)收發(fā)分為二進(jìn)制形式和文本形式。若發(fā)送文本, 單片機(jī)收到的文本是ASC Ⅱ碼, 在VB6. 0 中使用的是Unicode 字符,即用2 個(gè)字符來(lái)表示1 個(gè)字符, 當(dāng)發(fā)送1 個(gè)字符時(shí)單片機(jī)收到2 個(gè)字節(jié)。因此大多情況下PC 機(jī)與單片機(jī)通訊交換的是二進(jìn)制數(shù)據(jù)。所以利用MSCOMM 控件來(lái)發(fā)送二進(jìn)制數(shù)據(jù)時(shí), 必須將變量聲明為Byte 形式。
參考文獻(xiàn) [1 ] 胡漢才. 單片機(jī)原理及其接口技術(shù). 北京:清華大學(xué)出版社,1993 :317 - 320. [2 ] 李華,嚴(yán)天峰. 串行通訊軟硬件的實(shí)現(xiàn)方法. 電子世界,2003 (5) :31 - 33. [3 ] 王小軍,郝迎吉,張斌. 單片機(jī)串行通信中兩個(gè)問(wèn)題的討論. 現(xiàn)代電子技術(shù),2002 (1) :69 - 71. |