1. 程式人生 > >c51微控制器上的傳送中斷標誌位

c51微控制器上的傳送中斷標誌位

對於一些大多數微控制器,他有一個專門的標誌位來給串列埠的傳送或接受資料做判斷。

比如c51中,TIx和RIx。

TIx標識資料緩衝區的資料是否傳送完畢,TIx = 1,表示傳送完畢,TIx= 0,表示還沒傳送結束。

所以一個很簡單的傳送程式:

		for(i=0;i<len;i++)
		{
			while(!TI0);
			TI0=0;
			SBUF0 = s_data[i];		
		}

像上面程式這樣來發送資料。

但是,上面程式有可能出現問題,有時你會發現微控制器一直髮送不了資料,或傳送的資料有些問題。

斷點除錯下你就會發現,微控制器不傳送資料的原因就是一直停留在while(!TI0)語句中。還好只是這樣,如果是複雜的應用,導致資料錯位或其他的,要找到原因還真麻煩啊。

問題原因很簡單,就是如果程式在這之前沒通過串列埠傳送過資料呢?

比如下面的初始化:

void UART0_Init()
{
	unsigned char SFRPAGE_SAVE = SFRPAGE;

	SFRPAGE = UART0_PAGE;
   	SCON0   = 0x50;       	// SCON0: mode 1, 8-bit UART, enable RX
	SSTA0   = 0x15;
	SFRPAGE = TMR2_PAGE;
	TMR2CN  = 0x00;
	TMR2CF  = 0x08;
	RCAP2L   = (-((unsigned int)(SYSCLK / BAUDRATE) >> 4 ));
	RCAP2H    = (-((unsigned int)(SYSCLK / BAUDRATE) >> 4 )>>8);
	TMR2L    = RCAP2L;
	TMR2H    = RCAP2H;
	TR2     = 1;
	SFRPAGE = SFRPAGE_SAVE;
}
看起來都沒問題,但是,TI呢?

TI預設0,沒錯,因為壓根沒傳送資料,哪有傳送完成。可巧好我們需要的條件是傳送完成...

於是,很簡單:

		for(i=0;i<len;i++)
		{
			while(!TI0);
			TI0=0;
			SBUF0 = s_data[i];		
		}