基于RS232modbus協(xié)議的雙機串行通信_第1頁
基于RS232modbus協(xié)議的雙機串行通信_第2頁
基于RS232modbus協(xié)議的雙機串行通信_第3頁
基于RS232modbus協(xié)議的雙機串行通信_第4頁
基于RS232modbus協(xié)議的雙機串行通信_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

目錄一、Modbus協(xié)議分析11.1兩種傳輸方式21.2Modbus消息幀31.3錯誤檢測方法5二、程序設計思想62.1總體設計62.2硬件設計7單片機串行通信功能72.2.2MAX232芯片82.2.3整體電路設計92.3軟件設計10主機系統(tǒng)軟件設計102.3.2從機系統(tǒng)軟件設計12三、程序代碼15基于51單片機的雙機串行通信設計一、Modbus協(xié)議分析Modbus協(xié)議是應用于電子控制器上的一種通用語言。通過此協(xié)議,控制器相互之間、控制器經(jīng)由網(wǎng)絡和其它設備之間可以通信。它已經(jīng)成為一通用工業(yè)標準。有了它,不同廠商生產(chǎn)的控制設備可以連成工業(yè)網(wǎng)絡,進行集中監(jiān)控。

此協(xié)議定義了一個控制器能認識使用的消息結構,而不管它們是經(jīng)過何種網(wǎng)絡進行通信的。它描述了一控制器請求訪問其它設備的過程,如何回應來自其它設備的請求,以及怎樣偵測錯誤并記錄。它制定了消息域格局和內(nèi)容的公共格式。

當在一Modbus網(wǎng)絡上通信時,此協(xié)議決定了每個控制器須要知道它們的設備地址,識別按地址發(fā)來的消息,決定要產(chǎn)生何種行動。如果需要回應,控制器將生成反響信息并用Modbus協(xié)議發(fā)出。在其它網(wǎng)絡上,包含了Modbus協(xié)議的消息轉換為在此網(wǎng)絡上使用的幀或包結構。這種轉換也擴展了根據(jù)具體的網(wǎng)絡解決節(jié)地址、路由路徑及錯誤檢測的方法。

1)在Modbus網(wǎng)絡上轉輸

標準的Modbus口是使用一RS-232C兼容串行接口,它定義了連接口的針腳、電纜、信號位、傳輸波特率、奇偶校驗??刂破髂苤苯踊蚪?jīng)由Modem組網(wǎng)。

控制器通信使用主—從技術,即僅一設備〔主設備〕能初始化傳輸〔查詢〕。其它設備〔從設備〕根據(jù)主設備查詢提供的數(shù)據(jù)作出相應反響。典型的主設備:主機和可編程儀表。典型的從設備:可編程控制器。

主設備可單獨和從設備通信,也能以播送方式和所有從設備通信。如果單獨通信,從設備返回一消息作為回應,如果是以播送方式查詢的,那么不作任何回應。Modbus協(xié)議建立了主設備查詢的格式:設備〔或播送〕地址、功能代碼、所有要發(fā)送的數(shù)據(jù)、一錯誤檢測域。

從設備回應消息也由Modbus協(xié)議構成,包括確認要行動的域、任何要返回的數(shù)據(jù)、和一錯誤檢測域。如果在消息接收過程中發(fā)生一錯誤,或從設備不能執(zhí)行其命令,從設備將建立一錯誤消息并把它作為回應發(fā)送出去。

2)在其它類型網(wǎng)絡上傳輸在其它網(wǎng)絡上,控制器使用對等技術通信,故任何控制都能初始和其它控制器的通信。這樣在單獨的通信過程中,控制器既可作為主設備也可作為從設備。提供的多個內(nèi)部通道可允許同時發(fā)生的傳輸進程。在消息位,Modbus協(xié)議仍提供了主—從原那么,盡管網(wǎng)絡通信方法是“對等〞。如果一控制器發(fā)送一消息,它只是作為主設備,并期望從從設備得到回應。同樣,當控制器接收到一消息,它將建立一從設備回應格式并返回給發(fā)送的控制器。

3)查詢—回應周期

〔=1\*romani〕查詢

查詢消息中的功能代碼告之被選中的從設備要執(zhí)行何種功能。數(shù)據(jù)段包含了從設備要執(zhí)行功能的任何附加信息。例如功能代碼03是要求從設備讀保持存放器并返回它們的內(nèi)容。數(shù)據(jù)段必須包含要告之從設備的信息:從何存放器開始讀及要讀的存放器數(shù)量。錯誤檢測域為從設備提供了一種驗證消息內(nèi)容是否正確的方法。

〔=2\*romanii〕回應

如果從設備產(chǎn)生一正常的回應,在回應消息中的功能代碼是在查詢消息中的功能代碼的回應。數(shù)據(jù)段包括了從設備收集的數(shù)據(jù):象存放器值或狀態(tài)。如果有錯誤發(fā)生,功能代碼將被修改以用于指出回應消息是錯誤的,同時數(shù)據(jù)段包含了描述此錯誤信息的代碼。錯誤檢測域允許主設備確認消息內(nèi)容是否可用。1.1兩種傳輸方式控制器能設置為兩種傳輸模式〔ASCII或RTU〕中的任何一種在標準的Modbus網(wǎng)絡通信。用戶選擇想要的模式,包括串口通信參數(shù)〔波特率、校驗方式等〕,在配置每個控制器的時候,在一個Modbus網(wǎng)絡上的所有設備都必須選擇相同的傳輸模式和串口參數(shù)。

