嵌入式第四十六天(51单片机(中断,定时器))

一.独立按键设置

cs 复制代码
#include "key.h"

void init_key(void)
{
	P1 |= (0x0F << 4);
}

int key_pressed(void)
{
	static int ret = 0;
	if((P1 & (1 << 4)) == 0)
	{
		ret = 1;
	}
	else if((P1 & (1 << 5)) == 0)
	{
		ret = 2;
	}
	else if((P1 & (1 << 6)) == 0)
	{
		ret = 3;
	}
		else if((P1 & (1 << 7)) == 0)
	{
		ret = 4;
	}
	else
	{
		ret = 0;
	}
	return ret;
}

二.外部中断

1.终端流程

2.代码编写

cs 复制代码
#include <reg52.h>
#include "delay.h"
#include "digtub.h"

void init_enit(void)
{
	IE |= (1<<7)|(1<<0)|(1<<2);
	TCON |= (1<<0)|(1<<2);
	TCON &= ~(1<<0);
	P3 |= (1<<2)|(1<<3);
}

int num = 0;

void enit0_hander(void) interrupt 0
{
	++num;
	if(num > 9999)
	{
		num = 0;
	}
}

void enit1_hander(void) interrupt 2
{
	--num;
	if(num < 0)
	{
		num = 9999;
	}
}

int main(void)
{
	init_enit();

	while(1)
	{
		show_number(num);	
	}
}

三.定时器

51单片机的定时器(如T0、TI)本质是可编程的16位计数器,核心功能是"计数"或"定时",原理基于"晶休振荡器提供的固定时钟信号"

核心原理拆解:

1.时钟来源

定时器的计数脉冲来自两个选择:

定时模式:脉冲来自单片机内部时钟 (由外部晶振分频得到),如晶振11.0592MHz时,内部时钟频率为11.0592MHz / 12 = 921.6kHz, 即每个计数脉冲的周期约1.08545(定时的最小单位))

计数模式:脉冲来自外部引脚(TO 对应P3.4、TI对应P3.5),引脚每发生一次电平跳变(下降沿),计数器加|(用于统计外部事件次数,如脉冲数),

2.计数器结构

定时器由两个8位寄存器(高8位THx、低8位TLx)组成16位计数器(x=0或1,对应TOTI),计数范围是0000H ~ FFFFH (共65536个计数单位)。

3.工作流程(以定时模式为例)

1.初始化:通过 TMOD寄存器设置定时器模式(如定时模式、16位自动重装),通过THx和TLX设置初始计数value(如要定时Ims,计算初始值后写入);

2.启动:设置TRx=1(TO的TRO、TI 的TRI),定时器开始以固定时钟脉冲计数,每来一个脉冲,TLx加1,TLx溢出时向THx进位,THx溢出时(计数器从初始值到FFFFH);

3.中断触发:计数器溢出后,自动置位"温出标志位"(TFx=1),若此时中断允许(ETx=1、EA=1),则触发定时器中断,CPU暂停主程序执行中断服务函数;

4.重装(可选):若设置为"自动重装模式"(如TMOD的M1 =1,M0=0),溢出后THx和TLx会自动恢复为初始值,无需在中断服务函数中手动重置,可实现周期性定时,

示例:11.0592MHz晶振下定时Ims

内部时钟周期:12 / 11059200Hz 1.085μs;

Ims所需计数次数:1000μs /1.085μS 元921;

16位计数器最大值65536,因此初始值:

65536 - 921 = 64615,转换为十六进制是FC67H,即THO=OxFC、TLO=0x67.

6、什么是PWM?

(1) PWM(脉冲宽度调制,Pulse Width

Modulation)

PWM是一种通过改变"脉冲信号的高电平时间

占比"来模拟模拟信号的技术,

比如:LED调光(高电平占比高则灯亮,占比

低则灯暗)、电机调速(占比高则转速快)

----核心是"用数字脉冲的'占比'替代连续的模拟电压",避免了模拟电路的精度问题,且易于单片机控制,

2.51单片机代码实现

cs 复制代码
#include <reg52.h>
#include "key.h"

#define Hz200 63035
#define Hz400 64285
#define Hz800 64910
#define Hz2000 65285

unsigned int n = Hz200;

