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