ASCII模式:地址功能代碼數(shù)據(jù)數(shù)量數(shù)據(jù)1...數(shù)據(jù)nLRC高字節(jié)LRC低字節(jié)回車換行RTU模式地址功能代碼數(shù)據(jù)數(shù)量數(shù)據(jù)1...數(shù)據(jù)nCRC高字節(jié)CRC低字節(jié)所選的ASCII或RTU方式僅適用于標準的Modbus網(wǎng)絡,它定義了在這些網(wǎng)絡上連續(xù)傳輸?shù)南⒍蔚拿恳晃?,以及決定怎樣將信息打包成消息域和如何解碼。在其它網(wǎng)絡上〔像MAP和ModbusPlus〕Modbus消息被轉成與串行傳輸無關的幀。

1)ASCII模式當控制器設為在Modbus網(wǎng)絡上以ASCII〔美國標準信息交換代碼〕模式通信,在消息中的每個8Bit字節(jié)都作為兩個ASCII字符發(fā)送。這種方式的主要優(yōu)點是字符發(fā)送的時間間隔可到達1秒而不產(chǎn)生錯誤。

代碼系統(tǒng)十六進制,ASCII字符0...9,A...F,消息中的每個ASCII字符都是一個十六進制字符組成每個字節(jié)的位。

?1個起始位

?7個數(shù)據(jù)位,最小的有效位先發(fā)送

?1個奇偶校驗位,無校驗那么無

?1個停止位〔有校驗時〕,2個Bit〔無校驗時〕

錯誤檢測域

?LRC(縱向冗長檢測)

2)RTU模式當控制器設為在Modbus網(wǎng)絡上以RTU〔遠程終端單元〕模式通信,在消息中的每個8Bit字節(jié)包含兩個4Bit的十六進制字符。這種方式的主要優(yōu)點是:在同樣的波特率下,可比ASCII方式傳送更多的數(shù)據(jù)。

代碼系統(tǒng)

?8位二進制,十六進制數(shù)0...9,A...F

?消息中的每個8位域都是一個兩個十六進制字符組成

每個字節(jié)的位

?1個起始位

?8個數(shù)據(jù)位,最小的有效位先發(fā)送

?1個奇偶校驗位,無校驗那么無

?1個停止位〔有校驗時〕,2個Bit〔無校驗時〕

錯誤檢測域

?CRC(循環(huán)冗長檢測)1.2Modbus消息幀兩種傳輸模式中〔ASCII或RTU〕,傳輸設備以將Modbus消息幀為有起點和終點的幀,這就允許接收的設備在消息起始處開始工作,讀地址分配信息,判斷哪一個設備被選中〔播送方式那么傳給所有設備〕,判知何時信息已完成。局部的消息也能偵測到并且錯誤能設置為返回結果。

1)ASCII幀使用ASCII模式,消息以冒號〔:〕字符〔ASCII碼3AH〕開始,以回車換行符結束〔ASCII碼0DH,0AH〕。其它域可以使用的傳輸字符是十六進制的0...9,A...F。網(wǎng)絡上的設備不斷偵測“:〞字符,當有一個冒號接收到時,每個設備都解碼下個域〔地址域〕來判斷是否發(fā)給自己的。消息中字符間發(fā)送的時間間隔最長不能超過1秒,否那么接收的設備將認為傳輸錯誤。一個典型消息幀如下所示:起始位設備地址功能代碼數(shù)據(jù)LRC校驗結束符1個字符2個字符2個字符n個字符2個字符2個字符ASCII消息幀2)RTU幀使用RTU模式,消息發(fā)送至少要以3.5個字符時間的停頓間隔開始。在網(wǎng)絡波特率下多樣的字符時間,這是最容易實現(xiàn)的(如下列圖的T1-T2-T3-T4所示)。傳輸?shù)牡谝粋€域是設備地址。可以使用的傳輸字符是十六進制的0...9,A...F。網(wǎng)絡設備不斷偵測網(wǎng)絡總線,包括停頓間隔時間內(nèi)。當?shù)谝粋€域〔地址域〕接收到,每個設備都進行解碼以判斷是否發(fā)往自己的。在最后一個傳輸字符之后,一個至少3.5個字符時間的停頓標定了消息的結束。一個新的消息可在此停頓后開始。整個消息幀必須作為一連續(xù)的流轉輸。如果在幀完成之前有超過1.5個字符時間的停頓時間,接收設備將刷新不完整的消息并假定下一字節(jié)是一個新消息的地址域。同樣地,如果一個新消息在小于3.5個字符時間內(nèi)接著前個消息開始,接收的設備將認為它是前一消息的延續(xù)。這將導致一個錯誤,因為在最后的CRC域的值不可能是正確的。一典型的消息幀如下所示:起始位設備地址功能代碼數(shù)據(jù)CRC校驗結束符T1-T2-T3-T48Bit8Bitn個8Bit16BitT1-T2-T3-T4RTU消息幀3)地址域消息幀的地址域包含兩個字符〔ASCII〕或8Bit〔RTU〕??赡艿膹脑O備地址是0...247(十進制)。單個設備的地址范圍是1...247。主設備通過將要聯(lián)絡的從設備的地址放入消息中的地址域來選通從設備。當從設備發(fā)送回應消息時,它把自己的地址放入回應的地址域中,以便主設備知道是哪一個設備作出回應。地址0是用作播送地址,以使所有的從設備都能認識。當Modbus協(xié)議用于更高水準的網(wǎng)絡,播送可能不允許或以其它方式代替。

