基于51单片机抢答器的课程设计报告书.doc
文理学院物理与机械电子工程学院专业课程设计报告专业班级测控技术与仪器课 程51单片机技术与设计题 目基于51单片机的抢答器设计学 号学生指导教师2014年 5月基于51单片机的八位抢答器设计摘要 随着电子技术的飞速发展,基于单片机的控制系统已应用于工业、农业、电力、电子、智能楼宇等行业,微型计算机作为嵌入式控制系统的主体与核心,代替了传统的控制系统的常规电子线路。抢答器作为一种工具,已广泛应用于各种智力和知识竞赛场合。但抢答器的使用频率较低,且有的要么制作复杂,要么可靠性低。作为一个单位,如果专门购一台抢答器虽然在经济上可以承受,但每年使用的次数极少,往往因长期存放使(电子器件的)抢答器损坏,再购置的麻烦和与时性就会影响活动的开展,因此设计了本抢答器。本设计是以八路抢答为基本理念。考虑到依需设定限时回答的功能,利用AT89C51单片机与外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时。同时使液晶显示屏能够正确地显示时间,并且给出指令的提示,扬声器发生提示。系统能够实现:在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;抢答限定时间和回答以下问题的时间可在1-99s设定;可以显示是哪位选手有效抢答和无效抢答,正确按键后有声音的提示;抢答时间和回答以下问题时间倒记时显示,满时后系统计时有声音提示;抢答倒计时时间和回答以下问题时间均可通过硬件的按键调整。关键词:AT89C51;单片机;液晶显示屏;抢答器;智能16 / 21目录1 引言12 设计任务与要求概述12.1 题目12.2 设计任务12.3 设计要求12.4 设计目的13 方案总体设计23.1 方案23.1.1 控制芯片23.1.2 显示方式23.1.3 程序语言的选择23.2 原理框图34 硬件电路设计34.1 抢答器的工作原理34.2 单元电路设计34.2.1抢答器电路34.2.2 发声电路设计44.2.3 开始、复位按键输入电路的设计44.2.4时钟震荡电路44.2.5 设定时间、加减时间电路设计44.2.6 显示电路的设计55 软件设计65.1 抢答器工作流程65.2 流程框图66 电路仿真调试76.1 上电准备状态76.2 开始抢答76.3 非法抢答86.4 正常抢答87 实验仪器与元器件清单98 设计总结99 致910 参考文献10附录一 系统电路图11附录二 程序清单111 引言目前各种各样的竞赛越来越多,无论是学校、工厂、军队还是益智性电视节目,其中用到抢答器的概率非常大。目前很多抢答器基本上采用小规模数字集成电路设计,使用起来不够理想。因此设计一款更易于使用和区分度高的抢答器成了非常迫切的任务。现在单片机已进入各个领域,以其功耗小、智能化而著称。所以若利用单片机来设计抢答器,便使以上问题得以解决。针对以上情况,本课程设计出以AT89C51单片机为核心的八路抢答器。它能根据不同的抢答输入信号,经过单片机的控制处理并产生不同的与输入信号相对应的输出信号,最后通过液晶显示屏显示相应的路数和答题时间以与各项命令等,使竞赛真正达到公正、公开、公平。2 设计任务与要求概述2.1 题目8路比赛抢答器2.2 设计任务利用8051单片机中断系统,制作一个有8个按键的比赛抢答器,可供8名选手比赛的抢答,每组设置一个抢答按钮,按钮的编号与选手的编号对应,主持人设置控制开关,用来控制系统的清零和抢答的开始,在有人按键时进行对应选手显示。2.3 设计要求1 完成系统的硬件电路设计与软件设计;2 采用汇编或C语言编程;3 采用Proteus、KeilC等软件实现系统的仿真调试;4 论文要求思路清晰,结构合理,语言流畅,书写格式符合要求。2.4 设计目的1 综合运用相关课程中所学的理论知识去完成这一设计课题。2 通过查阅手册和相关文献资料,培养自己独立分析和解决问题的能力。3 进一步熟悉单片机和常用接口电路,加深对专业知识和理论知识学习的认识和理解。4 学会电路的设计与程序的调试。5 学会撰写课程设计论文。6 培养严肃认真的工作作风和严谨的科学态度。3 方案总体设计3.1 方案3.1.1 控制芯片我们采用51系列单片机AT89C51作为控制核心,该系统可以完成运算控制、信号识别以与显示功能的实现。单片机技术比较成熟,应用起来方便、简单并且单片机周围的辅助电路也比较少,便于控制和实现。整个系统具有极其灵活的可编程性,能方便地对系统进行功能的扩和更改。MCS-51单片机特点如下:a、可靠性好:单片机按照工业控制要求设计,抵抗工业噪声干扰优于一般的CPU,程序指令和数据都可以写在ROM里,许多信号通道都在同一芯片,因此可靠性高,易扩充。b、单片机有一般电脑所必须的器件,如三态双向总线,串并行的输入与输出引脚,可扩充为各种规模的微电脑系统。c、控制功能强:单片机指令除了输入输出指令,逻辑判断指令外还有更丰富的条件分支跳跃指令。3.1.2 显示方式在实现基本功能时,我们采用了四位数码管显示,后两位显示倒计时时间,第一位显示抢答组号,第三位置空,在此基础上还在程序里加了更改抢答时间和倒计时时间的模块,也可通过数码管显示,成为一个比较完整的系统。后来在实现拓展功能时,我们想加入语音显示的模块,发现proteus软件无法仿真,就改为用液晶显示屏1602显示。1602液晶显示屏也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块1602液晶模块部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,它可以通过简短的英文提示和数字使人明确看到比赛进行的整个过程。3.1.3 程序语言的选择一开始实现基本功能时,使用数码管作为显示,采用了汇编语言,比较高效,条理也清晰;后来做拓展功能时改用液晶显示屏显示,发现液晶显示屏使用c语言编程更便捷高效,就整体使用了c语言。3.2 原理框图抢答按扭 优先编码器 码电路锁存器译码电路译码显示主持人按钮开关 控制电路报警电路秒脉冲产生电路定时电路译码电路显示电路图3.1 原理框图4 硬件电路设计4.1 抢答器的工作原理用单片机的两个外部中断作为修改时间的选择按钮,选择修改抢答倒计时时间还是回答以下问题时间;用定时器1作为时间的控制。4.2 单元电路设计4.2.1抢答器电路该电路有八个按钮分别接于P1.0P1.7可实现两个功能:一是分辨出选手按键的先后,并锁存优先抢答者的编号,同时译码显示电路显示编号;二是禁止其他选手按键操作无效。如有再次抢答需由主持人将S开关重新置,“清除”然后再进行下一次抢答。如图4.1图4.1 抢答器电路4.2.2 发声电路设计用P3.6口和扬声器相连,主持人将控制开关拨到"开始"位置时,会发声,抢答电路和定时电路进人正常抢答工作状态;当参赛选手按动抢答键时,扬声器发声,抢答电路和定时电路停止工作。如图4.24.2.3 开始、复位按键输入电路的设计复位是计算机的一个重要工作状态。开始和复位键分别接于P3.0和P3.1口,在单片机工作时,接电之前,断电后也要复位。在抢答器中复位则为定时做铺垫,在抢答之前要复位,抢答完也要复位。按了复位键,显示屏的状态是“start”。如图4.3图4.2发声电路图4.3 开始、复位电路4.2.4时钟震荡电路CPU的操作需要精确的定时,可用一个晶体振荡器产生稳定的时钟脉冲来控制AT89C51单片机上的XTAL1和XTAL2分别为振荡电路的输入和输出。如图4.44.2.5 设定时间、加减时间电路设计该电路主要是对答题时间和抢答时间调整设计的,抢答时间接P3.2,答题时间接P3.3,加一秒接P3.4,减一秒接P3.5。如图4.5图4.4时钟振荡电路图4.5 加减时间电路4.2.6 显示电路的设计本系统通过液晶显示屏来显示各提示信息。如图4.6图4.6 显示时间电路5 软件设计5.1 抢答器工作流程为了能够达到抢答的公平、公正、合理,应该在主持人发布抢答命令之前必须先设定抢答的时间,因而在编开始抢答前的程序得先编写设定时间的程序,当时间设好了之后,主持人发布抢答命令按下P3.0按键,程序开始打开定时中断开始倒计时,然后调用键盘扫描子程序,编写键盘扫描程序。当在扫描到有人按下了答题键,马上关闭T0、调用显示程序、封锁键盘。接通电源后,液晶显示屏显示“Ready”,抢答器处于禁止状态,处于等待开始状态,此时有人抢答,会显示“error”,也可以调整抢答时间和回答以下问题时间,;主持人将开关置,“开始”状态,宣布“开始”抢答器工作,显示屏显示“go!”,扬声器给出声响提示,定时器倒计时;选手在定时时间抢答时,抢答器完成,显示组号,并且倒计时,时间到扬声器提示。当一轮抢答之后,定时器停止、禁止二次抢答、定时器显示剩余时间。如果再次抢答必须由主持人再次操作"开始、停止"状态开关。5.2 流程框图图5.1 流程框图6 电路仿真调试6.1 上电准备状态图6.1 上电准备状态6.2 开始抢答图6.2 开始抢答6.3 非法抢答图6.3 非法抢答6.4 正常抢答图6.4 正常抢答7 实验仪器与元器件清单表7-1 实验仪器与元器件清单器件名称规格型号数量微处理器AT89C511极性电容1uF1电阻(排阻)RESPACK89电容10uF2晶振12MHZ1按钮15液晶显示屏LM020L1扬声器BUZZER18 设计总结 通过这次课程设计,我更进一步地认识了抢答器的工作原理,掌握了它的调整与测试方法。本系统通过采用AT89C51单片机作为核心,以八个按键输入抢答信号,以液晶显示屏显示,根据烧录到单片机中的程序控制整个系统的工作流程,整体性好,效率高,实现了抢答器的智能化。在这过程之中也遇到了一些问题,比如对汇编语言理解还不够,将其转化为C语言时在时序上出现一些问题,还有C语言基础也需要加强,编程能力有待提高。9 致通过此次的课程设计,让我更进一步的巩固了单片机的各种知识。但在设计的过程中,遇到了很多的问题,有一些知识已经不太清楚了,但是通过一些资料又重新的翻阅并且认真的复习了相关教科书中的容。此次的课程设计树立了对自己工作能力的信心,相信会对今后的学习工作生活都有非常重要的影响,而且大大的提高了动手能力,使我充分的体会到了创造过程中的探索的艰难和成功的喜悦。虽然这次做出的作品还存在很多需要改进的地方,但是在整个设计过程中所学习到的东西是这次实训所得到的最大收获跟财富,使我终身受益。最后,我要感指导老师老师和浩辉同学在我将系统的汇编语言改为C语言时对我无私的帮助。10 参考文献1戴梅蕚 史嘉权 编著,微型计算机技术与应用(第四版)清华大学,2008.32(美)Bruce Eckel 著 昊鹏 译JAVA编程思想(第四版),机械工业,2007.6(2013.11重印)3博琴 吴宁 主编,微型计算机原理与接口技术(第三版),清华大学,密云胶印厂,2011.64毅刚等 编著,新编MSC-51单片机应用设计(第三版),工业大学,东林印务,2008.4附录一 系统电路图图附录 系统电路图附录二 程序清单#include<reg51.h> /包含单片机的头文件#include<intrins.h> /包含_nop_()函数定义的头文件sbit RS=P20; /寄存器选择位,将RS位定义为P2.0引脚sbit RW=P21; /读写选择位,将RW位定义为P2.1引脚sbit E=P22;sbit ring=P36;sbit start=P30;sbit ok=P31; sbit add=P34;sbit sub=P35;sbit D0=P10;sbit D1=P11;sbit D2=P12;sbit D3=P13;sbit D4=P14;sbit D5=P15;sbit D6=P16;sbit D7=P17;unsigned char num=0;unsigned char a=30,b=60,n=0,qd,hd,d;void display();void delay1ms() unsigned char i,j; for(i=0;i<10;i+) for(j=0;j<33;j+) ; void delay(unsigned char n) unsigned char i; for(i=0;i<n;i+) delay1ms(); void nopp(unsigned char n) unsigned char i; for(i=0;i<n;i+) _nop_();bit lcd_bz() bit result; RS=0; /根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1; /E=1,才允许读写nopp(4); /空操作四个机器周期,给硬件反应时间 result=(bit)(P0&0x80); /将忙碌标志电平赋给result E=0; return result;void WriteInstruction (unsigned char dictate) while(lcd_bz()=1); /如果忙就等待 RS=0; /根据规定,RS和R/W同时为低电平时,可以写入指令 RW=0; E=1; /E置低电平 nopp(2); /空操作两个机器周期,给硬件反应时间 P0=dictate; /将数据送入P0口,即写入指令或地址 nopp(4); /空操作四个机器周期,给硬件反应时间 E=1; /E置高电平(正跳变) nopp(4);/空操作四个机器周期,给硬件反应时间 E=0; /当E由高电平跳变成低电平时,液晶模块开始执行命令 void WriteData(unsigned char y) while(lcd_bz()=1); RS=1; /RS为高电平,RW为低电平时,可以写入数据 RW=0; E=1; /E置低电平 P0=y; /将数据送入P0口,即将数据写入液晶模块 nopp(4);/空操作四个机器周期,给硬件反应时间 E=1; /E置高电平(正跳变) nopp(4);/空操作四个机器周期,给硬件反应时间 E=0; /当E由高电平跳变成低电平时,液晶模块开始执行命令 void LcdInitiate(void) delay(15); /延时15ms,首次写指令时应给LCD一段较长的反应时间 WriteInstruction(0x30); /显示模式设置:8位数据,16×2显示,5×7点阵, delay(5); /延时5ms WriteInstruction(0x38); delay(5); WriteInstruction(0x0c); /显示模式设置:显示开,有光标,光标闪烁 delay(5); WriteInstruction(0x06); /显示模式设置:光标右移,字符不移 delay(5); WriteInstruction(0x01); /清屏幕指令,将以前的显示容清除 delay(5); void Display(unsigned char string) unsigned char i;i = 0; while(stringi != '0') / 显示字符 WriteData(stringi); i+; /*void bark() ring=1; delay(10); ring=0; */void answer() ring=1; delay(500); ring=0; WriteInstruction(0x01); delay(1); Display(" go! "); TR1=1 ;qd=1;d=a; while(1) /TR0=1; if(!D0)n=1; break; if(!D1)n=2; break; if(!D2)n=3; break; if(!D3)n=4; break; if(!D4)n=5; break; if(!D5)n=6; break; if(!D6)n=7; break; if(!D7)n=8; break; WriteInstruction(0x01); switch(n) case 1:Display(" number:1 ");hd=1;break; case 2:Display(" number:2 ");hd=1;break; case 3:Display(" number:3 ");hd=1;break; case 4:Display(" number:4 ");hd=1;break; case 5:Display(" number:5 ");hd=1;break; case 6:Display(" number:6 ");hd=1;break; case 7:Display(" number:7 ");hd=1;break; case 8:Display(" number:8 ");hd=1;break; n=0; /WriteInstruction(0x01); delay(5000);d=b; while(d+1) ; void display() unsigned char tm3=0x20,0,0;unsigned char a1,b1;a1=d/10;tm1=a1+0x30;b1=d%10;tm2=b1+0x30; WriteInstruction(0x01);delay(1);Display(tm);void main(void) /主函数 TMOD=0X11; /选择定时器方式1 TH0=0X00; /给定时器赋处置 TL0=0XFF; TH1=0X3C; TL1=0XB0; EA=1; ET1=1;/开总中断 EX0=1; ET0=1; EX1=1; TR1=1; LcdInitiate(); /调用LCD初始化函数 Display("ready."); while(1) if(start) if(!(D0&D1&D2&D3&D4&D5&D6&D7) WriteInstruction(0x01); delay(1); Display(" error "); ring=1; delay(500); ring=0; delay(500); WriteInstruction(0x01); else answer(); void Int0() interrupt 0 /中断服务程序 WriteInstruction(0x01);Display(" setting qd_tm");delay(1000);WriteInstruction(0x01); d=a;display(); while(1)if(!add) a+; d=a;display(); delay(500); else if(!sub) a-;d=a; display(); delay(500); if(!ok)break; void T0_timer() interrupt 1 /中断服务程序 TH0=0X00; TL0=0XFF; ring=0; void Int1() interrupt 2 /中断服务程序 WriteInstruction(0x01);delay(1);Display(" setting hd_tm");delay(1000); WriteInstruction(0x01); d=b;display(); while(1)if(!add) b+; d=b;display(); delay(500); else if(!sub) b-;d=b; display(); delay(500); if(!ok)break; void T1_timer() interrupt 3 /中断服务程序 TH1=0X3C; /重装初值 TL1=0XB0;num+; if(num=20) num=0; display(); d-; if(d=0) TR1=0 ;ring=1;delay(500);ring=0;