应用——基于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控制等核心功能。

相关推荐
仰望星空的凡人19 小时前
探秘MCU最小系统中的晶振部分是如何工作的?
单片机·嵌入式硬件
羽获飞20 小时前
从零开始学嵌入式之STM32——8.流水灯
stm32·单片机·嵌入式硬件
蓬荜生灰1 天前
STM32(13)-- 位带操作
stm32·单片机·嵌入式硬件
哎呦 你干嘛~1 天前
plc单片机485通讯
单片机·嵌入式硬件
szxinmai主板定制专家1 天前
基于 PC 的控制技术+ethercat+linux实时系统,助力追踪标签规模化生产,支持国产化
arm开发·人工智能·嵌入式硬件·yolo·fpga开发
泡泡糖的中文规格书1 天前
【硬件设计】LM358DR2G中文文档深度解读:高质量翻译与芯片特性全解析
嵌入式硬件·规格说明书·电路设计·运放·中文翻译·datasheet
czwxkn1 天前
2STM32(stdl)GPIO输入
stm32·单片机·嵌入式硬件
码农三叔1 天前
(9-1)电源管理与能源系统:电池选择与安全
人工智能·嵌入式硬件·安全·机器人·能源·人形机器人
qq_246646192 天前
openclaw快速安装-windows版
windows·stm32·单片机
染予2 天前
13.AD软件操作:原理图如何导入PCB及导入常见错误
嵌入式硬件