51单片机第17步_外部中断

发布于:2024-07-02 ⋅ 阅读:(16) ⋅ 点赞:(0)

本章重点学习外部中断。

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指令;

}

}