STC12c-UART1 串口 通信设置
一般情況下,編寫串口通信程序的基本步驟如下:
配置串口為模式 1 ( SCON = 0x50)// 0101 0000
配置定時器 T1 為模式 2,即自動重裝模式 (配置T1為 8位重裝載 模式 -> 產生波特率用 )(TMOD = 0x20) //0010 0000
根據波特率計算 TH1 和 TL1 的初值,如果有需要可以使用 PCON 進行波特率加倍(因為有些晶振選用的波特率偏差太大,得加倍Baud才能縮小偏差)
打開定時器控制寄存器 TR1,讓定時器跑起來產生Baud 。 // TR = 1;
Step 1.
Step 2.
Step 3.
定時器的重載值計算公式為:
一 12T模式時
TH1 = TL1 = 256 - 晶振值/12 /2/16 /波特率
比如
TMOD &= 0x0F; //復位定時器1控制信息0f=0000 1111
TMOD |= 0x20; //設定定時器1為模式2,8位自動重裝方模式20=0010 0000
TL1 = 0xFD; //設定定時器1初值
TH1 = 0xFD; //設定定時器1重裝值
TL1,TH1值0xFD的計算如下:
TH1 = TL1 = 256 - 晶振值/12 /2/16 /波特率
=256-11059200/12/2/16/9600=253=0xFD
二 1T模式時
和波特率有關的還有一個寄存器,是一個電源管理寄存器 PCON,他的最高位可以把波
特率提高一倍,也就是如果寫 PCON |= 0x80 以后,計算公式就成了:
TH1 = TL1 = 256 - 晶振值/12 /16 /波特率
公式中數字的含義這里解釋一下,
256 是 8 位定時器的溢出值,也就是 TL1 的溢出值,
晶振值就是 11059200,
12 是說 1 個機器周期等于 12 個時鐘周期,
值得關注的是這個 16,我們來重點說明。在 IO 口模擬串口通信接收數據的時候,采集的是這一位數據的中間位置,而實際上串口模塊比我們模擬的要復雜和精確一些。他采取的方式是把一位信號采集 16 次,其中第 7、8、9 次取出來,這三次中其中兩次如果是高電平,那么就認定這一位數據是 1,如果兩次是低電平,那么就認定這一位是 0,這樣一旦受到意外干擾讀錯一次數據,也依然可以保證最終數據的正確性。
“晶振值/12/2/16/波特率”這個地方計算的時候,出現不能除盡,或者出現小數怎么辦,出現偏差,理解我們的晶振為何使用 11.0592M 了
11.0592M晶振 可以整除大部分,所以盡量用這個,本次實驗用的是12M的
Step 4.
TR = 1 / TCON = 0x40
程序:
(一)UART_Init.c
#include<UART_Init.h>
#include<reg52.h>
void UART_Init()
{
SCON = 0x50; //0101 0000
TMOD = 0X20; //0010 0000 配置T1為 8位重裝載 模式(產生波特率用)
PCON = 0x80; //8位為SMOD ,=1為 開啟倍頻,=0關閉倍頻
}
(二)main.c (在串口中斷中 寫你想做的事,或用標志flag 在main中寫)
#include<reg52.h>
#include<UART_Init.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED0 = P2^0;
//uchar UartRxBuffer[64] = {0}; //串口接收數據
uchar ReceiveData;
void Uart_server() interrupt 4 //串口中斷 號 是 4
{
ES = 0;
RI = 0;//清除接收中斷標志位
}
//void main()
{
UART_Init();
while(1)
{
;
}
}
總結
以上是生活随笔為你收集整理的STC12c-UART1 串口 通信设置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 安装Harbor镜像仓库,最
- 下一篇: PCB设计中频率与波长的对应值