4)如何處理功能域消息幀中的功能代碼域包含了兩個字符〔ASCII〕或8Bits〔RTU〕??赡艿拇a范圍是十進制的1...255。當然,有些代碼是適用于所有控制器,有些是應用于某種控制器,還有些保存以備后用。當消息從主設備發(fā)往從設備時,功能代碼域?qū)⒏嬷畯脑O備需要執(zhí)行哪些行為。例如去讀取輸入的開關狀態(tài),讀一組存放器的數(shù)據(jù)內(nèi)容,讀從設備的診斷狀態(tài),允許調(diào)入、記錄、校驗在從設備中的程序等。當從設備回應時,它使用功能代碼域來指示是正?;貞?無誤)還是有某種錯誤發(fā)生〔稱作異議回應〕。對正?;貞?,從設備僅回應相應的功能代碼。對異議回應,從設備返回一等同于正常代碼的代碼,但最重要的位置為邏輯1。主設備應用程序得到異議的回應后,典型的處理過程是重發(fā)消息,或者診斷發(fā)給從設備的消息并報告給操作員。

5)數(shù)據(jù)域數(shù)據(jù)域是由兩個十六進制數(shù)集合構成的,范圍00...FF。根據(jù)網(wǎng)絡傳輸模式,這可以是由一對ASCII字符組成或由一RTU字符組成。從主設備發(fā)給從設備消息的數(shù)據(jù)域包含附加的信息:從設備必須用于進行執(zhí)行由功能代碼所定義的所為。這包括了象不連續(xù)的存放器地址,要處理項的數(shù)目,域中實際數(shù)據(jù)字節(jié)數(shù)。

6)錯誤檢測域標準的Modbus網(wǎng)絡有兩種錯誤檢測方法。錯誤檢測域的內(nèi)容視所選的檢測方法而定。

ASCII中選用ASCII模式作字符幀,錯誤檢測域包含兩個ASCII字符。這是使用LRC〔縱向冗長檢測〕方法對消息內(nèi)容計算得出的,不包括開始的冒號符及回車換行符。LRC字符附加在回車換行符前面。

RTU中選用RTU模式作字符幀,錯誤檢測域包含一16Bits值(用兩個8位的字符來實現(xiàn))。錯誤檢測域的內(nèi)容是通過對消息內(nèi)容進行循環(huán)冗長檢測方法得出的。CRC域附加在消息的最后,添加時先是低字節(jié)然后是高字節(jié)。故CRC的高位字節(jié)是發(fā)送消息的最后一個字節(jié)。

7)字符的連續(xù)傳輸當消息在標準的Modbus系列網(wǎng)絡傳輸時,每個字符或字節(jié)以如下方式發(fā)送〔從左到右〕:

最低有效位...最高有效位

使用ASCII字符幀時,位的序列是:

有奇偶校驗啟始位1234567奇偶位停止位無奇偶校驗啟始位1234567停止位停止位位順序〔ASCII〕使用RTU字符幀時,位的序列是:

有奇偶校驗啟始位12345678奇偶位停止位無奇偶校驗啟始位12345678停止位停止位位順序〔RTU〕1.3錯誤檢測方法標準的Modbus串行網(wǎng)絡采用兩種錯誤檢測方法。奇偶校驗對每個字符都可用,幀檢測〔LRC或CRC〕應用于整個消息。它們都是在消息發(fā)送前由主設備產(chǎn)生的,從設備在接收過程中檢測每個字符和整個消息幀。用戶要給主設備配置一預先定義的超時時間間隔,這個時間間隔要足夠長,以使任何從設備都能作為正常反響。如果從設備測到一傳輸錯誤,消息將不會接收,也不會向主設備作出回應。這樣超時事件將觸發(fā)主設備來處理錯誤。發(fā)往不存在的從設備的地址也會產(chǎn)生超時。

1〕奇偶校驗用戶可以配置控制器是奇或偶校驗,或無校驗。這將決定了每個字符中的奇偶校驗位是如何設置的。如果指定了奇或偶校驗,“1〞的位數(shù)將算到每個字符的位數(shù)中〔ASCII模式7個數(shù)據(jù)位,RTU中8個數(shù)據(jù)位〕。例如RTU字符幀中包含以下8個數(shù)據(jù)位:11000101,整個“1〞的數(shù)目是4個。如果便用了偶校驗,幀的奇偶校驗位將是0,便得整個“1〞的個數(shù)仍是4個。如果便用了奇校驗,幀的奇偶校驗位將是1,便得整個“1〞的個數(shù)是5個。如果沒有指定奇偶校驗位,傳輸時就沒有校驗位,也不進行校驗檢測。代替一附加的停止位填充至要傳輸?shù)淖址麕小?/p>

2〕LRC檢測使用ASCII模式,消息包括了一基于LRC方法的錯誤檢測域。LRC域檢測了消息域中除開始的冒號及結束的回車換行號外的內(nèi)容。

LRC域是一個包含一個8位二進制值的字節(jié)。LRC值由傳輸設備來計算并放到消息幀中,接收設備在接收消息的過程中計算LRC,并將它和接收到消息中LRC域中的值比擬,如果兩值不等,說明有錯誤。

