2024-09-01
售卖作品
00

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表号处 */ } } } } } } }
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!