51單片機 串口中斷

1.什麼是中斷

廣義上的中斷是指一個過程,舉個簡單的例子,打開了電腦,你正在放音樂,點擊了暫停按鈕,於是歌停了。這就是一個很明顯的中斷的例子。CPU正在做自己的事情(放音樂),鼠標點擊了暫停,就等於給了CPU一箇中斷信號,CPU收到中斷信號之後,進入中斷服務函數(裏面寫着停止播放音樂具體實現)。中斷過程可以概述爲:CPU正在做的事-->中斷源觸發中斷-->CPU收到中斷信號-->CPU處理中斷--->CPU繼續之前做的事

        在應用層方面,也就是我們把串口中斷用起來目前只需掌握以下幾點:

        ①中斷源:就是中斷的來源,如定時中斷,串口中斷(包括髮送完成,接受完成等),DMA中斷,按鍵中斷,IO口輸入高低電平等等都可以當做中斷的來源。

        ②中斷服務函數:就是有一箇中斷來了,這個中斷具體要做什麼。比如串口收到1幀數據,需要用變量把數據存起來,或者用來顯示到屏幕上等等。

2. 51單片機串口中斷的實現

單片機的串口中斷實現分爲兩步:

  step1:初始化串口,單片機所有的外設(串口,定時器,CAN等等)本質上爲配置寄存器的值來實現不同模式的選擇,這一步其實是比較重複的工作,初學者有時間可以扣扣細節,沒時間的話,就把它想成一個黑盒,配置幾個變量即可使用。這裏不細講了,有空可以參考以下初始化的例程來理解,沒空就只需要 修改Baudrate變量來使用自己想要的波特率。

#define MAIN_Fosc		24000000L	//define main clock 即主頻
#define Baudrate		500000L		//define the baudrate
						//12T mode: 600~115200 for 22.1184MHZ, 300~57600 for 11.0592MHZ
						//1T  mode: 7200~1382400 for 22.1184MHZ, 3600~691200 for 11.0592MHZ
#define BRT_Reload		(256 - MAIN_Fosc / 16 / Baudrate)	//Calculate the timer1 reload value ar 1T mode

void uart_init(void)
{
	PCON |= 0x80;		//UART0 Double Rate Enable
	SCON = 0x50;		//UART0 set as 10bit , UART0 RX enable

	AUXR |=  0x01;		//UART0 使用BRT
	AUXR |=  0x04;		//BRT set as 1T mode
	BRT = BRT_Reload;
	AUXR |=  0x10;		//start BRT	

	ES  = 1;
	EA = 1;
}

step2:串口中斷服務子函數

當初始化完成之後,程序則進入while(1),然後,當串口中斷來了,則進入中斷服務子函數,執行完之後再返回while(1)繼續執行之前做的事情。常用的串口中斷有發送完成中斷(TI)和接收完成中斷(RI),當發送完成變量TI置1,當接收完成RI置1。需要手動給變量賦值爲0來接收下一次的中斷。

具體實現代碼如下:

//中斷服務函數可以隨便寫  但interrupt 4代表的串口0中斷
//這是程序的框架
void uart0_interrupt (void) interrupt 4
{
	if(RI)  //RI爲1代表接收完成一幀數據
	{
        /*
        需要具體做的事情
        */
		RI = 0;//清除標誌位,以便當接收到下一幀數據進入中斷
	}
	if(TI)//TI爲1代表發送完成中斷
	{
        /*
        需要具體做的事情
       */
		TI = 0;//清除標誌位,以便當接收到下一幀數據進入中斷

	}
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章