郑州轻工业学院单片机课程设计抢答器控制模拟程序设计.docx
《郑州轻工业学院单片机课程设计抢答器控制模拟程序设计.docx》由会员分享,可在线阅读,更多相关《郑州轻工业学院单片机课程设计抢答器控制模拟程序设计.docx(23页珍藏版)》请在冰点文库上搜索。
郑州轻工业学院单片机课程设计抢答器控制模拟程序设计
郑州轻工业学院
单片机课程设计
题目:
抢答器控制模拟程序设计
姓名:
院(系):
计算机与通信工程学院
专业班级:
学号:
指导教师:
陈晓雷、韩凤琴
成绩:
时间:
2016年1月11日至2016年1月15日
郑州轻工业学院
课程设计任务书
题目抢答器控制模拟程序设计
专业、班级学号姓名
主要内容、基本要求、主要参考资料等:
主要内容
模拟设计一个抢答器工作的程序。
给主持人设置一个开关,用来控制系统的清零(编号显示数码管灭灯)和抢答器的开始。
开始抢答后,当选手按动抢答键时,能显示选手的编号,同时能封锁输入电路,禁止其他选手抢答,扩展电路完成定时抢答的功能。
抢答成功后,有声音提示以示祝贺。
(抢答输入由键盘输入)。
技术要求
具有8个抢答输入
显示抢答剩余时间(初始10秒)
显示抢答成功者
抢答成功后,有声音提示;
时间分辨率小于10ms;
完善其它自定义功能。
主要参考资料
《STC单片机原理及应用》清华大学出版社何宾著
完成期限:
2016-12-31
指导教师签名:
陈晓雷、韩雪琴
课程负责人签名:
2016年01月15日
前言
抢答器作为一种工具,已广泛应用于各种智力和知识竞赛场合。
但抢答器的使用频率较低,且有的要么制作复杂,要么可靠性低。
作为一个单位,如果专门购一台抢答器虽然在经济上可以承受,但每年使用的次数极少,往往因长期存放使(电子器件的)抢答器损坏,再购置的麻烦和及时性就会影响活动的开展,因此设计了本抢答器。
本设计是以八路抢答为基本理念。
考虑到依照需要设定限时回答的功能,利用AT89C51单片机及外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时使数码管能够正确地显示时间。
用开关做键盘输出,扬声器发生提示。
同时系统能够实现:
在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;抢答限定时间和回答问题的时间可在1-99s设定;可以显示是哪位选手有效抢答和无效抢答,正确按键后有音乐提示;抢答时间和回答问题时间倒记时显示,满时后系统计时自动复位及主控强制复位;按键锁定,在有效状态下,按键无效非法。
目录
1抢答器设计功能分析5
1.1抢答器的概述5
1.2设计任务与要求5
2设计方案简介5
2.1定时抢答器的总体框图5
2.2定时抢答器的工作过程6
2.3主程序流程图7
3抢答器电路设计8
4整体电路仿真图9
5源程序及说明10
6设计总结17
7参考文献18
1、抢答器设计功能分析
1.1抢答器的概述
对于抢答器我们大家来说都不陌生,它是用于很多竞赛场合,真正实现先抢先答,让最先抢到题的选手来回答问题。
抢答器不仅考验选手的反应速度同时也要求选手具备足够的知识面和一定的勇气。
选手们都站在同一个起跑线上,体现了公平公正的原则。
1.2设计任务与要求
基本要求:
1.给主持人设置一个开关,用来控制系统的清零(编号显示数码管灭灯)和抢答器的开始。
2.抢答器具有数据锁存和显示的功能。
抢答开始后,若有选手按动抢答器按钮,编号立即锁存,并在LED数码上显示选手的编号,同时扬声器给出音响提示。
此外,要封锁输入电路,禁止其他选手抢答。
发挥部分:
1.抢答器具有定时抢答的功能,且一次抢答的时间可以由主持人设定(如30秒)。
当节目主持人启动“开始”键后,要求定时器立即减计时,并用显示器显示,同时扬声器发出短暂的声响,声响持续时间0.5秒左右。
2.参加选手在设定的时间内抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答时刻的时间,并保持到主持人将系统清零为止。
3.如果定时抢答的时间已到,却没有选手抢答时,本次抢答无效,系统短暂报警,并封锁输入电路,禁止选手超时后抢答,时间显示器上显示00。
4.选手如果在主持人按开始键之前违规抢答,系统报警,LED显示违规选手号码和FF,直到主持人按下停止键。
2、设计方案简介
2.1定时抢答器的总体框图
它由主体电路和扩展电路两部分组成。
主体电路完成基本的抢答功能,即开始抢答后,当选手按动抢答键时,能显示选手的编号,同时能封锁输入电路,禁止其他选手抢答,扩展电路完成定时抢答的功能。
2.2定时抢答器的工作过程
接通电源时,节目主持人将开关置于“消除”位置,抢答器处于禁止工作状态,编号显示器灭灯,定时器倒计时,当定时时间到,却没有选手抢答时,系统报警,并封锁输入电路,禁止选手超时后抢答。
当选手在定时时间内按动抢答键时,抢答器要完成以下四项工作:
优先编码电路立即分辨出抢答者的编号,并由锁存器进行锁存,然后由译码显示电路显示编号;扬声器发出短暂的声响,提醒节目主持人注意;控制电路要对输入编码电路进行封锁,避免其他选手再次进行抢答;控制电路要使定时器停止工作,时间显示器上显示剩余的抢答时间,并保持到主持人将系统消零为止,当选手将问题回答完毕,主持人操作控制开关,使系统回复到禁止工作状态,以便进行下一轮抢答。
2.3主程序流程图
主程序流程图
3、抢答器电路设计
抢答电路的功能有两个:
一是分辨选手按键的先后,并锁存抢答者的编号,供译码显示电路用;二是是其他选手的按键操作无效。
选用优先编码器74LS148和RS锁存器,74LS138,74LS279可完成上述功能。
译码电路选用74LS48芯片工作原理为:
当主持人控制开关处于“清除”位置时,RS触发器R为低电平,输出端(4Q~1Q)全部为低电平。
于是74LS48的BI=0,显示器灭灯;74LS148的选通输入ST=0,74LS148处于工作状态,此时锁存器电路不工作。
当主持人开关拨到开“始位”置,优先编码电路和锁存电路同时开始工作,等待输入信号I7,···,I0。
当有选手按下键时,74LS148的输出Y2Y1Y0=010,Yex=0。
经RS锁存器后,CTR=1,BI=1,74LS279处于工作状态,4Q3Q2Q=101。
经过74LS48译码后,显示器显示选手编号。
此外,CTR=1,是74LS148的ST为高电平,74LS148处于禁止工作状态,封锁了其他选手按键的输入。
当按下的键松开后,74LS148的Yes为高电平,但由于CTR维持高电平不变,所以74LS148仍处于禁止工作状态,其他选手的输入不会被接收,保证了抢答者的优先性以及抢答电路的准确性。
抢答完后主持人使抢答电路复位,以便进行下一轮抢答。
4、整体电路仿真图
5、源程序及说明
#include
#defineuintunsignedint
#defineucharunsignedchar
/*-----------------------------------------------------------
共阴极数码管编码表0-f显示
------------------------------------------------------------*/
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x7f,0x7c,0x39,0x5e,0x79,0x71};
sbitstart=P3^6;
sbitstop=P3^5;
sbitreset=P3^7;
sbitkey1=P1^0;//8个抢答按键
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitkey4=P1^3;
sbitkey5=P1^4;
sbitkey6=P1^5;
sbitkey7=P1^6;
sbitkey8=P1^7;
sbitbuzzer=P3^4;
bitstart_flag=0;
bitstop_flag=0;
bitkey1_flag=0;//按键抢答标志位,防止重复抢答
bitkey2_flag=0;
bitkey3_flag=0;
bitkey4_flag=0;
bitkey5_flag=0;
bitkey6_flag=0;
bitkey7_flag=0;
bitkey8_flag=0;
bitreset_flag=0;//复位键标志位,防止重复按下
bitaction=0;//开始键标志位,防止重复按下
ucharsecond=10;//10秒倒计时
uchartimer0_count=0;//定时器计数
ucharnumber=0;//抢答到的人
ucharnumber_display=0;
/*-----------------------------------------------------------
延时函数延时z毫秒
------------------------------------------------------------*/
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidfengming()//蜂鸣函数
{
//延时1ms
buzzer=1;//给P3.7口送高电平
delay(5);//延时1ms
buzzer=0;
delay(5);
}
/*-----------------------------------------------------------
数码管显示驱动函数
------------------------------------------------------------*/
voiddisplay(ucharnumber,ucharsecond)
{
ucharsecond_first,second_second;
second_first=second/10;//计算出个位
second_second=second%10;//计算出十位
P2=0xfe;
P0=table[number];
delay
(2);
//P2=0xfd;
//P0=0x3f;
//delay
(2);
P2=0xfb;
P0=table[second_first];
delay
(2);
P2=0xf7;
P0=table[second_second];
delay
(2);
}
/*-----------------------------------------------------------
开始键扫描函数
------------------------------------------------------------*/
voidstart_keyscan()
{
if(start==0)
{
delay(8);//延时防抖
if((start==0)&&(!
start_flag))
{
start_flag=1;
action=1;
TR0=1;
}
}
else
{
start_flag=0;
}
}
/*-----------------------------------------------------------
八位抢答键扫描函数
------------------------------------------------------------*/
charkey_scan8()
{
if(key1==0)
{
delay(8);
if((key1==0)&&(!
key1_flag))//防止按键重复被按下
{
key1_flag=1;
number=1;
number_display=number;
fengming();
}
}
else
{
key1_flag=0;
number=0;
}
if(key2==0)
{
delay(8);
if((key2==0)&&(!
key2_flag))
{
key2_flag=1;
number=2;
number_display=number;
fengming();
}
}
else
{
key2_flag=0;
number=0;
}
if(key3==0)
{
delay(8);
if((key3==0)&&(!
key3_flag))
{
key3_flag=1;
number=3;
number_display=number;
fengming();
}
}
else
{
key3_flag=0;
number=0;
}
if(key4==0)
{
delay(8);
if((key4==0)&&(!
key4_flag))
{
key4_flag=1;
number=4;
number_display=number;
fengming();
}
}
else
{
key4_flag=0;
number=0;
}
if(key5==0)
{
delay(8);
if((key5==0)&&(!
key5_flag))
{
key5_flag=1;
number=5;
number_display=number;
fengming();
}
}
else
{
key5_flag=0;
number=0;
}
if(key6==0)
{
delay(8);
if((key6==0)&&(!
key6_flag))
{
key6_flag=1;
number=6;
number_display=number;
fengming();
}
}
else
{
key6_flag=0;
number=0;
}
if(key7==0)
{
delay(8);
if((key7==0)&&(!
key7_flag))
{
key7_flag=1;
number=7;
number_display=number;
fengming();
}
}
else
{
key7_flag=0;
number=0;
}
if(key8==0)
{
delay(8);
if((key8==0)&&(!
key8_flag))
{
key8_flag=1;
number=8;
number_display=number;
fengming();
}
}
else
{
key8_flag=0;
number=0;
}
if(number_display!
=0)
{
return1;
}
else
{
return0;
}
}
/*-----------------------------------------------------------
复位键扫描函数
------------------------------------------------------------*/
voidreset_keyscan()
{
if(reset==0)
{
delay(8);
if((reset==0)&&(!
reset_flag))
{
reset_flag=1;
number_display=0;
second=10;
}
}
else
{
reset_flag=0;
}
}
/*-----------------------------------------------------------
主函数
------------------------------------------------------------*/
voidmain()
{
TMOD=0x01;//设置为定时器0工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=0;
buzzer=0;
while
(1)
{
start_keyscan();
reset_keyscan();
while(action==1)
{
if(second<=5&&second>0)
fengming();
while(!
key_scan8()&&!
stop==0)
{
display(number_display,second);
if(second==0)
{
second=10;
break;
}
}
TR0=0;
display(number_display,second);
action=0;
break;
}
display(number_display,second);
}
}
/*-----------------------------------------------------------
中断服务函数
------------------------------------------------------------*/
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
timer0_count++;
if(timer0_count==20)
{
timer0_count=0;
second--;
if(second<=5&&second>0)
fengming();
if(second==0)
{
TR0=0;
number_display=0;
action=0;
}
}
}
6、设计体会
设计不仅是对前面所学知识的一种检验,而且也是对自己能力的一种提高。
下面我对整个设计的过程做一下简单的总结。
第一,接到任务以后进行选题。
选题是设计的开端,选择恰当的、感兴趣的题目,这对于整个设计是否能够顺利进行关系极大。
好比走路,这开始的第一步是具有决定意义的,第一步迈向何方,需要慎重考虑。
否则,就可能走许多弯路、费许多周折,甚至南辕北辙,难以到达目的地。
因此,选题时一定要考虑好了。
第二,题目确定后就是找资料了。
查资料是做设计的前期准备工作,好的开端就相当于成功了一半,到图书馆、书店、资料室去虽说是比较原始的方式,但也有可取之处的。
总之,不管通过哪种方式查的资料都是有利用价值的,要一一记录下来以备后用。
第三,通过上面的过程,已经积累了不少资料,对所选的题目也大概有了一些了解,这一步就是在这样一个基础上,综合已有的资料来更透彻的分析题目。
第四,有了研究方向,就应该动手实现了。
其实以前的三步都是为这一步作的铺垫。
通过这次设计,我对数字电路设计中的逻辑关系等有了一定的认识,对以前学的数字电路又有了一定的新认识,温习了以前学的知识,就像人们常说的温故而知新嘛,但在设计的过程中,遇到了很多的问题,有一些知识都已经不太清楚了,但是通过一些资料又重新的温习了一下数字电路部分的内容。
在这次设计中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法我们更好的理解知识,所以在这里非常感谢帮助我的同学。
通过这次课程设计,我想说为完成这次课程设计我们确实很辛苦,但苦中仍有乐,和同学们相互帮助,大学里三年的相处还赶不上这几天来的实在,我感觉我和同学们之间的距离更加近了。
这个工程确实很累,LED亮了起来,喇叭响起的是我一生以来最好听的声音,我们的心中就不免兴奋,不免激动。
前面的种种艰辛这时就变成了最甜美的回忆!
这次学习给我留下了深刻的印象,使我受益匪浅。
而且对于论文的总体构思也有了很多经验,相信自己经过这一次的训练与学习,对于今后会更加努力,做得最好。
课程设计已结束,对我而言,知识上的收获重要,精神上的丰收更加可喜。
让我知道了学无止境的道理。
我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。
挫折是一份财富,经历是一份拥有。
这次课程设计必将成为我人生旅途上一个非常美好的回忆。
在此要感谢我的指导老师,感谢老师给我这样的机会锻炼。
在整个设计过程中我懂得了许多东西,也培养了我独立工作的能力,树立了对自己工作能力的信心,相信会对今后的学习工作生活有非常重要的影响。
而且大大提高了动手的能力,使我充分体会到了在创造过程中的探索的艰难和成功的喜悦。
虽然这个项目还不是很完