找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 709|回复: 5
打印 上一主题 下一主题
收起左侧

新手求助八位抢答器

[复制链接]
跳转到指定楼层
楼主
ID:1135711 发表于 2024-11-6 20:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有没有大佬做过八位抢答器,有什么需要注意的吗,如果从零开始我们需要如何去做。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:404160 发表于 2024-11-7 11:15 | 只看该作者
八位抢答器带锁定功能。一旦有选手按下按钮,我们将锁定其他按钮,直到主持人清除锁定状态。以下是C51代码:

```c
#include <reg51.h>

#define uchar unsigned char
#define uint unsigned int

// 假设P1是输入端口,连接抢答按钮,P0是输出端口,连接显示
sbit Buzzer = P3^7; // 假设P3.7连接蜂鸣器
bit isLocked = 0;   // 锁定状态标志

uchar code LED_Code[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; // 8位LED显示代码

// 延时函数
void Delay(uint z) {
    uint i, j;
    for (i = z; i > 0; i--)
        for (j = 120; j > 0; j--);
}

// 检测是否有人抢答并返回抢答的选手编号,如果没有返回0xFF
uchar CheckAnswer() {
    uchar i;
    if (!isLocked && P1 != 0xFF) { // 检测是否锁定状态,以及是否有按键按下
        Delay(10000); // 延时去抖
        if (P1 != 0xFF) { // 再次检测确保按键确实被按下
            for (i = 0; i < 8; i++) {
                if (P1 & LED_Code[i] == 0) { // 检测具体哪个按键被按下
                    isLocked = 1; // 设置锁定状态
                    P0 = LED_Code[i]; // 显示对应的LED
                    Buzzer = 1; // 蜂鸣器响
                    Delay(20000); // 延时
                    Buzzer = 0; // 蜂鸣器停
                    return i; // 返回抢答的选手编号
                }
            }
        }
    }
    return 0xFF; // 没有选手抢答或系统已锁定
}

// 主函数
void main() {
    P0 = 0xFF; // 初始化P0端口,关闭所有LED
    isLocked = 0; // 初始化锁定状态为未锁定
    while (1) {
        uchar answer = CheckAnswer(); // 检测是否有人抢答
        if (answer != 0xFF) { // 如果有人抢答
            // 这里可以添加主持人清除锁定状态的逻辑
            // 例如,当P3.6被按下时,清除锁定状态
            if (P3^6 == 0) { // 假设P3.6连接主持人的清除按钮
                Delay(10000); // 延时去抖
                if (P3^6 == 0) { // 再次检测确保按钮确实被按下
                    isLocked = 0; // 清除锁定状态
                    while (P3^6 == 0); // 等待按钮释放
                }
            }
        }
    }
}
```

在这个代码中,全局变量`isLocked`来表示锁定状态。当有选手抢答成功后,`isLocked`被设置为1,这样其他按钮的输入将被忽略,直到主持人通过按下P3.6按钮来清除锁定状态。
回复

使用道具 举报

板凳
ID:619259 发表于 2024-11-7 11:21 | 只看该作者
1.单片机:入门级就行,如STC89系列及以上,构建最小系统。
2.按键:至少9位(8位选手+1位复位)。
3.显示:入门级建议用数码管,1位即可。
4.程序中注意按键优先及约束,可以使用按键状态标志变量。
回复

使用道具 举报

地板
ID:537570 发表于 2024-11-7 15:47 | 只看该作者
从硬件(仿真)和软件两个方面进行考虑,先学习别人做好的,进行参考,然后学会使用,在进行优化和提升
回复

使用道具 举报

5#
ID:314651 发表于 2024-11-7 17:38 | 只看该作者
单片机还是数字电路,其实很简单,提前做好仿真,按照仿真来做实物就行
回复

使用道具 举报

6#
ID:314651 发表于 2024-11-7 17:39 | 只看该作者
单片机还是数字电路,其实很简单,提前做好仿真,按照仿真搭建实物即可
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表