在上一篇文章中,我主要给大家介绍328p的外部中断的一些常规知识点,在这里,我们就运用上面的知识点,来直接写一个demo小程序。使用INT0这个外部中断来控制一个led的亮灭。

话不多说,直接上demo:

单片机中断系统入门(小5带你飞5)(1)

简单的说明一下:

  1. 在这里我是用的winAVR来编辑和编译的,生成的hex文件,然后使用的usbasp配合一个名字叫progisp的一个烧写软件将软件写进328p的。当然在前面的教程中我是用的是avr fighter这个烧写软件,后来我发现progisp用起来更方便。

  2. 首先使用了3个在winavr中的头文件,一个是对io的操作,一个是对中断的操作,一个是延迟函数的头文件。再来说一下这个头文件吧:#include <util/delay.h> ,在winavr里面延迟有四个函数,分别是:_delay_loop_1( ); _delay_loop_2( ); _delay_us( ); _delay_ms( );看字面意思应该都能理解,不会自己查一下了。

  3. 首先看一下外部中断的初始化函数:void int0_init(void)。在这个里面,首先我们要开全局中断,然后在中断使能,然后设置中断的触发方式,是不是特别简单呢。大家发现没有,开启中断,其实有两个开关,一个是全局中断使能,一个是INT0的中断使能,为啥都是这样呢,其实去看看内部的电路就知道了。

  4. 在看看main函数,首先是初始化管脚,INT0 对应的管脚是PD2,我们led接在PB5上,那么肯定了,PD2为输入,PB5为输出,其实哦,PD2为啥,无所谓了。之后呢,先调用中断的初始化函数,然后进入循环体内,来执行这个上升沿动作,来触发中断。一触发中断,就进入到中断处理处理函数里面了。

  5. 在来看中断处理程序。将中断来了的时候,我们让PB5的电平翻转,其实就实现了亮灭的变换。

好了,就说这么多吧。

,