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;//清除標誌位,以便當接收到下一幀數據進入中斷
}
}