发布时间:2024-11-02 13:01
前面讲到了关于51单片机的中断,串口通信,但是他的中断系统没有详细介绍,因此这里就来把他的中断系统做一个理清。
注:下面内容参考普中科技51单片机教程
首先还是中断系统的流程,就是发生中断后的处理过程:
相关概念,下面例举一些后面可能出现的概念,可能会在后面出现的:
51单片机上的中断系统可以总结为:
这里需要注意的就是外部中断2和3还有定时器2中断有些51不一定有,这里需要慎用,这里51一共有四个中断优先级(差一点的只有2个中断优先级)
普中这里还提供了相关的中断查询表
如果设定的中断优先级相同的话,中断执行的先后要按照下表中的相同优先级内的查询次序来决定:
这里51单片机对中断的控制都在一个叫中断允许寄存器IE来进行控制的,这里也是用普中给的这个图来看
相关位的说明如下:
开启了中断之后获取中断请求需要读取中断请求标志,也是一个寄存器为TCON,如下所示:
相关位的说明如下:
下面就是中断优先级和中断号了:
中断号如下所示:
综上就是一个中断的所有过程了,那么我们要想自己的中断被响应,就需要:
如果我们编写一个外部中断的函数,配置如下,在中断函数中 exit0()是函数名, 可自定义, 但必须符合 C 语言标识符定义规则,interrupt 是一个关键字, 表示 51 单片机中断。 后面的“0” 是中断号, 外部中断 0 中断号为 0, 这个可参考前面的内容。
相关寄存器的说明在前面已经介绍过了,可以往上查看,源码如下:
void exit0_init(void)
{
IT0=1; //下降沿触发
EX0=1; //int0中断打开
EA=1; //打开总中断
}
void exit0() interrupt 0 //外部中断0的中断服务函数
{
if(KEY3 == 0)
LED1 = !LED1;
}
51单片机的定时器是一个16位的自增计数器,由两个8位寄存器组成,为THx还有TLx,输入一个时钟脉冲,计数器自增,当增加到我们设定的计数值的时候,就会溢出并使能相应的标志位为1。
下面是工作方式寄存器,根据这个寄存器中M1,M2的取值,定时器可以有四种工作方式,同时可以看到这个寄存器其实可以拆分成高四位还有低四位,GATE是一个门控位,就是如果这个位置1的话,定时器的开启要多一个步骤了(多的这个步骤为外部信号触发,就是是否需要外部信号触发才能打开)
C/T是计数模式选择位,就是选择是定时模式(0)还是计数模式(1),M1M0是工作方式设置位。 根据M1M0的选择定时/计数器的四种工作方式如下所示:
下面是控制寄存器的说明:
说明如下:
下面是四个定时器的工作方式介绍:
定时器的配置如下,下面顺序不分先后
下面是定时器计数时间的计算,这里需要注意就是定时时间的计算方式:
根据上面的部分,可以对定时器进行配置,如下所示:
下面是源代码,相关寄存器都可以在上文查到
void time0_init(void)
{
TMOD=0x01;
TH0=0xFC;
TL0=0x18;
ET0=1;
EA=1;
TR0=1;
}
void time0() interrupt 1
{
static u16 i;
TH0=0xFC;
TL0=0x18;
i++;
if(i == 1000)
{
i=0;
LED1 = !LED1;
}
}
下面是串口控制寄存器的描述:
其中SM0还有SM1决定了串口的四种工作方式:
相关寄存器的说明我根据参考资料画了一张表:
补充上面没有说到的位,REN,REN是串口接收使能为,软件置REN=1的话就会启动串口接收数据,反之就会关闭串口数据接收。
下面是电源控制寄存器,电源控制寄存器的说明如下:
其中SMOD寄存器决定了波特率是否倍增,当SMOD=1的时候,波特率就会倍增。
下面对定时器的四种模式进行说明: