基于单片机的四路抢答器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于单片机的四路抢答器
1.由于剩余4个引脚,所以可以扩展到8路
2.矩阵键盘输入任意两位数倒计时初值
一、功能要求
以8051系列单片机为核心,设计一个4路竞赛抢答器。具体功能要求如下:
1、该抢答器最多可供4名选手参赛,用4个按钮S0~S3表示,设置一个系统复位和抢答控制开关S,由主持人控制。
2、当主持人启动“抢答开始”键后,定时器进行减计时,同时扬声器发出短暂的声响,参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,LED显示器上显示选手的编号和抢答的时间并保持到主持人将系统清除为止;如规定的时间内无人抢答则蜂鸣器发声,计时器复位,为下一次计时做好准备。
3、抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如30秒)。
4、只有主持人的操作将电路复位后,方可结束上一次的抢答,为下一次抢答做好准备。
二.设计方案
(1)倒计时用矩阵键盘输入,程序中用keycount来记录按下按键的次数,我只设置两次,只能输入两位数,多按下几次是没有效果的,相当于键盘自锁,之后单片机读取键值,缓存入一个两位的数组table【2】。
(2)采用的是3位led动态扫描的方式显示
(3)中断扫描选手按键,选手按键用的用独立键盘,用与门接选手按键,当有人按下时,与门由高到低,产生下降沿
而引起中断,单片机扫描独立键盘。(4)蜂鸣器电路
(5)开始按键和复位按键
1-1主流程图
1-2 外部中断扫描选手按键
1-3 定时器中断电路图如下图
由于仿真软件proteus不能用PnP仿真,所以去掉了PnP,直接用IO口驱动;真实是不行的。
#include
#define uchar unsigned char
#define uint unsigned int
sbit FUW=P3^5; //抢答键
sbit CLR=P3^4; //清零,复位键
sbit xuan1=P2^4;//选手1,2,3,4
sbit xuan2=P2^5;
sbit xuan3=P2^6;
sbit xuan4=P2^7;
sbit wei1=P2^0;//位选1,2,3,4
sbit wei2=P2^1;
sbit wei3=P2^2;
sbit wei4=P2^3;
sbit buz=P3^0;
uchar code numtab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极
uint table[3]={0,0,0};//倒计时缓存
uchar keycount=0;
uint time=0;
uchar num=0;
uint ge,shi;
/***********延时函数*****************/
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
/************蜂鸣器****************/
void buzzer()
{
buz=0;
delayms(50);
buz=1;
}
/************报警部分独立按键扫描********************/ void kscan()
{uchar sk;
if(xuan1==0)
{
delayms(10);
if(xuan1==0)
{
buzzer();
sk=1;
table[2]=sk;
}
}
else if(xuan2==0)
{
delayms(10);
if(xuan2==0)
{
buzzer();
sk=2;
table[2]=sk;
}
}
else if(xuan3==0)
{
delayms(10);
if(xuan3==0)
{
buzzer();
sk=3;
table[2]=sk;
}
}
else if(xuan4==0)
{
delayms(10);
if(xuan4==0)
{
buzzer();
sk=4;
table[2]=sk;
}
}
}
/**********矩阵键盘扫描***************/ void keyscan()
{
uint temp,key;
P1=0xfe;//第一行为0
temp=P1;
temp=temp&0xf0;//与上11110000
if((temp!=0xf0)&&(keycount<2))
delayms(10);//去抖
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xde:key=0;table[keycount]=key;keycount++;break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfd;//第二行为0
temp=P1;
temp=temp&0xf0;//与上11110000
if((temp!=0xf0)&&(keycount<2))