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

	}
}

  • 25
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值