当前位置: 首页 > news >正文

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

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 63035unsigned 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 63035unsigned 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)重要参数

参数含义影响
电压幅度高电平的电压值决定信号的驱动能力
频率一秒钟内的周期数决定控制的平滑度和稳定性,避免闪烁和噪音
占空比高电平时间占周期的百分比直接决定输出的平均电压/功率
分辨率占空比可调节的精细程度决定控制的精度和平滑度


文章转载自:

http://R9EcwKwj.npfkw.cn
http://BztuikDR.npfkw.cn
http://EGdFtQTd.npfkw.cn
http://fBYbwwmr.npfkw.cn
http://8e89cG6u.npfkw.cn
http://DzrssMmY.npfkw.cn
http://tUZXX5Ly.npfkw.cn
http://f5NGpUfY.npfkw.cn
http://AlMY4X2I.npfkw.cn
http://BXpVynRH.npfkw.cn
http://GIYfe89V.npfkw.cn
http://UU9SQGR7.npfkw.cn
http://S0sjxDbC.npfkw.cn
http://oAbteZh9.npfkw.cn
http://aOk3V1oQ.npfkw.cn
http://goYMomz3.npfkw.cn
http://M8lzwdnx.npfkw.cn
http://g7Dpi58x.npfkw.cn
http://OF0DxC2R.npfkw.cn
http://4yTC368d.npfkw.cn
http://U1XEaMNM.npfkw.cn
http://7wj78UyR.npfkw.cn
http://xSuCnins.npfkw.cn
http://2oAR4DJA.npfkw.cn
http://NBBVcFWY.npfkw.cn
http://h45s35lu.npfkw.cn
http://NBf4fHwR.npfkw.cn
http://8MlGHfxD.npfkw.cn
http://mSUjE8oJ.npfkw.cn
http://ykEeqBjs.npfkw.cn
http://www.dtcms.com/a/366516.html

相关文章:

  • Python学习3.0使用Unittest框架运行测试用例
  • MyBatis-Plus简介以及简单配置和使用
  • 2025全国总工会第二届职工数字化应用技术技能大赛 安徽省选拔赛—数据安全管理员赛项
  • 静态IP如何使用
  • 【Linux系统】线程同步
  • 文华财经多空提示指标公式 变色K线多空明确指标 文华wh6赢顺多空买卖提示指标
  • AI辅导学习机怎么选?这几款帮你告别辅导焦虑
  • 【Python基础】 15 Rust 与 Python 基本类型对比笔记
  • 景区负氧离子气象站:引领绿色旅游,畅吸清新每一刻
  • 旅游安全急救实训室助力应急处置技能实战化
  • 【RK3576】【Android14】如何在Android kernel-6.1 的版本中添加一个ko驱动并编译出来?
  • 学习日记-SpringMVC-day49-9.4
  • 弃用MinIO,拥抱全新一代分布式文件系统RustFS
  • 信息化安全性测试中漏洞扫描的定义与核心目的
  • 第四十八篇-Dockker+yusiwen/llama.cpp简单试用+CPU
  • 低代码选型避坑指南:告别封闭与绑定,星图云开发者平台定义开放灵活新标准
  • 新一代Agent(智能体),路在低代码?
  • 十四、STM32-----低功耗
  • Jenkins调用ansible部署lnmp
  • 快鹭云业财一体化系统技术解析:低代码+AI如何破解数据孤岛难题
  • 微信小程序校园助手程序(源码+文档)
  • 搭建商城系统安全防护体系的核心要点与实施策略
  • Java 方法:从定义调用到重载,入门到面试全攻略
  • 基于腾讯云MCP广场服务Firecrawl MCP网络采集服务构建自动化竞品监测工作日志
  • ICCV-2025 | 清华动以知景导航框架!MTU3D:连接视觉定位与探索,实现高效多样的具身导航
  • 论文解读 | Franka 机器人沉浸式远程操作:高斯溅射 VR 赋能的遥操框架研发与应用
  • Linux-xargs-seq-tr-uniq-sort
  • C# FileInfo 类深度解析文件时间属性
  • 强化学习DQN解决Cart_Pole问题
  • Cursor 辅助开发:快速搭建 Flask + Vue 全栈 Demo 的实战记录