项目概述
这是一个基于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:用于精确时序控制
使用说明
-
系统初始化后,定时器开始工作
-
按下不同按键可以改变输出方波的频率
-
P2.1引脚输出可变频率的方波信号
逻辑分析仪PWM显示
实物演示
这个系统展示了51单片机的中断处理、定时器应用和IO控制等核心功能。