51单片机入门(二):中断

SFR(特殊功能寄存器)

  1. 定义:

    SFR是80C51单片机中各功能部件对应的寄存器,用于存放相应功能部件的控制命令,状态或数据。它是80C51单片机中最具有特殊的部分,所有80C51系列功能的增加和扩展几乎都是通过增加特殊功能寄存器SFR来达到目的的。(来源于百度百科)

  2. 作用:设计SFR可以执行一定的功能(比如中断)

  3. 设置方法:二进制0和1赋值,比如IT0=1

中断

  1. 定义

    中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。(百度百科)

  2. 作用:提高了单片机的效率等

  3. 种类:外部中断,定时器中断等

中断设置函数

  1. 定义:配置中断寄存器的函数

  2. 作用:配置寄存器使得单片机开启相应的中断

  3. 举例

    void Int0Init()//中断设置函数
    {
          
          
    	IT0=1;//跳变沿出发方式(下降沿)
    	//IT1=1;//跳变沿出发方式(下降沿) 中断1
    	EX0=1;//打开INT0的中断允许。	
    	//EX1=1;//打开INT1的中断允许。
    	EA=1;//打开总中断	
    }
    

中断号和中断函数

  1. 中断函数:当中断发生的之后单片机会干什么
  2. 中断号:每种中断都对应一个唯一一个中断号,并且中断具有优先级
    • 外部中断0:0(优先级最高)
    • 定时器中断0:1
    • 外部中断1:2
    • 定时器中断1:3
    • 串口中断:4(优先级最低)

外部中断

  1. P3^2口是外部中断0,P3^3是外部中断1
  2. 中断设置函数包括(跳变方式:上升,下降;打开中断和总中断)
  3. 中断函数就是单片机发生中断之后进行的行为

void Int0Init()//中断设置函数
{
    
    
	IT0=1;//跳变沿出发方式(下降沿)
	//IT1=1;//跳变沿出发方式(下降沿) 中断1
	EX0=1;//打开INT0的中断允许。	
	//EX1=1;//打开INT1的中断允许。
	EA=1;//打开总中断	
}

void main()
{
    
    	
	Int0Init();  //	设置外部中断0
	while(1);		
}

void Int0()	interrupt 0 //中断函数(中断发生的时候发生什么)
//void Int0()	interrupt 2 //中断函数(中断发生的时候发生什么)
{
    
    
	delay(1000);	 //延时消抖
	if(k3==0)
	{
    
    
		led=~led;
	}
}

定时器中断

  1. 定时器可以用来精确计时
  2. 和外部中断一样,也有中断函数和中断号(定时器0中断号为1)
void Timer0Init()
{
    
    
	TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

	TH0=0XFC;	//给定时器赋初值,定时1ms
	TL0=0X18;	
	ET0=1;//打开定时器0中断允许
	EA=1;//打开总中断
	TR0=1;//打开定时器			
}

void main()
{
    
    	
	Timer0Init();  //定时器0初始化
	while(1);		
}

void Timer0() interrupt 1
{
    
    
	static u16 i;
	TH0=0XFC;	//给定时器赋初值,定时1ms
	TL0=0X18;
	i++;
	if(i==1000)
	{
    
    
		i=0;
		led=~led;	
	}	
}

串口中断

void UsartInit()
{
    
    
	SCON=0X50;			//设置为工作方式1
	TMOD=0X20;			//设置计数器工作方式2
	PCON=0X80;			//波特率加倍
	TH1=0XF3;				//计数器初始值设置,注意波特率是4800的
	TL1=0XF3;
	ES=1;						//打开接收中断
	EA=1;						//打开总中断
	TR1=1;					//打开计数器
}

void main()
{
    
    	
	UsartInit();  //	串口初始化
	while(1);		
}

void Usart() interrupt 4
{
    
    
	u8 receiveData;

	receiveData=SBUF;//出去接收到的数据
	RI = 0;//清除接收中断标志位
	SBUF=receiveData;//将接收到的数据放入到发送寄存器
	while(!TI);			 //等待发送数据完成
	TI=0;						 //清除发送完成标志位
}

猜你喜欢

转载自blog.csdn.net/KafenWong/article/details/121509138