本章重点学习外部中断。
1、外部中断0框图:
2、外部中断1框图:
3、Keil C51中有一些关键字,需要牢记:
interrupt 0:指定当前函数为外部中断0;
interrupt 1:指定当前函数为定时器0中断;
interrupt 2:指定当前函数为外部中断1;
interrupt 3:指定当前函数为定时器1中断;
interrupt 4:指定当前函数为串口中断;
using 0:表示当前函数使用第0组寄存器;
using 1:表示当前函数使用第1组寄存器;
using 2: 表示当前函数使用第2组寄存器;
using 3: 表示当前函数使用第3组寄存器;
51单片机内有4个工作组寄存器,每个工作组的寄存器是R0--R7。
R0-R7在数据存储器里的实际地址是由特殊功能寄存器PSW里的RS1、RS0位决定的。
using 0表示设置 RS1=0,RS0 =0,用第0组寄存器,R0--R7的在数据存储区里的实际地址是00H-07H。R0(00H)....R7(07H);
using 1表示设置 RS1=0,RS0 =1,用第1组寄存器,R0--R7的在数据存储区里的实际地址是00H-07H。R0(08H)....R7(0FH);
using 2表示设置 RS1=1,RS0 =0,用第2组寄存器,R0--R7的在数据存储区里的实际地址是08H-0FH。R0(10H)....R7(17H);
using 3表示设置 RS1=1,RS0 =1,用第3组寄存器,R0--R7的在数据存储区里的实际地址是00H-07H。R0(18H)....R7(1FH);
4、程序举例:
#include <REG51.h> //包含头文件REG51.h,使能51内部寄存器;
#include <intrins.h> //包含头文件intrins.h,要放在stdio.h的头文件之前;
//使能函数如下:
//1 _nop_(); 相当于汇编的NOP指令;
//2 bit _testbit_( bit bit_value ); 对bit_value进行测试,若bit_value=1,返回1,否则返回0;
//3 _cror_( unsigned char x, unsigned char n ); 将字节型变量x的值,向右循环移动n位,然后将其值返回;
//相当于汇编的RR A命令;
//4 _iror_( unsigned int x, unsigned char n ); 将双字节型变量x的值,向右循环移动n位,然后将其值返回;
//5 _lror_( unsigned long x, unsigned char n ); 将4字节型变量x的值,向右循环移动n位,然后将其值返回;
//6 _crol_( unsigned char x, unsigned char n ); 将字节型变量x的值,向左循环移动n位,然后将其值返回;
//7 _irol_( unsigned int x, unsigned char n ); 将双字节型变量x的值,向左循环移动n位,然后将其值返回;
//8 _lrol_( unsigned long x, unsigned char n ); 将4字节型变量x的值,向左循环移动n位,然后将其值返回;
//以上的循环左移和循环右移,同C语言的左移和右移是不同的,使用时要小心
#define ON 0
#define OFF 1
sbit LED1=P1^7; //将LED的阴极K脚通过1K欧姆接P1.7脚,阳极A接电源5V;
sbit LED2=P1^6; //将LED的阴极K脚通过1K欧姆接P1.6脚,阳极A接电源5V;
//函数功能:int0中断服务函数,在双击P3.2脚时会进入int0中断服务函数;
void int0_interrupt_service_function() interrupt 0
{ LED1=ON; //开灯
LED2=OFF; //关灯
}
//函数功能:int1中断服务函数,在双击P3.3脚时会进入int1中断服务函数;
void int1_interrupt_service_function() interrupt 2
{ LED2=ON; //开灯
LED1=OFF; //关灯
}
void main(void)
{ //IT0=1; //设置int0为下降沿触发方式;
//IT1=1; //设置int1为下降沿触发方式;
IT0=0; //设置int0为低电平触发方式;
IT1=0; //设置int1为低电平触发方式;
EX0=1; //允许int0中断;
EX1=1; //允许int1中断;
EA=1; //开总中断允许位;
for(;;)
{
_nop_(); //相当于汇编的NOP指令;
}
}