自学嵌入式 day43 中断系统

一、中断概念:

cpu在处理一个任务时,外界来了一个更为紧急的事件,要求cpu暂停当前的工作,转而去处理这个紧急事件,处理完后再回之前的任务继续向下执行

二、中断源

打断cpu执行当前任务的事件/源头

个数:五个,外部中断0,timer0,外部中断1,timer1,UART(串口),优先级从左到右

三、外部中断:

引脚电平变化所引发的中断

四、中断优先级

在执行中断的过程中,如果外界又发生一次中断,比较优先级,先处理优先级高的

五、中断处理流程

1、中断源发送出中断请求

2、检查cpu是否允许中断,及该中断源是否被屏蔽

3、比较中断的优先级

4、保护现场

5、执行中断服务函数

6、恢复现场

六、中断寄存器

1、IE:中断允许寄存器(可位寻址)

1)EA(B7):手动置一,代表cpu响应允许所有的中断

2)EX(B1):手动置一,代表外部中断0允许中断

2、TCON寄存器:定时控制寄存器

1)ITO(B0):置一,代表外部中断0下降沿触发中断

七、程序

1、外部中断0初始化函数:

1)P3寄存器中的第二个位置置一

2)IE寄存器中的第7位和第0位置一

3)TCON寄存器中的第0位置一

2、编写中断服务函数

void einto_handler(void) intereupt0

注:中断向量表:函数指针数组

八、定时器初值
九、定时器相关配置

1、中断总开关:定时器开关

2、TMOD寄存器配置:

1)将TMOD寄存器低4位清零

2)将TMOD寄存器第0位置1,第一位清零

3、赋初值

4、TCON寄存器(bit4)置1,开启计时

5、IE寄存器配置

1)IE寄存器B7置1,打开总开关

2)IE寄存器B1置1,打开定时器0中断开关

十、PWM

1、脉冲宽度调制器,引脚波形,引脚周期性发生电平翻转

2、PWM周期:一个方波经历的时间,(从一个上升沿/下降沿到下一个上升沿/下降沿所经历的时间)

3、PWM控制蜂鸣器以200频率进行工作,占空比为50%

注:有源蜂鸣器:有震荡源,无源蜂鸣器:无震荡源

#include <reg51.h>

#include "led.h"

#include "digiter.h"

#include "key.h"

unsigned int g_n = 0;

unsigned int g_i = 0;

#define HZ200 63035

#define HZ400 64285

#define HZ600 64701

#define HZ800 64910

#define HZ1000 65035

void Timer0_Handler(void) interrupt 1

{

int ret = 0;

unsigned short n = 0;

ret = key_press();

switch(ret)

{

case 1:

{

n = HZ200;

break;

}

case 2:

{

n = HZ400;

break;

}

case 3:

{

n = HZ600;

break;

}

case 4:

{

n = HZ800;

break;

}

case 5:

{

n = HZ1000;

break;

}

default:

break;

}

TH0 = n >> 8;

TL0 = n;

P2 ^= (1 << 1) ;

}

void Timer0_Init(void)

{

key_init();

TMOD &= ~(0x0F << 0);

TMOD |= (1 << 0);

TH0 = HZ200 >> 8;

TL0 = HZ200;

TCON |= (1 << 4);

IE |= (1 << 7) | (1 << 1);

}