|
一般的程序設(shè)計是中斷一次接收一個字節(jié)數(shù)據(jù),這里我們將使一次中斷接收一個完整的數(shù)據(jù)包。數(shù)據(jù)包由五部分組成:從機地址(1Byte);命令字節(jié)(1Byte);數(shù)據(jù)字節(jié)數(shù)(1Byte);傳送數(shù)據(jù)(0-256Byte);校驗和(2Byte)。主機向下先發(fā)送從機地址,從機進入中斷接收程序,如地址相符,再以查詢方式接收命令字節(jié)、數(shù)據(jù)字節(jié)數(shù)、數(shù)據(jù)、校驗和。從機根據(jù)接收到的校驗和判斷接收正確與否,這時從機由接收狀態(tài)置成發(fā)送狀態(tài),若接收正確則向主機回發(fā)“A5H”信號及其它回應(yīng)信息,否則發(fā)“5AH”信號,中斷返回前從機再置成接收狀態(tài)。在主從機收發(fā)程序中做了超時處理,若經(jīng)過一段時間收不到信息,則此次通訊失敗。 3 軟件設(shè)計 1.單片機部分 工作方式:定時器1為工作方式2,串行口為工作方式3; 傳送方式:中斷接收與發(fā)送響應(yīng)信息; 數(shù)據(jù)格式:一個起始位,八個數(shù)據(jù)位,一個TB8或RB8,一個停止位; 波特率:9600bps 從機中斷子程序流程圖略。 下面給出單片機通訊程序采用Franklin/Keil C51語言編制。 main() { //初始化 TMOD=0x20; TL1=0xFD; //設(shè)定波特率為9600bit TH1=0xFD; PCON=0x80; TCON=0x00; SMOD=0x00; SCON=0xF0; TR1=1; REN=1; ES=1; EA=1; P35=1; //處于接收狀態(tài) } //串行口中斷程序 void serial() interrupt 4 using 1 { unsigned char address; RI=0; //關(guān)中斷 address=SBUF; //判斷是否符合本機地址,如1號機 if (address= =0x01) { P35=0; SM2=0; //清SM2位,準備接收數(shù)據(jù) …… //接收數(shù)據(jù)及相應(yīng)處理 (發(fā)送功能可在此部分完成) …… SM2=1; } else SM2=1; //不是發(fā)給本機數(shù)據(jù), 置位SM2,退出 } 2.PC機部分 傳送方式:查詢方式接收和發(fā)送數(shù)據(jù); 數(shù)據(jù)格式:一個起始位,八個數(shù)據(jù)位,一個可編程位(類似TB8或RB8),一個停止位; 波特率:9600bps 上位PC機通信程序的開發(fā)環(huán)境采用Borland C++ Builder5.0可視化編程工具,它是基于C++語言的快速應(yīng)用程序開發(fā)(RAD)工具,是最先進的開發(fā)應(yīng)用程序組件思想和面向?qū)ο蟮模茫Z言融合的產(chǎn)物,C++ Builder5.0內(nèi)置了近200個完全封裝了Windows 9x公用特性且具有擴展性的可重用控件,這就使得利用C++ Builder開發(fā)應(yīng)用程序非常方便、快捷。 在Windows98/95環(huán)境中,編寫串行通信應(yīng)用程序,一般采用如下兩種方法:其一是通過調(diào)用Win32 API提供的串行通信函數(shù),這種方法實現(xiàn)相當繁瑣;另一種方法則是利用專門處理串行通信的控件來編程,用戶只需在自己的應(yīng)用程序中嵌入這一類控件,編寫少量代碼便可輕松高效地完成任務(wù)。在本系統(tǒng)中,我們選擇一個名為Comm的第三方控件來實現(xiàn)串口的通信管理。 表1 Comm控件的重要屬性和事件列表 屬性(事件)名稱 用 途 BaudRate 設(shè)置串行通信波特率 Databits 設(shè)置有效數(shù)據(jù)位長度 DeviceAddress 設(shè)置串行口地址 DeviceName 選擇串行口 Parity 奇偶校驗位設(shè)置 OnBreak 通信中斷時激活 OnError 數(shù)據(jù)傳輸有誤時激活 Comm控件的一些重要屬性(Property)和事件(Event)如表1所示。串行端口的選擇、波特率的設(shè)定以及數(shù)據(jù)格式的定義等都可通過設(shè)置相應(yīng)的屬性來完成。在由計算機和多個單片機應(yīng)用系統(tǒng)構(gòu)成的多機環(huán)境中,一般把通信數(shù)據(jù)分為“地址幀”和 “數(shù)據(jù)幀”來傳送,PC機的串行通信本身并不具備多機通信功能,也不能產(chǎn)生TB8或者RB8,但可以通過靈活設(shè)置Comm控件中的“Parity”屬性來形成正確的地址/數(shù)據(jù)標志位,從而使PC機與單片機之間實現(xiàn)多機通信。 PC機與某一下位機通信,在對話框中選擇下位機的地址號、設(shè)定通信命令,在“連接”按鈕(Button)的OnClick事件處理函數(shù)中編寫代碼實現(xiàn)與下位機的數(shù)據(jù)通信。另外在通信被中斷或數(shù)據(jù)傳輸有誤時,分別激活Comm控件的OnBreak事件和OnError事件。在OnBreak或者OnError的事件處理函數(shù)中加入代碼用來完成是否重發(fā)或取消本次通信等操作。 PC機收發(fā)數(shù)據(jù)的流程圖略。 4 結(jié)束語 此設(shè)計應(yīng)用在實際設(shè)備中取得良好效果。MAX1487芯片的使用在RS485遠程多機通訊中表現(xiàn)出較強功能,值得推廣。 另外,值得一提的是,用C語言進行8051單片機程序設(shè)計是單片機開發(fā)與應(yīng)用的必然趨勢,而Franklin/Keil C51是一種很好的單片機C語言的編譯器,能自動完成變量存儲單元的分配,使得程序設(shè)計和維護效率大為提高。 參考文獻 [1]ANALOG DESIGN GUIDE MAXIM CORPORATION 1997,7
|