基于89C2051單片機(jī)的熱表通訊模塊的開發(fā)
圖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é)束字是完成異步通訊必須的,因此無論上位機(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ù),判斷來源后存入數(shù)據(jù)庫(kù)并通過人機(jī)界面顯示。
按照上述通信協(xié)議,綜合串口模擬過程對(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)沒有收到回應(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ī)軟件接口
通過通訊模塊最終實(shí)現(xiàn)工控機(jī)對(duì)熱表數(shù)據(jù)的讀取還需要對(duì)上位機(jī)進(jìn)行通訊接口程序的編寫。上位機(jī)通訊程序的編寫也同樣有多種方法: (1) 通過調(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)單, 開發(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è)字符來表示1 個(gè)字符, 當(dāng)發(fā)送1 個(gè)字符時(shí)單片機(jī)收到2 個(gè)字節(jié)。因此大多情況下PC 機(jī)與單片機(jī)通訊交換的是二進(jìn)制數(shù)據(jù)。所以利用MSCOMM 控件來發(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è)問題的討論. 現(xiàn)代電子技術(shù),2002 (1) :69 - 71.
評(píng)論