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;//清除标志位,以便当接收到下一帧数据进入中断
}
}