资源描述
课 程 设 计设计题目智力竞赛抢答器学生姓名学 号专业班级指导教师2011 年 月 日单片机智力竞赛抢答器设计 课程设计任务书设计题目智力竞赛抢答器成绩课程设计主要内容1 课题概述2 设计要求3 设计方案:1)方案论证,2)设计原理4 工作原理及程序流程图5 课程设计总结6 参考文献指导教师评语建议:从学生的工作态度、工作量、设计(论文)的创造性、学术性、实用性及书面表达能力等方面给出评价。签名: 200 年 月 日单片机智力竞赛抢答器设计概述随着科学技术的不断发展,促使人们学科学、学技术、学知识的手段多种多样。抢答器作为一种工具,已广泛应用于各种智力和知识竞赛场合。目前大多数抢答器均使用单片机及外围接口实现,基于单片机的智力竞赛抢答器系统框图如下图所示。 抢答开关电路分别设定选手抢答键若干个、主持人开始抢答键和复位键,每位选手对应一个抢答指示灯。系统工作后,首先由主持人按下开始键,单片机进入30秒倒计时,选手们开始抢答,如果在30秒内无人抢答,则自动放弃,进入下一题;若有人抢答,则单片机自动检测最先抢答选手信息并做出处理,封锁输入电路,禁止其他选手抢答,使选手对应的抢答指示灯点亮,LED显示器上同步显示抢答选手的编号,同时扬声器发声提示,表示抢答成功。此后,单片机进入90秒回答问题倒计时,若选手在90秒内回答完问题并回答正确,主持人按加分键,LED显示器上显示选手的得分;若选手回答完问题超时或回答错误,则主持人按减分键,LED显示器上显示选手的得分。主持人按下复位键,系统返回到抢答状态,进行下一轮抢答。在主持人按下开始抢答键前,有选手提前按下抢答键时,视为抢答犯规,系统红色报警灯点亮,LED显示器显示超前抢答报警信息,同时扬声器发声提示抢答犯规。当有几位选手同时按下抢答键时,由于在时间上必定存在先后,系统将自动锁存最先按键选手信号。一、 课程设计任务与要求1.课题概述用单片机实验装置模拟智力竞赛抢答器系统工作。本课题的硬件部分可以利用现有的目标板实验装置,实验箱上28矩阵键盘、LED显示器、K0K7开关电路、L0L7发光二极管和蜂鸣器电路等。具体安排如下:(1)抢答器可同时供8名选手或者8个代表队参加比赛。抢答开关电路设计方案:采用实验箱44矩阵键盘电路(参照本书第1部分第4章“图4.13 8279、键盘及LED显示电路示意图”),分别设置8个抢答键、主持人开始键和复位键; (2)8个选手抢答指示灯由实验箱L0L7发光二极管电路构成,单片机P1.0P1.7分别接L0L7;实验箱LED显示器共有6个LED管(参照本书第1部分第4章“图4.13 8279、键盘及LED显示电路示意图”),一个显示抢答选手编号,2个显示到计时时间,2个显示选手的分数,1个显示第几题等提示信息。(3)单片机定时器ET0,中断TR0。(4)单片机P3.2接实验箱扬声器。2设计要求(1)基本要求本课题硬件部分要求画出系统模块连接图,在实验平台上设计组成智力竞赛抢答器系统,并在其上调试自己设计、编制的程序,直到正确、完善达到要求为止。在软件程序设计方面,要完成以下基本内容:设计编写系统各模块的软件程序并调试通过,画出各程序模块的流程图。实现数据(选手编号)锁存和显示、超前抢答报警、抢答时间和回答问题时间倒记时显示、扬声器发生提示等基本功能。(2)附加要求附加要求则是根据学生学习单片机掌握和运用的情况选作,这给同学们开动脑筋发挥自己的创造性思维留出了空间。系统还可以增加以下功能:1)抢答限时倒计时和答题限时倒计时在达到最后5秒时进行声光报警,提示选手抢答剩余时间和答题剩余时间,扬声器每秒响一次,红色发光二极管闪烁点亮,频率为2Hz,占空比50%。2)抢答倒计时到达0时,报警,并锁定抢答开关禁止选手抢答。3)增加计分功能,当答题结束后,根据选手的答题情况给选手进行相应的加减分。二、设计方案1.方案论证在设计初期,根据所参阅的书目,提出使用8个开关来分别控制8个抢答的方案,但后来经过实践发现,这样就使主持人的主开关无法再设置,试验箱没有多余的可用开关,而且,参考硬件电路中需要用到反相器,这也是试验箱不能提供的,综上,这就使我们放弃这种方案,而决定使用键盘来代表八路抢答的选手代号,而主持人主开关使用开关控制,通过P1显示选手的信息。 2.设计原理该系统采用51系列单片机AT89C51作为控制核心,该系统可以完成运算控制、信号识别以及显示功能的实现。主要模块由单片机控制,时序控制,数码管显示,LED灯及响铃的逻辑控制,键盘控制及8279芯片的使用,基本框图如图1所示图1 设计原理框图三、工作原理及程序流程图 工作原理为:接通电源后,主持人将开关拨到“清除”状态,抢答器处于禁止状态,编号显示器显示为0,定时器显示初始设定时间;主持人将开关置“开始”状态(低电平启动),宣布“开始”抢答器工作。定时器开始倒计时,扬声器给出声响提示。选手在定时时间(在程序中设定为30秒)内抢答时,抢答器完成:优先判断、编号锁存、编号显示、扬声器提示。当第一轮抢答之后,定时器停止计时、禁止二次抢答、定时器显示剩余时间。如果在倒计时结束仍未有选手抢答,则响铃报警。再次抢答必须由主持人再次操作开始、停止状态开关,并且初始状态全部清零。 主程序流程图主程序主持人按开始按钮定时器及并行口初始化将时间计数器及启动标志值1开中断采并行口数据为0吗?启动标志m=0吗?判断抢答组号将抢答组发光二极管点亮判断哪一组为抢答组将抢答组号送显示抢答时间到了吗?输出响铃信号提示超时继续抢答比赛吗?系统返回NYYYNYN 抢答过程:挡主持人按复位键后,还没开始抢答,有选手按抢答器时,系统报警,LED显示器上显示哪位选手犯规:若没人按键,主持人按下开始键,即m=0,,开始抢答,倒计时30s,若在30s内没人抢答,则系统报警:若有人抢答,系统则锁定第一个抢答选手,即n=1,m=1,禁止抢答。开始回答问题,进行90s倒计时,在90s内回答完毕,且正确,主持人给选手加1分;否则,在90s内没回答出来,或者回答错误,主持人将会给选手减1分。刚开始抢答第一道题时,LED显示器上将显示为1,在90s倒计时结束后,在LED显示器上将会显示题目会自动加1,显示为2,主持人将进行第二题的抢答,后面依次一样。四、课程设计总结这次课程设计,更多的锻炼了自己的动手操作能力和汇编语言的软件编程思想,同时也是对所学单片机知识的综合运用,学以致用的效果。随着科学技术的迅猛发展,单片机在现代生活中的应用越来越广泛。这次的课程设计就给了我们一个很好的创造平台,来锻炼自己查阅文献,独立研究的能力。在进行设计同时,也发现理论与实际还是有一定差距的,自己还需要很多的实践经验来充实自己,达到举一反三的效果。刚拿到课程设计的题目时,看起来非常复杂,有一种无从下手的感觉。在搜集了一定的资料后,才有了一定的了解,在网上搜索了一些相关的知识,发现其中的程序有很大的问题存在,程序也比较繁琐,好多都没用,而且功能不全。最后找了一个程序,编译没错误,但是不能运行,在反复的查看中发现程序不全,其中大抢答功能不全,没法改,只能重新编程序,请教同学,最后编译成功。经过这次的课程设计,可以说经过了多天的学习, 课程设计不仅仅是让我们把所学的理论知识与实践相结合起来,提高自己的实际动手能力和独立思考的能力,更重要的是这次的课程设计收获的知识很多。发现、提出、分析、解决问题和实践能力的提高都会受益与我在以后的学习、工作和生活中。五、参考文献单片机原理及应用/王琼编著.合肥工业大学出版社单片机原理及应用实验教程/王琼编著.合肥工业大学出版社单片机课程设计指导/杨居义编著.清华大学出版社单片机接口模块应用与开发实例详解/薛小玲,刘志群,贾俊荣编著.北京航天航空大学出版社 单片机系统设计与实例分析/冯育长编著.西安电子科技大学出版社单片机原理及C51开发技术/潘育山编著.西南交通大学出版社程序:#include#include#include#define uchar unsigned char#define uint unsigned int#define D8279 XBYTE0x5EFF /8279 数据口地址#define C8279 XBYTE0x5FFF /8279 状态/命令口地址sbit beep=P32; /蜂鸣器sbit l1=P10;sbit l2=P11;sbit l3=P12;sbit l4=P13;sbit l5=P14;sbit l6=P15;sbit l7=P16;sbit l8=P17;uchar code tab = 0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86, 0x8e,0x8c,0xc1,0x89,0xc7, 0xbf,0x91,0x00,0xff;/LED显示常数表uchar xuanshou,second,count;uchar score1,score2,score3,score4,score5,score6,score7,score8,score,xianshi;/选手18的分数uint t,m,n,a1,a2,a3,a4,a5,a6,a7,a8,i;uchar idata huanchong5=0,0,0,0,0;/显示缓冲shijian,fenshu,xuanshouunsigned char timu=1;unsigned char disbuf6=0x17,0x17,0x17,0x17,0x17,0x17;bit bdata kbz; /anjianbiaozhiweivoid delay(uint z);void Timer();void disled(void);void dis();void init();uchar readkey();void delay(uint z) /延时函数uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);uchar readkey() uchar key;if(C8279&0x07)=0x00) kbz=0; /无键按下,置标志else kbz=1; C8279=0x40; /读FIFO RAM命令 key=D8279; key=(key&0x0f); /取键盘数据4?位 return(key); void tim(void) interrupt 1 using 1 /为定时中断TR0TH0=0x3c; /重新赋值TL0=0xb0;count+;if(count=20) /20*50ms=1秒count=0;second-; /秒减1if(second=0&m=1)beep=0;delay(500);beep=1; timu+; disbuf0=timu; TR0=0; disbuf1=disbuf2=disbuf3=disbuf4=disbuf5=23; if(readkey()=0x0f)TR0=0;xuanshou=0;t=0;beep=1;score=0;second=29; a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;m=1;n=1;void disled(void) /将缓冲区值显示出来 C8279=0x92; for(i=0;i6;i+) xianshi=huanchongi; D8279=tabxianshi;/-显示处理-void dis() huanchong5=timu; huanchong4=xuanshou;/shijian gewei huanchong3=score/10;/shijian shiwei huanchong2=score%10;/fenshu gewei huanchong1=second/10;/fenshu shiwei huanchong0=second%10;/xuanshouhao disled();void init() /初始化函数 t=0;beep=1;xuanshou=0;score=0;second=29;score1=10;score2=10;score3=10;score4=10;score5=10;score6=10;score7=10;score8=10;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;n=1;m=1; C8279=0xDC; /清除 LED 显示 delay(1);TMOD|=0x01;TH0=0x3c; /初值55536,计数10000次,每次1US,总计10msTL0=0xb0;IE=0x82; /这里是中断优先级控制EA=1(开总中断),ET0=1(定时器0允许中断),这里用定时器0来定时 C8279=0x02; /置8279工作方式/youduaua/shuru C8279=0x34; /置键盘扫描速率 PX1=1;PT0=1;ET1=1;xianshi=0;void main() init();/初始化, while(1) if(readkey()=0x0f)TR0=0;xuanshou=0;t=0;beep=0;delay(200);beep=1;score=0;second=29;m=1;n=1; a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1; l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis(); if(readkey()=0x01&n=1) xuanshou=1;score=score1;dis();l1=0;beep=0; else if(readkey()=0x02&n=1) xuanshou=2;score=score2;dis();l2=0;beep=0; else if(readkey()=0x03&n=1) xuanshou=3;score=score3;dis();l3=0;beep=0; else if(readkey()=0x04&n=1) xuanshou=4;score=score4;dis();l4=0;beep=0; else if(readkey()=0x05&n=1) xuanshou=5;score=score5;dis();l5=0;beep=0; else if(readkey()=0x06&n=1) xuanshou=6;score=score6;dis();l6=0;beep=0; else if(readkey()=0x07&n=1) xuanshou=7;score=score7;dis();l7=0;beep=0; else if(readkey()=0x08&n=1) xuanshou=8;score=score8;dis();l8=0;beep=0; else if(readkey()=0x0e) beep=0;delay(200);beep=1;TR0=1; m=0;n=0; if(n=0) if(m=0)dis(); if(second=0) t=0; beep=1;delay(500);beep=0;/30秒定时到TR0=0;n=1;/关中断,并使n等于1dis();if(readkey()=0x0f)TR0=0;xuanshou=0;t=0;beep=0;delay(500);beep=1;score=0;second=29;m=1;n=1; a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1; l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis(); if(m=0)/m等于零即处于抢答状态,查询选手键 if(readkey()=0x01) t=1; else if(readkey()=0x02) t=2; else if(readkey()=0x03) t=3; else if(readkey()=0x04) t=4; else if(readkey()=0x05) t=5; else if(readkey()=0x06) t=6; else if(readkey()=0x07) t=7; else if(readkey()=0x08) t=8; else if(readkey()=0x0f)TR0=0;xuanshou=0;t=0;beep=0;delay(500);beep=1;score=0;second=29;m=1;n=1; a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1; l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis(); while(t) if(readkey()=0x0f)xuanshou=0;TR0=0;i=0;t=0;beep=0;delay(200);beep=1;score=0;second=29;m=1;n=1;/ a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1; l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis(); if(m=0) /开关,保证程序只执行一次switch(t)case 1:TR0=0;xuanshou=1;second=0;beep=0;delay(500);beep=1; a1=0;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;m=1;l1=0;second=90;TR0=1;break;/跳出循环case 2:TR0=0;xuanshou=2;second=0;beep=0;delay(500);beep=1; a2=0;a1=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;m=1;l2=0;second=90;TR0=1;break; case 3:TR0=0;xuanshou=3;second=0;beep=0;delay(500);beep=1; a3=0;a1=1;a2=1;a4=1;a5=1;a6=1;a7=1;a8=1;m=1;l3=0;second=90;TR0=1;break;case 4:TR0=0;xuanshou=4;second=0;beep=0;delay(500);beep=1; a4=0;a1=1;a2=1;a3=1;a5=1;a6=1;a7=1;a8=1;m=1;l4=0;second=90;TR0=1;break; case 5:TR0=0;xuanshou=5;second=0;beep=0;delay(500);beep=1; a5=0;a1=1;a2=1;a3=1;a4=1;a6=1;a7=1;a8=1;m=1;l5=0;second=90;TR0=1;break;case 6:TR0=0;xuanshou=6;second=0;beep=0;delay(500);beep=1; a6=0;a1=1;a2=1;a3=1;a4=1;a5=1;a7=1;a8=1;m=1;l6=0;second=90;TR0=1;break; case 7:TR0=0;xuanshou=7;second=0;beep=0;delay(500);beep=1; a7=0;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a8=1;m=1;l7=0;second=90;TR0=1;break;case 8:TR0=0;xuanshou=8;second=0;beep=0;delay(500);beep=1; a8=0;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;m=1;l8=0;second=90;TR0=1;break; case 12:TR0=0;m=1;beep=0;delay(500);timu+; disbuf0=timu; disbuf2=disbuf3=disbuf4=disbuf5=23;TR0=1;break; if(a1=0) /选手1的分数 dis(); if(second=0)/定时到TR0=0;n=1;/关中断,并使n等于1,禁止抢答if(readkey()=0x0f)TR0=0;xuanshou=0;t=0;beep=0;delay(500);beep=1;score=0;second=29;m=1;n=1; a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1; l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis(); if(readkey()=0x0a) beep=0;delay(100);beep=1;score1+=1; else if(readkey()=0x0b) beep=0;delay(100);beep=1;score1-=1; score=score1; dis(); else if(a2=0) dis(); if(second=0) /30秒定时到 TR0=0;n=1;/关中断,并使n等于1,禁止抢答 if(readkey()=0x0f)/若此时再按下开始键,响铃提示,定时30s, TR0=0;xuanshou=0;t=0;beep=0;delay(500);beep=1;score=0;second=29;m=1;n=1; a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1; l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis(); if(readkey()=0x0a) beep=0;delay(100);beep=1;score2+=1; else if(readkey()=0x0b) beep=0;delay(100);beep=1;score2-=1; score=score2; dis(); else if(a3=0) dis(); if(second=0) /30秒定时到TR0=0;n=1;/关中断,并使n等于1,禁止抢答if(readkey()=0x0f)/若此时再按下开始键,响铃提示,定时30s, TR0=0;xuanshou=0;t=0;beep=0;delay(500);beep=1;score=0;second=29;m=1;n=1; a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1; l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis(); if(readkey()=0x0a) beep=0;delay(100);beep=1;score3+=1; else if(readkey()=0x0b) beep=0;delay(100);beep=1;score3-=1; score=score3; dis(); else if(a4=0) dis(); if(second=0) /30秒定时到TR0=0;n=1;/关中断,并使n等于1,禁止抢答if(readkey()=0x0f)/若此时再按下开始键,响铃提示,定时30s,TR0=0;xuanshou=0;t=0;beep=0;delay(500);beep=1;score=0;second=29;m=1;n=1; a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1; l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis(); if(readkey()=0x0a) beep=0;delay(100);beep=1;score4+=1; else if(readkey()=0x0b) beep=0;delay(100);beep=1;score4-=1; score=score4; dis(); else if(a5=0) dis(); if(second=0) /30秒定时到TR0=0;n=1;/关中断,并使n等于1,禁止抢答if(readkey()=0x0f)/若此时再按下开始键,响铃提示,定时30s, TR0=0;xuanshou=0;t=0;beep=0;delay(500);beep=1;score=0;second=29;m=1;n=1; a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1; l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis(); if(readkey()=0x0a) beep=0;delay(100);beep=1;score5+=1; else if(readkey()=0x0b) beep=0;delay(100);beep=1;score5-=1; score=score5; dis(); else if(a6=0) dis(); if(second=0) /30秒定时到TR0=0;n=1;/关中断,并使n等于1,禁止抢答if(readkey()=0x0f)/若此时再按下开始键,响铃提示,定时30s,TR0=0;xuanshou=0;t=0;beep=0;delay(500);beep=1;score=0;second=29;m=1;n=1; a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1; l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis(); if(readkey()=0x0a) beep=0;delay(100);beep=1;score6+=1; else if(readkey()=0x0b) beep=0;delay(100);beep=1;score6-=1; score=score6; dis(); else if(a7=0) dis(); if(second=0) /30秒定时到TR0=0;n=1;/关中断,并使n等于1,禁止抢答if(readkey()=0x0f) xuanshou=0;TR0=0;i=0;t=0;beep=0;delay(500);beep=1;score=0;second=29;m=1;n=1; a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1; l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis(); if(readkey()=0x0a) beep=0;delay(100);beep=1;score7+=1; else if(readkey()=0x0b) beep=0;delay(100);beep=1;score7-=1; score=score7; dis(); else if(a8=0) dis(); if(second=0) /30秒定时到TR0=0;n=1;/关中断,并使n等于1,禁止抢答if(readkey()=0x0f)TR0=0;xuanshou=0;t=0;beep=0;delay(500);beep=1;score=0;second=29;m=1;n=1; a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1; l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis(); if(readkey()=0x0a) beep=0;delay(100);beep=1;score8+=1; else if(readkey()=0x0b) beep=0;delay(100);beep=1;score8-=1; score=score8; dis(); if(readkey()=0x0f)xuanshou=0;TR0=0;i=0;t=0;beep=0;delay(200);beep=1;score=0;second=29;m=1;n=1;/ a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1; l1=1;l2=1;l3=1;l4=1;l5=1;l6=1;l7=1;l8=1;dis(); 14
展开阅读全文