起因
雙微控制器通訊,mcu資源受限,無法使用片上uart通道,只可用普通i/o
成果
使用2個普通i/o埠,通過軟體實現uart協議的資料全雙工收發,8bits資料位、1600波特率,可移植其它微控制器
資源占用
·1個定時器
·2個普通i/o埠
ide
keil v4
硬體
51最小系統板
一、uart協議
二、思路
1>資料的傳送其實就是控制傳送引腳ptxd的電平隨著固定時序變化,那麼固定的、週期性的時序需要乙個定時器來產生。為了保證定時器週期高精度穩定可控,選用自動重灌定時器模式 。為了盡可能的減少資源占用,傳送和接收共用乙個定時器資源。
2>程式的設計採用狀態機設計模式,這樣可以避免獨佔cpu,並且利於移植到各種狀態機系統。狀態遷移程式在isr中實現。
3>定時器的中斷頻率為波特率的3倍[之所以這樣做後面介紹接收時詳述]。
4>開啟傳送之後,isr中傳送相關程式得到執行,每3次中斷處理1bit.根據時序,先產生bit0[起始位],然後根據8bit型資料依次在時序線上控制ptxd的電平高低。資料位傳送完畢後,若設定了校驗位,則對8bits資料中bit1的數量進行判斷,根據奇偶校驗對bit1的數量通過控制prxd的電平進行奇偶補全[傳送資料位時對bit1進行計數]。然後根據設定傳送對應長度的bit1[停止位]。最後,判斷傳送資料是否達到傳送長度,若傳送長度到達,則結束傳送程式執行,否則繼續迴圈傳送。
5>開啟接收之後,isr中接收相關程式得到執行,並與傳送程式互不干涉。首先每次中斷都判斷prxd的電平是否置低[檢測起始位],當檢測到bit0之後,四個中斷後進行資料位最低位的接收。這裡之所以選擇四個中斷的延時,是因為當檢測到bit0[起始位]的時刻,不管此時處於實際起始位的哪個時間點位置,四個中斷後即下一次判斷的位置總會是最接近一位資料中心那個點[乙個bit中有三次中斷點,有乙個最接近中心,越接近中心越能免受傳送與接收波特率不同步的影響,具體細節畫圖可知]。之後的每一位改為每三個中斷進行一次判斷處理[與波特率同步]。處理到校驗位時,如果設定了奇偶校驗,則對校驗結果輸出至設定好的校驗標誌位中,外圍程式可根據此標準位判斷是否校驗出錯。然後判斷接收資料的長度是否達到設定長度,若沒有,則等待至prxd變為高電平後繼續迴圈接收。
三、**[關鍵部分]
static void xuart_isr(void) interrupt 3
else
if(cntsend_i >= 7)
}else
break;
// 奇校驗
case 2:
if((cntbit1 % 2) == 0) // 偶數個1
else
cntbit1 = 0;
seqsend = 4;
break;
// 偶校驗
case 3:
if((cntbit1 % 2) == 0) // 偶數個1
else
seqsend = 4;
break;
// 停止位
case 4:
cntbit1 = 0;
switch(xuart_config.bit_stop)
break;
default:
//seqsend = 5;
break;
}ptxd = high;
break;
// 下一幀or結束
case 5:
if(cntsend_j >= len_send - 1) // 傳送完畢處理
else
seqsend = 0;
break;
default:
seqsend = 0;
cntsend_i = 0;
cntsend_j = 0;
cntbit1 = 0;
fsend_end = set;
fsend = clr;
tr1 = 0;
} } }
/**************************receive*************************/
if(freceive == set)
break;
// 8bits_bit1資料
case 1:
if(++cntrec == 4) // 第一次進來時為4個週期,提公升容錯率
else
if(cntreceive_i >= 7) // 1幀接收完畢
}else
}break;
// 奇校驗
case 2:
if(++cntrec == 3) // 3個週期進入
else // 校驗錯誤
cntbit1_ = 0;
seqreceive = 4;
break;
}break;
// 偶校驗
case 3:
if(++cntrec == 3) // 3個週期進入
else // 校驗錯誤
seqreceive = 4;
break;
}break;
// 幀結束
case 4:
if(prxd == high)
else
seqreceive = 0;
break;
} break;
default:
break;
} }}
四、回環測試1.示波器
2.串列埠助手回環測試
UART通訊協議
第一部分 uart使用的是 非同步,序列通訊。序列通訊是指利用一條傳輸線將資料一位位地順序傳送。特點是通訊線路簡單,利用簡單的線纜就可實現通訊,降低成本,適用於遠距離通訊,但傳輸速度慢的應用場合。非同步通訊以乙個字元為傳輸單位,通訊中兩個字元間的時間間隔多少是不固定的,然而在同乙個字元中的兩個相鄰位...
Uart通訊協議
第一部分 uart使用的是 非同步,序列通訊。序列通訊是指利用一條傳輸線將資料一位位地順序傳送。特點是通訊線路簡單,利用簡單的線纜就可實現通訊,降低成本,適用於遠距離通訊,但傳輸速度慢的應用場合。非同步通訊以乙個字元為傳輸單位,通訊中兩個字元間的時間間隔多少是不固定的,然而在同乙個字元中的兩個相鄰位...
UART通訊協議
第一部分 uart使用的是 非同步,序列通訊。序列通訊是指利用一條傳輸線將資料一位位地順序傳送。特點是通訊線路簡單,利用簡單的線纜就可實現通訊,降低成本,適用於遠距離通訊,但傳輸速度慢的應用場合。非同步通訊以乙個字元為傳輸單位,通訊中兩個字元間的時間間隔多少是不固定的,然而在同乙個字元中的兩個相鄰位...