目录
[2.5定时器/计数器配置示例(以定时器 0 为例)](#2.5定时器/计数器配置示例(以定时器 0 为例))
1、中断
1.1中断核心概念
- 中断概念:当CPU执行某个任务时,外界发生了一个紧急事件,要求CPU放下当前的任务,转而去执行这个更为紧急的事件,执行完紧急事件后再回到原来被打断的地方继续向下执行
- 中断源::打断CPU执行当前任务的源头/事件(如按键电平变化、定时器溢出);
- 中断优先级 :多个中断同时触发时,CPU 优先处理优先级高的中断;(所有的
中断都具有四个中断优先级(基本型只有两个)。) - 中断嵌套:CPU在处理一个中断任务的时候,能够去执行另外的一个更高中断优先级的任务(51单片机中最多允许嵌套两层,im6ull不允许中断嵌套)。(有中断嵌套功能的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。)
- 5个中断源:外部中断0、外部中断1、定时器0、定时器1、串口(im6ull有1024个中断源)。

- 中断应用:随着计算机技术的应用,人们发现中断技术不仅解决了快速主机与慢速 I/O设备的数据传送问题,而且还具有如下优点:
- ①分时操作。CPU 可以分时为多个 I/O 设备服务,提高了计算机的利用率;
- ②实时响应。CPU 能够及时处理应用系统的随机事件,系统的实时性大大增强,如下图系统;

- ③可靠性高。CPU 具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性提高。
- 中断查询次序表如下:

以 51 单片机均有的 5 个中断来介绍,其内部结构框图如下所示:

- 中断处理流程
- 中断源发出中断请求
- 检查CPU是否允许中断及该中断源是否被屏蔽
- 比较中断优先级
- 保护现场
- 执行中断处理函数(回调函数,根据中断号)
- 恢复现场
1.2中断相关寄存器
- (1)中断允许控制:CPU 对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器 IE 控制的。(下图标黑的是要用的)
EX0(IE.0),外部中断 0 允许位;
ET0(IE.1),定时/计数器 T0 中断允许位;
EX1(IE.2),外部中断 0 允许位;
ET1(IE.3),定时/计数器 T1 中断允许位;
ES(IE.4),串行口中断允许位;
EA (IE.7), CPU 中断允许(总允许)位。
- (2)中断请求标志TCON
IT0(TCON.0),外部中断 0 触发方式控制位。
当 IT0=0 时,为电平触发方式。
当 IT0=1 时,为边沿触发方式(下降沿有效)------通常使用外部中断都是配置为下降沿触发
IE0(TCON.1),外部中断 0 中断请求标志位。
IT1(TCON.2),外部中断 1 触发方式控制位。
IE1(TCON.3),外部中断 1 中断请求标志位。
TF0(TCON.5),定时/计数器 T0 溢出中断请求标志位。
TF1(TCON.7),定时/计数器 T1 溢出中断请求标志位。
- (3)中断优先级
- 优先级相同,按下图顺序排列
- 中断号------就是默认的优先级顺序号

注意 :51 中断不是靠 "函数名" 找,是靠【中断号 / 中断向量】 。编译器看到 interrupt 1,就会自动把这个函数地址填到 0x000B 中断向量, 函数名叫什么、放哪个文件,根本不重要。++中断函数可以分散放在工程里任意 .c 文件,不需要声明、不需要头文件、不需要 extern,只要 interrupt 号对,就能正常执行。++
1.3示例
以外部中断 0 为例,如下:
cpp
//外部中断0初始化函数
void exti0_init(void)
{
IT0=1;//跳变沿触发方式(下降沿)。若置1则为电平触发
EX0=1;//打开 INT0 的中断允许
EA=1;//打开总中断
}
//中断服务函数:
//函数名:int0 ,可自定义
//中断关键字: interrupt
//中断号: 0
void exti0() interrupt 0
{
//编写用户所需的功能代码
}
- 要让 51 单片机发生中断必须要满足以下 3 个条件,这 3 个条件的顺序可以任意:
①中断源有中断请求;
②此中断源的中断允许位为 1;
③CPU 开中断(即 EA=1)。
2.定时器/计数器(∵既可以定时,又可以计数)
2.1CPU时序的有关知识
- ①振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)。
- ②状态周期:2 个振荡周期为 1 个状态周期,用 S 表示。振荡周期又称 S 周期或时钟周期。
- ③机器周期:1 个机器周期含 6 个状态周期,12 个振荡周期。
- ④指令周期:完成 1 条指令所占用的全部时间,它以机器周期为单位。
例如:外接晶振为 12MHz 时,51 单片机相关周期的具体值为:
振荡周期=1/12us;
状态周期=1/6us;
机器周期=1us;
指令周期=1~4us;
2.2定时器/计数器基础知识
- 51 单片机有两组定时器/计数器,,分别是Timer0和Timer1,是自增型定时器. 因为既可以定时,又可以计数,故称之为定时器/计数器。
- 定时器/计数器和单片机的 CPU 是相互独立的。定时器/计数器工作的过程是自动完成的,不需要 CPU 的参与。
- 有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加 1 的工作可以交给定时器/计数器处理。CPU 转而处理一些复杂的事情。同时可以实现精确定时作用。
2.3单片机定时器/计数器原理
定时/计数器的实质 :加 1 计数器(16 位),由高 8 位和低 8 位两个寄存器 THx 和 TLx 组成。它随着计数器的输入脉冲进行自加 1,也就是每来一个脉冲,计数器就自动加 1 ,当加到计数器为全 1 时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置 1 ,向 CPU 发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;
如果工作于计数模式,则表示计数值已满。
2.4定时器/计数器相关寄存器
51 单片机定时器/计数器内部结构如下所示:

