天津大学智能车队阶段一第二部分培训内容主要包括:
1、回顾上节课内容;
2、总结作业遇到的问题;(提示要用好在线文档)
3、关于中断:
1)单片机程序执行过程。
2)中断系统:
3)中断的意义:
4)51中断配置方法:(直接操作寄存器)
5)中断使用例子:
1、单片机程序执行过程
程序经过编译器编译后变成二进制数据,存入ROM中,对ROM的读取只能分字节读取,相当于划分一个个房间,每个字节的数据都有相应的地址,相当于门牌号。
1、 取指令。根据程序计数器(PC)中的值,从程序存储器(ROM)中读出每一行指令,送入指令寄存器。
2、 分析指令阶段。
3、 执行指令阶段。
涉及的寄存器:
PC指针,存放当前要执行的代码的地址,引导系统从ROM读取指令,具有自动加一的功能,表现为程序的顺序执行,每次程序的跳转,中断等,都相当于直接给PC寄存器赋值,让他跳转到别的语句执行。
以上可以看出,51单片机是单核单线程工作。
2、中断系统
举个例子:中断过程描述
1、 CPU在处理某一事件A时,发生了另一事件B请求CPU去处理(中断发生)
2、 CPU暂时中断当前的工作,转去处理B(中断响应和中断服务)
3、 CPU处理完事件B后,再回到原来的事件A被中断的地方继续处理事件A(中断返回)。
一些概念:
中断源:引起CPU产生中断的根源。
断点:被中断打断的地方;执行完中断程序返回的地方。
(切记,从哪里被中断打断的,响应结束后就返回哪里,而不是从头开始)
优先级:抢占优先级,响应优先级。
中断请求。
中断响应。
中断服务程序。
中断的意义
中断的意义:
1、 实时性:
以按键处理为例:
如果不使用中断,则需要在主循环中反复扫描按键电平状态,不仅占用了主循环执行效率,而且按下按键的瞬间如果程序没执行到扫描按键的语句则不会立刻触发,存在一定的滞后性。
延伸到工业上的紧急跳闸装置,如果主循环很复杂,可能几百毫秒才会扫描一次跳闸装置状态,发生意外时会严重影响保护装置的性能。
2、 分时操作:
虽然我们常用的单品机是单核单线程工作,但正因有了中断系统,诸如按键检测,通信等待接收,定时器定时处理某函数等功能可以不占用主程序的执行,等待有需求时,中断到来,再打断主程序,进而实现一定意义上的多线程操作。
优先级
为了处理两个中断请求同时发生的时候怎么处理的问题。一种情况是PC指针指向主循环时,一种情况是PC指针指向某一中断函数时。一个正常的程序应该是PC不是指向主循环就是指向中断函数。
1、主循环优先级最低,所有中断都可以打断。
2、优先级分为抢占式优先级和响应式优先级。
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
3、 51单片机不区分抢占式优先级和响应式优先级概念,有5个中断源,每个中断源有2个优先级(配置成0或者1),如果中断源优先级配置成一样,则以中断源默认排序进行优先级划分(如下图)。可以实现二级中断嵌套(嵌套的意思就是正在执行某个中断的时候另一个中断发出请求了,怎么处理的问题,下面有例子)
但以后智能车上用到的单片机每个中断都得配置好抢占式优先级和响应式优先级,而且每种优先级还可以配置成0,1,2,3,4等等,以后再说。
下面以抢占式优先级为主介绍一个例子:
假设上述例子事件A和事件B是中断请求A和中断请求B的响应函数。正在执行事件A时,如果中断B的抢占式优先级低于中断A,则执行完事件A之后才会跳转到事件B执行(如何跳转涉及程序地址的问题);如果中断B的抢占式优先级高于中断A,则无论事件A执行到哪里,都会马上跳转到事件B执行,执行完事件B之后才会返回到事件A继续执行。(由于主循环优先级最低,所以事件A和B都执行完才会返回主循环)
两种优先级详细对比的例子在:
链接: 抢占式优先级和响应式优先级.
3、中断配置方法:
以外部中断为例:外部中断就是gpio口输入信号触发的中断,可以配置成下降沿产生中断请求,或者低电平产生中断请求(看INT头顶有没有横杠)。外部中断有两个中断源,分别为INT0和INT1,对应P3.2和P3.3引脚。
配置寄存器:
1、TCON(1字节,8位):中断配置寄存器。
与外部中断相关的寄存器位为:IE1,IT1,IE0,IT0
0和1代表两个外部中断源。
IEn:中断标志位。系统自动赋值,当相应引脚检测到有效电平的时候IEn=1表示中断源向系统发出中断请求(不管中断开关打没打开,不管系统响应不响应,标志位都会显示中断状态)
ITn:中断触发类型。赋值1则配置成下降沿触发,0则低电平触发。
2、IE(1字节,8位):中断开关配置器
赋值1则打开对应外部中断源,0则关闭。
与外部中断相关的寄存器位:EA,EX0,EX1
0和1代表两个外部中断源。
EA:中断总开关。赋值1时使能中断功能,赋值0时所有中断都屏蔽。
EXn:对应外部中断源的开关。赋值1时允许响应外部中断请求,0时屏蔽外部中断请求。
3、IP(1字节,8位):优先级配置器
与外部中断相关的寄存器位:PX0,PX1
PXn:赋值1则将相应外部中断配置为高优先级,0则低优先级。
当两中断源配置为相同的优先级时,则默认按中断源固定排序进行优先级划分(上图从上到下优先级从高到低)
中断响应服务程序入口:
不同中断源有固定的响应程序入口,类似于对应的门牌号,中断请求发生,如果系统响应的话,程序地址指针会指向相应的地址,表现为执行相应的服务函数。
注意事项:
1、 CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。
2、 正在进行的中断过程不能被新的同级或低优先级的中断请求所打断。
3、 正在进行的低优先级中断服务,能被高优先级中断请求所打断。
4、 中断响应条件:1)中断源发出请求2)此中断源中断允许位为1。3)CPU开启了总中断开关。
外部中断使用例子:
// A code block
#include<reg52.h>
sbit LED=P0^0;
sbit LED2=P0^1;
void main()
{
IT0=1; //设置外部中断0的触发方式为下降沿
EX0=1; //开启外部中断0
IT1=0; //设置外部中断1的触发方式为低电平
EX1=1; //开启外部中断1
EA =1; //总中断开关
while(1);
}
void EX0_ISR(void) interrupt 0
{
LED=~LED;
}
void EX1_ISR(void) interrupt 2
{
LED2=~LED2;
}
从仿真效果可以看出低电平触发和下降沿触发的区别。低电平模式可能会触发很多次,下降沿模式比较稳定。
keil5有两个版本:一个是MDK是给ARM单片机编程的,一个是C51,是给STC单品机编程的,以下链接介绍如何同时安装MDK和C51.
链接: keil5安装教程:.
keil5如何选择89C51单片机:
链接: keil和protues在线联调教程:.