一、中断的基本概念
中断程序一般指中断服务程序。中断服务程序,处理器处理“急件”,可理解为是一种服务,是通过执行事先编好的某个特定的程序来完成的,这种处理“急件”的程序被称为——中断服务程序。在程序方面来说 当cpu在执行一个程序的时候,突然产生了中断事件cpu就去执行中断程序了,当执行完成后cpu又回来执行原先的程序。
当单片机正在执行程序时,出现了某些特殊状况,例如定时时间到、有键盘信号输入等,此时cpu须要暂时停止当前的程序,而转去执行处理这些事件的程序,待执行完这些特定的程序之后,再返回到原先的程序去执行,这就形成了一次“中断”。“中断”加强了单片机处理突发事件的能力,如果没有中断功能,对可能发生的特殊状况的处理就必须采用定时查询,这样就会浪费大量的cpu时间。
因此,中断是单片机中很重要的一个概念,是提高工作效率的重要功能,中断系统功能的好坏是衡量单片机功能的重要指标。单片机的“中断源”与单片机包含的外围设备有很大的关系,所谓“中断源”就是引起中断的原因或根源,就是中断请求的来源。16f873/876内部集成了12个外围设备。
外围设备在工作过程中,都需要cpu参与控制、协调或交换数据等服务,而cpu正是通过中断技术使得这些外围设备协调工作的。pic单片机作一次中断处理的过程如下,当某一中断源发出中断请求时:
①假如cpu正在执行更重要的任务,则可采用屏蔽的方法暂时不响应该中断请求;
②如果可以响应该中断请求,则cpu执行完当前指令后,必须把断点处的程序计数器pc的值(即下一条指令的地址)压入堆栈保存起来(断点保护),也可以把一些的重要寄存器内容也保护起来(现场保护)。然后再转移到相应的中断服务子程序中执行。
③在中断服务子程序中,首先必须确定发出中断请求的中断源,然后再跳转到与该中断源相对应的程序分支中去执行中断服务程序。
④当中断服务程序执行毕后,必须先恢复被保护的寄存器的值(现场恢复),再将程序计数器pc的值从堆栈中恢复(断点恢复) ,使cpu返回断点处继续执行被中断的程序。
二、中断处理过程
(1)保护被中断进程现场。为了在中断处理结束后能够使进程准确地返回到中断点,系统必须保存当前处理机程序状态字psw和程序计数器pc等的值。
(2)分析中断原因,转去执行相应的中断处理程序。在多个中断请求同时发生时,处理优先级最高的中断源发出的中断请求。
(3)恢复被中断进程的现场,cpu继续执行原来被中断的进程。
三、中断的运用
1、设置中断相关寄存器。这里包含了中断源的方式(高、低、下降沿、上升沿),优先级等,最后得开启当前的中断(可能有多个中断),开启总中断。设置完后,有中断信号到来后,cpu就会处理了,自动跳转到中断里去。
2、中断服务函数。也就是cpu跳到中断去,你想让单片机干什么。比如之前的例子,开门后,看是小广告,我们不要,那关门。中断服务函数就这样,就是单片机跳过去需要处理的事情,一般是要求时效性的,紧急的事。
3、中断嵌套。等会用一般的中断后,再理解嵌套就简单了。
四、pic16f876的中断源
pic16f876单片机具备的中断源如下表所示:
从上表可看出,各中断源基本上都与各个外围设备模块相对应的:多数的外围设备对应着一个中断源(如定时/计数器tmr0),也有的外围设备对应二个中断源(如sci同步/异步接收/发送器usart);有的外围设备没有中断源与之对应(如输入/输出端口 ra和rc);也有的中断源没有外围设备与之对应(例如外部中断源int)。
每一种中断源对应了一个中断标志位,记为xxxf,以及一个中断屏蔽位或叫中断使能位,记为xxxe。中断源产生的中断信号能否到达cpu,都受控于相应的中断屏蔽位。 每个中断源申请中断时,其中断标志位会自动置位,中断标志位的清0是由用户程序完成的;而每个中断屏蔽位的置位和清位均由用户程序完成。
pic16f876单片机的中断系统的逻辑电路如图:
图中全部的的14个中断源按两个梯队并列排开,第一梯队中只安排了3个中断源,其余的中断源全部安排到第二梯队中。所有的中断源都受“全局中断屏蔽位”(也称总屏蔽位)gie的控制;第一梯队的中断源不仅受gie的控制,还要受各自中断屏蔽位的控制;第二梯队的中断源不仅受到gie和各自中断屏蔽位的控制,还要受到一个外设中断屏蔽位peie的控制。
五、中断相关的寄存器
与中断有关的特殊功能寄存器sfr共有6个,分别是:
选项寄存器option_reg、中断控制寄存器intcon、第一外围设备中断标志寄存器pir1、第一外围设备中断屏蔽寄存器pie1(也称中断使能寄存器)、第二外围设备中断标志寄存器pir2和第二外围设备中断屏蔽寄存器pie2。
后5个sfr,共有40位,但仅使用了30位来控制中断,分别与图中的中断逻辑电路输入信号成严格的对应关系。
1、选项寄存器option _reg
该寄存器包含了与定时/计数器tmr0、分频器和端口rb有关的控制位。rb端口引脚rb0和外部中断int复用一脚,与该脚有关的一个控制位含义如下:
intedg:外部中断int触发信号边沿选择位:1=选择rb0/int上升沿触发;0=选择rb0/int下降沿触发。
2、中断控制寄存器intcon
它将第一梯队中的3个中断源的标志位和屏蔽位,以及peie和gie包含在其中:
rbif:端口rb的引脚rb4~rb7电平变化中断标志位。1=rb4~rb7已经发生了电平变化;0=rb4~rb7尚未发生电平变化。
rbie:端口rb的引脚rb4~rb7电平变化中断屏蔽位。1=允许rb产生的中断;0=屏蔽端口rb产生的中断。
intf:外部int引脚中断标志位。1=外部int引脚有中断触发信号; 0=外部int引脚无中断触发信号。
inte:外部int引脚中断屏蔽位。 l=允许外部int引脚产生的中断;0=屏蔽外部int引脚产生的中断。
t0if:tmr0溢出中断标志位。1=tmr0已经发生了溢出;0=tmr0尚未发生溢出。
t0ie:tmr0溢出中断屏蔽位。1=允许tmr0溢出后产生的中断; 0=屏蔽tmr0溢出后产生的中断。
peie:外设中断屏蔽位。1=允许cpu响应来自第二梯队中断请求0=禁止cpu响应来自第二梯队中断请求。
gie:全局中断屏蔽位(总屏蔽位)。1=允许cpu响应所有中断源产生的中断请求;0=禁止cpu响应所有中断源产生的中断请求。
3、 第一外围设备中断标志寄存器pir1
该寄存器中各中断标志位的含义如下:
tmr1if:定时/计数器tmr1模块溢出中断标志位。1=发生了tmr1溢出; 0=未发生tmr1溢出。
tmr2if:定时/计数器tmr2模块溢出中断标志位。1=发生了tmr2溢出; 0=未发生tmr2溢出。
ccp1if:输入捕捉/输出比较/脉宽调制ccp1模块中断标志位。 输入捕捉模式下:1=发生了捕捉中断请求;0=未发生捕捉中断请求。输出比较模式下:1=发生了比较输出中断请求;0=未发生比较输出中断请求。脉宽调制模式下: 无用。
sspif:同步串行端口(ssp)中断标志位。1=发送/接收完毕产生的中断请求;0=等待发送/接收。
txif:串行通信接口(sci)发送中断标志位。1=发送完成,即发送缓冲区空 0=正在发送,即发送缓冲区未空。
rcif:串行通信接口(sci)接收中断标志位。1=接收完成,即接收缓冲区满0=正在接收,即接收缓冲区空。
adif:模拟/数字(a/d)转换中断标志位。1=发生了a/d转换中断;0=未发生a/d转换中断。
pspif:并行端口中断标志位,只有40脚封装型号具备,对于28脚封装型号总保持0。1=并行端口发生了读/写中断请求;0=并行端口未发生读/写中断请求。
4、 第一外围设备中断屏蔽寄存器pie1
该寄存器中包含的中断屏蔽位(使能位)的含义如下:
tmr1ie:定时器/计数器tmrl模块溢出中断屏蔽位。l=开放tmrl溢出发生中断;0=屏蔽tmrl溢出发生中断。
tmr2ie:定时/计数器tmr2溢出中断屏蔽位。1=开放tmr2溢出发生的中断;0=屏蔽tmr2溢出发生的中断。
ccp1ie:输入捕捉/输出比较/脉宽调制ccp1模块中断屏蔽位。1=开放ccp1模块产生的中断请求;0=屏蔽ccp1模块产生的中断请求。
sspie:同步串行端口(ssp)中断屏蔽位。1=开放ssp模块产生的中断请求0=屏蔽ssp模块产生的中断请求。
txie:串行通信接口(sci)发送中断屏蔽位。1=开放sci发送中断请求;0=屏蔽sci发送中断请求。
rcie:串行通信接口(sci)接收中断屏蔽位。1=开放sci接收中断请求;0=屏蔽sci接收中断请求。
adie:模拟/数字(a/d)转换中断屏蔽位。1=开放a/d转换器的中断请求;0=屏蔽a/d转换器的中断请求。
pspie:并行端口中断屏蔽位,只有40脚封装型号具备,对于28脚封装型号总保持0。1=开放并行端口读/写发生的中断请求;0=屏蔽并行端口读/写发生的中断请求。
5、 第二外围设备中断标志寄存器pir2
ccp2if:输入捕捉/输出比较/脉宽调制ccp2模块中断标志位。输入捕捉模式下:1=发生了捕捉中断请求(必须用软件清0);0=未发生捕捉中断请求。输出比较模式下:1=发生了比较输出中断请求(必须用软件清0);0=未发生比较输出中断请求。脉宽调制模式下:无用
bclif:i2c总线冲突中断标志。当同步串行端口mssp被配置成i2c总线的主控器模式时:1=发生了总线冲突;0=未发生总线冲突。
eeif:eeprom写操作中断标志位。1=写操作已经完成(必须用软件清0);0=写操作未完成或尚未开始进行。
6、 第二外围设备中断屏蔽寄存器pie2
ccp2ie:输入捕捉/输出比较/脉宽调制ccp2模块中断屏蔽位。1=开放ccp2模块产生的中断请求;
0=屏蔽ccp2模块产生的中断请求。
eeie:eeprom写操作中断屏蔽位。1=开放eeprom写操作产生的中断请求;0=屏蔽eeprom写操作产生的中断请求。
六、pic单片机timer中断实例
功能描述: timer0实现1s定时,rd低四位取反控制led低四位,timer1实现0.5s定时,rd高四位取反控制led高四位
维护记录: 2011-8-22
***************************************************************************************************/
#include 《pic.h》 //头文件在hi-tech安装目录下\hi-tech software\picc\std\9.60\include
#define uchar unsigned char
#define uint unsigned int
uint temp1,temp2;
//***********************************************************************************
//延时
//***********************************************************************************
void delay(uint time)
{
uint i,j;
for(i = 0;i 《 time; i++)
{
for(j = 0;j 《 30; j++);
}
}
//***********************************************************************************
//io初始化操作
//***********************************************************************************
void io_init(void)
{
trisd=0x00; //rd设置为输出
portd=0xff; //初始化为高
}
//***********************************************************************************
//timer0初始化
//***********************************************************************************
void timer0_init(void) //fosc/4=4m/4所以计数周期为1us
{
t0cs=0; //timer0工作于定时器方式
psa=1; //timer0不分频
t0if=0; //清timer0中断标志
t0ie=1; //timer0中断允许
tmr0=0xaa; /*置初值,定时100us。因为写入tmr0后接着的两个周期不能增量,
中断需要3个周期的响应时间,以及c语言自动进行现场保护要消
耗周期,取修正值15,所以只需要定时100-15=85us
初值=255-85=0xaa*/
gie=1; //开总中断
}
//***********************************************************************************
//timer1初始化
//***********************************************************************************
void timer1_init(void) //fosc/4=4m/4所以计数周期为1us
{
t1con=0x01; //16位定时方式
tmr1if=0; //清timer1中断标志
tmr1ie=1; //timer1中断允许
tmr1h=0xfc; /*置初值,tmr1每1ms中断一次。因为写入tmr1后接着的两个周期不能增量,
中断需要3个周期的响应时间,以及c语言自动进行现场保护要消
耗周期,取修正值15,所以只需要定时1000-15=985us
初值=65535-985=0xfc26*/
tmr1l=0x26;
peie=1; //允许外围中断
gie=1; //开总中断
}
//*************************************************
**********************************
//中断服务子程序
//***********************************************************************************
void interrupt isr(void)
{
// timer0 interrupt service routine
if(tmr0if==1)
{
tmr0=0xaa; //每100us中断一次对tmr0写入一个调整值。
t0if=0; //清timer0中断标志
temp1++; //中断次数加1
if(temp1》9999) //中断10000次后,为1秒
{
temp1=0; //中断次数清0
rd0=!rd0;rd1=!rd1; rd2=!rd2; rd3=!rd3;//取反控制rd低4位led发光或熄灭
}
}
// timer1 interrupt service routine
if(tmr1if==1)
{
tmr1h=0xfc; //中断一次对tmr1写入一个调整值。
tmr1l=0x26;
tmr1if=0; //清timer1中断标志
temp2++; //中断次数加1
if(temp2》499) //中断500次后,为0.5秒
{
temp2=0; //中断次数清0
rd4=!rd4; rd5=!rd5; rd6=!rd6; rd7=!rd7; //取反控制rd高4位led发光或熄灭
}
}
}
//***********************************************************************************
//主函数
//***********************************************************************************
main()
{
__config(xt&wdtdis&lvpdis); //配置,设置为晶振xt方式振荡,禁看门狗,禁低电压编程
io_init(); //io初始化
timer0_init(); //定时器0初始化
timer1_init(); //定时器1初始化
while(1); //死循环
}
//******************************************程序结束*****************************************
放大器电路噪声峰峰值的评估要点与实例
人工智能需要爆发,智能翻译或成为入口!
关于小米汽车,雷军发声:“50万以内,有对手吗?”
余压监控系统
郑建邦率队赴深圳调研 聚焦“深港共建全球科技创新高地”
实例讲解PIC单片机之中断程序
人脸识别技术的应用 部署一个人脸识别系统
HFSS同轴线、微带线、共面波导端口设置
单片机的中断系统
1亿部!传华为提高42.86%目标
基于高速AD的激光z扫描高频信号幅值测量系统
微生物快速检测仪器的特性
磁场重联会发生什么?
USB母座焊连接器的焊接技巧
变压器采用差动保护取决容量或线路技术分析
晶振的最大波特率及其误差介绍
基于C#开发一个简单的窗体应用程序
手机板对板连接器的测试及解决方案
通过CAN模块和PIC30系列芯片实现船舶电站控制系统的设计
rfid系统供应商有哪些_国内十大rfid系统供应商排名