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

相关推荐
UTP协同自动化测试8 小时前
物联网模组测试难点 |APP指令下发+UART 响应+GPIO 电平变化,如何一次性验证?
功能测试·嵌入式硬件·物联网·模块测试
yoyobravery9 小时前
蓝桥杯第15届单片机满分
单片机·职场和发展·蓝桥杯
4caf110 小时前
作业2:6位数码管静态显示
嵌入式硬件·51单片机
不做无法实现的梦~11 小时前
STM32解析PPM协议
stm32·单片机·嵌入式硬件
czhaii12 小时前
基于Arm Cortex-M7内核GD32H7
单片机·嵌入式硬件
番茄灭世神12 小时前
MCU开发常见软件BUG总结(持续更新)
c语言·stm32·单片机·嵌入式·gd32
wanghanjiett12 小时前
双轮平衡车建模及控制 2 PID控制原理与调参
嵌入式硬件·控制算法
EVERSPIN12 小时前
SQPI PSRAM为单片机提供RAM扩展方案
单片机·嵌入式硬件·psram·sqpi psram
Ar-Sr-Na13 小时前
STM32现代化AI开发指南-VSCode环境配置(macOS)
c语言·人工智能·vscode·stm32·嵌入式硬件·硬件工程
进击的小头13 小时前
第6篇:嵌入式芯片算力核心来源:多级流水线架构与指令并行机制详解
单片机·嵌入式硬件·架构