一、中断概念:
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);
}