基于单片机的多路抢答器设计.doc_第1页
基于单片机的多路抢答器设计.doc_第2页
基于单片机的多路抢答器设计.doc_第3页
基于单片机的多路抢答器设计.doc_第4页
基于单片机的多路抢答器设计.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

西安文理学院机械与材料工程学院课程设计报告专业班级 测控1502 课 程 单片机课程设计 题 目 抢答器的设计 教研室 测控技术与仪器 学 号 2807150205 学生姓名 高宇璠 指导教师 杨森林 2017年9月 摘要 本次的课程设计基于单片机技术原理,以美国ATMEL公司开发的AT89S52芯片作为核心控制器。通过硬件电路的制作及软件程序的编制,设计制作了一种具有复位、校时功能的数字时钟系统。利用七段数码管实现星期、上下午和时间信息并且可以通过蜂鸣器和二极管实现整点提醒功能,用户可通过系统上的按键对时间进行调整,实现实时的时钟显示。本次设计的硬件由主控模块、提示模块以及显示模块构成。复位模块主要由电阻、电容、按键组成;提示模块主要由蜂鸣器、三极管、二极管、排阻组成;显示模块则由七段数码管构成,用于显示提示信息和实时时钟。 关键词: AT89S51;七段数码管; 蜂鸣器 目录摘要11.任务与要求32.电路设计42.2基本电路72.2.1整体电路72.2.2片机的最小系统82.2.3晶振模块82.2.4复位模块92.2.5数码管显示模块92.2.7发声模块104. 总结与感悟11附录0运行程序0 1.任务与要求设计任务:以51单片机为核心,设计一个供4组选手比赛的抢答器。每组设置一个抢答按钮,按钮的编号与选手的编号对应。主持人控制开始、复位和分数按键。初始状态,每组成绩均为0分,倒计时和组号显示全零。抢答开始,主持人按下开始键,系统显示15秒倒计时,绿灯亮。如果15秒内有选手抢答,则所有抢答开关被锁定,系统显示相应的组号,蜂鸣器响1声。此时,主持人按下答题键,选手开始答题,系统开始30秒倒计时显示。时间到,红灯亮1秒,蜂鸣器响1秒。答题结束,主持人将选手回答情况进行加分或减分,每按一次“+”或“”对应1分;每题分值改变范围为-33分。如果15秒内没有选手抢答,则所有抢答开关都将无效,此时红灯闪烁3秒,蜂鸣器间断响3秒。比赛结束,主持人按下复位键,系统将回到初始状态。 设计要求:1完成系统的硬件电路设计与软件设计;2采用C51语言编程;3采用Proteus、Keil C等软件实现系统的仿真调试;4设计报告要求思路清晰,结构合理,语言流畅,书写格式符合要求。5能条理清晰地讲述每个设计环节,完成设计答辩。2单片机的设计方案2.电路设计2.1 电路元件清单及部分元件简介 2.1.1电路基本元件 电路元件元件型号 电路元件元件型号单片机AT89S51 电阻RES电容CAP 极性电容CAP-ELEC晶振CRYSTAL 按键开关BUTTON数码管7SEG-MPX8-CA-BULL LED LED-RED&GREEN蜂鸣器BUZZER三极管MPSA562.1.2部分主要元器件简介AT89S51芯片AT89s51管脚图 图1.AT89S51引脚 AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,AT89S51在众多嵌入式控制应用系统中得到广泛应用。管脚说明VCC:电源电压输入端。GND:电源地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为低八位地址接收。P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写1时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址1时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入1后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口除了作为普通I/O口,还有第二功能:P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(T0定时器的外部计数输入)P3.5 T1(T1定时器的外部计数输入)P3.6 /WR(外部数据存储器的写选通)P3.7 /RD(外部数据存储器的读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。I/O口作为输入口时有两种工作方式,即所谓的读端口与读引脚。读端口时实际上并不从外部读入数据,而是把端口锁存器的内容读入到内部总线,经过某种运算或变换后再写回到端口锁存器。只有读端口时才真正地把外部的数据读入到内部总线。89C51的P0、P1、P2、P3口作为输入时都是准双向口。除了P1口外P0、P2、P3口都还有其他的功能。RST:复位输入端,高电平有效。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:地址锁存允许/编程脉冲信号端。当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令时ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。PSEN:外部程序存储器的选通信号,低电平有效。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。EA/VPP:外部程序存储器访问允许。当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。XTAL1:片内振荡器反相放大器和时钟发生器的输入端。XTAL2:片内振荡器反相放大器的输出端。7SEG-MPX8-CA-BULL7seg-mpx8-ca是共阳极数码管显示器,它左下侧的abcdefg dp是LED数码管显示器的I/O口,是段选信号,右下侧的12345678是它的位选信号,就是从左到右分别是第一位到第八位,段选信号与位选信号分别接到单片机的不同输出口,例如段选信号可以接到P0口,位选信号可以接到P2口,共阳极的字形显示代码为:uchar cod shuzi=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 .位选信号代码为:uchar wei=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80;当选中第一位时,段选信号就执行从0到9的显示。如果想显示数字的话,就要通过程序来执行:#include#include#define uchar unsigned char#define uint unsigne int#define uint unsigned intuchar code shuzi=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 ;uchar code wei=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80;void main() uchar i;while(1) for(i=0;i8;i+) P0=shuzii; P2=位i; 这样它就能显示数字了,这是在AT89s51单片机下的程序,P0口还要加一个上拉电阻。2.2基本电路2.2.1整体电路 图2.抢答器基本电路图2.2.2片机的最小系统单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统。对51系列单片机来说,最小系统一般应该包括:单片机、晶振电路、复位电路。AT89S51单片机的最小系统电路图: 图3.AT89S51最小系统2.2.3晶振模块单片机晶振的作用是为系统提供基本的时钟信号。通常一个系统共用一个晶振,便于各部分保持同步。有些通讯系统的基频和射频使用不同的晶振,而通过电子调整频率的方法保持同步。单片机晶振两端有2 个电容,这2 个电容叫晶振的负载电容,分别接在晶振的2 个脚上和对地的电容,一般在几十皮法。它会影响到晶振的振谐频率和输出幅度。晶振的负载电容=(Cd*Cg)/(Cd+Cg)+Cic+C。 图4.晶振模块示意图2.2.4复位模块电路由电容、电阻、复位按键组成,如图3.2 所示。AT89C51的复位引脚(RESET) 是第9 脚,当此引脚连接高电平超过2 个。机器周期,即可产生复位的动作。以12MHZ 的时钟脉冲为例,每个时钟脉冲为1uS,两个机器周期为2us,因此,在第9脚上连接一个2US的高电平脉冲,即可产生复位动作。最简单的就是只有一个电阻跟一个电容就可组成一个可靠复位的电路,复杂一点的就加个按键,可以进行手动复位。如图所示 图5.晶振模块示意图2.2.5数码管显示模块根据设计,系统包含4个LED数码管,都为八段(a、b、c、d、e、f、g、d p ),数码管分别显示四位参赛选手的分数。该系统采用共阳极数码管,对于阳阴极数码管,其公共端必须接高电平。数码管中选手初始分都为0分,每当主持人控制对应选手加减分时,数码管显示的数字对应发生改变。 图6.数码管显示模块2.2.6键盘模块尝试采用最简单的复位开关完成输入功能。通过按压按键K1,控制抢答开始以及答题开始,数码管显示倒计时。通过按压按键K2,,重置比赛,清零比分。通过按压按键K3以及K4,对正在答题的选手进行加减分。其余按键均为选手抢答专用,抢答成功的选手组好会在LED屏上显示。 图7.键盘输入模块示意图2.2.7发声模块发声模块由单片机和峰鸣器两大主要部分组成,如图3.5 所示,当选手抢答完成时或分数满10 分时给P3.7 输入高电平,蜂鸣器发出声音。 图8.发声模块电路图3.参考文献 由于个人能力实在不济,程序编写过程以及电路设计过程中参考了他人的经验。 /p-566008212.html /view/859f08183968011ca30091dd.html /p-290390019.html /view/d13037e3763231126fdb11ec.html1 马轲瀛.八路数字抢答器系统J.华商,2007,(23).2蔡朝阳.单片机控制实习与专题制作M.北京:北京航空航天大学出版社,2006年3林凌,李刚,丁茹,李小霞.新型单片机接口器件与技术M.西安: 西安电子科技大学出版社,2005年.4杨凌霄微型计算机原理及应用DM.江苏: 中国矿业大学出版社,2004年.5丁建伟抢答器电路设计J.兰州工业高等专科学校学报,2008,(04).4. 总结与感悟我在这一次抢答器的设计过程中,很是受益匪浅。通过对自己在大学期间所学的知识的|顾,并充分发挥对所学知识的理解和对本次课程设计论文的思考及书面表达能力,最终完成了。这为自己今后进步深化学习,积累 了一定宝贵的经验。撰写论文的过程也是专业知识的学习过程,它使我运用己有的专业基础知识,对其进行设计,分析和解决一个理论问题或实际问题,把知识转化为能力的实际训练培养了我运用所学知识解决实际问题的能力。由于个人能力实在不济,于是我只能在海量的信息和与组员的讨论中慢慢摸索,虽然结果并不完美。但是我已经很满意了,在这里我要感谢在这个过程中所有帮助过我的人。今后的学习中我仍需要加强keil与protues软件的使用熟练度,为以后的学习与工作打下基础。 附录 图9.抢答器工作流程图运行程序 #includereg52.h/引入51单片机头文件#includemath.h /数学计算方法头文件#define uchar unsigned char /快捷定义#define uint unsigned int /快捷定义#define key P3 /按键借口#define duan P2 /数码管段选借口#define wei P1 /数码管位选接口#define wei2 P0 /数码管位选接口sbit key1=P30;/按键1sbit key2=P31;/按键2sbit key3=P32;/按键3sbit key4=P33;/按键 4sbit key5=P17;/按键 4sbit people1=P34;/按键 4sbit people2=P35;/按键 4sbit people3=P36;/按键 4sbit people4=P37;/按键 4sbit led=P00; /指示灯接口sbit buzzer=P01;/蜂鸣器接口sbit ledH=P02; /指示灯接口sbit ledL=P03; /指示灯接口uchar i=0;/数码管显示计时uchar qinflag; /移位标志bit beepStart,ks,beepStart2; /报警标志uchar code shuzi19=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0xff,0xbf; /09,a,b,c,d,e,f,p,不显示,-,uchar code weizi11=0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x10,0x20;/位选数据uchar code error10=0xff,0xaf,0xc0,0xaf,0xaf,0x86,0xff,0xff,0xff;/erroruchar playshuzu11;uchar weishu;/位数,输入标志,错误次数,错误标志char time;uchar timeQD;/时间计时uchar timeDT; /答题时间uchar id; /选手编号bit startQD; /抢答启动bit startDT; /答题启动bit select; /选择uint count;/定时计时变量char fs1,fs2,fs3,fs4; /分数bit a;void init(); /初始化uchar scanzhi();/获取按键值void display();/数码管显示void duzhichuli();/数据处理void displayerror();/错误显示/=void keyscan()if(key1=0)/检测按键K1是否按下开始/Delay10ms();/消除抖动while(key1=0);/松手检测if(a=0)startQD = 1; /启动抢答timeQD = 15;/倒计时15秒select = 1;/启动选择ledL = 1; /绿灯亮elsestartDT = 1; /倒计时启动a = a;if(key2=0)/检测按键K2是否按下复位/Delay10ms();/消除抖动while(key2=0);/松手检测ledL = 0;/绿灯灭ledH = 0; /红灯灭select = 1;/选择fs1=0;/1号分数清零fs2=0;/2号分数清零fs3=0; /3号分数清零fs4=0; /4号分数清零for(i=1;i12;i+) /显示数据清零playshuzui=shuzi0;if(key3=0)/检测按键K3是否按下分数加/Delay10ms();/消除抖动while(key3=0);/松手检测switch(id)/选手编号case 1: /选手1fs1 = fs1 + 1;/分数加3if(fs1 0)/分数小于0/fs1 = abs(fs1); /playshuzu1 = shuzi18; /显示负号playshuzu2 = shuziabs(fs1);elseplayshuzu1 = shuzifs1/10;playshuzu2 = shuzifs1%10;break;case 2: /选手2fs2 = fs2 + 1; /分数加3if(fs2 0) /分数小于0/fs2 = abs(fs2);playshuzu3 = shuzi18; /显示负号playshuzu4 = shuziabs(fs2);/显示数elseplayshuzu3 = shuzifs2/10; /显示数playshuzu4 = shuzifs2%10; /显示数break;case 3: /选手3fs3 = fs3 + 1; /分数加3if(fs3 0)/分数小于0/fs3 = abs(fs3);playshuzu5 = shuzi18; /显示负号playshuzu6 = shuziabs(fs3);/显示数elseplayshuzu5 = shuzifs3/10; /显示数playshuzu6 = shuzifs3%10; /显示数break;case 4: /选手4fs4 = fs4 + 1; /分数加3if(fs4 0)/分数小于0fs4 = abs(fs4);playshuzu7 = shuzi18; /显示负号playshuzu8 = shuzifs4%10;/显示数elseplayshuzu7 = shuzifs4/10; /显示数playshuzu8 = shuzifs4%10; /显示数break;if(key4=0)/检测按键K4是否按下/Delay10ms();/消除抖动while(key4=0); /松手检测switch(id)case 1:/选手1fs1 = fs1 - 1;if(fs1 0)/分数小于0fs1 = abs(fs1);playshuzu1 = shuzi18; /显示负号playshuzu2 = shuzifs1%10;/显示数elseplayshuzu1 = shuzifs1/10; /显示数playshuzu2 = shuzifs1%10; /显示数break;case 2: /选手2fs2 = fs2 - 1;if(fs2 0)/分数小于0/fs2 = abs(fs2);playshuzu3 = shuzi18; /显示负号playshuzu4 = shuziabs(fs2); /显示数elseplayshuzu3 = shuzifs2/10; /显示数playshuzu4 = shuzifs2%10; /显示数break;case 3: /选手3fs3 = fs3 - 1;if(fs3 0)/分数小于0/fs3 = abs(fs3);playshuzu5 = shuzi18; /显示负号playshuzu6 = shuziabs(fs3);/显示数elseplayshuzu5 = shuzifs3/10; /显示数playshuzu6 = shuzifs3%10; /显示数break;case 4: /选手4fs4 = fs4 - 1;if(fs4 0)/分数小于0fs4 = abs(fs4);playshuzu7 = shuzi18;/显示负号playshuzu8 = shuzifs4%10;elseplayshuzu7 = shuzifs4/10; /显示数playshuzu8 = shuzifs4%10; /显示数break;if(select = 1 & startQD = 1) /抢答处理if(people1=0)/检测按键1号选手/Delay10ms();/消除抖动while(people1=0);/松手检测select = 0; /退出选择timeDT = 30; /倒计时30秒/startDT = 1; /倒计时启动startQD = 0; /抢答停止id = 1; /选手1time=0;playshuzu1 = shuzi10; /显示aplayshuzu2 = shuziid; /显示编号beepStart2 = 1;if(people2=0)/检测按键2号选手/Delay10ms();/消除抖动while(people2=0);/松手检测select = 0; /退出选择timeDT = 30; /倒计时30秒/startDT = 1; /倒计时启动startQD = 0; /抢答停止id = 2;/选手2time=0; /计时清零playshuzu3 = shuzi10; /显示aplayshuzu4 = shuziid; /显示编号beepStart2 = 1;if(people3=0)/检测按键3号选手/Delay10ms();/消除抖动while(people3=0);/松手检测select = 0;/退出选择timeDT = 30; /倒计时30秒/startDT = 1; /倒计时启动startQD = 0; /抢答停止id = 3; /选手3time=0; /计时清零playshuzu5 = shuzi10; /显示aplayshuzu6 = shuziid;/显示编号beepStart2 = 1;if(people4=0)/检测按键4号选手/Delay10ms();/消除抖动while(people4=0);/松手检测select = 0;/退出选择timeDT = 30; /倒计时30秒/startDT = 1; /倒计时启动startQD = 0; /抢答停止id = 4; /选手4time=0; /计时清零playshuzu7 = shuzi10; /显示aplayshuzu8 = shuziid; /显示编号beepStart2 = 1;void qin() /清楚显示函数uchar i;/yiweiflag=1; /不移for(i=1;i9;i+)playshuzui=shuzi17;/显示无void beepControl() /报警if(beepStart=1) /抢答报警三次switch(time) /鸣响3次,红灯闪烁三次case 1:buzzer = 0;ledH=0;break; /第一次case 2:buzzer = 1;ledH=1;break;case 3:buzzer = 0;ledH=0;break; /第二次case 4:buzzer = 1;ledH=1;break;case 5:buzzer = 0;ledH=0;break; /第三次case 6:buzzer = 1;ledH=1;break;buzzer = 1; /关蜂鸣器beepStart=0; /关报警time=0;/计时清零break;if(beepStart2=1) /报警switch(time) /鸣响1次,红灯闪烁1次case 1:buzzer = 0;ledH=0;break; /第一次case 2:buzzer = 1;/关蜂鸣器ledH=1; /关红灯time=0; /计时清零beepStart2=0;/关报警break;/=void main() /主函数init();/初始化display();/显示while(1)beepControl(); /报警keyscan(); /按键扫描/=void init()/初始化uchar i;qinflag=0; /不清除weishu=0; /位数beepStart=0;/报警buzzer=1; /蜂鸣器ledH=0; /红灯ledL=0; /绿灯timeQD=22;/抢答时间初始化startQD=0; /抢答count=0; /计时se

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论