(完整版)基于51单片机的4人抢答器课程设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于51单片机的4人抢答器设计

设计要求:

以单片机为核心,设计一个4位竞赛抢答器:同时供4名选手或4个代表队比赛,分别用4个按钮S0~S3表示。

设置一个系统清除和抢答控制开关S,开关由主持人控制。

抢答器具有锁存与显示功能。即选手按按钮,锁存相应的编号,并在优先抢答选手的编号一直保持到主持人将系统清除为止。

抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如30秒)。

当主持人启动“开始”键后,定时器进行减计时,同时扬声器发出短暂的声响,声响持续的时间为0.5s左右。

参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。

如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。

工作原理:

通过键盘改变抢答的时间,原理与闹钟时间的设定相同,将定时时间的变量置为全局变量后,通过键盘扫描程序使每按下一次按键,时间加1(超过30时置0)。同时单片机不断进行按键扫描,当参赛选手的按键按下时,用于产生时钟信号的定时计数器停止计数,同时将选手编号(按键号)和抢答时间分别显示在LED上。

#include

#define uchar unsigned char

#define uint unsigned int

uchar num; //定义中断变量,num计满20表示1秒时间到uchar num1; //十秒倒计时显示初始值

uchar flag1,flag2; //清零键及开始键按下标志位

uchar flag3,flag4=0; //定义键盘按下标志位

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f}; //数码管编码

sbit dula=P1^6; //定义段选端口

sbit wela=P1^7; //定义位选端口

sbit sp=P3^0; //定义蜂鸣器端口

sbit clear=P1^0; //定义清零键

sbit start=P1^1; //开始键

sbit key1=P1^2;

sbit key2=P1^3;

sbit key3=P1^4;

sbit key4=P1^5; //key1到key4为选手按键

void delay(uint z) //延时函数

{

uint i,j;

for(i=z;i>0;i--)

for(j=110;j>0;j--);

}

void beep() //定义蜂鸣器函数

{

sp=0;

delay(500);

sp=1;

}

void display(uint a) //选手编号显示函数

{

wela=1;

P2=0xff; //防止锁存干扰

wela=0;

dula=1;

P2=table[a];

dula=0;

P2=0xff;

wela=1;

P2=0xfd;

wela=0;

delay(5);

}

void clr() //清零函数(主持人按下清零键后数码管显示0) {

dula=1;

P2=table[0];

dula=0;

P2=0xff;

wela=1;

P2=0xfc;

wela=0;

delay(5);

}

void dis30s() //十秒倒计时显示函数{

uchar shi,ge;

shi=num1/30;

ge=num1%30;

wela=1;

P2=0xff;

wela=0;

dula=1;

P2=table[shi];

dula=0;

P2=0xff;

wela=1;

P2=0xfe;

wela=0;

delay(5);

wela=1;

P2=0xff;

wela=0;

dula=1;

P2=table[ge];

dula=0;

P2=0xff;

wela=1;

P2=0xfd;

wela=0;

delay(5);

}

void player() //选手按键检测函数{

if(key1==0&&flag4==0)

{

delay(10);

if(key1==0&&flag4==0)

{

display(1);

TR0=0;

flag1=flag2=0;

flag4=1;

beep();

while(!key1);

}

}

if(key2==0&&flag4==0)

{

delay(10);

if(key2==0&&flag4==0)

{

display(2);

TR0=0;

flag1=flag2=0;

flag4=1;

beep();

while(!key2);

}

}

if(key3==0&&flag4==0)

{

delay(10);

if(key3==0&&flag4==0)

{

display(3);

TR0=0;

flag1=flag2=0;

flag4=1;

beep();

while(!key3);

}

}

if(key4==0&&flag4==0)

{

delay(10);

if(key4==0&&flag4==0)

{

display(4);

TR0=0;

flag1=flag2=0;

flag4=1;

beep();

while(!key4);

}

}

}

void keyscan() //检测按键{

相关文档
最新文档