LRC方法是將消息中的8Bit的字節(jié)連續(xù)累加,丟棄了進位。

3〕CRC檢測使用RTU模式,消息包括了一基于CRC方法的錯誤檢測域。CRC域檢測了整個消息的內(nèi)容。

CRC域是兩個字節(jié),包含一16位的二進制值。它由傳輸設備計算后參加到消息中。接收設備重新計算收到消息的CRC,并與接收到的CRC域中的值比擬,如果兩值不同,那么有誤。

CRC是先調(diào)入一值是全“1〞的16位存放器,然后調(diào)用一過程將消息中連續(xù)的8位字節(jié)各當前存放器中的值進行處理。僅每個字符中的8Bit數(shù)據(jù)對CRC有效,起始位和停止位以及奇偶校驗位均無效。

CRC產(chǎn)生過程中,每個8位字符都單獨和存放器內(nèi)容相或〔OR〕,結果向最低有效位方向移動,最高有效位以0填充。LSB被提取出來檢測,如果LSB為1,存放器單獨和預置的值或一下,如果LSB為0,那么不進行。整個過程要重復8次。在最后一位〔第8位〕完成后,下一個8位字節(jié)又單獨和存放器的當前值相或。最終存放器中的值,是消息中所有的字節(jié)都執(zhí)行之后的CRC值。

