绪论------------------------------------------------------------------------------------------------------------- 3 第1章系统设计内容--------------------------------------------------------------------------------- 4 1.1 系统设计依据---------------------------------------------------------------------------------------- 4 1.2 设计任务和要求-----------------------------------------------------4 1.3 设计目的---------------------------------------------------------------------------------------------- 4 第2章 硬件设计-------------------------------------------------------------------------------------- 5 2.1 单片机控制原理------------------------------------------------------------------------------------- 5 2.2 抢答器的原理---------------------------------------------------------------------------------------- 6 2.3 功能模块电路--------------------------------------------------------------------------------------7 2.3.1 晶振复位及开始抢答电路-----------------------------------------------------------------7 2.3.2 选手抢答键(矩阵式键盘)----------------------------------------------------------------- 8 2.3.3.显示与显示驱动电路------------------------------------------------------------------------ 8 2.3.4 蜂鸣器音频输出电路------------------------------------------------------------------------ 9 2.3.5 发声系统设计------------------------------------------------------------------------------- 10 第3章 软件设计---------------------------------------------------------------------------------------- 10 3.1程序设计----------------------------------------------------------------------------------------------- 10 3.1.1 系统流程图-------------------------------------------------------------------------------------10 3.1.2 显示抢答违规流程图--------------------------------------------11 3.1.3 抢答成功流程图-------------------------------------------------11 3.2 程序代码-----------------------------------------------------------12 3.2.1主程序代码-----------------------------------------------------12 3.2.2 定时器子程序---------------------------------------------------16 3.2.3 延时子程序-----------------------------------------------------17 3.2.4 显示子程序-----------------------------------------------------17 第4章 系统调试--------------------------------------------------------18 第5章 总结------------------------------------------------------------18 参考文献-----------------------------------------------------------------19 附录一 程序代码----------------------------------------------------------20 附录二 原理图------------------------------------------------------------27 ·绪论 随着电子技术的飞速发展,基于单片机的控制系统已经广泛应用于工业、农业、电力、电子、智能楼宇等行业。微型计算机作为嵌入式控制系统的主体与核心,代替了传统的控制系统的常规电子线路。同时楼宇智能化的发展与成熟,也为基于单片机的照明控制系统的普及与应用奠定了坚实的基础。 电子智能抢答器在抢答过程中,为了知道哪一组或哪一位选手先回答问题,必须要设计一个系统来完成这个任务。如果在抢答中,靠视觉是很难判断出哪组先答题。利用单片机系统来设计抢答器,使以上问题得以解决,即使两组的抢答时间相差几微秒也可以分辨出使哪组优先回答问题。抢答组数可以在八组以内任意使用,本系统设计为模块形式采用九针插头进行连接,系统工作原理本系统采用AT89C51单片机作为核心。控制系统的五个模块分别为:单片机最小系统、显示模块、显示驱动模块、抢答开关模块、音乐音频输出模块。 多路数字抢答器在各种智力竞赛中经常用到。在各校举行的各种竞赛中我们也经常看到有抢答的环节,举办方多数采用让选手通过举答题板的方法判断选手的答题权,这在某种程度上会因为主持人的主观误断造成比赛的不公平性。为解决这个问题,我准备借本次课程设计的机会制作一个八路数显抢答器。一方面加深我们对所学习的知识的了解,巩固模拟、数字电路知识,也提升我们解决日常生活中常见问题的能力,掌握一般设计方法与设计步骤。积累实际设计制作经验,为走向更复杂更实用的应用领域奠定基础。控制系统主要由单片机控制电路、存储器接口电路及显示电路组成。具体以AT89C51单片机为系统工作核心,负责控制各个部分协调工作。在其外围接上了复位电路、上拉电阻、数码管、按钮及扬声器,其中用到了WAVE软件,集成调试环境,集成编辑器、编译器、调试器,支持软件模拟等。同时也用到了PROTEUS软件,通过仿真可完全实现对所设计系统的功能的模拟。 第1章 系统设计内容 1.1系统设计依据
抢答器由计数器、寄存器、集成定时器和译码显示等组合、时序电路组成。可分为抢答电路,定时电路,报警电路等几个单元部分。每个单元电路分别可以处理一些抢答竞赛中的基本问题。
本次课程设计设计的是一个多路定时抢答器,是一个多于两位选手参赛的一个抢答器,具有锁存和显示功能。同时有主持人控制系统的清零和抢答的开始。抢答开始后,若有任何一名选手按动抢答按钮,抢答器就会显示该选手编号直至系统被主持人清零,并有扬声器发出提示,同时其他人再抢答就无效了。这次设计的抢答器还有自动定时功能,主持人可以设定选手答题的时间。当主持人启动“开始”键后,定时器会自动减计时,这个会显示在显示器上。选手只有在抢答时间内抢答才有效,若在答题时间内没有选手答题,时间到时,报警电路就会发出警报亮灯并且禁止抢答。 1.2设计任务和要求 设计一个八路抢答器 要求:(1)设计出硬件电路; (2)设计出软件编程方法,并写出源代码; (3)用PROTEUS进行仿真; (4)论文格式要符合学院的统一规定,结构要合符逻辑,表达要得体。 1.3 设计目的 通过设计学习单片机最小系统的基本设计方法,掌握单片机应用系统的开发调试过程。 (1)学习单片机开发工具功能、特点和使用方法。 (2)学会单片机控制系统程序的编制和编制和调试方法。 (3)设计单片机抢答器硬件电路,绘制出电路原理图。 (4)编制并调试出键盘扫描程序和显示驱动程序。 (5)掌握单片机定时器的基本用法,编制出定时器的中断程序。 第2章 硬件设计 2.1 单片机控制原理 单片机(SCM)是单片微型计算机(SingleChip Microcomputer)的简称。它是把中央处理器CPU、随机存储器RAM、只读存储器ROM、I/O接口电路、定时/计数器以及输入输出适配器都集成在一块芯片上,构成一个完整的微型计算机。它的最大优点是体积小,可放在仪表内部。但存储量小,输入输出适配器简单,功能较低。目前,单片机在民用和工业测控领域得到最广泛的应用,早已深深地融入人们的生活中。 简单的说,用单片机系统来设计抢答器,实现两组的抢答时间即使是相差几微秒,也可分辨出哪组优先答题。 P0端口(P0.0-P0.7):P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。 P1端口(P1.0-P1.7):P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高电平,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 P2端口(P2.0-P2.7):P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3端口(P3.0-P3.7): P3口管脚是一个带有内部上拉电阻的8位的双向I/O端口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入端时,由于外部下拉为低电平,P3口将输出电流(ILL)。 2.2 抢答器的原理 抢答器的工作原理是采用单片机最小系统,用程序查询方式采用动态显示组号。主持人按下开始抢答键才可以抢答。主持人没有按下开始抢答按纽(P3.0),有人抢答则抢答违规,报警并显示组号,主持人按下开始抢答开关重新抢答。主持人按下开始抢答按纽(P3.0),蜂鸣响声提示,数码管30秒倒计时抢答,蜂鸣器响声提示并显示他的组号,30秒内有人抢答则开始60秒倒计时(60秒内必须回答完问题),最后五秒倒计时警报。单片机最小系统、抢答按键模块(四位并行数码显示)、显示模块、显示驱动模块、抢答开关模块、蜂鸣器音频输出模块。 2.2.1 原理及电路总框图 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg 图2.2.1抢答器总原理图 2.3 功能模块电路 2.3.1晶振复位及开始抢答电路 晶振的频率为12MHZ,提供89C51的时钟脉冲使89C51工作,复位电路是单片机初始化,使单片机重新开始执行程序。当复位开关按下RST由低电平变为高电平,则程序从头开始执行,在此次课程设计电路中当一个问题结束主持人后按下复位开关后进行下一题的准备。 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg 图2.3.1 晶振复位电路 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg 图2.3.1开始抢答电路 2.3.2 选手抢答键(矩阵式键盘) 89C51的P1口做一个为选手抢答的输入按键引脚,P1.0至P1.7轮流输出低电位,给每一个选手编号1至8,当选手按下按钮时,P1口个端口的电平变化从P1口输入,经单片机处理后从P0输出由数码管显示抢答者编号。 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg 图2.3.2 选手抢答电路 2.3.3 显示与显示驱动电路 此电路包括显示和驱动,显示采用数码管,驱动用P2口, 违规者编号、抢答30秒倒计时、正常抢答者编号和回答问题时间60秒倒计时,数码管采用动态显示。驱动电路P2口,查询显示程序利用P0口做段选码口输出P2低3位做位选码输出,当为低电平则能驱动数码管使其显示数字。在+5V电压下接10k的电阻,保证正常压降。 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg 图2.3.3 显示驱动电路 2.3.4蜂鸣器音频输出电路 通过控制不同频率的矩形脉冲来控制蜂鸣器发声。此次课程设计中只需要一些简单的提示声音和稍微显眼的灯控,有抢答违规,开始抢答,抢答时间结束和回答时间到得提示声和亮灯提醒。 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg 图2.3.4蜂鸣器音频输出电路 2.3.5 发声系统设计 声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单片机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调,使喇叭发出不同的声音。 图2.3.5发声系统电路图 第3章 软件设计 3.1程序设计 本程序采用子程序设计,在主程序中调用子程序来实现定时、倒计时、计分、显示等功能,这样程序会通俗易懂,同时也有利于程序的调试和修改。 3.1.1 系统流程图 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image013.gif 3.1.2显示抢答违规流程图 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image014.gif 3.1.3抢答成功流程图 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image015.gif 3.2 程序代码 3.2.1 主程序 voidmain() { init(); if(k==0) //主持人按下开始键 { Timer(); delay(10); while(!k); while(1) { dis(); m=0; n=0; if(second==10){beep=1;delay(500);beep=0;} if(second==0) { TR0=0;n=1; if(k==0) {beep=1;delay(500);beep=0;second=29;TR0=1;m=1;} } if(n==0) { if(k1==0) {delay(5);if(k1==0);while(!k1);t=1;} elseif(k2==0) {delay(5);if(k2==0);while(!k2);t=2;} elseif(k3==0) {delay(5);if(k3==0);while(!k2);t=3;} elseif(k4==0) {delay(5);if(k4==0);while(!k2);t=4;} elseif(k5==0) {delay(5);if(k5==0);while(!k2);t=5;} elseif(k6==0) {delay(5);if(k6==0);while(!k2);t=6;} elseif(k7==0) {delay(5);if(k7==0);while(!k2);t=7;} elseif(k8==0) {delay(5);if(k8==0);while(!k2);t=8;} elseif(k==0) {delay(5);if(k==0);while(!k);t=0;i=0;second=29;beep=1;delay(500);beep=0;TR0=1;} } while(t) { if(m==0)//开关,保证程序只执行一次 { switch(t) { case1: { TR0=0;i=1;second=0;beep=1;delay(500);beep=0; a1=0;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;m=1;break; } case2: { TR0=0;i=2;second=0;beep=1;delay(500);beep=0; a2=0;a1=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;m=1;break; } case3: { TR0=0;i=3;second=0;beep=1;delay(500);beep=0; a3=0;a1=1;a2=1;a4=1;a5=1;a6=1;a7=1;a8=1;m=1;break; } case4: { TR0=0;i=4;second=0;beep=1;delay(500);beep=0; a4=0;a1=1;a2=1;a3=1;a5=1;a6=1;a7=1;a8=1;m=1;break; } case5: { TR0=0;i=5;second=0;beep=1;delay(500);beep=0; a5=0;a1=1;a2=1;a3=1;a4=1;a6=1;a7=1;a8=1;m=1;break; } case6: { TR0=0;i=6;second=0;beep=1;delay(500);beep=0; a6=0;a1=1;a2=1;a3=1;a4=1;a5=1;a7=1;a8=1;m=1;break; } case7: { TR0=0;i=7;second=0;beep=1;delay(500);beep=0; a7=0;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a8=1;m=1;break; } case8: { TR0=0;i=8;second=0;beep=1;delay(500);beep=0; a8=0;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;m=1;break; } } } if(a1==0)//选手1的分数 { second=score1; dis(); if(m1==0){delay(5);if(m1==0);while(!m1);beep=1;delay(100);beep=0;score1+=1;if(score1==99)score1=60;} else if(m2==0){delay(5);if(m2==0);while(!m2);beep=1;delay(100);beep=0;score1-=1;if(score1==0)score1=60;} dis(); } else if(a2==0) { second=score2; dis(); if(m1==0){delay(5);if(m1==0);while(!m1);beep=1;delay(100);beep=0;score2+=1;if(score2==99)score2=60;} else if(m2==0){delay(5);if(m2==0);while(!m2);beep=1;delay(100);beep=0;score2-=1;if(score2==0)score2=60;} dis(); } else if(a3==0) { second=score3; dis(); if(m1==0){delay(5);if(m1==0);while(!m1);beep=1;delay(100);beep=0;score3+=1;if(score3==99)score3=60;} else if(m2==0){delay(5);if(m2==0);while(!m2);beep=1;delay(100);beep=0;score3-=1;if(score3==0)score3=60;} second=score3; dis(); } else if(a4==0) { second=score4; dis(); if(m1==0){delay(5);if(m1==0);while(!m1);beep=1;delay(100);beep=0;score4+=1;if(score4==99)score4=60;} else if(m2==0){delay(5);if(m2==0);while(!m2);beep=1;delay(100);beep=0;score4-=1;if(score4==0)score4=60;} second=score4; dis(); } else if(a5==0) { second=score5; dis(); if(m1==0){delay(5);if(m1==0);while(!m1);beep=1;delay(100);beep=0;score5+=1;if(score5==99)score5=60;} else if(m2==0){delay(5);if(m2==0);while(!m2);beep=1;delay(100);beep=0;score5-=1;if(score5==0)score5=60;} second=score5; dis(); } else if(a6==0) { second=score6; dis(); if(m1==0){delay(5);if(m1==0);while(!m1);beep=1;delay(100);beep=0;score6+=1;if(score6==99)score6=60;} else if(m2==0){delay(5);if(m2==0);while(!m2);beep=1;delay(100);beep=0;score6-=1;if(score6==0)score6=60;} second=score6; dis(); } else if(a7==0) { second=score7; dis(); if(m1==0){delay(5);if(m1==0);while(!m1);beep=1;delay(100);beep=0;score7+=1;if(score7==99)score7=60;} else if(m2==0) {delay(5);if(m2==0);while(!m2);beep=1;delay(100);beep=0;score7-=1;if(score7==0)score7=60;} second=score7; dis(); } else if(a8==0) { second=score8; dis(); if(m1==0){delay(5);if(m1==0);while(!m1);beep=1;delay(100);beep=0;score8+=1;if(score8==99)score8=60;} else if(m2==0){delay(5);if(m2==0);while(!m2);beep=1;delay(100);beep=0;score8-=1;if(score8==0)score8=60;} second=score8; dis(); } if(k==0){i=0;t=0;second=29;beep=1;delay(500);beep=0;TR0=1;} while(!k); } } } } 3.2.2 定时器子程序 voidTimer() { TMOD|=0x01; TH0=0xd8; //初值55536,计数10000次,每次1US,总计10ms TL0=0xf0; IE=0x82; //这里是中断优先级控制EA=1(开总中断),ET0=1(定时器0允许中断),这里用定时器0来定时 TR0=1; } voidtim(void) interrupt 1 using 1 //为定时中断TR0 { TH0=0xd8; //重新赋值 TL0=0xf0; count++; if(count==100) //100*10ms=1秒 { count=0; second--; //秒减1 } } 3.2.3 延时子程序 voiddelay(uint z) //延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } 3.2.4 显示子程序 voiddisplay (uchar shiwei,gewei,xuanshou) //显示函数 { P2=0xfe; //打开显示时间十位的位选 P0=shiwei;//显示十位 delay(5); P2=0xfd; //个位位选 P0=gewei; delay(5); P2=0xf7; //选手位选 P0=xuanshou; delay(5); } 第4章 系统调试 软件的设计与调试实行分模块实现的方法。本设计软件调试中的分模块包括显示功能模块,调整时间功能模块,抢答功能模块以及报警功能模块。各个独立模块功能调试成功后,将这些模块程序通过主程序合并在一起,最后再对合并后的总程序进行调试。各软件模块首先要通过PC和仿真器进行软件调试,当仿真效果符合要求后在烧写进单片机看是否在实际电路板上正常工作。本设计通过利用Proteus仿真,将所编写的程序用wave软件编译,所仿真原理图见附录。 1、 倒计时 当按下开始按钮时开始倒计时。 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image016.gif 2、计分 选手按下抢答按钮,显示选手号及基础分60。
|