嵌入式第四十六天(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,脉冲宽度调制)是一种通过周期性输出高低电平脉冲信号,以调节高电平(有效电平)在一个周期内占比,从而等效控制输出 "平均电压 / 功率" 的数字信号调制技术。其核心是利用数字电路的离散电平,模拟出连续的模拟量输出效果,广泛应用于电机调速、灯光调光、电源稳压等场景。

核心参数:

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

相关推荐
嵌入式牛马在努力帮老板娶老婆4 小时前
十三、STM32----LCD屏驱动
stm32·嵌入式硬件·计算机外设
Skylar_.4 小时前
嵌入式 - 硬件:51单片机(3)uart串口
单片机·嵌入式硬件·51单片机
今天阳光明媚吗4 小时前
STM32启动模式配置
stm32·单片机
@ZzHhXx5 小时前
嵌入式学习---(单片机)
单片机·嵌入式硬件·学习
世微 如初5 小时前
精准掌控功率流动:AP3465 同步降压芯片的设计艺术
单片机·嵌入式硬件
CC呢5 小时前
基于单片机智能水龙头/智能洗漱台设计
stm32·单片机·嵌入式硬件·单片机设计
彭祥.5 小时前
Mid-360 雷达获取数据并使用 Open3d+python 进行可视化
单片机·嵌入式硬件
芯岭技术5 小时前
XL5300测距模组与XL32F001/PY32F030单片机测距 最大7.6M距离测量
单片机·嵌入式硬件
m0_571372825 小时前
关于嵌入式学习——嵌入式硬件3
嵌入式硬件·学习