用普通 I O 口模擬標準 UART 序列口

2021-07-09 15:01:56 字數 1913 閱讀 9607

用普通 i/o 口也可以模擬標準 uart 序列口,進行序列通訊。

uart 通訊規範是以 8 位二進位制數為一幀,低位在前,逐位的傳輸。

為了區分各個幀,在每一幀之前,要有乙個 0 作為起始標記,之後,有乙個 1,作為結束符。

在結束符之前,還可選髮乙個「校驗位」,但是,目前多數的應用都不選擇這個位。

那麼,每次的序列通訊,就是傳送乙個位元組,加上前後的標記,共 10 位二進位制數。

空閒時,傳送的都是 1;一旦出現了 0,就說明開始傳輸資料了。

波特率

序列通訊的乙個重要指標就是傳輸速度,就是每秒傳送了多少位二進位制數。

這個速度稱為波特率,單位是 bps,中文就是「位/秒」。

時間設定

當以 9600bps 來傳送資料時,每一位數的持續時間是 (1/9600)s,這也就是間隔時間。

如果選用晶振頻率是 11059200hz,乙個機器週期t的時間就是 (12/11059200)s

那麼,一位數的持續時間 (1/9600)s,是多少個機器週期t呢 ?

這是很容易算的,就是下面的這個算式:

x = (1/9600) / (12/11059200) = 11059200 / 12 / 9600 = 96t

為了精確定時,可以利用定時器來定時,每當 96t 時間到了,就傳送出去一位二進位制數,這就行了。

實驗程式

用 io 口模擬串列埠輸出的程式如下:

#include

sbit txd1 = p2^0;     //用io口模擬串列埠傳送端

sbit rxd1 = p2^1;     //用io口模擬串列埠接收端

bit t96;              //位變數

//----------------------------------------

void wait96(void)     //延時,控制波特率

//----------------------------------------

void wbyte(char x)    //傳送一幀資料

txd1 = 1;         //傳送結束位1

wait96();         //等待96t

tr0 = 0;          //關閉定時器

} //----------------------------------------

void main()

}//----------------------------------------

void inttime0() interrupt 1 //t0中斷

//----------------------------------------

**截圖

見下圖:

由圖可見,並沒有使用微控制器本身的序列口,而是把虛擬終端接到了 p2 口。

此時,虛擬終端也收到了字元 a~z,以及回車換行。

後記

用 io 口模擬串列埠輸入也是可行的。

但是,這種模擬方法,程式設計的工作量,可以說相當的大;cpu 的工作時間,也被大量占用;

而且,還占用了定時器,那麼在硬體資源方面,也浪費很多。

如果討論模擬串列埠的接收問題,那還得搭上乙個外部中斷。

這種笨方法,當初,不知道是被誰想出來的 !真的遠遠比不上做而論道在前一篇博文中所介紹的用三態門擴充串列埠的方法。

費了這麼大的勁,僅僅換來乙個串列埠,可謂得不償失。

做而論道是不會使用這樣的方法的,寫這篇博文,只不過是回答網上提出的問題而已。

IO口模擬UART串列埠

由於博主近期參與了合泰晶元的專案開發,所以此次就用合泰微控制器來測試 具體型號為ht66f70a ide為ht ide3000 合泰官方 首先需要了解兩個概念 1.幀 是序列通訊的資料單元,其中各位的意義如下 起始位 先發出乙個邏輯 0 的訊號,表示傳輸資料的開始。資料位 緊接著起始位之後,資料位的...

關於JTAG引腳設定為普通IO口

stm32微控制器中的jtdo與jntrst是jtag引腳復用,一般最好不用jtag dp除錯埠,而是用sw dp,只需要jtms swdio與jtck swclk。這樣可以省下有限的io資源。但是stm32復位後,jtag與sw預設同時開啟的,即所有的jtag埠均被系統保留,軟體設定gpio是不起...

普通IO模擬串列埠輸入輸出。

目標 普通io埠中輸入輸出模擬串列埠通訊。串列埠空閒狀態時為高電平,在空閒時當接收到高電平轉低電平時,那麼下一位時間電平開發送8個資料據,資料位從第一位開始到第8位從高到低傳送。傳送完8個資料位後會傳送乙個停止位,就10位資料。下面以9600的波特率為例說明。第一步,選擇好波特率,這裡用9600。第...