工作方式寄存器TMOD:
用于设置定时/计数器的工作方式,低四位用于 T0,高四位用于 T1。其格式如下:

GATE 是门控位, GATE=0 时,用于控制定时器的启动是否受外部中断源信号的影响。只要用软件使 TCON 中的 TR0 或 TR1 为 1,就可以启动定时/计数器工作;(一般配置为0)
GATA=1 时,要用软件使 TR0 或 TR1 为 1,同时外部中断引脚 INT0/1 也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了 INT0/1 引脚为高电平这一条件。
C/T :定时/计数模式选择位。C/T =0 为定时模式;C/T =1 为计数模式。
M1M0:工作方式设置位。定时/计数器有四种工作方式。

方式0:计数初值与计数个数的关系为:X=2^13-N
方式1:X=2^16-N
方式2:X=2^8-N
方式3:少用,所以不介绍
控制寄存器TCON:
TCON 的低 4 位用于控制外部中断,已在前面介绍。TCON 的高 4 位用于控制定时/计数器的启动和中断申请。其格式如下:

TF1(TCON.7):T1 溢出中断请求标志位。T1 计数溢出时由硬件自动置 TF1为 1。CPU响应中断后 TF1 由硬件自动清 0 。T1 工作时,CPU 可随时查询 TF1 的状态。所以,TF1 可用作查询测试的标志。TF1 也可以用软件置 1 或清 0,同硬件置 1 或清 0 的效果一样。
TR1(TCON.6):T1 运行控制位。TR1 置 1 时,T1 开始工作;TR1 置 0 时,T1 停止工作。TR1 由软件置 1 或清 0 。所以,用软件可控制定时/计数器的启动与停止。
TF0(TCON.5):T0 溢出中断请求标志位,其功能与 TF1 类同。
TR0(TCON.4):T0 运行控制位,其功能与 TR1 类同。
2.5定时器/计数器配置示例(以定时器 0 为例)
cpp
/*******************************************************************************
* 函 数 名: time0_init
* 函数功能: 定时器 0 中断配置函数,通过设置 TH 和 TL 即可确定定时时间
* 输入: 无
* 输出: 无
*******************************************************************************/
void time0_init(void)
{
TMOD|=0X01;//①选定时器及其模式:选择为定时器 0 模式,工作方式 1
TH0=0XFC;//②给定时器赋初值:定时 1ms
TL0=0X18;
ET0=1;//③打开定时器 0 中断允许
EA=1;//④打开总中断
TR0=1;//⑤打开定时器
}
void time0() interrupt 1//定时器 0 中断函数
{
static u16 i;//定义静态变量 i。使用static关键字就相当于将i变成了一个全局变量功能。
TH0 = 0XFC;//给定时器赋初值,定时 1ms
TL0 = 0X18;
i++;
if(i == 1000)
{
i = 0;
LED1 = !LED1;
}
}
实用求初值工具:①51 定时器计算.exe
②STC-ISP:
③问AI
3.PWM
核心概念
- PWM 周期:一个完整方波的时间(从上升沿到下一个上升沿),决定信号的频率(频率 = 1 / 周期);
- PWM 占空比:高电平在一个周期内所占的时间比例(如占空比 50% 表示高电平与低电平时间相等);
- 核心作用:通过调整占空比模拟 "渐变" 效果(如 LED 亮度调节、直流电机调速),通过调整周期改变信号频率(如蜂鸣器音调)。
蜂鸣器
- 应用:广泛应用于计算机、 打印机、 复印机、 报警器、 电子玩具、 汽车电子设备、 电话机、 定时器等电子产品中作发声器件。
- 分类:
- 压电式蜂鸣器(也是无源蜂鸣器)------改变频率就可以调节蜂鸣器音调;改变输出电平的高低电平占空比,则可以改变蜂鸣器的声音大小。
- 电磁式蜂鸣器(也是有源蜂鸣器)。
- 实物图:

