8路抢答器
- 格式:doc
- 大小:276.88 KB
- 文档页数:8
一、实验内容
以单片机为核心,设计一个8位竞赛抢答器:同时供8名选手或8个代表队比赛,分别用8个按钮
S0~S7表示。
设置一个系统清除和抢答控制开关S,开关由主持人控制。
抢答器具有锁存与显示功能。即选手按按钮,锁存相应的编号,并在优先抢答选手的编号一直保持
到主持人将系统清除为止。
抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如30秒)。
当主持人启动“开始”键后,定时器进行减计时,同时扬声器发出短暂的声响,声响持续的时间为
0.5s左右。
参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答
的时间,并保持到主持人将系统清除为止。
如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。
通过键盘改变抢答的时间,原理与闹钟时间的设定相同,将定时时间的变量置为全局变量后,通过
键盘扫描程序使每按下一次按键,时间加1(超过30时置0)。同时单片机不断进行按键扫描,当参赛
选手的按键按下时,用于产生时钟信号的定时计数器停止计数,同时将选手编号(按键号)和抢答时间
分别显示在LED上。
二、实验电路及功能说明
2.1该实验的整体电路图如下图5-1所示:
图5—1 整体电路图
2.2各模块功能说明
2.2.1抢答器显示模块
图 5-2 4位七段数码管显示电路图
本实验采用的是4位一体七段共阴数码管,其中A~H段分别接到单片机的P0口,由单片机输出的
P0口数据来决定段码值,位选码COM1, COM2,COM3,COM4分别接到单片机的P2.0,P2.1,P2.2 ,P2.,3,
由单片机来决定当前该显示的是哪一位。在图中还有一个排阻,连接在P0口上,用作P0口的上拉电阻,
保证P0口没有数据输出时候处于高电平状态。通过查表法,将其在数码管上显示出来,其中P0口为字
型码输入端,P2口低4位为字选段输入段。在这里我们通过查表将字型码送给7段数码管显示的数字。
2.2.2抢答器按键模块
图5—3 抢答按键电路图
图5—4 主持人按键电路图
本实验采用的是8个按键作为选手的抢答按键,其中1—8分别接到单片机的P1口,如图5-3所示。
3个按键作为主持人的按键,分别用来设置时间、开始、和复位,其中设置时间、开始、和复位按键分
别接到单片机的P3.2,P3.5,P3.6口,如图5-4所示。本实验采用独立式键盘,这种类型的键盘,其
按键比较少,且键盘中各按键的工作互不干扰。因此可以根据实际需要对键盘中的按键灵活的编码。
2.2.3报警电路
图5—4 扬声器报警电路图
本实验用到了单片机15脚的IO端口功能,如图5-4所示,单片机通过内部定时器的操作实现交替
变换的波形输出驱动扬声器发声,用来提示抢答开始,或抢答无效。
三、实验程序流程图
3.1主程序
N
Y
N
Y
Y
N
3.2子程序
主程序
序
外部中断0及定时器0初始化
设置抢答时间,数码管
显示时间
开定时器,开始抢
答,按键扫描
数码管显示00
数码管显示抢答序号和时间
复位
结束
按下开始键,
蜂鸣器响
Y
Y
Y
Y
Y
Y
Y
四、实验结果分析
1主持人设定抢答时间(如10秒),仿真图如下图5-5所示:
按键扫描
1键按下
2键按下
3键按下
4键按下
5键按下
7键按下
6键按下 8键按下 返回主程序 数码管显示01 数码管显示02 数码管显示03 数码管显示04 数码管显示05 数码管显示06
数码管显示07
数码管显示08
图5—5
2主持人按下开始键,抢答开始,同时蜂鸣器响0.5s,如有人抢答,仿真图如下图5-6所示:
图5—6
3若定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,数码管上显示00,仿
真图如下图5-7所示:
图5—7
四、心得体会
通过这次实验,我才明白学习是一个长期积累的过程,在以后的工作、生活中都应该
不断的学习,努力提高自己知识和综合素质。
总之,不管学会的还是学不会的的确觉得困难比较多,真是万事开头难,不知道如何
入手。最后终于做完了有种如释重负的感觉。此外,还得出一个结论:知识必须通过应用
才能实现其价值!有些东西以为学会了,但真正到用的时候才发现是两回事,所以我认为
只有到真正会用的时候才是真的学会了。
六、程序清单
#include
P2=0xf7;
P0=LED[time%10];
delay(10);
P0=0x00;
}
void shuzi_display(unsigned char u) //显示号码
{
P2=0xfe;
P0=0x3f;
delay(10);
P0=0x00;
P2=0xfd;
P0=LED[u];
delay(10);
P0=0x00;
}
void fengming()//蜂鸣器
{
unsigned int i;
for(i=0;i<5;i++)
{
voice=1;
time_display();
voice=0;
time_display();
}
}
void start_keyscan()//开始按键
{
if(start==0)
{
TR0=1;
fengming(); } } void reset_keyscan() { if(reset == 0) { time=i; TR0=0; TH0=(65536-50000)/256; TL0=(65536-50000)%256; key_flag=0; shuzi=0; } } void main() { EA=1; EX0=1; IT0=1; Init_Timer0(); while(1) { time_display(); start_keyscan(); reset_keyscan(); if(!shuzi) shuzi=key(); else shuzi_display(shuzi); } } void timer0(void) interrupt 1 //定时器0方式1,50ms中断一次 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; num++; if(num==20) { num=0;
time--;
if(time==0)
{
TR0=0;
fengming();
}
}
}
void Int_0()interrupt 0
{
time++;
i++;
if(time==30)
time=0;
}
//key.h
bit key_flag=0;
unsigned char key()
{
unsigned char keyValue=0;
unsigned char v=0;
keyValue=P1;
if(!key_flag)
switch(~keyValue)
{
case 0x01: v=1;key_flag=1;TR0=0;break;
case 0x02: v=2;key_flag=1;TR0=0;break;
case 0x04: v=3;key_flag=1;TR0=0;break;
case 0x08: v=4;key_flag=1;TR0=0;break;
case 0x10: v=5;key_flag=1;TR0=0;break;
case 0x20: v=6;key_flag=1;TR0=0;break;
case 0x40: v=7;key_flag=1;TR0=0;break;
case 0x80: v=8;key_flag=1;TR0=0;break;
default:break;
}
return v;
}