1、第第4 4章章 51 51单片机单片机中断系统中断系统的的C51C51编程编程 4.1 4.1 中断系统中断系统结构与中断控制结构与中断控制 4.2 4.2 中断优先级与中断函数中断优先级与中断函数 4.3 4.3 外部中断外部中断源的源的C51C51编程编程 4.4 4.4 实验实验4.1 514.1 51单片机中断系统单片机中断系统结构与中断结构与中断控制控制5 5个中断源个中断源 外部中断:外部中断:外部中断外部中断0 0 /INT0/INT0 外部中断外部中断1 1 /INT1/INT1 定时器定时器/计数器溢出中断:计数器溢出中断:定时器定时器/计数器计数器0 0 TF0TF0 定时
2、器定时器/计数器计数器1 1 TF1 TF1 串行口中断:串行口中断:串行口串行口 RIRI、TITI中断控制中断控制 设置了设置了4 4个专用寄存器用于中断控制。个专用寄存器用于中断控制。(1 1)定时器控制寄存器()定时器控制寄存器(TCONTCON)(2 2)串行口控制寄存器(串行口控制寄存器(SCONSCON)(3 3)中断允许控制寄存器(中断允许控制寄存器(IEIE)(4 4)中断优先级控制寄存器(中断优先级控制寄存器(IPIP)4.2 4.2 中断优先级与中断函数中断优先级与中断函数 优先级排列如下优先级排列如下(从高到低从高到低):):外部中断外部中断0 0 定时器定时器/计数器
3、计数器0 0溢出溢出 外部中断外部中断1 1 定时器定时器/计数器计数器1 1溢出溢出 串行口中断串行口中断中断函数的结构中断函数的结构 定义中断服务函数的一般形式为:定义中断服务函数的一般形式为:函数名(函数名()interruptinterrupt()n n 外部中断外部中断0 0中断、定时器中断、定时器/计数器计数器0 0溢出溢出中断、外部中断中断、外部中断1 1中断、定时器中断、定时器/计数器计数器1 1溢出中断、串行口中断对应的中断类溢出中断、串行口中断对应的中断类型号分别为型号分别为0 0、1 1、2 2、3 3、4 4。4.3 4.3 外部中断外部中断源的源的C51C51编程编程
4、 5151单片机提供了单片机提供了2 2个外部中断源个外部中断源 :外部中断外部中断0 0请求请求,占用,占用P3.2P3.2引脚,其引脚,其中断请求号为中断请求号为0 0。外部中断外部中断1 1请求请求,占用,占用P3.3P3.3引脚,其引脚,其中断请求号为中断请求号为2 2。外部中断源的初始化时通过设置相外部中断源的初始化时通过设置相应的特殊功能寄存器的相应位来实现的应的特殊功能寄存器的相应位来实现的。(1 1)TCONTCON寄存器中的寄存器中的IT0IT0、IT1IT1位位 外部中断外部中断0 0和外部中断和外部中断1 1的中断触发方式的中断触发方式控制位。如:控制位。如:IT0=0
5、IT0=0;/外部中断外部中断0 0为电平触发方式为电平触发方式 IT1=1IT1=1;/外部中断外部中断1 1为脉冲触发方式为脉冲触发方式(2 2)IPIP寄存器中的寄存器中的PX0PX0、PX1PX1位位 外部中断外部中断0 0和外部中断和外部中断1 1的中断优先级的的中断优先级的设定。如:设定。如:PX0=0;PX0=0;/设定外部中断设定外部中断0 0为低级中断为低级中断 PX1=1;PX1=1;/设定外部中断设定外部中断1 1为高级中断为高级中断(3 3)IEIE寄存器中的寄存器中的EAEA、EX0EX0、EX1EX1位位 EAEA为中断允许总控制位;为中断允许总控制位;EX0EX0
6、、EX1EX1为外为外部中断部中断0 0中断和外部中断中断和外部中断1 1中断的中断允中断的中断允许位。如:许位。如:EA=1;EA=1;/开放总的中断控制开放总的中断控制 EX0=1;EX0=1;/允许外部中断允许外部中断0 0中断中断 EX1=0;EX1=0;/禁止外部中断禁止外部中断1 1中断中断【例【例4-14-1】初始状态时低初始状态时低4 4位灯亮,高位灯亮,高4 4位位的灯灭,编程实现按一下的灯灭,编程实现按一下S0S0,P1P1口的发光口的发光状态发生反转。状态发生反转。#include#include void main()void main()P1=0XF0;P1=0XF0
7、;/高高4 4位灭、低位灭、低4 4位亮位亮 IT1=1;IT1=1;/脉冲触发方式脉冲触发方式 EA=1;EX1=1;EA=1;EX1=1;/开放相应的中断开放相应的中断 while(1);while(1);/等待中断等待中断 void wint0(void)interrupt 2 /2void wint0(void)interrupt 2 /2外外1 1 P1=P1;P1=P1;【例【例4-24-2】利用利用S0S0按钮控制按钮控制P1P1口的灯,要口的灯,要求每按一下就点亮一盏灯(其余的灯是灭求每按一下就点亮一盏灯(其余的灯是灭的)。的)。#include#include#include
8、 /#include /内部函数内部函数 bit flag;/bit flag;/中断标志中断标志 unsigned char ledstatus;unsigned char ledstatus;void wint1()interrupt 2void wint1()interrupt 2 flag=1;flag=1;void main(void)void main(void)P1=0 xff;ledstatus=0 xfe;P1=0 xff;ledstatus=0 xfe;IT1=1;EA=1;EX1=1;IT1=1;EA=1;EX1=1;while(1)while(1)if(flag)if(
9、flag)P1=ledstatus;P1=ledstatus;ledstatus=_crol_(ledstatus,1);ledstatus=_crol_(ledstatus,1);flag=0;flag=0;【例【例4-34-3】当当S0S0动作时,动作时,P1.0P1.0端口的电平端口的电平反向,当外反向,当外S1S1动作,动作,P1.7P1.7端口的电平反向端口的电平反向#include#include sbit LED0=P10;sbit LED0=P10;sbit LED7=P17;sbit LED7=P17;void IS0(void)interrupt 0void IS0(voi
10、d)interrupt 0/外部中断外部中断0 0 LED0=LED0;LED0=LED0;void IS1(void)interrupt 2void IS1(void)interrupt 2/外部中断外部中断1 1 LED7=LED7;LED7=LED7;void main()void main()P1=0 xFF;P1=0 xFF;IT0=1;IT1=1;EX0=1;EX1=1;EA=1;IT0=1;IT1=1;EX0=1;EX1=1;EA=1;while(1);while(1);修改:修改:(1 1)S0S0控制控制P1.0P1.0P1.3P1.3的灯,的灯,S1S1控制控制P1.4P1
11、.4P1.7P1.7的灯。的灯。(2 2)按下)按下S0S0后,点亮后,点亮8 8只只LEDLED;按下;按下S1S1后,变为闪烁状态。后,变为闪烁状态。【例【例4-44-4】P1P1口控制的灯按一定的频率闪口控制的灯按一定的频率闪烁,烁,S0S0动作,实现单灯左移,而左移动作,实现单灯左移,而左移3 3圈圈结束。结束。【例【例4-54-5】首先通过首先通过P1.7P1.7口点亮发光二极口点亮发光二极管管D1D1,然后外部输入一脉冲串,则发光二,然后外部输入一脉冲串,则发光二极管极管D1D1亮、暗交替。亮、暗交替。#include#include sbit P1_7=P17;sbit P1_7=P17;void interrupt0()interrupt 0 using 2 void interrupt0()interrupt 0 using 2 P1_7=P1_7;P1_7=P1_7;void main()void main()EA=1;IT0=1;EX0=1;EA=1;IT0=1;EX0=1;P1_7=0;P1_7=0;do while(1);do while(1);修改:修改:如果有如果有3 3个脉冲,则灯亮、暗交替一次,请编程。个脉冲,则灯亮、暗交替一次,请编程。实验1 按钮型开关模拟外部中断实验实验实验2 外部中断优先级实验外部中断优先级实验