C51 單片機開發(fā)串口初始化實現(xiàn)
共 3126字,需瀏覽 7分鐘
·
2024-07-05 07:30
公眾號文章同步閱讀網(wǎng)址:www.netor0x86.com
閑話:多快好省如果存在的話,就沒有時間換空間,空間換時間一說了吧?魚和熊掌就兼得了。
本篇文章回顧一下串口初始化的文檔,然后再用代碼實現(xiàn)一下。實現(xiàn)代碼后會驚奇的發(fā)現(xiàn),這么多文檔性的東西,然后對應這么少的代碼。
上篇文章整理了關于串口配置的寄存器,都是手冊上比較概念的內(nèi)容,本篇通過手冊自己來寫一下串口寄存器的配置。
0x01:回顧串口配置所需寄存器
通過上篇文章了解到,串口寄存器的使用包含 PCON、SCON 和 定時器相關的寄存器,一共三個部分。
簡單的再次回顧一下,PCON 是電源控制寄存器,SCON 是串行控制寄存器。
PCON 的第七位控制串口的波特率是否加倍。PCON 的第六位決定了 SCON 的第七位和第六位的作用。
SCON 用來設定串口的工作方式。
0x02:PCON 寄存器配置
PCON 寄存器實際上可以不用進行配置。在文檔 P232 中可以看到 PCON 寄存器的復位值,如下圖:
從圖中可以看出,它的復位值 00x1 0000。
最高位是 0,表示波特率不加倍;第六位也是 0,表示 SCON 的最高兩位用來配置工作方式。因此,我們?yōu)榱耸∈驴梢圆粚?PCON 進行配置。
0x03:SCON 寄存器配置
SCON 寄存器用來配置工作方式。
在上篇文章中已經(jīng)知道 SCON 有四種工作方式,這里選擇工作方式1。四種工作方式的區(qū)別,我認為首先它們的長度不一樣,其次是幀格式不同。具體可以找相關的設計原理來看。
這里我們選擇工作方式1,如下圖,文檔 P233。
工作方式1給出了 SM0 和 SM1 的值,并給出了波特率。
其中工作方式0和工作方式2和晶振不掛鉤,方式1和方式3波特率可變。所以我們選擇工作方式1,需要配置定時器。在上圖中有一個溢出率,它和晶振有關,和定時器 TH1 的初值有關系。如下圖,文檔 P244
在 SCON 中有一個 TI 位,它是中斷相關的,TI 是發(fā)送中斷,配置為 0 即可。
根據(jù)上面的描述,SCON 每位的配置為 0100 0000 = 40H 即可。
0x04:定時器的配置
波特率由內(nèi)部定時器/計數(shù)器產(chǎn)生,運行的速度靠晶振,晶振跟時鐘周期和機器周期相關。如下圖,文檔 P232。
在 C51 單片機中由定時器0和定時器1,在前面也提到了,具體和定時器1相關。那么我們需要回顧一下定時器1的相關寄存器。如下圖,文檔 P187。
上圖是 TMOD 寄存器,我們使用定時器1,那么就是使用 TMOD 的高4位。我們需要設置 M1 和 M0,這兩位表示定時器1的模式。這里,我們選擇8位自動重裝載定時器,即 M1 為 1,M0 為 0。
那么它們的配置方式如下:
TMOD &= 0x0F;
TMOD |= 0x20;
上面的方式是在不影響定時器0的情況下去設置定時器1。
0x05:配置波特率
在 SCON 中選擇了工作方式1,而工作方式1中給出了波特率的計算的公式。公式如下圖,文檔 P233。
通過這個公式,我們需要計算 TL1 和 TH1 的初值(是否還記得定時器就是數(shù)數(shù),數(shù)的過程讓它溢出,通過溢出次數(shù)來計算時間的流逝,從而完成過定時)。
把上面的公式展開來計算一下,計算的過程如下:
2 ^ 0 / 32 * 定時器1的溢出率
定時器1的溢出率 = SYSclk/12/(256-TH1) = 11059200 / 12 / (256 - t)
(2 ^ 0 / 32) * (11059200 / 12 / (256 -t) ) = 9600
(1 / 32) * (1105900 / 12 / (256 -t) ) = 9600
11059200 / 32 / 12 = 28800
28800 / (256 -t) = 9600
28800 / 9600 = 3
256 -3 = 253 = 0xFD
最后得出,TH1 和 TL1 的初值為 0xFD。
0x06:初始化串口代碼
根據(jù)上面的詳細整理,最后得出如下代碼:
sfr AUXR = 0x8e; /* 聲明AUXR寄存器的地址 */
void UartInit(void)
{
AUXR = 0x01;
// 配置串口工作方式1,REN不使能接收
SCON = 0x40;
TMOD &= 0x0F;
TMOD |= 0x20; // 定時器1工作方式為8位自動重載
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1; // 啟動定時器
}
我們可以用這段代碼替換前面文章中的初始化串口的代碼來進行測試。
我是一個程序員,了解 C、PHP、Java、ASM、Python,有 信安、CISP 證書,寫小白也能看得懂的文章,感謝關注!!!
我的網(wǎng)站:https://www.netor0x86.com
我錄制的視頻課程:
1. 入門級棧溢出分析
2. WEB端獲取MAC地址真實項目案例
3. PHP擴展模塊開發(fā)之DLL編寫與調(diào)用
4. C語言零基礎入門教程
5. PE 文件結(jié)構(gòu)初識與二進制手寫可執(zhí)行程序
