首页 > 其他分享 >51单片机数码管显示的计数器,按键按下暂定,再次按下继续。(按键功能使用中断实现)

51单片机数码管显示的计数器,按键按下暂定,再次按下继续。(按键功能使用中断实现)

时间:2024-06-11 15:59:35浏览次数:13  
标签:服务程序 中断 计数器 数码管 按下 按键

1、功能描述

数码管显示的计数器,按键按下暂定,再次按下继续。(按键功能使用中断实现)

2、实验原理

·  按键与中断:使用单片机的外部中断功能来检测按键动作,实现非阻塞的按键检测。

·  中断服务程序:编写中断服务程序来处理按键动作,切换暂停和继续的状态。

·  动态显示:通过分时控制两个数码管(或一个数码管的两个位置)来动态显示计数器的值。

3、编程思路

·  主循环:在主循环中,根据暂停标志位决定是否继续计数和更新数码管显示。

·  显示逻辑:编写数码管显示函数,用于显示计数器的当前值。由于只有一个数码管,需要实现动态扫描来交替显示十位和个位的数字。

·  中断服务程序: 在按键按下时,通过中断服务程序切换暂停标志位。使用边沿检测机制来避免抖动和多次触发的问题。

· 去抖动处理:在中断服务程序中加入防抖动逻辑,确保按键状态稳定后再进行处理。

·  暂停与继续:

当暂停标志位为非激活状态时,单片机继续计数并更新数码管显示。

当暂停标志位为激活状态时,单片机停止计数,但可以通过再次按下按键来继续计数。

4、代码

#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int

sbit k3 = P3^2;    // 连接到P3.2的按键
bit pause_flag = 0; // 定义一个标志位,用于控制计数器的暂停和继续

uchar count = 0; // 计数器变量

// 延时函数
void delay(uint xms) {
    uint i, j;
    for (i = xms; i > 0; i--)
        for (j = 110; j > 0; j--);
}

// 数码管显示函数
void display(uchar num) {
    uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
    P0 = table[num]; // 显示数码管
}

// 外部中断0服务程序
void external0_isr() interrupt 0 {
    if (k3 == 0) { // 检测按键是否按下
        pause_flag = !pause_flag; // 切换暂停标志位
        while (k3 == 0); // 等待按键释放
    }
}

void main() {
    // 初始化设置
    IT0 = 1; // 设置INT0为边沿触发
    EX0 = 1; // 使能INT0中断
    EA = 1;  // 使能全局中断
    P0 = 0x3f; // 初始数码管显示0

    while (1) {
        if (!pause_flag) { // 检查是否处于暂停状态
            display(count / 10); // 显示计数器的十位数
            display(count % 10); // 显示计数器的个位数
            count++; // 计数器增加
            delay(1000); // 计数间隔延时
        }
    }
}

标签:服务程序,中断,计数器,数码管,按下,按键
From: https://blog.csdn.net/ylazzy/article/details/139566035

相关文章

  • 按键中断驱动程序-异步通知
    在前面的休眠-唤醒、POLL机制中,都是通过休眠等待某一个事件的发生,而程序一旦陷入休眠,就没法再执行其它任务,相当于整个程序卡死了。在很多的场景中,如果发生了某一个事件我们就去处理它,没有发生事件那就可以做其它的事情。这种正常执行程序,当中断发生时才去执行的方式就叫做异步通知......
  • 【esp32 项目】中断读取按键
    原理图:图 按键部分图 单片机部分程序:KEY_USR 引脚配置成上拉输入在Arduino中,配置一个IO为上拉输入可以使用pinMode()函数和digitalWrite()函数。pinMode()函数用于设置引脚模式,而digitalWrite()函数用于设置上拉电阻。以下是一个示例代码,展示如何将Arduino的数字引脚3配......
  • 数码管
    /******************************************************************************此程序是依据吴坚鸿程序框架,在普中51A2单片机开发板上的程序练习程序目标:数码管显示*******************************************************************************/#include<REG51.H>......
  • 51单片机独立按键控制流水灯,按一次左流水,再按一次反向流水
    1、功能描述独立按键控制流水灯,按一次左流水,再按一次反向流水2、实验原理单片机的I/O口可以通过编程设置为输入或输出模式。在流水灯实验中,我们将I/O口配置为输出模式,用于控制LED灯的亮灭。同时,我们还需要一个输入口来检测按键的状态,以实现按键控制流水灯的功能。流水灯的效......
  • 51单片机独立按键控制LED灯,按键按一次亮,再按一次灭
    1、功能描述独立按键控制LED灯,按键按一次亮,再按一次灭2、实验原理轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动米实现接通和断开;独立按键原理图如下:其在MCU上的位置如下所示:由上面两张图可以知道,独立按键......
  • 402、基于51单片机的火灾报警(3房间,温度,数码管)(程序+Proteus仿真+原理图+流程图+元器件
    毕设帮助、开题指导、技术解答(有偿)见文未目录方案选择单片机的选择一、设计功能二、Proteus仿真图单片机模块设计三、原理图四、程序源码资料包括:需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。方案选择单片机的选择方......
  • 按键中断驱动程序-poll机制
    前言:学东西的时候总是喜欢碎碎念,去思考该怎么学。关于嵌入式开发,以前就觉得嵌入式只是一个工具,关键还是结合专业知识赋能,比如控制、信号处理、神经网络、计算机网络、各种协议比如蓝牙、wifi,音视频,当然,如果能够把内核学的很透彻,那也是很了不起的。现在越学越觉得这个东西应该就是......
  • STC8H2K系列采用ADC功能实现轻触感应按键(无需电阻电容二极管)
    有感于8H2K系列不自带触摸控制器按键功能(8H4K,8H8K自带),如果要实现这个功能需要使用官方建议的两个IO口(一个PWM另一个ADC)还有一堆外围元器件(电阻电容二极管),这样的设计确实繁琐而且累赘,占用空间也大(如果有这空间我也不会选8H2K)。参考了另一个网友设计,线路减少到一个电容一个电阻,......
  • 一个问题:六位八段数码管(Verilog)
    【基本信息】需求:verilog程序,显示任意六位字符或数值,包含点号,且能够按需点亮位数。(学习篇)芯片型号:cycloneⅣEP4CE10F17C8数码管属性:六位、八段【最终成果图】经过多轮测试,最后代码程序满足设计要求,但结合仿真发现了一个问题,仿真和上机不匹配,当然还是要以上机为准。【模块......
  • Verilog设计实现七段数码管译码器的设计
    七段数码管常用于计时器、拨码开关输入、班级和学号等信息的显示,通过控制不同的段亮灭,可以实现各种数字和字符的显示。七段数码管通常由a-g七个段组成,每一段对应一个LED。为了显示不同的数字,需要控制这些LED的亮灭。图1七段数码管为了控制这些LED的亮灭,需要设计一个显示译......