因為想使兩個51單片機通訊,又不能使用串口,因為STC89C52單片機只有一個串口,己被占用了,沒有串口可以用。所以編寫了這個程序。
使用仿真軟件進行測試,工作正常。
在電路上實際測試,運行正常。
對控制線,進行短接干擾,測試,都按照預想的結果運行。
測試代碼:
發送端不停的發送自定義數據幀,每發送一次,將第數據幀中的2個字節數加 1,再發送。
接收端使用LCD1602 將接收的據據幀中的第2個字節,顯示出來。
對兩根控制線進行斷線,和對地短路干擾測試,也按照預想,干擾消除后,恢復正常工作。
下面是說明文檔,附件源代碼,和仿真電路圖下載。
雙單片機通信協議說明文檔 一、通信協議的作用 功能:實現兩片51單片機互相通信,4根線單向通信,8根線雙向通信。 工作方式:使用普通IO口,不斷輪詢方式通訊。 (不使用單片機的中斷,不使用串口) 適用場景:電路上兩片51單片機,需要互相通訊。 傳輸速度:使用Porfessional和keil聯調,在單片機的晶振頻率為11.0592MHZ,單片機型號AT89C 51。兩片單片機的時間全部用在輪詢,測試約27MS接受完成16個字節數據。 (注:測試時發現的問題,Porfessional和keil聯調,調試那個CPU就需要把正在調試的CPU改為U1,不然另一個CPU里面的代碼沒有運行,沒有反應不能調試)。
定義數據幀的格式
傳輸1個字節的流程
分析運行時的步驟 協議在運行時,發送端控制C1,D1,D2三根線的電平狀態,接收端控制C2一根線的電平狀態。發送端不斷在輪詢C2的狀態,接收端也同時在不斷輪詢C1的狀態。這兩根線我們把他稱為控制線,也稱為握手線。D1和D2我們把他稱為數據線,兩根線的電平可以表示4種狀態,狀態的表示如下:
為什么需要有(一個字節傳輸開始和一個字節傳輸結束)這兩種狀態,直接傳送0和1不就可以了嗎?我舉一個例子:現在我們要把4個字節的數據發送給對方。如:01100110 01100110 01100110 01100110,按照正常的接收,接收端依次讀取8個比特然后存入1字節,依次讀完36比特存入4字節。但是通訊協議的設計應該要考慮到異常情況,如果由于某種原因受到干擾,這36比特中間少傳或者多傳了1比特。接收端接下來再以每8比特為1字節的取,接下來的數據就會全部錯位。使用開始位和結束位來標識,就解決了這個問題。 發送和接收1比特數據的步驟如下: 初始狀態:四根線的電平都為高電平1, 51單片機的IO口默認也是高電平。接收端在不斷輪詢C1的狀態。 步驟一:發送端,發送1比特數據,在代碼里,首先將D1和D2置為需要表達的電平,然后將C1置為底電平,等待接收端C2的底電平響應。(因為CPU執行指令是需要時間的,如果發送端先將C1置為底電平,然后再置D1和D2的電平,接收端恰好在C1剛為底電平時,檢測到并且讀取了D1和D2的狀態。發送端還沒來的及對D1和D2置需要的電平,這時就讀到了錯誤的數據。雖然概率很小,但是這樣可以避免。) 步驟二:接收端,檢測到C1的狀態是0時,表示發送端在發送1比特數據,接收端讀取D1,D2的電平狀態接收后,將C2置為底電平,表示己接收。然后等待接收端將C1恢復為高電平。 步驟三:發送端,檢測到C2被置為底電平,表示接收端收到了數據,于是將C1恢復為高電平。等待C2恢復為高電平。 步驟四:接收端,檢測到C1恢復為高電平,將C2恢復為高電平。 步驟五:發送端,檢測到C2恢復為高電平,繼續發送下一個比特。跳到步驟一(循環)。
分析協議在傳輸數據過程中受到干擾會發生的狀態 在正常工作的情況下,數據會由發送端發送,接收端完成接收,一直運行。但是設計協議需要考慮到抗干擾性,受到干擾之后,協議能夠恢復正常工作,繼續傳輸數據,而不是停在某個狀態。(例如:發送端在等待接收端響應,接收端同時也在等在發送端響應,一直停在這樣的狀態)。 現在我們來分類別分析發送端和接收端的等待情況,檢查看能否發生同時等待的現象,造成死鎖,數據傳輸停在這個狀態。 發送端發生等待的2種情況: (1) 發送端C1置底電平,等待接收端C2底電平響應 (在第一步) (2) 發送端C1置高電平,等待接收端C2高電平響應 (在第五步) 接收端發生等待的2種情況: (1) 接收端C2是高電平,等待發送端C1的底電平 (在第一步) (2) 接收端C2置底電平,等待發送端C1高電平響應 (在第二步) 分析控制線的狀態:如果有一個條件符合,其中的一端控制線的電平就會發生改變,不會發生死鎖。如果沒有條件符合,就會發生死鎖。 分析1:發送端(1)和接收端(1)相結合,總有一個條件符合,不會發生死鎖。 分析2:發送端(1)和接收端(2)相結合,總有一個條件符合,不會發生死鎖。 分析3:發送端(2)和接收端(1)相結合,總有一個條件符合,不會發生死鎖。 分析4:發送端(2)和接收端(2)相結合,總有一個條件符合,不會發生死鎖。 結論:不會發生死鎖 現在我們再來分類別分析發送端和接收端的異常情況,數據在傳輸時,會發生的情況。 1、接收端和發送端兩片單片機不是同時啟動分兩種情況 (1)發送端先啟動,接收端后啟動,結果:接收端啟動后開始檢測C1的電平,接收比特數據,不影響。 (2)接收端先啟動,發送端后啟動,結果:發送端啟動后,如果有數據,置C1為底電平,開始發送比特數據,不影響。 2、接收端在接收比特數據的時候死機重啟分2種情況 (1)在步驟一,接收端死機重啟后,接收端檢測到C1為0,開始接收數據。如果不是開始位,丟棄接收到的比特,直到收到開始位。結果:會丟棄不完整數據,繼續接收,恢復通訊。 (2)在步驟三,接收端死機重啟后,接收端默認置C2為高電平,發送端檢測到C2為高電平,認為接收端響應,繼續發送下1比特數據。接收端開始接收比特數據。結果:會丟棄不完整數據,繼續接收,恢復通訊。 (3)在步驟五,接收端死機重啟后,結果和(步驟三)一樣。 3、發送端在發送比特數據的時候死機重啟分 3種情況 (1)在步驟二,發送端死機重啟后,發送端恢復到初始狀態,開始發送1比特,置C1為0。接收端在等待C1為1,等不到。但是接收端檢測到C2被接收端己置為0,發送端認為接收端己收到數據,發送端響應,置C1 為1,接著正常執行后面的步驟。結果:發送端發送的這1比特丟失,會丟棄不完整的數據,繼續接收,恢復通訊。 (2)在步驟二,發送端死機重啟后,發送端恢復到初始狀態,開始發送1比特,置C1為0的過程中。在發送端重啟過程中,C1有一段時間為高電平,接收端正好收到,并響應。接收端進入步驟四。 (3)在步驟四,發送端死機重啟后,發送端恢復到初始狀態,開始發送1比特,置C1為0。接收端己完成1比特接收,沒有等待,繼續接收數據。結果:會丟棄不完整的數據,繼續接收,恢復通訊。 4、在發送數據的1個初始狀態和5個步驟過程中,控制線電平受到干擾分類別分析 (1)在初始狀態,發送端沒有數據需要發送:C1,C2全部為高電平,這時,接收端在等待C1的底電平到來然后接收比特數據。C1,C2受到干擾,由高電平變為底電平。 接收端的代碼如果正好執行到檢測C1位置,接收端響應,進入步驟二,等待C1恢得為高電平。干擾消除后,C1恢復為高電平,接收端進入步驟四完成1比特數據接收,繼續接收下1比特數據。結果:接收1比特錯誤數據,續續接收,恢復通訊。 接收端的代碼如果沒有執行到檢測C1位置,干擾消除。結果:無影響。 初始狀態,發送端沒有檢測C2狀態,受到干擾,無影響。 (2)在步驟1,發送端發送1比特數據,置C1為底電平,發送端等待C2的底電平來到來。C2受到干擾,由高電平變為底電平。 發送端的代碼如果正好執行到檢測C2位置,發送端認為接收端己接收到1比特數據并響應,發送端進入步驟三,置C1為高電平,等待C2恢復為高電平。干擾消除后,C2恢復為高電平。發送端進入到步驟五。結果:接收端少收到1比特數據,恢復通訊。 發送端的代碼如果正好執行到檢測C2位置,同時,接收端檢測到C1為底電平,接收1比特數據并響應C2為底電平。結果:接收端正確收到1比特數據,無影響。 發送端的代碼如果沒有執行到檢測到C2的位置,干擾消除。結果:無影響。 (3)在步驟2,接收端收到1比特數據,置C2為底電平,接收端等待C1的高電平到來。C1受到干擾,由底電平變為高電平。 接收端代碼正好執行到檢測C1位置,接收端認為發送端響應,接收端完成1比特數據接收,進入步驟四,恢復C2為高電平。干擾消除后,繼續接收發送端的數據。結果:收到錯誤的1 比特數據,恢復通訊。 接收端代碼沒有執行到檢測C1的位置,干擾消除。結果:無影響。 (4)在步驟3,發送端等待C2為高電平。受到干擾,C2變為高電平。 發送代碼正好執行到檢測C2位置,發送端認為接收端響應,跳到步驟五。如果此時接收端正好響應,則完成1比特數據發送。結果:無影響。 發送端等待C2為高電平。受到干擾,C2變為高電平。發送代碼正好執行到檢測C2位置,發送端認為接收端響應,跳到步驟五,然后又跳到步驟一,發送到下1比特數據。此時接收端在等待C1的高電平,然而C1是底電平,接收端繼續等待。但是C2被接收端置為底電平,發送端認為接收端己接收1比特數據響應。進入步驟三,置C1為1,接收端響應,完成1比特數據接收。結果:接收端少收到1比特數據。 (5)在步驟4,接收端己完成接收,接收端在檢測C1的底電平到來,接收數據。 C1受到干擾,由高電平變為底電平,然后干擾消除恢復為高電平。接收端會多收到1比特數據。當然這比特數據是錯誤的數據。結果:收到錯誤的1比特數據,恢復通訊。 C2受到干擾,由高電平變為底電平,干擾消除后恢復為高電平。因為發送端在這一步驟在等待接收端C2的高電平,然后發送數據,結果:干擾消除后發送端開始發送數據,無影響。 (6)在步驟5,實際就是初始狀態。受到干擾發生的情況,也一樣,就不再重復。
結論:受到干擾有三種結果:1,多收到1比特數據(數據是錯誤的)。2,少收到1比特數據。3,收到1比特錯誤數據。所以通信協議在受到干擾的情況下,不能保證數據的完整性,但是干擾消除,能夠恢復通訊。這個通信方式,設計的時候,是盡可能的讓數據傳輸,需要上層的通信協議來識別數據是否正確。
全部資料51hei下載地址(源碼+資料):
四根線進行通訊協議設計.rar
(2.21 MB, 下載次數: 159)
2018-4-15 16:14 上傳
點擊文件名下載附件
源械碼
|