用C语言写一段四人数字抢答器代码,实现的功能有:1、数码管显示30秒倒计时;2、抢答成功显示编号;3、抢答成功后停止倒计时;4、三十秒倒计时结束后亮红灯
时间: 2024-01-31 09:01:50 浏览: 166
以下是用C语言实现的四人数字抢答器代码,基于51单片机:
```
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
// 定义数码管段选端口
sbit seg1 = P2^2;
sbit seg2 = P2^3;
sbit seg3 = P2^4;
sbit seg4 = P2^5;
// 定义数码管位选端口
sbit dig1 = P2^6;
sbit dig2 = P2^7;
// 定义按钮端口
sbit btn1 = P1^0;
sbit btn2 = P1^1;
sbit btn3 = P1^2;
sbit btn4 = P1^3;
// 定义LED灯端口
sbit led = P3^0;
uchar code ledTable[] = {0xFE, 0xFD}; // LED灯表,0xFE表示亮,0xFD表示灭
uchar code segTable[] = { // 数码管段选表
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71
};
uchar code digTable[] = { // 数码管位选表
0x01, 0x02
};
uchar num = 0; // 抢答成功的编号
bit flag = 0; // 抢答成功标志
bit timeOut = 0; // 倒计时超时标志
void display(uchar n) { // 数码管显示函数,n为要显示的数字
uchar i;
uchar data[] = {segTable[n/10], segTable[n%10]}; // 将数字拆分成十位和个位对应的数码管段选码
for (i = 0; i < 2; i++) { // 循环显示两位数
if (i == 0) {
dig1 = 0; // 选中第一位数码管
} else {
dig1 = 1; // 取消选中第一位数码管
dig2 = 0; // 选中第二位数码管
}
seg1 = data[i] & 0x01; // 显示数码管的第一段
seg2 = data[i] & 0x02; // 显示数码管的第二段
seg3 = data[i] & 0x04; // 显示数码管的第三段
seg4 = data[i] & 0x08; // 显示数码管的第四段
delay(1); // 延时一段时间,使数字可以被肉眼观察
}
dig2 = 1; // 取消选中第二位数码管
}
void countdown() { // 倒计时函数
uint i;
for (i = 30; i > 0; i--) { // 倒计时30秒
display(i); // 显示倒计时数字
if (btn1 == 0 || btn2 == 0 || btn3 == 0 || btn4 == 0) { // 如果有人抢答成功
if (!flag) { // 如果还没有抢答成功
if (btn1 == 0) {
num = 1; // 记录抢答成功的编号
} else if (btn2 == 0) {
num = 2;
} else if (btn3 == 0) {
num = 3;
} else if (btn4 == 0) {
num = 4;
}
flag = 1; // 标记抢答成功
}
break; // 跳出倒计时循环
}
delay(1000); // 延时一秒钟
}
timeOut = 1; // 倒计时超时
}
void main() {
while (1) {
display(0); // 显示0
flag = 0; // 清除抢答成功标志
timeOut = 0; // 清除倒计时超时标志
led = 1; // 关闭LED灯
countdown(); // 倒计时
if (timeOut) { // 如果倒计时超时
led = 0; // 亮红灯
} else { // 如果抢答成功
display(num); // 显示抢答成功的编号
led = 1; // 关闭LED灯
}
}
}
void delay(uint i) { // 延时函数,i为延时的时间(毫秒)
while (i--) {
uchar j, k;
for (j = 5; j > 0; j--) {
for (k = 110; k > 0; k--);
}
}
}
```
这段代码使用了一个循环来不断进行抢答,每次抢答前都会进行30秒的倒计时。倒计时过程中,如果有人按下按钮,则记录这个人的编号,并标记抢答成功。如果30秒倒计时结束,但没有人抢答成功,则亮红灯。如果有人抢答成功,则显示这个人的编号,并关闭LED灯。
阅读全文