|
很多初学单片机的小伙伴都非常惧怕中断的学习,确实中断最难学但也最重要,没学会中断就不能说自己会单片机,如果学会中断就可以做很多事,像做什么电路断路检测系统呀,可以用P3.2脚接到通电电路上并且低电平触发中断系统,假如电路一断电就低电平触发外部中断,然后中断函数内定义一个蜂鸣器,一触发就通电蜂鸣器,像这样的小例子还有很多,所以学会中断很重要,难学的问题在我看来其实就两方面,一个是各个寄存器字码的记忆以及一张图的理解,只要记住了各个寄存器字码和学会看中断系统结构图,可以说你就很容易学会中断或者是定时/计数器了。
51单片机中断系统结构图
外部中断0-----INT0
定时器0-------T0
外部中断1-----INT1
定时器1中断-----T1
串口中断--RX/TX
假如我们需要使用外部中断0,就以此为例子,看图,往INT0一走遇到个小门IT0这是什么呢?哦,原来是外部中断0的触发方式,假如我们需要低电平触发所以就选择IT0=0,接着走遇到EX0了,这个小门只有开和关,值等于1就是开,等于0就是关,所以我们需要使用外部中断0当然要他开了,所以EX0=1;接着遇到了EA,诶!怎么这些小门怎么都连在一起呀,哦原来是中断总开关,那么当然需要把这么多门一切打开呀,所以EA=1;接着走遇到了PX0这个门了,怎么这个门那边都可以通过呀,只是路长短不一样而已,额,原来是中断优先级选择器呀,随便怎么走吧,不管他就原来系统的优先级,这一路走下来基本就对各寄存器设置完毕了,看代码吧。
#include
sbit LED=P1^0; //定义LED端口
void DelayUs2x(unsigned char t);//us级延时函数声明
void DelayMs(unsigned char t); //ms级延时
void main() {
LED=0; //LED灯点亮
EA=1; //全局中断开,就是等于把所有大门打开
EX0=1; //外部中断0开,等于把外部中断0这个小门打开
IT0=0; //T1=0表示低电平触发,等于把小门拨到电平触发那一面
while(1)
{
//在此添加其他程序
}
}
/*------------------------------------------------
外部中断程序0
------------------------------------------------*/
void ISR_INT0(void) interrupt 0
{
/*------------此处也可以放其他处理函数,像简单的蜂鸣器报警呀等等!----------*/
if(!INT0)
{
DelayMs(10);//在此处可以添加去抖动程序,防止按键抖动造成错误
if(!INT0)
while(!INT0);//等待按键释放
{
LED=!LED;
}
}
}
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
所以只要多记字码和看图,然后结合代码例子,就能学会中断,多练就会熟悉,看多了就能把图记在心里随手捻来。
|
|