- 原理图:

-
驱动:蜂鸣器驱动需要约 30mA,需要三极管或者 ULN2003 芯片来驱动
-
高级应用:蜂鸣器播放音乐
直流电机
- 直流电机:指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。
- 驱动芯片:ULN2003 驱动芯片,是一个单片高电压、高电流的达林顿晶体管阵列集成电路。可以用来驱动直流电机、五线四相步进电机,比如 28BYJ-48 步进电机。
主要应用:继电器驱动器,字锤驱动器,灯驱动器,显示驱动器(LED 气体放电),线路驱动器和逻辑缓冲器。
主要特点:
①500mA 额定集电极电流(单个输出)
②高电压输出:50V
③输入和各种逻辑类型兼容
④继电器驱动器
原理图:
注意:①因为ULN2003的输出是集电极开路,ULN2003要输出高电平,必须在输出口外接上拉电阻。②只可实现单方向控制,电机一端接电源正极,另一端接芯片的输出口。若想控制五线四相步进电机,则可将四路输出接到步进电机的四相上,电机另一条线接电源正。
- 5V 直流电机,其主要参数如下:
电压:1-6V
参考电流:0.35-0.4A
3V 转速:17000-18000 转每分钟
外观实物图如下:
步进电机
概念:步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。
特点:
- 当定子的矢量磁场旋转一个角度,转子也随着该磁场转步距角。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。
- 步进电机只有周期性的误差而无累计误差等特点。
- 在速度、位置等控制领域用步进电机来控制变的非常的简单。它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。
- 它输出的角位移 与输入的++脉冲数++ 成正比、转速 与++脉冲频率++ 成正比。改变绕组通电的顺序,可以改变旋转方向。
控制 :可以控制脉冲数量 、频率 及电动机各相绕组的通电顺序来控制步进电机的转动。
28BYJ48 步进电机旋转驱动方式如下表:
28BYJ48 步进电机主要参数如下所示:
28BYJ48 步进电机:
- 自带减速器,为四相无线步进电机
- 外观实物图及内部结构等效图如下:








