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

相关推荐
Moonquakes5403 小时前
嵌入式基础学习笔记(51)
笔记·单片机·学习
小鱼23333 小时前
STM32中的中断机制与应用
c语言·stm32·单片机·嵌入式硬件·mcu
爱潜水的小L3 小时前
自学嵌入式day44,51单片机
单片机·嵌入式硬件
v先v关v住v获v取3 小时前
ZY8600-25-50型掩护式液压支架设计支撑6张cad+设计说明书
科技·单片机·51单片机
宵时待雨3 小时前
STM32笔记归纳1:STM32的基本信息与引脚分布
笔记·stm32·嵌入式硬件
CS Beginner3 小时前
STM32F103ZET6中I2C、SPI和USART
单片机
阿华hhh3 小时前
单片机day1
c语言·单片机·嵌入式硬件
思茂信息4 小时前
CST电动汽车EMC仿真(三)——初探轴电压
运维·服务器·单片机·嵌入式硬件·cst·电磁仿真·天线仿真
Xx香菜4 小时前
单片机—2
单片机·嵌入式硬件