51--定时器/计数器,串口,中断的巧妙关系

目录

什么是中断

什么是定时器计数器

什么是串口 

开始

直接配置中断 

中断+定时器/计数器

串口+中断

总结        

中断查询次序号:


什么是中断

        中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的, 中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。

        STC89C5X 系列单片机提供了 8 个中断请求源,它们分别是:外部中断 O(INTO)、外部中断 1(INT1)、外部中断 2(INT2)、外部中断 3(INT3)、定时器 0 中断、定时器 1 中断、定时器 2 中断、串口(UART)中断。

        举例子来说,我们在写作业,突然水开了,那么我们就得去把水关了,然后再回来写作业。这其中的水开了,然后跑去关水都是中断,总之就是影响主要程序的就是中断;

那么定时器有什么好处呢?

        分时操作。CPU 可以分时为多个 I/O 设备服务,提高了计算机的利用率;

        实时响应。CPU 能够及时处理应用系统的随机事件,系统的实时性大大增 强;

        可靠性高。CPU 具有处理设备故障及掉电等突发性事件能力,从而使系统 可靠性提高

什么是定时器计数器

        ①51 单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之 为定时器/计数器。

        定时器/计数器和单片机的 CPU 是相互独立的。定时器/计数器工作的过程 是自动完成的,不需要 CPU 的参与。

        51 单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信 号对寄存器中的数据加 1。 有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加 1 的 工作可以交给定时器/计数器处理。CPU 转而处理一些复杂的事情。同时可以实 现精确定时作用。

什么是串口 

        串口是是采用串行通信方式的扩展接口

      串行接口简称串口,也称串行通信接口或串行通讯接口,是采用串行通信方式的扩展接口。串行接口是指数据一位一位地顺序传送。

开始

        为什么没用过直接配置的中断,不是说不能直接配置中断,而是很少,这就让大家以为不能单独配置中断;他需要一个命令才能开起中断,至于开启条件还是的理解内部结构框图

直接配置中断 

        配置中断0(中断0是外部中断,顾名思义,当你外部条件满足才能开启)——》按下独立按键3(外部中断0的开启条件就是按键3按下,至于是下降沿开启还是低电平开启,这取决于你的配置)——》中断开启;

//以配置外部中断0为例
void Init0()
{
    IT0=1;
    IE0=0;
    EX0=1;
    EA=1;
    PX0=0;
}

中断+定时器/计数器

        ①首先配置好二者(共同配置),那么什么时候会触发中断呢,那就是当定时器/计数器溢出的时候,不如当时间达到TH0(<<8)+TL0=65535us,就会开始执行中断;

//定时器0+中断  以500微秒为了

void Timer0_Init(void)		//500微秒@11.0592MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x33;		//设置定时初始值
	TH0 = 0xFE;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
    TF0=0;
    ET0=1;
    EA=0;
    PT0=0;
}

        ②分开配置,这时候时间溢出也不会触发中断,中断改为外部中断了。其次,在执行中断的过程中,不会影响定时器/计数器,他们还是会运行,不像其他的,当CPU中断时,都卡住不动;

//配置定时器

void Timer0_Init(void)		//500微秒@11.0592MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x33;		//设置定时初始值
	TH0 = 0xFE;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时

//配置中断

void Init0()
{
    IT0=1;
    IE0=0;
    EX0=1;
    EA=1;
    PX0=0;
}

串口+中断

        首先一起配置好二者,那么为什么串口会触发中断呢,原因是当发送完、接收完数据后,TI=1或RI=1,这两个是触发中断的条件;

//串口+中断
void Uart_Init(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率

	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式
	TL1 = 0xFD;		//设置定时初始值
	TH1 = 0xFD;		//设置定时重载值
	ET1 = 0;		//禁止定时器%d中断
	TR1 = 1;		//定时器1开始计时
    ES=1;
    EA=1;
    PS=1;
}

总结        

总结,要想实现中断,那么就需要明白开启中断的条件是什么,然后就能配置,比如第一种,直接配置中断,我觉得不一定要按下开关去触发中断,我可以间接的在内部控制它实现(Key3与灯相连,那么中断就和灯有关了);

中断查询次序号:


参考资料

普中