#include <reg52.h> #include <intrins.h>

#define uchar unsigned char #define uint unsigned int

sbit beep = P2^3; // 蜂鸣器控制引脚 sbit addBtn = P3^0; // 加分按钮 sbit subBtn = P3^1; // 减分按钮 sbit resetBtn = P3^2; // 复位按钮

uchar code segCode[] = { // 数码管显示段码 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };

uchar score = 50; // 初始分数

void delay(uint ms) { uint i, j; for (i = ms; i > 0; i--) for (j = 110; j > 0; j--); }

void displayScore(uchar num) { P0 = segCode[num / 10]; // 显示十位 P1 = 0xfe; // 打开第一个数码管 nop(); nop(); P1 = 0xff; // 关闭所有数码管 P0 = segCode[num % 10]; // 显示个位 P1 = 0xfd; // 打开第二个数码管 nop(); nop(); P1 = 0xff; // 关闭所有数码管 }

void main() { EA = 1; // 允许中断 ET0 = 1; // 允许定时器0中断 EX0 = 1; // 允许外部中断0 IT0 = 1; // 设置外部中断0为下降沿触发

TMOD = 0x01; // 设置定时器0为模式1
TH0 = 0xfc; // 定时器0初始值,12MHz晶振,50ms定时
TL0 = 0x18;
TR0 = 1; // 启动定时器0

while (1) {
    if (addBtn == 0) { // 检测加分按钮是否按下
        delay(10); // 延时去抖动
        if (addBtn == 0) {
            while (addBtn == 0); // 等待按钮释放
            if (score < 99) {
                score++; // 加分
                beep = 0; // 发出提示音
                delay(100);
                beep = 1;
            }
        }
    }

    if (subBtn == 0) { // 检测减分按钮是否按下
        delay(10); // 延时去抖动
        if (subBtn == 0) {
            while (subBtn == 0); // 等待按钮释放
            if (score > 0) {
                score--; // 减分
                beep = 0; // 发出提示音
                delay(100);
                beep = 1;
            }
        }
    }

    if (resetBtn == 0) { // 检测复位按钮是否按下
        delay(10); // 延时去抖动
        if (resetBtn == 0) {
            while (resetBtn == 0); // 等待按钮释放
            score = 50; // 复位分数为50
            beep = 0; // 发出提示音
            delay(100);
            beep = 1;
        }
    }

    displayScore(score); // 显示当前分数
}

}

void timer0_isr() interrupt 1 { TH0 = 0xfc; // 定时器0初始值,12MHz晶振,50ms定时 TL0 = 0x18; displayScore(score); // 定时刷新分数显示 }

void external0_isr() interrupt 0 { if (score < 99) { score++; // 加分 beep = 0; // 发出提示音 delay(100); beep = 1; } }

该代码使用51单片机实现了一个简单的电子记分牌,主要功能包括:

  1. 初始化: 设置晶振频率、初始分数、定时器和中断配置。
  2. 加分: 通过加分按钮按下触发,分数增加1,并发出提示音。
  3. 减分: 通过减分按钮按下触发,分数减少1,并发出提示音。
  4. 复位: 通过复位按钮按下触发,分数重置为50,并发出提示音。
  5. 分数显示: 使用定时器0每50ms刷新一次数码管显示当前分数。
  6. 提示音: 使用蜂鸣器在按钮按下时发出提示音。

代码使用中断机制实现按钮的检测和分数更新,使用定时器0定时刷新数码管的显示。

注意: 以上代码仅为示例,具体硬件电路和外设连接方式需要根据实际情况进行调整。

51单片机电子记分牌编程代码示例 - 详细解析及代码实现

原文地址: https://www.cveoy.top/t/topic/pAVf 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录