CRC添加到消息中時,低字節(jié)先參加,然后高字節(jié)。二、程序設計思想2.1總體設計本文在MODBUS協(xié)議的根底上通過串行端口實現(xiàn)單片機和單片機的通訊,根據(jù)MODBUS協(xié)議,它有兩種數(shù)據(jù)傳輸?shù)姆绞剑篈SCII和RTU方式,由于RTU方式傳輸效率高,采用CRC校驗方法,數(shù)據(jù)傳輸準確,所以本文采用了RTU方式。硬件局部,使用兩片89C4051,通過RS232進行雙機通信。發(fā)送方的數(shù)據(jù)由串行口TXD段輸出,經(jīng)過電平轉換芯片MAX232將TTL電平轉換為RS232電平輸出,經(jīng)過傳輸線將信號傳送到接收端。接收方也使用MAX232芯片進行電平轉換后,信號到達接收方串行口的接收端。每個51從設備增加了一個I2C接口的ADC0831,主機通過協(xié)議來輪詢各個從機的采樣信號,解析后顯示在主機的LCD屏的對應位置上。軟件局部,通過MODBUS協(xié)議進行發(fā)送接收,主機發(fā)送命令幀給從機,等待從機回應,等待超時那么重新發(fā)送。從機收到命令幀后檢查目的地址,確認后計算接收到數(shù)據(jù)的檢驗和,與主機發(fā)送來的檢驗和進行比擬,假設檢驗和相同那么發(fā)送正?;貞獛o主機;否那么發(fā)送錯誤報告幀給主機,告知主機重新發(fā)送命令幀。2.2硬件設計單片機串行通信功能圖2-1AT89C4051計算機與外界的信息交換稱為通信,常用的通信方式有兩種:并行通信和串行通信。51單片機用4個接口與外界進行數(shù)據(jù)輸入與數(shù)據(jù)輸出就是并行通信,并行通信的特點是傳輸信號的速度快,但所用的信號線較多,本錢高,傳輸?shù)木嚯x較近。串行通信的特點是只用兩條信號線〔一條信號線,再加一條地線作為信號回路〕即可完成通信,本錢低,傳輸?shù)木嚯x較遠。51單片機的串行接口是一個全雙工的接口,它可以作為UART〔通用異步接受和發(fā)送器〕用,也可以作為同步移位存放器用。51單片機串行接口的結構如下:〔1〕數(shù)據(jù)緩沖器〔SBUF〕接受或發(fā)送的數(shù)據(jù)都要先送到SBUF緩存。有兩個,一個緩存,另一個接受,用同一直接地址99H,發(fā)送時用指令將數(shù)據(jù)送到SBUF即可啟動發(fā)送;接收時用指令將SBUF中接收到的數(shù)據(jù)取出?!?〕串行控制存放器〔是SCON〕SCON用于串行通信方式的選擇,收發(fā)控制及狀態(tài)指示,各位含義如下:SM0SM1SM2RENTB8RB8TIRISM0,SM1:串行接口工作方式選擇位,這兩位組合成00,01,10,11對應于工作方式0、1、2、3。串行接口工作方式特點見下表。SM0SM1工作方式功能波特率0008位同步移位存放器〔用于I/O擴展〕fORC/1201110位異步串行通信〔UART〕可變〔T1溢出率*2SMOD/32〕10211位異步串行通信〔UART〕fORC/64或fORC/3211311位異步串行通信〔UART〕可變〔T1溢出率*2SMOD/32〕SM2:多機通信控制位。REN:接收允許控制位。軟件置1允許接收;軟件置0禁止接收。TB8:方式2或3時,TB8為要發(fā)送的第9位數(shù)據(jù),根據(jù)需要由軟件置1或清0。RB9:在方式2或3時,RB8位接收到的第9位數(shù)據(jù),實際為主機發(fā)送的第9位數(shù)據(jù)TB8,使從機根據(jù)這一位來判斷主機發(fā)送的時呼叫地址還是要傳送的數(shù)據(jù)。TI:發(fā)送中斷標志。發(fā)送完一幀數(shù)據(jù)后由硬件自動置位,并申請中斷。必須要軟件清零后才能繼續(xù)發(fā)送。RI:接收中斷標志。接收完一幀數(shù)據(jù)后由硬件自動置位,并申請中斷。必須要軟件清零后才能繼續(xù)接收?!?〕輸入移位存放器接收的數(shù)據(jù)先串行進入輸入移位存放器,8位數(shù)據(jù)全移入后,再并行送入接收SBUF中?!?〕波特率發(fā)生器波特率發(fā)生器用來控制串行通信的數(shù)據(jù)傳輸速率的,51系列單片機用定時器T1作為波特率發(fā)生器,T1設置在定時方式。波特率時用來表示串行通信數(shù)據(jù)傳輸快慢程度的物理量,定義為每秒鐘傳送的數(shù)據(jù)位數(shù)。〔5〕電源控制存放器PCON其最高位為SMOD?!?〕波特率計算當定時器T1工作在定時方式的時候,定時器T1溢出率=〔T1計數(shù)率〕/〔產(chǎn)生溢出所需機器周期〕。由于是定時方式,T1計數(shù)率=fORC/12。產(chǎn)生溢出所需機器周期數(shù)=模M-計數(shù)初值X。MAX232芯片用8051串行接口通信,如果兩臺8051單片機之間的距離很近〔不超過1.5m〕,可以采用直接將兩臺8051單片機的串行接口直接相連,利用其自身的TTL電平〔0-5V〕直接傳輸數(shù)據(jù)信息。如果傳輸距離較遠〔超過1.5m〕,由于傳輸線的阻抗與分布電容,會產(chǎn)生電平損耗和波形畸變,以至于檢測不出數(shù)據(jù)或數(shù)據(jù)出錯。此時可利用RS232標準總線接口,將單片機輸出的TTL電平轉換為RS232標準電平〔邏輯1為-15—-5V;邏輯0為+5-—+15V〕。用RS232可將傳輸距離提高到15m,如果想遠距離傳輸,可以采用RS422或者RS485。電平轉換芯片MAX232是美信公司〔MAXIM〕生產(chǎn),專用于進行將TTL電平轉換為RS232電平的芯片,MAX232內(nèi)部有泵電源,能將+5V電源電壓在芯片內(nèi)提高到RS232電平所需的+10V或者-10V電平。圖2-2電平轉換芯片MAX232整體電路設計最終設計電路如下列圖3所示,發(fā)送方的數(shù)據(jù)由串行口TXD段輸出,經(jīng)過電平轉換芯片MAX232將TTL電平轉換為RS232電平輸出,經(jīng)過傳輸線將信號傳送到接收端。接收方也使用MAX232芯片進行電平轉換后,信號到達接收方串行口的接收端。每個51從設備增加了一個I2C接口的ADC0831,主機通過MODBUS協(xié)議來輪詢各個從機的采樣信號,解析后顯示在主機的LCD屏的對應位置上。主機和從機發(fā)送的數(shù)據(jù)通過VIRTUALTERMINAL顯示。圖2-3串行通信電路2.3軟件設計通過MODBUS協(xié)議進行發(fā)送接收,主機發(fā)送命令幀給從機,等待從機回應,等待超時那么重新發(fā)送。從機收到命令幀后檢查目的地址,確認后計算接收到數(shù)據(jù)的檢驗和,與主機發(fā)送來的檢驗和進行比擬,假設檢驗和相同那么發(fā)送正?;貞獛o主機;否那么發(fā)送錯誤報告幀給主機,告知主機重新發(fā)送命令幀。2.3.1主機系統(tǒng)軟件設計主機要對從機實施控制,首先要實現(xiàn)兩者之間的通訊,按照MODBUS協(xié)議的約定,在通訊中的信息數(shù)據(jù)中設置特定的代碼,在通訊成功后,對信息數(shù)據(jù)進行解析和提取,然后啟動相應的中斷程序進行處理。本設計中,主機的通信過程如下:(1)主程序:開始,翻開串口,然后準備要發(fā)送的信號數(shù)據(jù),調(diào)用CRC生成程序獲取信號數(shù)據(jù)的CRC校驗碼,組織命令報文,以MODBUS的RTU信息幀方式發(fā)送報文,發(fā)送完畢后進入偵聽階段,偵測幀頭(T1.T2.T3.T4),通過判斷,假設符合MODBUS協(xié)議規(guī)定四個字符延時等待時間,等待中斷效勞效勞,中斷處理未完畢后返回中斷等待,處理完畢,中斷返回,返回主程序的數(shù)據(jù)準備階段,繼續(xù)進行偵聽;假設超時,進行超時處理,處理完畢返回主程序,進入數(shù)據(jù)準備。(2)中斷程序:響應中斷后,進入中斷效勞程序,接收數(shù)據(jù),進行CRC校驗,假設命令數(shù)據(jù)正確,進行命令報文解析,根據(jù)協(xié)議約定功能進行數(shù)據(jù)處理,處理完畢進入主程序;否那么,重發(fā)報文,重發(fā)完畢,返回進入主程序。主機軟件設計如主機主程序流程圖2-4和主機中斷效勞子程序流程圖2-5所示。圖2-4主機主程序流程圖圖2-5主機中斷效勞子程序流程圖從機系統(tǒng)軟件設計從機的程序設計要實現(xiàn)五大功能:第一,要實現(xiàn)主機和從機之間的通訊功能(接收報文和回報文);第二,要完成命令報文的解析和信息提取(設備地址、功能碼,存放器地址和數(shù)據(jù)等);第三,實現(xiàn)MODBUS協(xié)議規(guī)定的主要的功能(采集模擬量、從存放器中取值、往存放器寫入數(shù)值以及向特定的單片機IO端口下置數(shù)字量);第四,通訊環(huán)節(jié)中的一些特定的中斷程序的執(zhí)行(接收和發(fā)生的啟動、偵測報文開始位和結束位的啟動中斷等);第五,在通訊過程中保證信息數(shù)據(jù)的準確是非常重要的,所以從機軟件的設計中要進行錯誤檢測,其方法多種多樣,在本設計中采用循環(huán)冗余檢測(CRC),其優(yōu)點是檢驗的效率比擬高、準確率也比擬高,實現(xiàn)五大功能程序設計,可以使從機完成MODBUS協(xié)議的相應功能。從機軟件設計如從機主程序流程圖2-6和從機中斷子程序流程圖2-7所示。圖2-6從機主程序流程圖圖2-7從機中斷子程序流程圖三、程序代碼/*******************************主機********************************/#include<reg52.h>#include<intrins.h>#defineUint16unsignedint#defineUint32unsignedlong#defineucharunsignedchar#defineLCD_DataP1#defineBusy0x80//用于檢測LCD狀態(tài)字中的Busy標識sbitreving=P3^5;//發(fā)送或接收指示燈,1:發(fā)送0:接收sbitLCD_RS=P3^2;//定義引腳sbitLCD_RW=P3^3;sbitLCD_E=P3^4;bitnodeok;//標志位bitcrcok;//校驗標志位,1:校驗正確0:校驗錯誤ucharasknode;//輪詢的當前節(jié)點ucharasknode_save;//保存輪詢的當前節(jié)點ucharmtx[8],mrx[10];ucharsend101[]={0x01,0x04,0x00,0x00,0x00,0x03};uchartimercnt;//定時ucharrevptr;Uint16delaycnt;voidInitUART(void);voidSendOneByte(unsigned);voidmdproc(uchar);Uint16Crc16(Uint16*puchMsg,Uint16usDataLen);voidWriteDataLCD(unsignedcharWDLCD);voidWriteCommandLCD(unsignedcharWCLCD,BuysC);unsignedcharReadDataLCD(void);unsignedcharReadStatusLCD(void);voidLCDInit(void);voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData);voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedchar*DData);voidDelay5Ms(void);voidDelay400Ms(void);/*CRC高位字節(jié)值表*/constUint16codeauchCRCHi[]={0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40};/*CRC低位字節(jié)值表*/constUint16codeauchCRCLo[]={0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,0x07,0xC7,0x05,0xC5,0xC4,0x04,0xCC,0x0C,0x0D,0xCD,0x0F,0xCF,0xCE,0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,0x08,0xC8,0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,0x1E,0xDE,0xDF,0x1F,0xDD,0x1D,0x1C,0xDC,0x14,0xD4,0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,0x11,0xD1,0xD0,0x10,0xF0,0x30,0x31,0xF1,0x33,0xF3,0xF2,0x32,0x36,0xF6,0xF7,0x37,0xF5,0x35,0x34,0xF4,0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,0x3B,0xFB,0x39,0xF9,0xF8,0x38,0x28,0xE8,0xE9,0x29,0xEB,0x2B,0x2A,0xEA,0xEE,0x2E,0x2F,0xEF,0x2D,0xED,0xEC,0x2C,0xE4,0x24,0x25,0xE5,0x27,0xE7,0xE6,0x26,0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0,0xA0,0x60,0x61,0xA1,0x63,0xA3,0xA2,0x62,0x66,0xA6,0xA7,0x67,0xA5,0x65,0x64,0xA4,0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,0x6E,0xAE,0xAA,0x6A,0x6B,0xAB,0x69,0xA9,0xA8,0x68,0x78,0xB8,0xB9,0x79,0xBB,0x7B,0x7A,0xBA,0xBE,0x7E,0x7F,0xBF,0x7D,0xBD,0xBC,0x7C,0xB4,0x74,0x75,0xB5,0x77,0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,0x70,0xB0,0x50,0x90,0x91,0x51,0x93,0x53,0x52,0x92,0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,0x9C,0x5C,0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,0x99,0x59,0x58,0x98,0x88,0x48,0x49,0x89,0x4B,0x8B,0x8A,0x4A,0x4E,0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,0x43,0x83,0x41,0x81,0x80,0x40};voidmain(void){ unsignedchartemp8; Uint16temp16,temp16_1,temp16_2; unsignedcharcoderow1[]={"MODBUSFUNC:04H"}; unsignedcharcoderow2[]={"NOWGETSTART"};ucharrow3[]={"V1V2V3"};ucharrow4[]={"..."}; inti; reving=0; nodeok=0; timercnt=0x00; asknode=0x00; temp16_2=250; for(i=0;i<10;i++){mrx[i]=0x00;} for(i=0;i<8;i++){mtx[i]=0x00;}Delay400Ms();//啟動等待,等LCD講入工作狀態(tài) LCDInit();//LCD初始化 Delay5Ms();//延時片刻(可不要) DisplayListChar(1,0,row1); DisplayListChar(2,1,row2); ReadDataLCD();//測試用句無意義 delaycnt=0xffff; while(delaycnt--){} delaycnt=0xffff; while(delaycnt--){} DisplayListChar(0,0,row3); InitUART(); crcok=1; while(1) { if(crcok==1) { temp16_1=mrx[3]; temp16_1*=temp16_2; temp16_1>>=7; switch(mrx[0]) { case0x01:{row4[1]=(temp16_1/100)+0x30;row4[3]=((temp16_1%100)/10)+0x30;row4[4]=(temp16_1%10)+0x30;break;} case0x02:{row4[6]=(temp16_1/100)+0x30;row4[8]=((temp16_1%100)/10)+0x30;row4[9]=(temp16_1%10)+0x30;break;} case0x03:{row4[11]=(temp16_1/100)+0x30;row4[13]=((temp16_1%100)/10)+0x30;row4[14]=(temp16_1%10)+0x30;break;} default:{break;} } DisplayListChar(0,1,row4);//在指定位置顯示從機發(fā)送來的數(shù)據(jù) delaycnt=0x3ff;//顯示延遲 while(delaycnt--){} reving=1; send101[0]=(asknode++)+0x01;//打包主機發(fā)送幀 asknode_save=asknode-1; asknode%=3; temp16=Crc16(send101,6);//產(chǎn)生16位CRC校驗碼 for(i=0;i<6;i++){mtx[i]=send101[i];} mtx[6]=(temp16>>8)&0x00ff; mtx[7]=temp16&0x00ff; delaycnt=0x3ff;while(delaycnt--){} for(i=0;i<8;i++) { temp8=mtx[i]; SendOneByte(temp8); } crcok=0; delaycnt=0x3ff; while(delaycnt--){} timercnt=0; reving=0;//發(fā)送完畢關閉LED,等待接收 } }}//定時100ms,重新發(fā)送數(shù)據(jù)voidTimer0Interrupt(void)interrupt1{TH0=0x3C;TL0=0x0B0; if(++timercnt==5) { crcok=1; asknode=asknode_save; timercnt=0; }}//接收從機數(shù)據(jù)voidUARTInterrupt(void)interrupt4{ ucharbyterev;if(RI){RI=0;byterev=SBUF; mdproc(byterev);}elseTI=0;}voidmdproc(ucharb){ Uint16temp16_1,temp16_2; if(nodeok==0) { if(b==send101[0])//地址是否正確 { nodeok=1; revptr=1; mrx[0]=b; } } elseif(revptr<11)//是否發(fā)送完畢 { mrx[revptr++]=b; } else { revptr=0; nodeok=0; temp16_1=Crc16(mrx,9); temp16_2=mrx[9]; temp16_2<<=8; temp16_2|=mrx[10]; if(temp16_1==temp16_2)//CRC校驗是否正確 { if(mrx[1]==0x54){asknode=asknode_save;crcok=1;} elsecrcok=1; } else { asknode=asknode_save; crcok=1; } }}voidSendOneByte(unsignedcharc){SBUF=c;while(!TI);TI=0;}//初始化串口通信〔波特率設置為9600〕voidInitUART(void){TMOD=0x20;SCON=0x50;TH1=0xFD;TL1=TH1;PCON=0x00;EA=1;ES=1;TR1=1; TMOD|=0x01;TH0=0x3C;TL0=0xB0;//timersetsat20msET0=1;TR0=1;}//產(chǎn)生16位CRC校驗碼Uint16Crc16(uchar*puchMsg,Uint16usDataLen){ Uint16uchCRCHi=0xFF;/*高CRC字節(jié)初始化*/ Uint16uchCRCLo=0xFF;/*低CRC字節(jié)初始化*/ Uint16temp16; Uint32uIndex;/*CRC循環(huán)中的索引*/ while(usDataLen--)/*傳輸消息緩沖區(qū)*/ { temp16=*puchMsg++; uIndex=uchCRCHi^temp16;/*計算CRC*/ uchCRCHi=uchCRCLo^auchCRCHi[uIndex]; uchCRCLo=auchCRCLo[uIndex]; } return(uchCRCHi<<8|uchCRCLo);}//寫數(shù)據(jù)voidWriteDataLCD(unsignedcharWDLCD){ReadStatusLCD();//檢測忙LCD_Data=WDLCD;LCD_RS=1;LCD_RW=0;LCD_E=0;//假設晶振速度太高可以在這后加小的延時LCD_E=0;//延時LCD_E=0;LCD_E=1;}//寫指令voidWriteCommandLCD(unsignedcharWCLCD,BuysC)//BuysC為0時忽略忙檢測{ if(BuysC)ReadStatusLCD();//根據(jù)需要檢測忙 LCD_Data=WCLCD; LCD_RS=0; LCD_RW=0; LCD_E=0; LCD_E=0; LCD_E=1;}//讀數(shù)據(jù)unsignedcharReadDataLCD(void){ LCD_RS=1; LCD_RW=1; LCD_E=0; LCD_E=0; LCD_E=1; return(LCD_Data);}//讀狀態(tài)unsignedcharReadStatusLCD(void){ LCD_Data=0xFF; LCD_RS=0; LCD_RW=1; LCD_E=0; LCD_E=0; LCD_E=1; while(LCD_Data&Busy);//檢測忙信號 return(LCD_Data);}//LCD初始化voidLCDInit(void){ LCD_Data=0; WriteCommandLCD(0x38,0);//三次顯示模式設置,不檢測忙信號 Delay5Ms(); WriteCommandLCD(0x38,0); Delay5Ms(); WriteCommandLCD(0x38,0); Delay5Ms(); WriteCommandLCD(0x38,1);//顯示模式設置,開始要求每次檢測忙信號 WriteCommandLCD(0x08,1);//關閉顯示 WriteCommandLCD(0x01,1);//顯示清屏 WriteCommandLCD(0x06,1);//顯示光標移動設置 WriteCommandLCD(0x0C,1);//顯示開及光標設置}//按指定位置顯示一個字符voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData){ Y&=0x1; X&=0xF;//限制X不能大于15,Y不能大于1 if(Y)X|=0x40;//當要顯示第二行時地址碼+0x40; X|=0x80;//算出指令碼 WriteCommandLCD(X,0);//這里不檢測忙信號,發(fā)送地址碼 WriteDataLCD(DData);}//按指定位置顯示一串字符voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedchar*DData){ unsignedcharListLength; ListLength=0; Y&=0x1; X&=0xF;//限制X不能大于15,Y不能大于1 while(DData[ListLength]>=0x20)//假設到達字串尾那么退出 { if(X<=0xF)//X坐標應小于0xF { DisplayOneChar(X,Y,DData[ListLength]);//顯示單個字符 ListLength++; X++; } }}//5ms延時voidDelay5Ms(void){ unsignedintTempCyc=5552; while(TempCyc--);}//400ms延時voidDelay400Ms(void){ unsignedcharTempCycA=5; unsignedintTempCycB; while(TempCycA--) { TempCycB=7269; while(TempCycB--); }}/******************************從機*********************************/#include<reg52.h>#include<intrins.h>#defineUint16unsignedint#defineUint32unsignedlong#defineucharunsignedcharsbitnodesel0=P3^2;sbitnodesel1=P3^3;sbitreving=P1^6;sbitSCL2=P1^1; //SCL2定義為P1口的第3位腳,連接ADC0831SCL腳sbitSDA2=P1^2; //SDA2定義為P1口的第4位腳,連接ADC0831SDA腳sbitCS2=P1^0; //CS2定義為P1口的第4位腳,連接ADC0831CS腳bitnodeok;bitcrcok;bitprocok;ucharnode;ucharmtx[11],mrx[10];ucharsend101[9]={0x00,0x04,0x06,0x00,0x00,0x00,0x00,0x00,0x00};uchartimercnt;ucharbyterev;//接收字符ucharrevptr;Uint16delaycnt;voidInitUART(void);voidSendOneByte(unsigned);voidmdproc(uchar);unsignedcharad0831read(void); //定義該函數(shù)為讀取ADC0831的數(shù)據(jù)Uint16Crc16(Uint16*puchMsg,Uint16usDataLen);voidsend_error_report();//CRC校驗出錯,發(fā)送錯誤報告/*CRC高位字節(jié)值表*/constUint16codeauchCRCHi[]={0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40};/*CRC低位字節(jié)值表*/constUint16codeauchCRCLo[]={0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,0x07,0xC7,0x05,0xC5,0xC4,0x04,0xCC,0x0C,0x0D,0xCD,0x0F,0xCF,0xCE,0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,0x08,0xC8,0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,0x1E,0xDE,0xDF,0x1F,0xDD,0x1D,0x1C,0xDC,0x14,0xD4,0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,0x11,0xD1,0xD0,0x10,0xF0,0x30,0x31,0xF1,0x33,0xF3,0xF2,0x32,0x36,0xF6,0xF7,0x37,0xF5,0x35,0x34,0xF4,0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,0x3B,0xFB,0x39,0xF9,0xF8,0x38,0x28,0xE8,0xE9,0x29,0xEB,0x2B,0x2A,0xEA,0xEE,0x2E,0x2F,0xEF,0x2D,0xED,0xEC,0x2C,0xE4,0x24,0x25,0xE5,0x27,0xE7,0xE6,0x26,0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0,0xA0,0x60,0x61,0xA1,0x63,0xA3,0xA2,0x62,0x66,0xA6,0xA7,0x67,0xA5,0x65,0x64,0xA4,0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,0x6E,0xAE,0xAA,0x6A,0x6B,0xAB,0x69,0xA9,0xA8,0x68,0x78,0xB8,0xB9,0x79,0xBB,0x7B,0x7A,0xBA,0xBE,0x7E,0x7F,0xBF,0x7D,0xBD,0xBC,0x7C,0xB4,0x74,0x75,0xB5,0x77,0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,0x70,0xB0,0x50,0x90,0x91,0x51,0x93,0x53,0x52,0x92,0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,0x9C,0x5C,0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,0x99,0x59,0x58,0x98,0x88,0x48,0x49,0x89,0x4B,0x8B,0x8A,0x4A,0x4E,0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,0x43,0x83,0x41,0x81,0x80,0x40};voidmain(void){ unsignedchartemp8; Uint16temp16;inti; reving=0; crcok=0; nodeok=0; timercnt=0x00; for(i=0;i<10;i++){mrx[i]=0x00;} for(i=0;i<11;i++){mtx[i]=0x00;} node=!nodesel1; node<<=1; node|=!nodesel0; send101[0]=node;//從節(jié)點地址 InitUART(); while(1) { if(crcok==1) { reving=1; send101[3]=ad0831read();//得到采樣數(shù)據(jù) for(i=0;i<9;i++) { mtx[i]=sen

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論