8路抢答器设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
珞珈学院单片机实验之
八路抢答器
年级:2009级
专业:通信工程
设计者:郭吕超
日期:2011.12.18
目录
一.实验安排 (3)
二.八路抢答器仿真图 (4)
三.八路抢答器设计原理 (5)
四.八路抢答器C语言程序 (6)
一.实验安排
1.设计一个八路抢答器。
2.必须有主持人按钮,当主持人按下按钮,开始30秒倒计时,这
30秒内即是八位选手抢答的时长,若30秒内无人抢答,则视为所有选手弃权。
3.倘若主持人按下开始的30秒内有人抢答,定时到10秒,同时
在一屏幕上显示该抢答选手号码,当主持人按下开始答题键时,则倒计时从10秒开始,同时选手号码清零。若10秒内无法回答,则该选手视为题目回答错误。
4.实验装置有绿.黄两盏灯;其中绿灯在主持人按钮按下时被点亮,
在倒计时30秒内,当有选手抢答时,绿灯被熄灭,。若30秒内无选手抢答,倒计时到0时绿灯还是熄灭;若开始答题后10秒钟倒计时黄灯被点亮,到零时黄灯熄灭。
二.八路抢答器仿真图
三.实验设计原理
1.准备工具:A T89C51单片机,两片74HC573锁存器芯片,一块
含两位选的共阴数码管,一块单个的共阴数码管,上拉排阻,黄.
绿二极管各一支,插针,焊接导线,焊锡,电烙铁,独立按键若干。
2.完成实验硬件部分后,软件部分用到了单片机定时器0;两位选
的共阴数码管来显示倒计时秒钟。
3.单个的数码管用来显示选手号码1~8,由8个选手按键决定选手
号码的显示。
4.初始化中选手号码无显示,倒计时秒钟无显示,定时器0和关中
断。
5.主持人按下开始键,定时器0开中断,进行30秒倒计时,当中
选手按键按下,定时器0关中断,当答题键按下时,定时器开中断,进行10秒倒计时,选手号码显示在单个数码管上。
6倒计时中按下清零键,即数码管全部显示0。
四.八路抢答器C语言程序设计
/*珞珈单片机课程《八路抢答器》c语言程序设计..........2011.12.18*/ #include
#define uchar unsigned char
#define uint unsigned int
sbit wela_hao=P3^0;//显示选手的数码管位选
sbit wela1=P3^1;
sbit wela2=P3^7;
sbit qing=P3^5;
sbit host=P3^6;
sbit answer=P3^4;
sbit led1=P3^3;//绿灯
sbit led2=P3^2;//黄灯
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit key5=P1^4;
sbit key6=P1^5;
sbit key7=P1^6;
sbit key8=P1^7;
uchar hao,shu,shi,ge,t0,t1,start,flag;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void init();/*初始函数申明*/
void display(uchar shi,uchar ge,uchar hao);
void delay(uint z);
void keyscan();
void main()
{
init();
display(shi,ge,hao);
while(1)
{
if(host==0) //主持人
{
delay(5);
if(host==0)
{
shu=30;
hao=0;
flag=1;
led1=0;
led2=1;
start=1;
delay(5);
while(!host);
}
}
if(qing==0) //清零
{
delay(5);
if(qing==0)
{
while(1)
{
shu=0;
shi=shu/10;
ge=shu%10;
TR0=0;
delay(5);
hao=0;
led1=1;
led2=0;
wela1=0;
wela2=0;
wela_hao=0;
delay(1);
display(shi,ge,hao);
if(host==0)break;
}
delay(5);
while(!qing);
}
}
if(answer==0)//开始答题
{
delay(5);
if(answer==0)
{
flag=1;
shu=10;
start=1;
led1=1;
led2=0;
hao=0;
}
delay(5);
while(!answer);
}
if(flag==1)
{
if(start==0)//选手按下,定时10秒
{
shu=10;
shi=shu/10;
ge=shu%10;
led2=1;
led1=1;
wela1=0;
wela2=0;
wela_hao=0;
delay(1);
TR0=0;
display(shi,ge,hao);
delay(1);
}
if(start==1)//主持人按下,倒计时30秒
{