https://blog.csdn.net/qq_38351824/article/details/93964530
课程设计题一:八人抢答器
1、八人抢答逻辑:只有一个最先抢答有效。
2、在主持人控制下,10秒内抢答有效。
3、采用数码管显示抢答10秒倒计时,若有抢答直接结束,显示结果。
4、抢答结束后用数码管显示抢答结果:抢答有效人编号;若有异常(提前抢答,犯规),显示抢答人编号和E,本次抢答结束 。
5、设主持人控制键、复位键。
控制键:启动抢答 复位键:系统复位
6、开始、正常结束、抢答结束、违规抢答采用声音提示。
7、最后5S开始倒计时的时候有滴滴滴的计时音。
c#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
sbit smg1 = P2 ^ 4; /* 定义数码管第一位 */
sbit smg2 = P2 ^ 6; /* 定义数码管第二位 */
sbit smg3 = P2 ^ 7; /* 定义数码管第三位 */
sbit smg4 = P2 ^ 5;
sbit keyks = P2 ^ 2; /* 定义开始按键 */
sbit keytz = P2 ^ 1; /* 定义停止按键 */
sbit keyqc = P2 ^ 0; /* 定义清除按键 */
sbit key1 = P1 ^ 4; /* 定义1号抢答选手 */
sbit key2 = P1 ^ 5; /* 定义2号抢答选手 */
sbit key3 = P1 ^ 6; /* 定义3号抢答选手 */
sbit key4 = P1 ^ 7; /* 定义4号抢答选手 */
sbit key5 = P3 ^ 4; /* 定义5号抢答选手 */
sbit key6 = P3 ^ 5; /* 定义6号抢答选手 */
sbit key7 = P3 ^ 6; /* 定义7号抢答选手 */
sbit key8 = P3 ^ 7; /* 定义8号抢答选手 */
sbit spk = P1 ^ 0; /* 定义蜂鸣器 */
int djs, js = 0; /* djs和bt是初始倒计时时间 */
unsigned char flag = 0;
int table[] = { 0x5f, 0x44, 0x9d, 0xd5, 0xc6, 0xd3, 0xdb, 0x45, 0xdf, 0xd7, 0x80, 0x9b };
void delayms( uint z ) /* 毫秒 */
{
uint x, y;
for ( x = z; x > 0; x-- )
for ( y = 110; y > 0; y-- )
;
}
void Timer0_init() /* 定时器0初始化 */
{
js = 0;
TMOD = 0x01; /* 设置定时器0为工作方式1(M1M0为01) */
TH0 = (65536 - 45872) / 256; /* 装初值11.0592M晶振定时50ms数为45872 */
TL0 = (65536 - 45872) % 256;
ET0 = 1; /* 开定时器0中断 */
EA = 1; /* 开总中断 */
}
void timer0() interrupt 1 using 1 /* 定时器0中断服务函数 */
{
TH0 = (65536 - 45872) / 256; /* 装初值11.0592M晶振定时50ms数为45872 */
TL0 = (65536 - 45872) % 256;
js++; /* 叠加20次 */
if ( flag == 1 ) /* */
{
if ( js < 8 )
spk = 0; /* 蜂鸣器响 */
else spk = 1; /* 蜂鸣器停 */
}
if ( js == 20 )
{
js = 0; /* 清空 */
djs--; /* 产生1s的倒计时 */
}
}
void djsxs() /* 显示倒计时函数 */
{
int b1, b2;
b1 = djs / 10;
b2 = djs % 10; /* 将倒计时时间分成高低位 */
P0 = table[b1];
smg2 = 0;
delayms( 3 );
smg2 = 1; /* 显示十位数字 */
P0 = table[b2];
smg3 = 0;
delayms( 3 ); /* 显示个位数字 */
smg3 = 1;
}
void djsxse() /* 第二位数码管显示 E */
{
P0 = 0x9b; /* 第三位数码管显示E */
smg2 = 0;
delayms( 3 );
smg2 = 1;
}
void djsxs30() /* 第三位数码管显示 - */
{
P0 = 0x80; /* 第三位数码管显示- */
smg4 = 0;
delayms( 3 );
smg4 = 1;
}
void djsxs22() /* 4位数码管显示- - - - */
{
P0 = 0x80; /* 第一位数码管显示- */
smg1 = 0;
delayms( 3 );
smg1 = 1;
P0 = 0x80; /* 第二位数码管显示- */
smg4 = 0;
delayms( 3 );
smg4 = 1;
P0 = 0x80; /* 第三位数码管显示- */
smg2 = 0;
delayms( 3 );
smg2 = 1;
P0 = 0x80; /* 第四位数码管显示- */
smg3 = 0;
delayms( 3 );
smg3 = 1;
}
void djsxs1() /* 第一位数码管显示1 */
{
P0 = table[1]; /* 第一位数码管显示1 */
smg1 = 0;
delayms( 3 );
smg1 = 1;
}
void djsxs2() /* 第一位数码管显示2 */
{
P0 = table[2];
smg1 = 0;
delayms( 3 );
smg1 = 1; /* 第一位数码管显示2 */
}
void djsxs3() /* 第一位数码管显示3 */
{
P0 = table[3];
smg1 = 0;
delayms( 3 );
smg1 = 1; /* 第一位数码管显示3 */
}
void djsxs4() /* 第一位数码管显示4 */
{
P0 = table[4];
smg1 = 0;
delayms( 3 );
smg1 = 1; /* 第一位数码管显示4 */
}
void djsxs5() /* 第一位数码管显示5 */
{
P0 = table[5];
smg1 = 0;
delayms( 3 );
smg1 = 1; /* 第一位数码管显示5 */
}
void djsxs6() /* 第一位数码管显示6 */
{
P0 = table[6];
smg1 = 0;
delayms( 3 );
smg1 = 1; /* 第一位数码管显示6 */
}
void djsxs7() /* 第一位数码管显示7 */
{
P0 = table[7];
smg1 = 0;
delayms( 3 );
smg1 = 1; /* 第一位数码管显示7 */
}
void djsxs8() /* 第一位数码管显示8 */
{
P0 = table[8];
smg1 = 0;
delayms( 3 );
smg1 = 1; /* 第一位数码管显示8 */
}
void main()
{
int djs1 = 10; /* 修改倒计时第一处,共两处 */
Timer0_init(); /* 初始化定时器中断 */
spk = 0; delayms( 500 ); spk = 1; /* 蜂鸣器不响 */
djs = 10; /* 修改倒计时第二处,共两处 */
while ( 1 )
{
LOOP1: djs = djs1; /* LOOP1是标号 */
djsxs22(); /* 4位数码管显示- - - - */
if ( keyks == 0 ) /* 开始按键 */
{
delayms( 3 ); /* 去除按键抖动 */
if ( keyks == 0 )
{
while ( !keyks )
; /* 以上表示按下开始按键 */
spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1;
TR0 = 1; /* 启动定时器 开始倒计时 */
while ( 1 )
{
djsxs(); /* 显示倒计时函数 */
if ( keyks == 0 )
{
delayms( 3 );
if ( keyks == 0 )
{
while ( !keyks )
; /* 以上表示按下清楚按键后 */
TR0 = 1; /* 定时器启动 */
}
}
/***************************以下是八个选手抢答,key1表示1号选手,依次类推,注释只写第一位选手,其他和第一个完全一致,************************************/
if ( (key1 == 0) && (TR0 == 1) ) /* 在定时器运行状态下,key1==0 则说明1号选手按下按键 */
{
spk = 0; /* 蜂鸣器响 */
delayms( 3 );
if ( key1 == 0 )
{
while ( !key1 )
; /* 去除按键抖动后,重新在判断,是否确实按下 */
{
spk = 1; /* 蜂鸣器不响 */
flag = 0; /* 清0最后五秒响蜂鸣器 */
}
while ( 1 )
{
TR0 = 0; /* 定时器停止 */
djsxs1(); /* 显示选手编号 */
djsxs30(); /* 第二位数码管显示- */
djsxs(); /* 显示剩余倒计时时间 */
if ( keyqc == 0 )
{
delayms( 3 ); /* 去除抖动 */
if ( keyqc == 0 )
{
while ( !keyqc )
; /* 如果按下清除键,则回到----状态 */
goto LOOP1; /* goto语句,回到loop1表号处 */
}
}
}
}
}
if ( (key2 == 0) && (TR0 == 1) )
{
spk = 0;
delayms( 3 );
if ( key2 == 0 )
{
while ( !key2 )
;
{
spk = 1;
flag = 0; /* 清0最后五秒响蜂鸣器 */
}
while ( 1 )
{
TR0 = 0;
djsxs2();
djsxs30(); /* 第二位数码管显示- */
djsxs();
if ( keyqc == 0 )
{
delayms( 3 );
if ( keyqc == 0 )
{
while ( !keyqc )
;
goto LOOP1;
}
}
}
}
}
if ( (key3 == 0) && (TR0 == 1) )
{
spk = 0;
delayms( 3 );
if ( key3 == 0 )
{
while ( !key3 )
;
{
spk = 1;
flag = 0; /* 清0最后五秒响蜂鸣器 */
}
while ( 1 )
{
TR0 = 0;
djsxs3();
djsxs30(); /* 第二位数码管显示- */
djsxs();
if ( keyqc == 0 )
{
delayms( 3 );
if ( keyqc == 0 )
{
while ( !keyqc )
;
goto LOOP1;
}
}
}
}
}
if ( (key4 == 0) && (TR0 == 1) )
{
spk = 0;
delayms( 3 );
if ( key4 == 0 )
{
while ( !key4 )
;
{
spk = 1;
flag = 0; /* 清0最后五秒响蜂鸣器 */
}
while ( 1 )
{
TR0 = 0;
djsxs4();
djsxs30(); /* 第二位数码管显示- */
djsxs();
if ( keyqc == 0 )
{
delayms( 3 );
if ( keyqc == 0 )
{
while ( !keyqc )
;
goto LOOP1;
}
}
}
}
}
if ( (key5 == 0) && (TR0 == 1) )
{
spk = 0;
delayms( 3 );
if ( key5 == 0 )
{
while ( !key5 )
;
{
spk = 1;
flag = 0; /* 清0最后五秒响蜂鸣器 */
}
while ( 1 )
{
TR0 = 0;
djsxs5();
djsxs30(); /* 第二位数码管显示- */
djsxs();
if ( keyqc == 0 )
{
delayms( 3 );
if ( keyqc == 0 )
{
while ( !keyqc )
;
goto LOOP1;
}
}
}
}
}
if ( (key6 == 0) && (TR0 == 1) )
{
spk = 0;
delayms( 3 );
if ( key6 == 0 )
{
while ( !key6 )
;
{
spk = 1;
flag = 0; /* 清0最后五秒响蜂鸣器 */
}
while ( 1 )
{
TR0 = 0;
djsxs6();
djsxs30(); /* 第二位数码管显示- */
djsxs();
if ( keyqc == 0 )
{
delayms( 3 );
if ( keyqc == 0 )
{
while ( !keyqc )
;
goto LOOP1;
}
}
}
}
}
if ( (key7 == 0) && (TR0 == 1) )
{
spk = 0;
delayms( 3 );
if ( key7 == 0 )
{
while ( !key7 )
;
{
spk = 1;
flag = 0; /* 清0最后五秒响蜂鸣器 */
}
while ( 1 )
{
TR0 = 0;
djsxs7();
djsxs30(); /* 第二位数码管显示- */
djsxs();
if ( keyqc == 0 )
{
delayms( 3 );
if ( keyqc == 0 )
{
while ( !keyqc )
;
goto LOOP1;
}
}
}
}
}
if ( (key8 == 0) && (TR0 == 1) )
{
spk = 0;
delayms( 3 );
if ( key8 == 0 )
{
while ( !key8 )
;
{
spk = 1;
flag = 0; /* 清0最后五秒响蜂鸣器 */
}
while ( 1 )
{
TR0 = 0;
djsxs8();
djsxs30(); /* 第二位数码管显示- */
djsxs();
if ( keyqc == 0 )
{
delayms( 3 );
if ( keyqc == 0 )
{
while ( !keyqc )
;
goto LOOP1;
}
}
}
}
}
if ( djs <= 5 )
flag = 1; /* spk=0; //到倒计时小于5是,蜂鸣器响 */
if ( djs == 0 ) /* 当倒计时时间等于0后,需要按清楚键恢复 */
{
flag = 0;
spk = 1;
while ( 1 )
{
if ( keyqc == 0 )
{
delayms( 3 );
if ( keyqc == 0 )
{
while ( !keyqc )
;
spk = 1;
goto LOOP1;
}
}
}
}
}
}
}
/* //////////////////抢答违规//////////////////// */
if ( (key1 == 0) && (TR0 == 0) ) /* 1号选手违规按下按键 */
{
delayms( 3 );
if ( key1 == 0 )
{
while ( !key1 )
; /* 去除按键抖动后,重新在判断,是否确实按下 */
spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1;
while ( 1 )
{
djsxs1(); /* 显示选手编号 */
djsxs30(); /* 第二位数码管显示- */
djsxse(); /* 显示E */
if ( keyqc == 0 )
{
delayms( 3 ); /* 去除抖动 */
if ( keyqc == 0 )
{
while ( !keyqc )
; /* 如果按下清除键,则回到----状态 */
goto LOOP1; /* goto语句,回到loop1表号处 */
}
}
}
}
}
if ( (key2 == 0) && (TR0 == 0) ) /* 1号选手违规按下按键 */
{
delayms( 3 );
if ( key2 == 0 )
{
while ( !key2 )
; /* 去除按键抖动后,重新在判断,是否确实按下 */
spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1;
while ( 1 )
{
djsxs2(); /* 显示选手编号 */
djsxs30(); /* 第二位数码管显示- */
djsxse(); /* 显示E */
if ( keyqc == 0 )
{
delayms( 3 ); /* 去除抖动 */
if ( keyqc == 0 )
{
while ( !keyqc )
; /* 如果按下清除键,则回到----状态 */
goto LOOP1; /* goto语句,回到loop1表号处 */
}
}
}
}
}
if ( (key3 == 0) && (TR0 == 0) ) /* 1号选手违规按下按键 */
{
delayms( 3 );
if ( key3 == 0 )
{
while ( !key3 )
; /* 去除按键抖动后,重新在判断,是否确实按下 */
spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1;
while ( 1 )
{
djsxs3(); /* 显示选手编号 */
djsxs30(); /* 第二位数码管显示- */
djsxse(); /* 显示E */
if ( keyqc == 0 )
{
delayms( 3 ); /* 去除抖动 */
if ( keyqc == 0 )
{
while ( !keyqc )
; /* 如果按下清除键,则回到----状态 */
goto LOOP1; /* goto语句,回到loop1表号处 */
}
}
}
}
}
if ( (key4 == 0) && (TR0 == 0) ) /* 1号选手违规按下按键 */
{
delayms( 3 );
if ( key4 == 0 )
{
while ( !key4 )
; /* 去除按键抖动后,重新在判断,是否确实按下 */
spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1;
while ( 1 )
{
djsxs4(); /* 显示选手编号 */
djsxs30(); /* 第二位数码管显示- */
djsxse(); /* 显示E */
if ( keyqc == 0 )
{
delayms( 3 ); /* 去除抖动 */
if ( keyqc == 0 )
{
while ( !keyqc )
; /* 如果按下清除键,则回到----状态 */
goto LOOP1; /* goto语句,回到loop1表号处 */
}
}
}
}
}
if ( (key5 == 0) && (TR0 == 0) ) /* 1号选手违规按下按键 */
{
delayms( 3 );
if ( key5 == 0 )
{
while ( !key5 )
; /* 去除按键抖动后,重新在判断,是否确实按下 */
spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1;
while ( 1 )
{
djsxs5(); /* 显示选手编号 */
djsxs30(); /* 第二位数码管显示- */
djsxse(); /* 显示E */
if ( keyqc == 0 )
{
delayms( 3 ); /* 去除抖动 */
if ( keyqc == 0 )
{
while ( !keyqc )
; /* 如果按下清除键,则回到----状态 */
goto LOOP1; /* goto语句,回到loop1表号处 */
}
}
}
}
}
if ( (key6 == 0) && (TR0 == 0) ) /* 1号选手违规按下按键 */
{
delayms( 3 );
if ( key6 == 0 )
{
while ( !key6 )
; /* 去除按键抖动后,重新在判断,是否确实按下 */
spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1;
while ( 1 )
{
djsxs6(); /* 显示选手编号 */
djsxs30(); /* 第二位数码管显示- */
djsxse(); /* 显示E */
if ( keyqc == 0 )
{
delayms( 3 ); /* 去除抖动 */
if ( keyqc == 0 )
{
while ( !keyqc )
; /* 如果按下清除键,则回到----状态 */
goto LOOP1; /* goto语句,回到loop1表号处 */
}
}
}
}
}
if ( (key7 == 0) && (TR0 == 0) ) /* 1号选手违规按下按键 */
{
delayms( 3 );
if ( key7 == 0 )
{
while ( !key7 )
; /* 去除按键抖动后,重新在判断,是否确实按下 */
spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1;
while ( 1 )
{
djsxs7(); /* 显示选手编号 */
djsxs30(); /* 第二位数码管显示- */
djsxse(); /* 显示E */
if ( keyqc == 0 )
{
delayms( 3 ); /* 去除抖动 */
if ( keyqc == 0 )
{
while ( !keyqc )
; /* 如果按下清除键,则回到----状态 */
goto LOOP1; /* goto语句,回到loop1表号处 */
}
}
}
}
}
if ( (key8 == 0) && (TR0 == 0) ) /* 1号选手违规按下按键 */
{
delayms( 3 );
if ( key8 == 0 )
{
while ( !key8 )
; /* 去除按键抖动后,重新在判断,是否确实按下 */
spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1;
while ( 1 )
{
djsxs8(); /* 显示选手编号 */
djsxs30(); /* 第二位数码管显示- */
djsxse(); /* 显示E */
if ( keyqc == 0 )
{
delayms( 3 ); /* 去除抖动 */
if ( keyqc == 0 )
{
while ( !keyqc )
; /* 如果按下清除键,则回到----状态 */
goto LOOP1; /* goto语句,回到loop1表号处 */
}
}
}
}
}
}
}
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!