资源描述
实验七 外部中断实验
一.实验目的
1.学习PIC24F系列单片机的中断原理及编程方法;
2.掌握中断处理程序的编程方法和调试方法。
二.实验原理
PIC24F系列单片机有5个外部中断输入,对应外部5个I/O管脚,每个中断都对应一个唯一的中断入口地址,当单片机响应中断时,会自动跳转到对应的中断入口地址处开始执行用户中断服务程序。
依次设置如下寄存器:
1.INTCON2:中断控制寄存器2(有五个外部中断源)。设置触发边沿:‘0’为正边沿,即由低电平到高电平;‘1’为负边沿,由高电平跳到低电平。
2.IPCn:中断优先级寄存器。设置中断优先级,默认为‘4’,可不设置。
3.IFSn:中断标志状态寄存器。初始化时需要置为零,每次运行中断服务函数的时候需要清零,否则会陷入陷阱。
4.IECn:中断允许寄存器。‘0’为不允许中断,‘1’为允许中断。
主程序正常执行时,遇到开放的中断信号,则自动跳转到中断服务函数执行。执行完毕,返回到原来的程序继续执行。
三.实验内容
1.单片机的一个8位端口作输出,连接8位发光二极管;单脉冲发生器作外部中断源,街道单片机的外部中断管脚。当外部中断发生时,中断处理程序将发光二极管显示的数字加一。
#include <p24FJ64GA006.h>
unsigned int state=0; //定义全局状态变量
void _ISR _INT0Interrupt() //中断服务程序
{
IFS0bits.INT0IF=0; //清零标志位
state++; //状态+1
}
void IOInit()
{
TRISD=0x0000; //初始化PORTD为输出
INTCON2bits.INT0EP=0; //设置触发边沿为正边沿
IFS0bits.INT0IF=0; //清零标志位
IEC0bits.INT0IE=1; //允许中断
}
int main(void)
{
IOInit();
while(1)
{
if(state>255) //256个状态结束重新循环
state=0;
PORTD = ~state; //逐位取反,发光二极管低电平点亮
}
}
运行结果:
试验:将单脉冲发生器改为使用PIC24F转接板上的按键作为外部中断源,会出现什么问题?应如何处理?
将单脉冲换为按键之后将出现按键抖动的问题,为此需要加入一个防抖动的程序,可以通过在中断开始时加入一个延时来完成。
其他部分不变,加入延时函数,并将中断服务程序改为如下:
void Delayms(unsigned int del)
{
unsigned int j;
while(del--)
for(j = 0;j<1000;j++); }
void _ISR _INT0Interrupt() //中断服务程序
{
Delayms(400);
IFS0bits.INT0IF=0; //清零标志位
state++; //状态+1
}
2.单片机的一个8位端口做输出口,连接8位发光二极管。按键1与按键2街单片机的两个外部中断管脚。按一次按键1,发光二极管循环左移显示;按一次按键2,发光二极管循环右移显示。移位的状态间隔0.5秒,要求用外部中断处理按键事件。
#include <p24FJ64GA006.h>
unsigned int flag = 0; //标志用来判断左移还是右移
void Delayms(unsigned int del) //定义延迟函数
{
unsigned int j;
while(del--)
for(j = 0;j<1000;j++); }
void _ISR _INT0Interrupt() //按键1中断服务程序
{
flag=0; //赋flag为0
IFS0bits.INT0IF=0; //中断0标志清零
}
void _ISR _INT1Interrupt() //按键2中单服务程序
{
flag=1; //赋flag为1
IFS1bits.INT1IF=0; //中断1标志清零
}
void IOInit()
{
TRISE=0x0000; //PORTE设为输出
INTCON2bits.INT0EP=0;
INTCON2bits.INT1EP=0; //将INT0和INT1设为正边沿触发
IEC0bits.INT0IE=1;
IEC1bits.INT1IE=1; //允许INT0和INT1中断
IFS0bits.INT0IF=0;
IFS1bits.INT1IF=0; //将INT0和INT1标志清零
}
int main(void)
{
unsigned int state=0xFEFE,temp;
IOInit();
while(1)
{
PORTE = state; //发光二极管当前状态
temp = state;
if(flag==1) //flag=1则右移,即往高位移
state=((state<<=1)&0xFFFE)|((temp>>15)&0x0001);
else //flag=0则左移,即往低位移
state=((state>>1)&0x7FFF)|((temp<<15)&0x8000);
Delayms(600);
}
}
运行结果:
四.实验结果分析
由于中断是在主程序之外打断运行的,所以在编写程序的时候应该尽可能简化中断服务程序,缩短其中的运行时间而将繁琐的运行过程放在主函数中进行。
对于按键的抖动问题的解决方案不止一种,也可以通过在主程序中延时后判断按键是否依旧按下来从而消除其抖动的影响。
五.心得体会
本次实验让我们对外部中断的运行机制和编程有了一个初步的理解,使得单片机可以进行多任务的操作。中断可以通过解放CPU来更有效率地处理更多任务。使得单片机的功能更加强大。
展开阅读全文