51单片机-按键、蜂鸣器、定时器模块及中断

1.中断的基本概念

(1)概念

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

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

③中断系统:实现中断的功能的部件。

④中断源:请示CPU中断的请求源。

(2)中断处理流程

①中断源发出中断请求

②内核检查是否响应中断以及该中断是否被屏蔽

③内核会检查中断的中断优先级

④保护现场

⑤执行中断服务函数

⑥恢复现场

(3)中断向量表

中断向量表:存储中断函数的入口地址的数组

(4)代码

cs 复制代码
#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)代码

cs 复制代码
#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.按键模块

cs 复制代码
#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.蜂鸣器模块

cs 复制代码
#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)重要参数

参数 含义 影响
电压幅度 高电平的电压值 决定信号的驱动能力
频率 一秒钟内的周期数 决定控制的平滑度和稳定性,避免闪烁和噪音
占空比 高电平时间占周期的百分比 直接决定输出的平均电压/功率
分辨率 占空比可调节的精细程度 决定控制的精度和平滑度
相关推荐
CODECOLLECT2 小时前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen2 小时前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
全栈游侠5 小时前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件
Lsir10110_5 小时前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件
深圳市九鼎创展科技7 小时前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
辰哥单片机设计7 小时前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
小龙报9 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
范纹杉想快点毕业9 小时前
嵌入式与单片机开发核心学习指南——从思维转变到第一性原理的深度实践
单片机·嵌入式硬件
Industio_触觉智能9 小时前
瑞芯微RK3566开发板规格书,详细参数配置,型号EVB3566-V1,基于RK3566核心板SOM3566邮票孔封装
嵌入式硬件·开发板·rk3568·rk3566·核心板·瑞芯微
czwxkn9 小时前
4STM32(stdl)TIM定时器
stm32·单片机·嵌入式硬件