基于51单片机的Uart串口通信协议
1.串口通信協議
嵌入式開發中,UART串口通信協議是我們常用的通信協議(UART、I2C、SPI等)之一,全稱叫做通用異步收發傳輸器(Universal Asynchronous Receiver/Transmitter),是異步串口通信協議的一種,工作原理是將傳輸數據的每個字符一位接一位地傳輸,它能將要傳輸的資料在串行通信與并行通信之間加以轉換,能夠靈活地與外部設備進行全雙工數據交換。
1)起始位
當未有數據發送時,數據線處于邏輯“1”狀態;先發出一個邏輯“0”信號,表示開始傳輸字符。
2)數據位
緊接著起始位之后。資料位的個數可以是4、5、6、7、8等,構成一個字符。通常采用ASCII碼。從最低位開始傳送,靠時鐘定位。
3)奇偶校驗位
資料為加上這一位后,使得“1”的位數應為偶數(偶校驗)或奇數(奇校驗),以此來校驗資料傳送的正確性。
4)停止位
它是一個字符數據的結束標志。可以是1位、1.5位、2位的高電平。 由于數據是在傳輸線上定時的,并且每一個設備有其自己的時鐘,很可能在通信中兩臺設備間出現了小小的不同步。因此停止位不僅僅是表示傳輸的結束,并且提供計算機校正時鐘同步的機會。適用于停止位的位數越多,不同時鐘同步的容忍程度越大,但是數據傳輸率同時也越慢。
5)空閑位或起始位
處于邏輯“1”狀態,表示當前線路上沒有資料傳送,進入空閑狀態。
處于邏輯“0”狀態,表示開始傳送下一數據段。
6)波特率
表示每秒鐘傳送的碼元符號的個數,是衡量數據傳送速率的指標,它用單位時間內載波調制狀態改變的次數來表示。
常用的波特率有:9600、115200……
時間間隔計算:1秒除以波特率得出的時間,例如,波特率為9600的時間間隔為1s / 9600(波特率) = 104us。
7)接口
接口通過兩個引腳從外部連接到其它設備。任何 USART 雙向通信均需要 至少兩個引腳:接收數據輸入引腳 (RX) 和發送數據引腳輸出 (TX):
RX:接收數據輸入引腳就是串行數據輸入引腳。過采樣技術可區分有效輸入數據和噪聲,從而用于恢復數據。
TX:發送數據輸出引腳。如果關閉發送器,該輸出引腳模式由其 I/O 端口配置決定。如果使 能了發送器但沒有待發送的數據,則 TX 引腳處于高電平。在單線和智能卡模式下,該 I/O 用于發送和接收數據。
2.發送函數
這里的發送指的是51單片機發送數據到串口,單片機的TX接串口的RX。
首先要根據你單片機的晶振頻率,調試出一個104us的延時函數,用于時序控制。
void Delay_104us(void)
{
uint x=58;
while(x-- !=0)
{
_nop_();
}
}
這個延時是基于下圖所示的頻率
然后是發送函數
/************串口發送函數,Tx_Data為要發送的數據***********/
void Uart_Tx(uchar Tx_Data)
{
uchar uData=Tx_Data;
uint i=0;
/************拉低單片機的TX引腳104us,作為開始信號***********/
UART_TX=0;
Delay_104us();
/************根據一字節數據每一個比特位的不同,TX拉高或拉低,保持104us,作為數據信號***********/
for(i=0;i<8;i++)
{
UART_TX= uData & 0x01;
Delay_104us();
uData=uData>>1;
}
/************拉高單片機的TX引腳104us,作為結束信號***********/
UART_TX=1;
Delay_104us();
}
3.接收函數
這里的接收指的是51單片機接收串口所發的數據,單片機的RX接串口的TX。
這里還要調試出一個52us的延時。
void Delay_52us(void)
{
uint x=28;
while(x-- !=0)
{
_nop_();
}
}
接收函數
/************串口接收函數,返回值為接收到的數據***********/
uchar Uart_Rx(void)
{
uchar R_Data = 0x00,i;
/************判斷單片機的RX引腳是否拉低,有沒有開始信號***********/
if( UART_RX== 0)
{
/************如果有,再過52us判斷一次,這是防抖操作***********/
Delay_52us();
if(UART_RX == 0)
{
/************如果是真的,就沒過104us判斷一次RX的電平變化,記錄每一位數據***********/
Delay_104us();
for(i=0;i<8;i++)
{
R_Data=R_Data>>1;
if(UART_RX == 1)
{
R_Data=R_Data|0x80;
}
Delay_104us();
}
}
/************判斷單片機的RX引腳是否拉高,有沒有結束信號,如果有就返回和重新用串口發送接收到的數據***********/
Delay_104us();
if(UART_RX == 1)
{
Uart_Tx(R_Data);
return R_Data;
}
}
return 0;
}
4.其他
(1)引腳定義
這里面的TX和RX引腳是自定義的,只要能夠拉高,拉低,延時就行,下面是我定義的,
#define UART_TX P17 #define UART_RX P15
(2)發送漢字
每一個漢字都是由兩個字節作為地址,在字庫里索引出來的,發送就是發送漢字的地址,方法如下。
void Uart_String(uchar *Tx_String)
{
while(*Tx_String)
{
Uart_Tx(*Tx_String++);
}
}
5.檢驗
首先接好杜邦線,單片機的TX,RX接串口的RX,TX,還有GND線要接,VCC線可以不接。
在主函數的while(1)循環里調用Uart_Tx(0x34),發送0x34,注意把串口助手的波特率調為9600。
在主函數的while(1)循環里調用Uart_Rx(),單片機接收串口發送的數據
在主函數的while(1)循環里調用Uart_String(),發送漢字,注意要把HEX顯示去掉,不然就是16進制數了
總結
以上是生活随笔為你收集整理的基于51单片机的Uart串口通信协议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 帅康油烟机价目表帅康油烟机报价
- 下一篇: k-modes算法mysql_第十一章