1.中断的基本概念
(1)概念
①中断:当中央处理器CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完之后,再回到原理被中断的地方,继续原来的工作。
②中断嵌套:当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序。
③中断系统:实现中断的功能的部件。
④中断源:请示CPU中断的请求源。
(2)中断处理流程
①中断源发出中断请求
②内核检查是否响应中断以及该中断是否被屏蔽
③内核会检查中断的中断优先级
④保护现场
⑤执行中断服务函数
⑥恢复现场
(3)中断向量表
中断向量表:存储中断函数的入口地址的数组
(4)代码
#include <reg52.h>
#include "delay.h"
#include "digital.h"
void init_enit(void)
{
IE |= (1 << 7) | (1 << 0) | (1 << 2);
P3 |= (1 << 2) | (1 << 3);
TCON &= ~((1 << 0) | (1 << 2));
}
int num = 0;
void eint0_handler(void) interrupt 0
{
++num;
if(num > 9999)
{
num = 0;
}
}
void eint1_handler(void) interrupt 2
{
--num;
if(num < 0)
{
num = 9999;
}
}
int main(void)
{
init_enit();
P2 = 0XFF;
while(1)
{
show_number(num);
}
return 0;
}
2.定时器模块
(1)工作原理
51单片机的定时器本质上是一个自动递增的16位计数器。其核心原理是通过对内部机器周期脉冲(定时模式)或外部引脚信号(计数模式)进行计数,并在计数器从初值累加至溢出(65536)时,通过硬件置位溢出标志位。程序员可通过查询该标志位或配置中断的方式,来执行所需的定时或计数任务,之后重置初值使其循环工作。由于整个过程由硬件独立完成,无需CPU持续参与,从而实现了精确定时和高效率的并行处理。
(2)工作流程
(3)代码
#include <reg52.h>
#include "key.h"
#define HZ400 64285
#define HZ200 63035
unsigned short n = HZ200;
void init_timer(void)
{
TMOD &= ~(0XFF << 0);
TMOD |= (1 << 0);
TH0 = n >> 8;
TL0 = n;
IE |= (1 << 7) | (1 << 1);
}
void timer0_handler(void) interrupt 1
{
static int t = 0;
++t;
if(t >= 500)
{
P2 ^= 0XFF;
t = 0;
}
/*
P2 ^= (1 << 1);
TH0 = n >> 8;
TL0 = n;
*/
}
int main(void)
{
init_timer();
init_key();
P1 &= ~(0X0F << 0);
while(1)
{
int key;
key = key_pressed();
if(key == 1)
{
n = HZ200;
TCON |= (1 << 4);
}
else if(key == 5)
{
n = HZ400;
TCON |= (1 << 4);
}
else if(key == 0)
{
TCON &= ~(1 << 4);
}
}
return 0;
}
3.按键模块
#include "key.h"
#include <reg52.h>
void init_key(void)
{
P1 |= (0X0F << 4);
P3 |= (1 << 5);
}
int key_pressed(void)
{
static int ret = 0;
if((P1 & (1 << 4)) == 0)
{
ret = 1;
}
else if((P3 & (1 << 5)) == 0)
{
ret = 2;
}
return ret;
}
4.蜂鸣器模块
#include <reg52.h>
#include "key.h"
#define HZ400 64285
#define HZ200 63035
unsigned short n = HZ200;
void init_timer(void)
{
TMOD &= ~(0XFF << 0);
TMOD |= (1 << 0);
TH0 = n >> 8;
TL0 = n;
IE |= (1 << 7) | (1 << 1);
}
void timer0_handler(void) interrupt 1
{ /*
static int t = 0;
++t;
if(t >= 500)
{
P2 ^= 0XFF;
t = 0;
}
*/
P2 ^= (1 << 1);
TH0 = n >> 8;
TL0 = n;
}
int main(void)
{
init_timer();
init_key();
P1 &= ~(0X0F << 0);
while(1)
{
int key;
key = key_pressed();
if(key == 1)
{
n = HZ200;
TCON |= (1 << 4);
}
else if(key == 5)
{
n = HZ400;
TCON |= (1 << 4);
}
else if(key == 0)
{
TCON &= ~(1 << 4);
}
}
return 0;
}
5.PWM
(1)基本概念
PWM,中文叫脉冲宽度调制。它是一种用数字信号来模拟模拟信号的有效技术。
核心思想: 通过快速开关数字信号,并改变一个周期内“开”(高电平)的时间比例,来控制输送到负载的平均功率。
(2)重要参数
参数 | 含义 | 影响 |
---|---|---|
电压幅度 | 高电平的电压值 | 决定信号的驱动能力 |
频率 | 一秒钟内的周期数 | 决定控制的平滑度和稳定性,避免闪烁和噪音 |
占空比 | 高电平时间占周期的百分比 | 直接决定输出的平均电压/功率 |
分辨率 | 占空比可调节的精细程度 | 决定控制的精度和平滑度 |