51单片机的外部中断
来源:万校如锦 更新:2018-06-06 17:33:33 | 关注7人
很多初学单片机的小伙伴都非常惧怕中断的学习,确实中断最难学但也最重要,没学会中断就不能说自己会单片机,如果学会中断就可以做很多事,像做什么电路断路检测系统呀,可以用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这个门了,怎么这个门那边都可以通过呀,只是路长短不一样而已,额,原来是中断优先级选择器呀,随便怎么走吧,不管他就原来系统的优先级,这一路走下来基本就对各寄存器设置完毕了,看代码吧。#includesbit 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--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}所以只要多记字码和看图,然后结合代码例子,就能学会中断,多练就会熟悉,看多了就能把图记在心里随手捻来。