news 2026/5/6 9:54:04

应用——基于51单片机的按键控制蜂鸣器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
应用——基于51单片机的按键控制蜂鸣器

项目概述

这是一个基于51单片机的按键控制蜂鸣器,包含按键控制、定时器中断、外部中断。

项目文件结构

1. 主程序文件 (main.c)

#include <reg51.h> #include "timer.h" #include "key.h" // 频率常数定义 #define HZ_200 63231 #define HZ_400 64383 #define HZ_600 64767 #define HZ_800 64959 #define HZ_1000 65074 int main() { timer0_init(); // 初始化定时器0 while(1) { int ret = key_press(); // 检测按键按下 if (ret == 1) g_i = HZ_200; // 按键1: 200Hz if (ret == 2) g_i = HZ_400; // 按键2: 400Hz if (ret == 3) g_i = HZ_600; // 按键3: 600Hz if (ret == 4) g_i = HZ_800; // 按键4: 800Hz } return 0; }

2. 按键控制模块

key.h 头文件
#ifndef _KEY_H_ #define _KEY_H_ extern unsigned int g_n; // 外部中断计数变量 // 函数声明 extern void key_init(void); extern int key_press(void); extern void int0_init(void); #endif
key.c 实现文件
#include <reg51.h> #include "key.h" unsigned int g_n = 0; // 全局中断计数变量 // 外部中断0处理函数 void int0_headler(void) interrupt 0 { g_n++; // 中断计数加1 } // 外部中断0初始化 void int0_init(void) { P3 |= (1 << 2); // 设置INT0引脚 IE |= (1 << 7); // 开启总中断允许 IE |= (1 << 0); // 开启外部中断0 TCON |= (1 << 0); // 设置中断触发方式 } // 按键初始化 void key_init(void) { P1 |= (0x0F << 4); // 设置P1.4-P1.7为输入 P3 |= (1 << 5); // 设置P3.5为输入 } // 按键检测函数 int key_press(void) { int ret = 0; if((P1 & (1 << 4)) == 0) ret = 1; // 按键1: P1.4 else if((P1 & (1 << 5)) == 0) ret = 2; // 按键2: P1.5 else if((P1 & (1 << 6)) == 0) ret = 3; // 按键3: P1.6 else if((P1 & (1 << 7)) == 0) ret = 4; // 按键4: P1.7 // else if ((P3 & (1 << 5)) == 0) ret = 5; // 按键5: P3.5(注释状态) return ret; }

3. 定时器模块

timer.h 头文件
#ifndef __TIMER_H_ #define __TIMER_H_ extern unsigned int g_i; // 定时器重载值变量 extern void timer0_init(void); #endif
timer.c 实现文件
#include <reg51.h> #include "timer.h" unsigned int g_i = 0; // 定时器重载值 // 定时器0中断处理函数 void timer0_handler(void) interrupt 1 { TH0 = g_i >> 8; // 重载高8位 TL0 = g_i; // 重载低8位 P2 ^= (1 << 1); // P2.1引脚取反,产生方波 // 注释掉的LED控制代码 // g_i++; // if(g_i >= 500) // { // led_nor(); // g_i = 0; // } } // 定时器0初始化 void timer0_init(void) { TMOD &= ~(0x0F << 0); // 清除定时器0模式位 TMOD |= (1 << 0); // 设置定时器0为模式1(16位定时器) TH0 = g_i >> 8; // 初始化定时器高8位 TL0 = g_i; // 初始化定时器低8位 TCON |= (1 << 4); // 启动定时器0 IE |= (1 << 7); // 开启总中断允许 IE |= (1 << 1); // 开启定时器0中断 }

系统功能说明

1. 按键功能

  • 4个独立按键:P1.4-P1.7引脚

  • 按键检测:轮询方式检测按键状态

  • 功能分配:每个按键对应不同的输出频率

2. 定时器功能

  • 工作模式:定时器0,模式1(16位定时器)

  • 中断功能:定时产生方波信号

  • 频率控制:通过改变重载值g_i实现不同频率输出

3. 中断系统

  • 外部中断0:用于计数功能

  • 定时器中断0:用于精确时序控制

使用说明

  1. 系统初始化后,定时器开始工作

  2. 按下不同按键可以改变输出方波的频率

  3. P2.1引脚输出可变频率的方波信号

逻辑分析仪PWM显示

实物演示

这个系统展示了51单片机的中断处理、定时器应用和IO控制等核心功能。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 7:54:41

运维噩梦?揭秘MINIO在生产环境的七大痛点

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个运维痛点诊断工具&#xff0c;输入&#xff1a;1) 集群规模 2) 当前问题描述 3) 监控数据。输出&#xff1a;1) 根因分析报告 2) 紧急处理方案 3) 长期优化建议 4) Promet…

作者头像 李华
网站建设 2026/4/26 13:34:27

AXURE RP高效技巧:比传统设计快3倍的秘诀

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个AXURE RP效率工具包&#xff0c;包含&#xff1a;1.常用组件库模板 2.自动化脚本集合 3.样式管理插件 4.团队协作工作流指南 5.设计规范检查工具。使用AXURE RP插件API开发…

作者头像 李华
网站建设 2026/4/21 20:22:25

数据库管理入门:从零开始不用Navicat17

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个面向新手的数据库管理教学网页应用&#xff0c;包含&#xff1a;1) 基础SQL教程 2) 在线练习环境 3) 可视化查询构建器 4) 学习进度跟踪。使用SQLite作为教学数据库&#…

作者头像 李华
网站建设 2026/4/17 20:40:12

企业级VS Code插件离线部署实战指南

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个企业级VS Code插件离线部署系统&#xff0c;针对金融行业开发环境需求&#xff0c;包含以下功能&#xff1a;1. 插件仓库镜像同步 2. 批量导出/导入插件 3. 权限管理系统 …

作者头像 李华
网站建设 2026/5/5 15:27:53

CANOE零基础入门:从安装到第一个测试项目

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个CANOE入门教学项目&#xff0c;包含&#xff1a;1.简单的汽车灯光控制系统仿真(远光/近光/转向灯) 2.基础CAPL脚本示例 3.分步骤的教程注释 4.测试验证环节。要求界面简洁…

作者头像 李华
网站建设 2026/5/5 7:20:05

一个合格的网络工程师,这些工具基本都要会用

在很多刚入行的同事眼里,网络工程师的核心能力,往往等同于“会敲命令”“记得住配置”。 但实际工作几年后你会发现,命令只是基础,真正决定效率和排障质量的,是你会不会用工具。 网络规模越来越大,设备越来越多,云、虚拟化、安全、自动化不断叠加,如果还停留在“全靠…

作者头像 李华