以下是使用51单片机实现电子记分牌,并在按键时蜂鸣器工作,松开按键时蜂鸣器停止工作的代码示例:

#include <reg51.h>

sbit buzzer = P1^0;  // 设置蜂鸣器连接的引脚

unsigned char score = 0;  // 记分牌初始值为0

// 延时函数
void delay(unsigned int time) {
    unsigned int i, j;
    for(i = 0; i < time; i++)
        for(j = 0; j < 125; j++);
}

// 按键检测函数
unsigned char keyScan() {
    unsigned char keyVal = 0xff;
    if(P2 != 0xff) {  // 检测到按键按下
        delay(10);  // 延时一段时间,消除按键抖动
        if(P2 != 0xff) {
            keyVal = P2;  // 获取按键值
            while(P2 != 0xff);  // 等待按键松开
        }
    }
    return keyVal;
}

// 数码管显示函数
void display(unsigned char num) {
    unsigned char code tubeTab[] = {
        0x3f,  // 0
        0x06,  // 1
        0x5b,  // 2
        0x4f,  // 3
        0x66,  // 4
        0x6d,  // 5
        0x7d,  // 6
        0x07,  // 7
        0x7f,  // 8
        0x6f   // 9
    };
    P0 = tubeTab[num];  // 显示数字
}

void main() {
    EA = 1;  // 允许中断
    EX0 = 1;  // 外部中断0使能
    IT0 = 1;  // 设置外部中断0为下降沿触发
    while(1) {
        display(score);  // 显示当前分数
        delay(1000);  // 延时1秒
    }
}

// 外部中断0中断服务函数
void int0_isr() interrupt 0 {
    score++;  // 每次按键分数加1
    buzzer = 1;  // 蜂鸣器工作
}

// 外部中断0中断服务函数
void int0_isr() interrupt 0 {
    score++;  // 每次按键分数加1
    buzzer = 1;  // 蜂鸣器工作
}

// 外部中断1中断服务函数
void int1_isr() interrupt 2 {
    score--;  // 每次按键分数减1
    buzzer = 1;  // 蜂鸣器工作
}

// 定时器0中断服务函数
void timer0_isr() interrupt 1 using 1 {
    TH0 = (65536 - 50000) / 256;  // 重新赋初值
    TL0 = (65536 - 50000) % 256;
    buzzer = !buzzer;  // 蜂鸣器状态翻转
}

以上代码实现了一个简单的电子记分牌,使用外部中断0和1分别实现加分和减分功能,同时在按键时蜂鸣器工作,在松开按键时蜂鸣器停止工作。记分牌的当前分数通过数码管进行显示


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

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