基于单片机的抢答器课程设计.docx
《基于单片机的抢答器课程设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的抢答器课程设计.docx(39页珍藏版)》请在冰点文库上搜索。
基于单片机的抢答器课程设计
湖南工程学院
课程设计
课程名称单片机原理及应用
课题名称抢答器设计
专业自动化
班级自动化0902
学号200901020219
姓名曾艳红
指导教师王迎旭李晓秀汪超李世军
2012年6月13日
湖南工程学院
课程设计任务书
课程名称单片机原理及应用
课题抢答器设计
专业班级自动化0902
学生姓名曾艳红
学号200901020119
指导老师王迎旭李晓秀李世军汪超
审批王迎旭
任务书下达日期2012年6月5日
任务完成日期2012年6月13日
设计内容与设计要求
设计内容:
本课题要求以单片机开发板为基础,分析其结构以及各硬件模块的功能,画出出各模块原理图,并设计与之配套例程,整理例程库和使用说明书。
设计要求:
1)分析开发系统的硬件构成;
2)进行系统的硬件设计;
3)完成必要的参数计算与元器件选择;
4)完成应用程序设计;
5)进行单元电路及应用程序的调试;
6)写出使用说明书。
主要设计条件
1.一位主持人与3位抢答者,复位后,甲乙丙的绿、红灯全亮,开始键、复位键的指示灯全暗;
2.主持人按复位键则仅复位指示灯亮,其他都暗,准备开始;主持人按开始键,开始灯亮,允许甲乙丙抢答,此时优先者则相应成功指示灯亮,如允许前抢就相应犯规灯亮;
3.答题开始进行倒计时,到规定时间不允许答题,并返回复位状态。
4.可以通过键盘操作修改答题限制时间和枪答限制时间。
说明书格式
1.课程设计任务书
2.目录
3.系统总体方案选择与说明
4.系统结构框图与工作原理
5.各单元硬件设计说明及计算方法
6.软件设计与说明(包括流程图)
7.调试结果与必要的调试说明
8.使用说明
9.程序清单
10、总结
11、参考文献
附录
附录A系统原理图
附录B程序清单
4.2仿真结果分析11
第6章心得体会13
第1章课题设计的要求、目的及意义
1.1课题设计的要求
本课题要求以单片机为核心设计一个电子抢答器,具有抢答控制和倒计时显示功能。
有一位主持人与3~4位抢答者,控制器应有复位控制、开始控制、抢答控制和状态指示等功能,并有答题时间控制和显示功能。
设计任务包括控制器硬件设计和应用程序设计。
1.2课题设计的目的及意义
课题设计的目的:
1)掌握用51单片机控制LED数码管显示字符的方法。
2)掌握用单片机进行显示系统开发的方法。
3)掌握单片机软件、硬件调试技术。
4)了解LED显示器的一般驱动方法。
课题设计的意义:
本系统采用单片机作为整个控制核心。
该系统通过抢答电路键盘按键输入抢答信号;利用一个数码管来完成显示功能;用按键来让选手进行抢答,在数码管上显示哪一组先答题的,从而实现整个抢答过程。
在知识比赛中,特别是做抢答题目的时候,在抢答过程中,为了知道哪一组或哪一位选手先答题,必须要设计一个系统来完成这个任务。
如果在抢答中,靠视觉是很难判断出哪组先答题。
利用单片机系统来设计抢答器,使以上问题得以解决,即使两组的抢答时间相差几微秒,也可分辨出哪组优先答题。
通过该课程的学习使我们对计算机控制系统有一个全面的了解、掌握常规控制算法的使用方法、掌握简单微型计算机应用系统软硬的设计方法,进一步锻炼同学们在微型计算机应用方面的实际工作能力。
第2章总体设计思路
设计目的:
设计简单抢答器,功能齐全,连线简单,方便学校时常举行竞赛。
同时加深对单片机的认识和理解,加强自己的动手能力。
设计内容及要求:
本课题要求以单片机为核心设计一个竟赛抢答器系统,具有抢答控制和倒计时显示功能。
有一位主持人和3位抢答者,控制系统应有复位控制、开始控制、抢答控制和状态指示等功能,并有答题时间控制与时间显示功能。
设计任务包括控制系统硬件设计和应用程序设计。
一位主持人和3位抢答者,复位后,3位抢答者的两组指示灯全亮;开始后,开始指示灯亮,3位抢答者指示灯全暗,准备开始;优先者成功抢答及相应指示灯亮,不出现其他抢答者的序号;在规定前抢答,示为犯规并指示;答题开始,有倒计时显示,到规定时间不允许答题;复位返回。
在七段数码管上将其组号(1-3)显示出来,并使喇叭响一下(或LED显示)。
2.1总体设计框图
利用单片机设计,总体框图如下图2.1所示:
抢答按钮
控制电路(单片机)
主持人开始、复位按钮
报警电路
计时电路
图2.1总体框图
本抢答系统设计为三路抢答,通过对应LED灯亮、数码管显示编号来表明某一抢答者抢答,在抢答者抢答之前,由主持人按下复位键后,在按下开始键,说明抢答开始,10秒钟之内,若有人抢答,就由抢答者开始答题,限时一分钟,一分钟内答完,由主持人复位,再重新开始新一轮的抢答;若一分钟内未答完,系统就会报警,定时器中断,停止计时,此次抢答完成,再开始新一轮的抢答。
10秒分钟内没人抢答,系统报警,进入下一个题目的抢答。
抢答者若是在复位键按下后,开始键按下之前就强答,则说明抢答者未按规则抢答,此次抢答也无效,然后由主持人复位,开始抢答下一题目。
2.2总体设计流程图
利用单片机设计,总体设计流程图如下图2.2所示:
主持人按下复位键
有人未按规则抢答
开始键按下
N
报警
Y
开始灯亮
N
10秒钟内有无人抢答
Y
对应指示灯亮,数码管显示编号及时间
N
一分钟内是否答完
Y
图2.2总体设计流程图
第三章各单元设计及说明
3.1硬件单元设计及说明
3.1.1抢答电路
抢答器是将键盘部分、单片机部分、锁存显示部分按指示的3个单元电路相接。
这样就将整个硬件部分连接起来组成一个整体电路。
抢答器由主体电路和扩展电路两部分组成。
主体电路完成基本的抢答功能;扩展电路完成定时抢答的功能。
定时抢答器的工作过程是:
接通电源时,节目主持人按下复位键,抢答器处于禁止工作状态,编号显示器灭灯,定时显示器灭灯,当节目主持人宣布“抢答开始”,同时按下开始抢答键,定时显示器显示设定的时间,抢答器处于工作状态,定时器倒计时。
当定时时间到,却没有选手抢答时,系统报警,并封锁输入电路,禁止选手超时后抢答。
在规定时间内若有人抢答,抢答时间为10秒钟,在一分钟内若抢答完,主持人按下复位键,开始新一轮的抢答,若没有抢答完,会发出报警声,主持人按下复位键,在进入新一轮的抢答。
3.1.2单片机电路引脚各部分连接及功能
AT89C52(如图3.1所示)提供以下标准功能:
8字节FLASH闪速存储器,256字竹内部RAM,32个I/O口线,3个16位定时/计数器,一个6向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89c52可降至OHz的静态逻辑操作,并支持两种软件可选的节电上作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器.串行通信口及中断系统继续工作。
图3.1AT89C52芯片
3.1.3显示部分
采用动态扫描4位LED显示接口电路(如图3.2所示),LED动态显示是单片机中应用最为广泛的一种显示方式,其接口电路是把所有显示器的8个笔划段a~dp同名端并联在一起,而每一个显示器的公共极COM是各自独立地受I/O线控制,CPU的字段输出口送出字形码时,所有显示器由于同名端并联接收到相同的字形码,但究竟哪个显示器亮,则取决于COM端,这一端是由I/O控制的,可以自行决定何时显示哪一位。
在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的,尽管实际上各位显示器并非同时点亮,但只要扫描速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。
3.1.4矩阵键盘工作原理
本次因为要用到9个开关。
但是单片机板子上只有4个独立开关所以选择使用矩阵键盘。
本次用的是扫描法。
首先是判断有无键按下。
设其列口初值为0FH,然后输入行线状态,测试行线中是否有低电平,如果没有低电平则测试列线状态。
若有低电平则闭合键找到。
且键码值为行健号加上列键号。
本次设计可以通过键盘操作修改答题时间和犯规抢答时间。
3.1.5指示灯的设计原理
主持人没有按下开始键时复位灯亮。
当主持人按下开始键后开始灯亮。
没有按下开始键时抢答为犯规。
及犯规选手的灯和报警灯同时亮。
3.2软件设计及说明
3.2.1主函数
主函数是对定时器0、1的初始化,开放CPU总中断、定时器0、1中断,其中while循环是一个死循环,单片机一旦上电就一直会运行下去,不断扫描键盘的状态,通过scan()函数,两个中断函数来实现对个电路的控制,一实现抢答器的功能。
3.2.2定时器0中断的定时、倒计时
voidtimer0()interrupt1,这是定时器0的中断函数,设置定时时间为50ms,每运行50ms,就发生一次中断,且与软件计数器综合使用,软件计数为20,当计数达到20时,正好为一秒,即产生秒脉冲信号。
每一秒通过键盘扫描函数来判断有无按键按下,如果有就进入相应函数,执行相应功能。
比如主持人按下复位键后,再按下开始键后,开始灯会亮,数码管处于通电状态,并且显示0300,开始进入倒计时阶段,期间如有强答者抢答,数码管的第一位会显示抢答者的编号,后三位进入五分钟倒计时阶段,同时,没当有键按下,蜂鸣器都会响一声,蜂鸣器响的时长及频率由voidspeaker_out()该函数确定。
在规定时间内如果没有人抢答或者犯规抢答,或者定时时间已到就会发出报警声,并且报警灯也会亮。
3.2.3定时器1中断的动态扫描显示
voidtimer1()interrupt3,这是定时器1的中断函数,定时时间为10ms,即每隔10ms扫描一次键盘的状态,如果扫描时间太长的话,扫描频率低,数码管的显示会有闪烁,所以为了保证显示处于“连续”的状态,利用人眼的视觉逗留特性,这里我们设置器定时时间为20ms,满足要求。
数码管显示器的位选信号由单片机的P2口控制,段选信号由单片机的P0口控制。
3.2.4键盘扫描与控制
voidscan(),这是键盘扫描与控制函数,一旦主持人按下复位键(flag0=1),进入预抢答状态,三位抢答者的灯就会亮,同时数码管通电,如果在主持人没有按下开始键时就有人抢答,视此次抢答无效,报警灯会亮,并且发出报警声,显示器会显示对应抢答者的编号,然后有主持人重新按下复位键,开始新一轮的抢答;如果没有有犯规,主持人紧接着按下开始键,开始灯会亮,然后数码管显示倒计时3分钟,三分钟内有人抢答,抢答者按下抢答键,相应指示灯亮,数码管也会显示其编号,显示五分钟倒计时。
按规则抢答的子程序流程图如下图3.3所示:
开始
为0
60秒倒计时
N
非0
有人抢答
Y
1号抢答
3号抢答
2号抢答
抢答器3号灯亮,显示编号3
抢答器2号灯亮,显示编号2
抢答器1号灯亮,显示编号1
显示器显示一分钟倒计时,为0时或者抢答者答完
复位
图3.3抢答者按规则抢答子程序流程图
第四章调试与运行
4.1仿真测试
4.1.1开始抢答仿真:
主持人按开始按钮后,进入抢答10秒倒计时,仿真结果如图
4.1.2抢答犯规仿真:
若在主持人还未按开始按钮时,就抢答则为抢答犯规。
C号选手在主持人未宣布开始时就抢答,从而造成犯规,犯规仿真如图。
4.1.3抢答成功仿真:
主持人按开始按钮后,10秒内抢答则为成功抢答。
仿真图为A号选手成功抢答,抢答后进入60秒倒计时答题时间,抢答成功仿真如图
4.2仿真结果分析
通过对电路的仿真,可以看出基于AT89C52单片机控制的抢答器在PROTEUS软件上可以很好的实现抢答闪烁、抢答成功显示、抢答倒计时等一系列功能。
当仿真开始运行时,各个模块处于初始状态。
此时显示器并无状态显示,但此时抢答键处于开启状态,若此时有选手按下抢答键,则指示灯会闪烁,并且在数码管上显示犯规的选手的编号。
主持人重新按下开始键,此时表示抢答正式开始,并且数码管显示10秒倒计时,提醒选手抢答开始了。
选手抢答成功,同时也进入到倒计时60秒答题时间。
从仿真的测试结果来看,此设计还是能比较好的实现预期的目标。
第五章系统硬件调试及结果
二号选手成功答题与三号选手违规答题的硬件示意图如下:
图5.1二号选手答题成功图5.2三号选手答题违规
第六章心得体会
本单片机课程设计是要设计一个可用于实际操作的抢答器,该电路由我和我的搭档一起完成,该设计的显示要求是要显示剩余答题时间与剩余允许抢答时间及抢答选手号,有状态显示电路及报警电路。
要求有主持人复位按键,开始按键,三位抢答者各按键一个,一个蜂鸣器,用于提示选手或者主持人按下键以及犯规抢答、抢答超时等功能。
功能相当齐全,在以后还可扩展功能。
如自动控制记分器进行记分,并通过串行口与PC机通信,用PC机统计选手得分情况,完全实现智能化,减小人为因素造成的影响。
通过运用我所学习的单片机原理及应用、数字电子技术等关于电子技术的课程中的理论知识来完成此项设计。
在设计的过程中,通过查找资料又重新的温习了一下各个部分的内容,并且通过查阅书籍和相关文献资料来提高独立分析能力和解决实际问题的能力;掌握并熟练运用相关软件进行操作;熟悉常用电子器件的类型、特征和功能,并本着合理采选用的原则进行选用;进一步熟悉电子仪器的正确使用。
此外,本次我们设计的抢答器,电路简单,成本较低,操作方便,灵敏可靠,功能也较多。
在此我要感谢指导老师的悉心教导,感谢期间帮助过我的同学,谢谢你们,让我加强了对单片机知识的理解,能过把所学的理论知识运用到实际当中去,加强了我的动手能力。
同时,在整个设计过程中我懂得了许多东西,不仅加强了我与搭档一起合作的团结能力,增进了我们之间的友谊,树立了对自己工作能力的信心,相信这次设计对今后的工作有非常重要的影响,而且还大大提高了我的动手能力,使我充分体会到了在创造过程中的探索的艰难和成功的喜悦。
总之,通过这次课程设计我受益良多。
参考文献
1、《51系列单片机应用与实践教程》周向红编北航出版社
2、《单片机应用系统设计》何立民编北航出版社
3、《单片机原理及应用》王迎旭主编机械工业出版社2012年二月
4、《51系列单片机设计实例》楼然苗等编北航出版社
5、《51单片机应用系统开发典型实例》戴家等编中国电力出版社
7、《单片机实用系统设计技术》房小翠编国防工业出版社
附件
源程序
程序清单:
#include
unsignedcharflag0=0;//用于标志数码管显示的内容
unsignedcharflag1=0,flag2=0,flag3=0,flag4=0,flag5=1;//1表示数码管显示的内容,2表示选手正常答题,5表示复位状态
unsignedcharkey;//键盘扫描的键值
unsignedcharsec=0;//当前数码管显示的秒数
unsignedcharkey1=0,key2=0,key3=0;//每位数码管表示的数值
sbitLEDA=P1^0;
sbitLEDB=P1^1;
sbitLEDC=P1^2;
sbitLEDF=P1^3;
sbitLEDK=P1^4;
unsignedchart1,t2;
sbitALARM1=P1^7;
unsignedcharled1[11]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,
0x7D,0x07,0x7F,0x6F,0X71};//共阴数码管数字意以及F字符数组
//unsignedcharled2[3]={0x80,0x40,0x20};//数码管位选数组
unsignedcharled2[3]={0xFE,0xFD,0xFB};//数码管位选数组
voiddelay(intt)
{
unsignedchari,j;
for(i=0;ifor(j=0;j<100;j++);
}
voidinitiatime0()
{
TMOD|=0x01;//使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65536-50000)/256;//50毫秒
TL0=(65536-50000)%256;//给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
EA=1;//总中断打开
ET0=1;//定时器中断打开
TR0=1;//定时器开关打开
}
/*****************功能:
键盘扫描************/
key_scan()
{
unsignedchark=0,p3_h=0,p3_l=0;
P3=0XF0;
k=P3;
if(k!
=0XF0)
{
delay(20);//读入行键值
if(k!
=0XF0)
{
p3_h=P3;//行键值给高位
P3=0X0f;//翻转后读入列的值给P1(读键值时按键还未释放)
p3_l=P3;//列键值给低位
k=p3_h|p3_l;//高低位相或确定具体按键值
if(key==5||key==6||key==7)
{
if(k!
=0xED)
k=0;
}
switch(k)
{
case0:
return(0);break;
case0xEE:
if(flag2==0){flag0=1;sec=t1;initiatime0();return(key=1);}break;//开始
case0xED:
{flag0=1;return(key=2);}break;//复位
case0xEB:
{flag0=1;sec=t1;initiatime0();return(key=3);}break;
case0xe7:
{flag0=1;sec=t2;initiatime0();return(key=4);}break;
case0xde:
{flag0=1;sec=t2;initiatime0();return(key=5);}break;//A选手
case0xdd:
{flag0=1;sec=t2;initiatime0();return(key=6);}break;//B选手
case0xdb:
{flag0=1;sec=t2;initiatime0();return(key=7);}break;//C选手
//case0xd7:
{flag0=1;sec=t2;initiatime0();return(key=8);}break;
case0xbe:
{flag0=1;return(key=9);}break;//时间加
case0xbd:
{flag0=1;return(key=10);}break;//时间减
default:
return(0);break;
}
}
}
}
/*****************定时器T0**************
函数功能:
实现倒计时秒钟的递减
******************************************/
voidTimer0()interrupt1
{
staticunsignedcharcount;//计时数量
TH0=(65536-50000)/256;//50毫秒
TL0=(65536-50000)%256;//给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
P3=0xf0;
while(P3!
=0xf0)
{
key_scan();//键盘扫描
}
EX0=0;//关闭外部中断0
count++;
if(count==20)
{
count=0;
sec--;
}
if(sec==0)//倒计时完成,参数初始化
{
ET0=0;
sec=0;
TR0=0;
key=0;
}
}
/****************************************
函数名:
main
功能:
调节整个程序的功能完成显示功能
***************************************/
voidmain()
{
P1=0;//关闭所有灯
t1=10;
t2=60;
key=0;
flag0=0;
key1=10;
sec=0;
while
(1)
{
key_scan();//键盘扫描
if(sec==0&&flag3==0)//当倒计时完毕后flag0=0;是程序进入复位状态
{
flag0=0;
}
if(0==flag0)//显示FFF
{
P1=0;
LEDF=1;
//ALARM1=0;
key=0;
flag1=0;
flag2=0;
flag5=1;//做为复位的标志
key1=key2=key3=10;
P0=led1[key1];
P2=led2[0];
delay(5);
P0=led1[key2];
P2=led2[1];
delay(5);
P0=led1[key3];
P2=led2[2];
delay(5);
}
if(1==flag0)
{
flag4=0;
switch(key)
{
case1:
{
LEDK=1;
LEDA=LEDB=LEDC=LEDF=0;
flag2=1;
flag1=1;
key1=10;
key2=sec/10;
key3=sec%10;
P2=led2[0];
P0=led1[key1];
delay(60);
P2=led2[1];
P0=led1[key2];
delay(60);
P2=led2[2];//须先显示段码数码管不然会闪
P0=led1[key3];
delay(40);
}break;
case2:
//实现复位
{
flag2=0;
flag0=0;
flag3=0;
flag4=0;
flag1=0;
}break;
case3:
//实现抢答时间的设置
{
while