标题:
新手求助八位抢答器
[打印本页]
作者:
ccccllxx
时间:
2024-11-6 20:11
标题:
新手求助八位抢答器
有没有大佬做过八位抢答器,有什么需要注意的吗,如果从零开始我们需要如何去做。
作者:
飞云居士
时间:
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按钮来清除锁定状态。
作者:
cy009
时间:
2024-11-7 11:21
1.单片机:入门级就行,如STC89系列及以上,构建最小系统。
2.按键:至少9位(8位选手+1位复位)。
3.显示:入门级建议用数码管,1位即可。
4.程序中注意按键优先及约束,可以使用按键状态标志变量。
作者:
wzg_90
时间:
2024-11-7 15:47
从硬件(仿真)和软件两个方面进行考虑,先学习别人做好的,进行参考,然后学会使用,在进行优化和提升
作者:
花少广
时间:
2024-11-7 17:38
单片机还是数字电路,其实很简单,提前做好仿真,按照仿真来做实物就行
作者:
花少广
时间:
2024-11-7 17:39
单片机还是数字电路,其实很简单,提前做好仿真,按照仿真搭建实物即可
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1