52微控制器使用T2串列埠通訊

qq_32464461發表於2020-12-22

引言

由於某些要求需要在定時器0和定時器1被佔用的條件下進行串列埠通訊。其實也可以將定時器1分時進行,但是本著探索精神,記錄一下定時器2的配置使用。

資料

首先在stc的官方資料手冊找到定時器2的介紹(p205)

可以看到它有6個暫存器,其中主要是T2CON的配置

使用

T2CON

官方說明的很清楚。其中要將其作為串列埠通訊時鐘,需要將RCLK和TCLK兩個位置1

其次要計算定時器初值,其中TH2和TL2合併為16位,溢位後將自動重灌RCAP2L和RCAP2H的值,這一點和定時器1的八位自動重灌模式不同

初值計算方式

之後要配置SCON串列埠模式,開啟定時器TR2,開啟中斷ES,EA就可以啦

例子

晶振11.0592,波特率115200,每隔1ms向電腦傳送一個訊息

#include <reg52.h>
#include <intrins.h>
void ConfigUART();
void delay(unsigned int t)		//@11.0592MHz
{
	while(t--){
	unsigned char i, j;

	_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
}
}
void main()
{
	EA = 1; //使能總中斷
	ConfigUART(); //配置波特率為115200
	while (1){
		SBUF = 'S';
		delay(1);
	}
}


/* 串列埠配置函式, baud-通訊波特率 */
void ConfigUART()
{
	T2MOD = 0x01;
	T2CON = 0x30;
	TH2 = 0xFF;
	TL2 = 0xFD;
	RCAP2H = 0xFF;
	RCAP2L = 0xFD;
	SCON = 0x50;
	PCON = 0x00;
	TR2 = 1;
	ES = 1;
	EA = 1;
}
/* UART 中斷服務函式 */
void InterruptUART() interrupt 4
{
	if (RI) //接收到位元組
	{
		RI = 0; //手動清零接收中斷標誌位
		//SBUF = SBUF + 1; //接收的資料+1 後發回,左邊是傳送 SBUF,右邊是接收 SBUF
	}
	if (TI) //位元組傳送完畢
	{
		TI = 0; //手動清零傳送中斷標誌位
	}
}

效果

注意

T2MOD要自己在標頭檔案中定義

只有加強版51微控制器才有計時器2

 

相關文章