广州网站建设外包公司,苏南网站建设,百度联盟广告,网页设计实训心得体会500字本文是在学习51单片机的中断系统的简单性总结#xff0c;着重于51单片机的中断系统的工作原理及如何使用。 文章目录 一、中断原理简单介绍二、 外部中断相关介绍2.1 与外部中断相关的寄存器2.2、外部中断0使用示例2.3、外部中断1使用示例 三、定时器中断相关介绍3.1、51单片机… 本文是在学习51单片机的中断系统的简单性总结着重于51单片机的中断系统的工作原理及如何使用。 文章目录 一、中断原理简单介绍二、 外部中断相关介绍2.1 与外部中断相关的寄存器2.2、外部中断0使用示例2.3、外部中断1使用示例 三、定时器中断相关介绍3.1、51单片机定时器原理3.2、 与定时器中断相关的寄存器3.3、定时/计数器的工作方式3.3.1、工作方式03.3.2、工作方式13.3.3、工作方式23.3.4、工作方式3 3.4、定时器中断如何使用3.4.1、定时器0使用示例3.4.2、定时器1使用示例 一、中断原理简单介绍
首先需要知道51单片机的引脚如下示意图其中P3口除了作为输入/输出I/O口还有第二功能与中断有关的引脚
P3.0/RXD作为串口接收数据P3.1/TXD作为串口发送数据P3.2/INT0具有外部中断0功能P3.3/INT1具有外部中断1功能P3.4/T0具有定时/计数器0功能P3.5/T1具有定时/计数器1功能 然后要看懂80C51系列单片机的中断系统结构如下图。
以外部中断0为例从左侧开始看IT0控制中断触发方式是下降沿还是低电平IE0作为中断请求标志由硬件置位发送中断申请。当EX01且EA1时不考虑中断优先级中断优先级置1或置0都可IE0被置位即会进入中断入口。 以定时/计数器0为例TF0作为定时/计数器溢出中断请求标志由硬件置位发送中断申请或清0。当ET01且EA1时不考虑中断优先级TF0置位时会进入中断。 以串口中断为例RI作为串口接收中断标志位TI作为串口发送中断标志位当接收或发送一帧串口数据时会置位发送中断申请。当ES1且EA1时不考虑中断优先级RI或TI被置位后即进入中断。 然后要知道中断响应的条件① 中断源有中断请求② 此中断源的中断允许位为1③ CPU开中断。
以外部中断0为例P3.2口作为外部中断0的中断源。
第一个条件中断源有中断请求P3.2口什么情况下会有中断请求 首先需要IT0设置中断触发方式是下降沿触发中断还是低电平触发中断。 如果是下降沿触发中断即IT01那么P3.2口由高电平变为低电平时就会触发中断并会置IE01产生中断申请。 第二个条件此中断源的中断允许位为1外部中断0的允许位即EX0置1则允许INT0中断被处理第三个条件CPU开中断置CPU总中断位为1即EA置1。
最后在编码时要编写中断响应条件的代码还要编写中断响应后的中断处理函数的代码。
中断处理函数的格式如下 其中返回值类型为空void函数名自定义interrupt表示该函数是中断处理函数0表示中断号。
void user_def_func_name() interrupt 0
{// 中断处理
}根据中断类型不同中断号也不同中断号如下
中断源符号名称中断引起原因中断号/INT0外部中断0P3.2引脚低电平或下降沿信号0T0定时器0中断定时/计数器0计数回0溢出1/INT1外部中断1P3.3引脚低电平或下降沿信号2T1定时器1中断定时/计数器1计数回0溢出3TI/RI串行口中断串口通信完成一帧数据发送或接收引起中断4
二、 外部中断相关介绍
STC89C5X系列单片机提供了4个外部中断外部中断0、外部中断1、外部中断2、外部中断3。51系列单片机一定有基本的2个外部中断不全有4个中断可通过查看芯片手册确认。通常使用基本的2个外部中断外部中断0和外部中断1。这两个外部中断使用方法一致。
2.1 与外部中断相关的寄存器
与外部中断0/1相关的寄存器有TCONIEIP
IE-中断允许控制寄存器
CPU对中断系统所有中断以及对某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。IE各位说明如下
位76543210字节地址A8HEAESET1EX1ET0EX0IECPU总中断允许位串行口中断允许位定时/计数器1中断允许位外部中断1允许位定时/计数器中断允许位外部中断0允许位
TCON-控制寄存器
TCON中的各位控制中断请求及中断触发方式。TCON各位说明如下
位76543210字节地址A8HTF1TR1TF0TR0IE1IT1IE0IT0TCON定时/计数器T1溢出中断请求标志位定时/计数器T1运行控制位定时/计数器T0溢出中断请求标志位定时/计数器T0运行控制位外部中断1中断请求标志位外部中断1触发方式控制位外部中断0中断请求标志位外部中断0触发方式控制位
其中外部中断触发控制位IT0/IT1为高电平时为边沿触发方式为低电平时为电平触发方式。
IP-中断优先级控制寄存器。
2.2、外部中断0使用示例
以独立按键通过外部中断0控制LED亮灭为例。
要触发外部中断0中断需要INT0引脚产生有效信号外部中断0允许标志位EX01且CPU总中断允许位EA1。
要使INT0引脚产生有效信号需要外部中断0触发方式控制位IT0选择中断触发方式IT0置1选择下降沿触发。通过按键连接到INT0引脚当按键按下时INT0引脚由高电平变为低电平产生了一个下降沿就会触发外部中断0请求中断。CPU响应外部中断0的中断申请进入外部中断0中断处理函数中在该函数中控制LED的亮灭。
proteus设计原理图如下 代码设计。首先编写外部中断0响应条件代码即外部中断0的初始化函数。如下
// 外部中断0中断响应条件设置即外部中断0初始化
void Int0Init()
{// 1. 设置外部中断0触发方式选择下降沿触发IT01;// 2. 设置外部中断0允许标志位为1EX01;// 3. 设置CPU总中断允许位为1EA1;
}CPU收到外部中断0的中断申请后进入中断处理函数中。在中断处理函数中控制LED的亮灭。如下
// 外部中断0中断处理函数当CPU响应中断后进入该处理函数在该函数中控制LED亮灭
void Int0() interrupt 0
{delay(10);if(0K1){LED~LED;}
}在主函数中调用外部中断0初始化函数然后进入循环等待状态。当按键按下时外部中断0触发中断请求CPU响应中断请求进入中断处理函数中断处理函数结束后继续返回主函数执行因为主函数一直在循环状态所以当下一次按键再次按下时会再次进入中断处理函数中。主函数代码如下
void main()
{Int0Init();while(1);
}仿真结果 2.3、外部中断1使用示例
外部中断1与外部中断0使用类似。以上个示例为例把外部中断0改成外部中断1。
proteus设计如下 代码设计与外部中断0类似。外部中断1初始化函数如下
// 外部中断1中断响应条件设置即外部中断1初始化
void Int1Init()
{// 1. 设置外部中断1触发中断方式选择下降沿触发IT11;// 2 设置外部中断1中断允许位为1EX11;// 3. 设置CPU总中断允许位为1EA1;
}外部中断1中断处理函数如下
// 外部中断1中断处理函数当CPU响应中断INT1后进入该处理函数在该函数中控制LED亮灭
void Int1() interrupt 2
{delay(10);if(0K2){LED~LED;}
}主函数中将外部中断0的初始化函数Int0Init改成外部中断1的初始化函数Int1Init。
仿真结果如下此时通过外部中断0已经不能控制LED亮灭因为外部中断0此时不会响应不会进入到外部中断0中断处理函数中。 如果想外部中断0和外部中断1都能控制LED那么在主函数中添加调用外部中断0的初始化函数Int0Init即可。
三、定时器中断相关介绍
STC89C5X系列单片机提供了3个定时器定时器1、定时器1、定时器2。51系列单片机一定有基本的2个定时器不全有3个定时器可通过查看芯片手册确认。通常使用的是基本的2个定时器定时器0和定时器1。这两个定时器使用方式大致类似。
3.1、51单片机定时器原理
首先需要了解与CPU时序有关的几个周期振荡周期、状态周期、机器周期、指令周期。
振荡周期是为单片机提供定时信号的振荡源的周期也称为晶振周期或外加振荡周期。比如51单片机外接12MHz的晶振这里1/12MHz就是振荡周期。状态周期也称为S周期或时钟周期。1个状态周期包含2个振荡周期。机器周期1个机器周期包含6个状态周期包含12个振荡周期。指令周期完成一条指令占用的全部时间以机器周期为单位通常占用1~4个机器周期。 以51单片机外接12MHz的晶振为例相关周期的具体值为 振荡周期1/12MHz1/12us 状态周期2振荡周期1/6us 机器周期6状态周期12*振荡周期1us 指令周期1~4 * 机器周期1 ~ 4us STC89C5X系列单片机内有两个可编程的定时/计数器T0、T1和一个特殊功能定时器T2。
定时/计数器的实质是加1计数器是一个16位的计数器由高8位和低8位两个寄存器THx和TLx组成。其中x代表0或1当使用定时器0时x为0当使用定时器1时x为1。
随着输入脉冲加1计数器进行自加1即每来一个脉冲计数器就自动加1。当加到计数器全为1时即THx为FFHTLx为FFH时再输入一个脉冲计数器就会溢出此时THxTLx00H并且计数器的溢出也会使对应的中断请求标志位TF0或TF1置1向CPU发出中断请求。如果定时器中断允许位ET0或ET1为1且CPU总中断EA为1那么CPU响应中断。
这里需要计算计数初值。加入THxTLx00H那么要计数65536次计数器才会溢出对于外接12MHz的晶振来说经过了65536us的时间。通常用来定时1ms的时间即计数1000次那么计数初值应该为65536-100064536。
当定时器工作于定时模式则表示定时时间已到当定时器工作于计数模式则表示计数值已满。
3.2、 与定时器中断相关的寄存器
定时/计数器的工作由特殊功能寄存器TCON、TMOD控制。
TCON-控制寄存器
TCON低四位用于控制外部中断高四位用于控制定时/计数器的启动和中断申请。各位结构如下
位76543210字节地址88HTF1TR1TF0TR0IE1IT1IE0IT0定时器1溢出中断请求标志位定时器1运行控制位定时器0溢出中断请求标志位定时器0运行控制位外部中断1中断请求标志位外部中断1中断触发方式位外部中断0中断请求标志位外部中断0中断触发方式位
TF1是定时器1溢出中断请求标志位。T1计数溢出时由硬件自动置TF为1CPU响应中断后TF1由硬件自动清0。T1工作时CPU可随时查询TF1的状态。TF1也可由软件置1或清0同硬件置1或清0的效果一样。TF0功能与TF1类似是定时器0溢出中断请求标志位。
TR1是T1运行控制位TR1置1时T1开始工作TR1置0时T1停止工作。软件控制TR1置1或清0。TR0功能与TR1类似是定时器0运行控制位。
TMOD-定时器工作方式寄存器
TMOD用于设置定时器的工作方式低四位用于T0高四位用于T1。各位结构如下
位76543210字节地址89HGATEC/TM1M0GATEC/TM1M0TMOD门控位定时or计数模式选择位工作方式设置位门控位定时or计数模式选择位工作方式设置位
门控位GATE控制定时器中断是否受外部中断控制。当GATE0时只需要定时器运行控制位TR0/TR1为1就可以启动定时/计数器工作当GATE1时除了TR0/TR1置1还需要外部中断引脚为高电平才能启动定时/计数器工作。C/T选择定时/计数器处于定时模式C/T还是计数模式C/T1。M1M0用来设置工作方式有四种工作方式
定时/计数器工作方式设置M1M0工作方式说明00013位定时/计数器01116位定时/计数器1028位自动重装定时/计数器113T0分成两个8位定时/计数器T1此方式停止计数
3.3、定时/计数器的工作方式
定时/计数器有四种工作方式工作方式0、工作方式1、工作方式2、工作方式3。
3.3.1、工作方式0
工作方式0为13位计数由TLx的低5位和THx的8位组成。TLx的低5位溢出时向THx进位THx溢出时置位TCON的TFx标志向CPU发出中断请求。
工作方式0结构图如下下图以定时器0为例GATE通过一个非门和INT0引脚连接一个或门再与TR0位通过与门连接控制定时器工作每当到来一个机器周期后计数器TH0和TL0自加1直到TH0溢出置位TF0向CPU发出中断申请。
当GATE1时经过非门后为0那么此时需要INT0引脚为高电平和TR0置1共同作用下才能启动定时器工作 当GATE0时经过非门后为1此时不需要INT0引脚只需TR0置1就可启动定时器工作。
当GATE1TR01外中断引脚为高电平启动计数外中断引脚为低电平停止计数。这种方式常用来测量外中断引脚上正脉冲的宽度。 计数初值X与计数个数N的关系为 X 2 13 − N X2^{13} - N X213−N。或者直接对计数个数取补码1得到。
3.3.2、工作方式1
方式1的计数位数是16位TLx作为低8位THx作为高8位组成16位的加1计数器。工作方式1的结构图如下所示
工作方式1计数初值X与计数个数N的关系为 X 2 16 − N X2^{16}-N X216−N。
3.3.3、工作方式2
方式2是自动重装8位计数方式。工作方式2适合于用作较精确的脉冲信号发生器。方式2结构图如下 工作方式2计数初值X与计数个数N的关系为 X 2 8 − N X2^{8}-N X28−N。
3.3.4、工作方式3
工作方式3只适用于定时/计数器T0定时器T1处于方式3时停止计数。
工作方式3将T0分成两个独立的8位计数器TLx和THx方式3结构如下图 3.4、定时器中断如何使用
中断响应的三个条件①中断源有中断请求②此中断源的中断允许位为1③CPU开中断。
第一个条件中断源有中断请求。对于定时器来说当计数器溢出时会向CPU申请中断。要满足条件就需要给定时器设置工作方式设定计数的初值设置TRx为1启动计数。 第二个条件此中断源的中断允许位为1置ET0或ET1为1. 第三个条件CPU开中断置EA1。
3.4.1、定时器0使用示例
通过定时器0控制LED实现闪烁时间间隔为1s。
因为定时器属于51单片机内部资源只需要使用软件控制即可。
proteus设计原理图可复用外部中断0的设计。这里使用工作方式1仅使用TR0位控制启动计数工作于定时模式。
计时1s可以采用定时1ms定时1000次的方式。定时1ms的初值为 2 16 − 1000 64536 F C 18 H 2^{16}-100064536FC18H 216−100064536FC18H即TH00xFCTL00x18。
当CPU响应中断后需要在中断处理函数中将计数初值设置为FC18H否则实现不了下一次定时1ms。
软件设计思路首先需要设置中断响应的几个条件即定时器初始化。定时器0初始化代码如下
// 定时器0中断响应条件设置即定时器0初始化
void Timer0Init()
{// 1. 设置工作方式1、设置初值TMOD|0x01;TH00xFC;TL00x18;// 2. 打开定时器0的中断允许标志位ET01;// 3. 打开CPU总中断允许标志位EA1;// 4. 启动计数TR01;
}定时器0中断处理函数如下
// 定时器0冲断处理函数CPU响应定时器0中断进入该处理函数在该函数中计算定时1s来控制LED亮灭
void Timer0() interrupt 1
{static u16 i;TH00xFC;TL00x18;i;if(1000i){i0;LED~LED;}
}主函数中调用定时器0初始化函数Timer0Init。
仿真结果如下 3.4.2、定时器1使用示例
定时器1与定时器0使用类似。
定时器1初始化函数如下
// 定时器1中断响应条件设置即定时器1初始化
void TImer1Init()
{// 1. 设置工作方式1、设置初值TMOD|0x10;TH10xFC;TL10x18;// 2. 打开定时器1中断允许标志位ET11;// 3. 打开CPU总中断允许位EA1;// 4. 启动计数TR11;
}定时器1中断处理函数如下
// 定时器0冲断处理函数CPU响应定时器0中断进入该处理函数在该函数中计算定时1s来控制LED亮灭
void Timer1() interrupt 3
{static u16 i;i;TH10xFC;TL10x18;if(1000i){i0;LED~LED;}
}主函数中调用定时器1初始化函数即可。