void init_timer0(void)
{
	TMOD &= ~(3<<2);
	TMOD &= ~(3<<0);
	TMOD |= (1<<0);
	TH0 = n >> 8;
	TL0 = n;
	//TCON |= (1<<4);

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


/*void timer0_hander(void) interrupt 1
{
	static int t;
	++t;
	if(t >= 500)
	{
		P2 ^= 0xFF;
		t = 0;
	}
	TH0 = 64535 >> 8;
	TL0 = 64535;
} */

void timer1_hander(void) interrupt 1
{
	P2 ^= (1<<1);
    TH0 = n >> 8;
	TL0 = n;
}

int main(void)
{
	init_timer0();
	init_key();

	while(1)
	{
		int ret;
		ret = key_pressed();
		if(ret == 0)
		{
			TCON &= ~(1<<4);		
		}
		if(ret == 1)
		{
			n = Hz200;
			TCON |= (1<<4);
		}
		if(ret == 2)
		{
			n = Hz400;
			TCON |= (1<<4);
		}
		if(ret == 3)
		{
			n = Hz800;
		    TCON |= (1<<4);
		}
		if(ret == 4)
		{
			n = Hz2000;
			TCON |= (1<<4);
		}
	}
	return 0;
}

四.重点概念

1.中断:

当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完成以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。

中断源:

实现中断功能的部件称为中断系统,请示CPU中断的请求源称为中断源。微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求。

中断处理流程:

(1).中断源发出中断请求:

中断源通过特定信号,向 CPU 或内核发起 "需要即时处理" 的请求,触发中断流程。

(2).内核检查是否响应相应中断以及该中断是否被屏蔽:

内核通过查询中断控制器的配置,判断两要素:一是该中断是否在 "可响应中断列表" 内;二是该中断是否被 "中断屏蔽字" 禁用。

(3).内核会检查中断的中断优先级:

内核读取中断对应的优先级标识,判断其优先级是否高于当前正在执行任务的优先级 ------ 仅高优先级中断可 "抢占" 当前任务,低优先级则排队等待。

(4).保护现场:

内核将当前 CPU 寄存器的数值、当前任务的上下文保存至指定存储区,确保后续恢复后能回到中断前的执行状态。

(5).执行中断服务函数;

内核跳转到该中断对应的 "中断服务程序" 入口,执行预设的处理逻辑,这是中断的核心处理环节。

(6).恢复现场;

从存储区中取出步骤 4 保存的寄存器值和任务上下文,恢复 CPU 状态,让系统回到中断发生前的执行点,继续运行被中断的任务

3.中断嵌套:

当CPU正在处理一个中断源请求的时候(即执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。

4.中断向量表:

中断向量表是存储于内存固定地址的核心数据结构,其本质是建立 "中断号(唯一中断标识)" 与 "中断服务程序(ISR)入口地址" 的一一映射,为 CPU / 内核提供中断响应时快速定位服务程序的 "索引表",是中断机制高效寻址的基础。

5.51单片机的定时器工作原理:

51 单片机定时器本质是可编程减计数 / 加计数硬件模块,核心基于内部晶振分频后的时钟脉冲驱动,通过预设计数初值、配置工作模式,实现定时(按时间间隔触发)或计数(对外部脉冲计数)功能,溢出时可触发中断或输出信号。

6.PWM:

定义:

PWM(Pulse Width Modulation,脉冲宽度调制)是一种通过周期性输出高低电平脉冲信号,以调节高电平(有效电平)在一个周期内占比,从而等效控制输出 "平均电压 / 功率" 的数字信号调制技术。其核心是利用数字电路的离散电平,模拟出连续的模拟量输出效果,广泛应用于电机调速、灯光调光、电源稳压等场景。

核心参数:

周期、频率、占空比、分辨率、幅值。

相关推荐
无畏jh9 分钟前
TLE5012B磁阻芯片解读
嵌入式硬件·汽车嵌入式·磁阻芯片
培林将军17 分钟前
Altium Designer 22的安装与汉化
嵌入式硬件·ad工具安装
idcardwang19 分钟前
xl9555-IO拓展芯片
stm32·单片机·嵌入式硬件
Y1rong22 分钟前
STM32之EXTI
stm32·单片机·嵌入式硬件
兆龙电子单片机设计27 分钟前
【STM32项目开源】STM32单片机智能语音家居控制系统
stm32·单片机·嵌入式硬件·物联网·开源·自动化
TaidL1 小时前
茂捷M1020电感式编码器芯片赋能工业智能升级,适用于工业及机器人等领域的各种应用场景
单片机·嵌入式硬件
意法半导体STM321 小时前
【官方原创】SAU对NSC分区的影响 LAT1578
stm32·单片机·嵌入式硬件·mcu·信息安全·trustzone·stm32开发
SmartRadio1 小时前
MK8000(UWB射频芯片)与DW1000的协议适配
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网·dw1000
LDR0061 小时前
芯片电路的引脚标识代表什么?
stm32·单片机·嵌入式硬件
恒锐丰小吕2 小时前
屹晶微 EG3116 600V高压、2A/2.5A驱动、双高有效输入逻辑的半桥栅极驱动芯片技术解析
嵌入式硬件·硬件工程