文章目录

一、项目概要

 二、硬件设计

2.1 核心器件清单 

2.2 电路连接方式

三、程序设计思路

四、编译下载与仿真演示

4.1 程序编译

4.2 仿真运行

五、项目小结


一、项目概要

本项目基于STC89C51单片机,采用线翻转法实现4×4矩阵按键的按键识别功能,将按键对应的键值(0~F)通过共阴极数码管实时显示,同时配合无源蜂鸣器实现按键提示音。

 二、硬件设计

2.1 核心器件清单 

1. 主控芯片:STC89C51单片机

2. 输入模块:4×4矩阵按键

3. 显示模块:1位共阴极数码管

4. 提示模块:无源蜂鸣器

5. 辅助电路:晶振电路(11.0592MHz)、复位电路、上拉排阻

2.2 电路连接方式

1. 单片机最小系统:晶振引脚接11.0592MHz晶振+22pF陶瓷电容,复位引脚接下拉电阻与按键,保证单片机正常启动与运行。

2. 4×4矩阵按键:全部引脚连接单片机P1口,其中P1.0~P1.3为列线,P1.4~P1.7为行线,采用线翻转法完成按键扫描。

3. 共阴极数码管:段码引脚(a~dp)连接单片机P0口,公共端接地,P0口外接上拉排阻增强驱动能力,实现0~F字符显示。

4. 无源蜂鸣器:直接连接单片机P3.0引脚,由IO口直接驱动发出提示音。

可参考如下图连接:

三、程序设计思路

1. 引脚与段码定义:定义蜂鸣器控制引脚P3.0,编写共阴极数码管0~F段码表,用于键值匹配显示。

2. 矩阵键盘扫描(线翻转法):第一步将列线置0、行线置1,读取行值判断按键所在行;第二步翻转电平,将行线置0、列线置1,读取列值判断按键所在列;通过行列值组合计算出唯一键值。 3. 按键消抖与处理:通过延时函数消除按键机械抖动,确保键值识别准确,识别成功后触发蜂鸣器短响提示。

4. 数码管显示:将计算得到的键值送入数码管段码表,通过P0口输出段码,实现对应字符实时显示。

5. 主函数逻辑:循环调用键盘扫描函数,获取键值后实时更新数码管显示,全程保持程序稳定运行。

源码可参考:

#include <reg51.h>
#include "delay.h"
// 引脚定义
sbit BEEP = P3^0;   // 无源蜂鸣器

// 共阴极数码管 0~F 段码
unsigned char code seg_table[] = {
    0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
    0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71
};

// 无源蜂鸣器响一声(发方波 PWM)
void beep(void) {
    unsigned int i;
    // 发一段方波,频率约1kHz
    for(i=0;i<100;i++) { 
        BEEP = 1;
        delay_us(80);
        BEEP = 0;
        delay_us(80);
    }
}

// 4x4 键盘扫描
unsigned char key_scan(void) {
    unsigned char row,col,val;

    P1 = 0x0F;//给行赋0,查看列
    if(P1 != 0x0F) {
        delay_ms(10);  // 消抖
        if(P1 != 0x0F) {           
            switch(P1) {
                case 0x0E: col=0; break;
                case 0x0D: col=1; break;
                case 0x0B: col=2; break;
                case 0x07: col=3; break;
                default: return 16;//无效值
            }
            P1 = 0xF0;//给列赋0,查看行
            switch(P1) {
                case 0xE0: row=0; break;
                case 0xD0: row=1; break;
                case 0xB0: row=2; break;
                case 0x70: row=3; break;
                default: return 16;//无效值
            }
            val = row*4 + col;
            while(P1 != 0xF0);  // 等待松开
            delay_ms(10);
            return val;
        }
    }
    return 16;//无效值
}

void main(void) {
    unsigned char key;
    BEEP = 0;
	  P0=0x00;
    while(1) {
        key = key_scan();
        if(key < 16) {
            P0 = seg_table[key];  // 显示键值
            beep();               // 无源蜂鸣器响一声
        }
    }
}

四、编译下载与仿真演示

4.1 程序编译

在Keil C51工程中,点击编译按钮,查看编译日志,无错误、无警告则代表程序编写正常。

4.2 仿真运行

1. 打开Proteus仿真电路,双击单片机芯片,导入Keil生成的HEX格式下载文件。

2. 启动仿真运行,按下矩阵键盘任意按键,单片机通过线翻转法识别按键,共阴极数码管立即显示对应键值(0~F),同时无源蜂鸣器发出短促提示音,松开按键后显示保持。

五、项目小结

通过此项目,掌握了51单片机IO口配置、矩阵键盘工作原理、线翻转法编程逻辑、共阴极数码管驱动及无源蜂鸣器控制方法。

最后,我已经把本次实验的完整源码、Proteus仿真文件、工程文件都整理好啦,需要的同学直接复制链接到百度网盘自取下载:

https://pan.baidu.com/s/1XmWvzCJF3f05ZQVayZDpfg?pwd=nvvc

⚠️ 特别提醒:本项目资料仅用于学习与技术交流分享,严禁用于任何商业用途或二次开发售卖,感谢理解!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