精品完整版基于51单片机8路抢答器设计.docx
- 文档编号:7748033
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:20
- 大小:689.75KB
精品完整版基于51单片机8路抢答器设计.docx
《精品完整版基于51单片机8路抢答器设计.docx》由会员分享,可在线阅读,更多相关《精品完整版基于51单片机8路抢答器设计.docx(20页珍藏版)》请在冰豆网上搜索。
精品完整版基于51单片机8路抢答器设计
创新实践课
课程名称:
实践题目:
基于51单片机8路抢答器设计
学院:
专业:
年级:
学生姓名:
指导教师:
日期:
目录
一、前言3
二、电路原理图设计3
三、印制版图设计7
四、软件设计9
五、测试数据及分析16
六、总结18
一、前言
目前,抢答器已经作为一种必不可少的工具广泛应用于各种智力和知识竞赛场合,但一般的抢答器可靠性低,使用寿命短,介于这些不方便因素,此次设计提出了用51单片机为核心控制元件,设计一个简易的八路抢答器。
本方案以51单片机作为主控核心,与晶振、数码管、蜂鸣器等通过外围接口实现的八路抢答器,利用了单片机的延时电路、按键复位电路、时钟电路、定时器/计数器等,设计的八路抢答器不仅具有实时显示抢答选手的号码和抢答时间的功能,同时还利用汇编语言编程,使其实现复位、定时和报警的功能。
本次设计的系统实用性强、判断精确、操作简单、扩展功能强。
功能:
以STC89C52RC单片机作为主控核心,与晶振、数码管、蜂鸣器等通过外围接口实现的八路抢答器,利用了单片机的延时电路、按键复位电路、时钟电路等,设计的八路抢答器不仅具有实时显示抢答选手的号码和抢答时间的功能,同时还利用汇编语言编程,使其实现复位和报警的功能。
此系统是基于51单片机,led发光二极管,一位共阳数码管,蜂鸣器,按键,等分立元件设计而成。
元件设计的意义:
关于按键:
共设计了10个独立按键,其中8个分别为八位选手抢答输入用,另外两个分别为开始和停止按键!
只有裁判按下了开始键才进入正常抢答,否则属于犯规抢答,抢答完毕,裁判按下停止,数码管显示0。
关于led发光二极管:
共设计了9个发光二极管,其中一个为电源指示,其他8个为选手抢答状态指示,正确抢答时led发光二极管缓慢闪烁,犯规抢答时,快速闪烁。
关于数码管:
选手按下自己的按键时显示相应的选手编号!
裁判按下开始键时数码管显示倒计时,倒计时0--9--8--7--6--5--4--3--2--1--0共10秒。
关于蜂鸣器:
选手正确抢答时蜂鸣器响一声,犯规抢答时响两声,倒计时结束时响一声。
系统采用5v直流供电,通电前注意电源正负极,以及电源接口是否匹配。
此系统通电有个短暂的自检时间,led发光二级管都亮下再灭,蜂鸣器也响一声再停,方便检测部分元件好坏。
二、电路原理图设计
(一)介绍AltiumDesigner软件
1、AltiumDesigner软件
AltiumDesigner软件是原Protel软件开发商Altium公司推出的一体化的电子产品开发系统,主要运行在WindowsXP操作系统。
这套软件通过把原理图设计、电路仿真、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出等技术的完美融合,为设计者提供了全新的设计解决方案,使设计者可以轻松进行设计,熟练使用这一软件必将使电路设计的质量和效率大大提高。
AltiumDesigner除了全面继承包括Protel99SE、ProtelDXP在内的先前一系列版本的功能和优点外,还增加了许多改进和很多高端功能。
该平台拓宽了板级设计的传统界面,全面集成了FPGA设计功能和SOPC设计实现功能,从而允许工程设计人员能将系统设计中的FPGA与PCB设计及嵌入式设计集成在一起。
由于AltiumDesigner在继承先前Protel软件功能的基础上,综合了FPGA设计和嵌入式系统软件设计功能,AltiumDesigner对计算机的系统需求比先前的版本要高一些。
2.AltiumDesigner软件的界面
图1-1AltiumDesigner软件的界面
3、功能
最基本的功能就是画原理图,设计PCB,另外还可以编辑Geber文件,以及FPGA的设计,可以将你的设计输出为PDF文档或者CAD文档以方便保护自己的设计或者配合结构件的设计。
(二)设计原理图步骤
1、原理图设计流程
图1-2原理图设计流程图
2、步骤
(1)创建PCB工程(项目文件)
启动ProtelDXP后,选择菜单【File】/【New】/【Project】/【PCBProject】
命令;完成后如图6-2.3所示
图1-3PCB创建图
(2)保存PCB项目(工程)文件
选择【File】/【SaveProject】菜单命令,弹出保存对话框【Save
[PCB_Project1.PrjPCB]AS…】对话框如图6-2.4所示;选择保存路径后在【文件名】栏内输入新文件名保存到自己自己建立的文件夹中。
(3)创建原理图文件
在新建的PCB项目(工程)下新建原理图文件。
在新建的PCB项目(工程)下,选择菜单【File】/【New】/【Schematic】命
(4)保存原理图文件
选择【File】/【Save】菜单命令,弹出保存对话【Save[Sheet1.SchDoc]AS…】
图1-4创建原理图
3、基于51单片机的八路抢答原理图
图1-5八路抢答的原理图
4、元件清单
表1-1元件清单
元件名称
规格型号
数量
电阻
1k
1个
10k
1个
4.7k
1个
3k
1个
470
7个
排阻
470
1个
电容
100uf
1个
10uf
1个
22pf
2个
104pf
1个
红绿指示灯
Led
9个
按键
10个
晶振
12M
1个
电源座子
1个
单片机
STC89C52RC
1个
Dip40座子
DY_5V
1个
蜂鸣器
FMQ
1个
三极管
8050
1个
1位共阳数码管
SMG_1
1个
三、印制版图设计
(一)电路板设计流程
图1-6印制电路板流程图
(二)PCB图
1.方法
在PCB编辑器窗口左侧的工作面板上,单击左下角的【Files】标签,打开【Files】菜单。
单击【Files】面板中的【NewFromTemplate】标题栏下的“PCBTemplate”选项,选择所需要的模板。
2.创建PCB图的文件
图1-7PCB图的创建
3.导入网络表格后的PCB图
激活PCB文件,执行菜单命令【Design】/【ImportChangesFrom单片机最小系统.PrjPCB】。
图1-8
图1-9
4.元件布局
(1)选中红色器件盒,在键盘上按下Delete键,将其删除。
(2)选中某个元件,按住鼠标左键拖动到板合适的位置后放开鼠标左键(在拖动过程中按下空格键可以旋转位置),将各个元件调整到适合的位置。
(3)执行菜单【AutoRoute】/【All...】
5..绘制好导线的PCB图
图1-10绘制好导线的PCB图
6、PCB的Bottomlayer和toplayer
图1-11PCB图的Bottomlayer
图1-12PCB图的toplayer
四、软件设计
(一)单片机软件流程图
图1-13软件流程图
(2)keil软件介绍
KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。
运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。
如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
KeilμVision4:
2009年2月发布KeilμVision4,KeilμVision4引入灵活的窗口管理系统,使开发人员能够使用多台监视器,并提供了视觉上的表面对窗口位置的完全控制的任何地方。
新的用户界面可以更好地利用屏幕空间和更有效地组织多个窗口,提供一个整洁,高效的环境来开发应用程序。
新版本支持更多最新的ARM芯片,还添加了一些其他新功能。
2011年3月ARM公司发布最新集成开发环境RealViewMDK开发工具中集成了最新版本的KeilμVision4,其编译器、调试工具实现与ARM器件的最完美匹配。
(三)KeilC编译步骤
1、运行Keilc51进入编辑界面,如图4.1所示。
图1-14Keilc51编辑界面
2、首先进入菜单project/newproject建立一个新工程,如图4.2所示。
图1-15建立新工程
3、选择要保存的路径,输入工程文件的名字,如图4-3所示。
图1-16保存路径
4、根据使用的单片机选择相应的型号,如图4.4所示。
图1-17选择单片机型号
5、单击“Target1”前面的“+”号,然后在“SourceGroup1”上单击右键,弹出如图4.5所示界面加入源文件。
如还没有源文件请先进入菜单File/New生成一个*.C格式的文件。
图1-18加入源文件界面
6、进行输出文件设置,进入菜单project/optionsfortarget选择OUTPUT选项卡,勾选CrestHEXFile项,如图4.6所示。
图1-19输出文件设置
7、程序编写完成后进入菜单Project/Buildtarget编译工程,如图4.7所示。
生成的*.HEX文件即可作为下载程序使用。
图1-20生成文件
(四)程序设计及说明
//8个选手,正确抢答:
显示选手号,对应的led慢闪,蜂鸣器响一声
//犯规抢答:
显示选手号,对应的led快闪,蜂鸣器响两声
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitkey1=P1^0;sbitkey2=P1^1;sbitkey3=P1^2;sbitkey4=P1^3;//选手1--4
sbitkey5=P1^4;sbitkey6=P1^5;sbitkey7=P1^6;sbitkey8=P1^7;//选手5--8
sbitd1=P0^0;sbitd2=P0^1;sbitd3=P0^2;sbitd4=P0^3;//选手指示灯1--4
sbitd5=P0^4;sbitd6=P0^5;sbitd7=P0^6;sbitd8=P0^7;//5--8
sbitalarm=P3^1;//蜂鸣器控制端
ucharcodedisplay[10]={0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84};//共阳0---9
bitflag=0;//是否允许抢答标志,初始【不允许】
bitflag1=1;//是否允许扫描按键标记,初始【允许】
ucharcounter,time=10;//计数器,10s抢答倒计时
//==========================================================延时函数=================================================
voiddelay1m(uintk)
{
uintj;
while(k--)
for(j=0;j<121;j++);
}
//===========================================================定时器,外中断初始化函数================================
voidinit_function()
{
TMOD=0x01;//定时器T0,工作于方式1
TH0=(65535-50000)/256;//定时50ms
TL0=(65535-50000)%256;
TR0=0;//启动T0
IT0=IT1=1;//外部中断负跳变触发
ET0=EX0=EX1=EA=1;//允许T0,外部中断0,1中断,开总中断
}
//================================================T0中断服务函数====================================================
voidtime0()interrupt1
{
TH0=(65535-50000)/256;//定时50ms
TL0=(65535-50000)%256;
counter++;
}
//===================================================响一声=========================================================
voidspeak1()
{
alarm=1;
delay1m(300);
alarm=0;
}
//===================================================响两声=========================================================
voidspeak2()
{
alarm=1;
delay1m(200);
alarm=0;
delay1m(200);
alarm=1;
delay1m(200);
alarm=0;
}
voidmain()
{
delay1m(500);//延时检测led,蜂鸣器
P0=0x00;alarm=0;//关led,蜂鸣器
init_function();//初始化函数
P2=display[0];//初始显示0
while
(1)
{
while(flag1)
{
if(flag)//正常抢答
{
if(!
key1){flag1=0;TR0=0;speak1();P2=display[1];while(flag1==0){d1=1;delay1m(300);d1=0;delay1m(300);}}//显示1,蜂鸣器叫,对应的led亮
elseif(!
key2){flag1=0;TR0=0;speak1();P2=display[2];while(flag1==0){d2=1;delay1m(300);d2=0;delay1m(300);}}//显示2,蜂鸣器叫
elseif(!
key3){flag1=0;TR0=0;speak1();P2=display[3];while(flag1==0){d3=1;delay1m(300);d3=0;delay1m(300);}}//显示3,蜂鸣器叫
elseif(!
key4){flag1=0;TR0=0;speak1();P2=display[4];while(flag1==0){d4=1;delay1m(300);d4=0;delay1m(300);}}//显示4,蜂鸣器叫
elseif(!
key5){flag1=0;TR0=0;speak1();P2=display[5];while(flag1==0){d5=1;delay1m(300);d5=0;delay1m(300);}}//显示5,蜂鸣器叫
elseif(!
key6){flag1=0;TR0=0;speak1();P2=display[6];while(flag1==0){d6=1;delay1m(300);d6=0;delay1m(300);}}//显示6,蜂鸣器叫
elseif(!
key7){flag1=0;TR0=0;speak1();P2=display[7];while(flag1==0){d7=1;delay1m(300);d7=0;delay1m(300);}}//显示7,蜂鸣器叫
elseif(!
key8){flag1=0;TR0=0;speak1();P2=display[8];while(flag1==0){d8=1;delay1m(300);d8=0;delay1m(300);}}//显示8,蜂鸣器叫
else
{
if(counter>=20)//1S时间到
{
counter=0;time--;
if(time==0)//10S到
{
TR0=0;P2=display[time];speak1();//显示0
flag=0;//抢答的时间内没人抢答,必须等待重新开始
}
P2=display[time];
}
}
}
else//犯规抢答
{
if(!
key1){flag1=0;TR0=0;speak2();P2=display[1];while(flag1==0){d1=1;delay1m(100);d1=0;delay1m(100);}}//数码管显示1,蜂鸣器叫
elseif(!
key2){flag1=0;TR0=0;speak2();P2=display[2];while(flag1==0){d2=1;delay1m(100);d2=0;delay1m(100);}}//数码管显示2,蜂鸣器叫
elseif(!
key3){flag1=0;TR0=0;speak2();P2=display[3];while(flag1==0){d3=1;delay1m(100);d3=0;delay1m(100);}}//数码管显示3,蜂鸣器叫
elseif(!
key4){flag1=0;TR0=0;speak2();P2=display[4];while(flag1==0){d4=1;delay1m(100);d4=0;delay1m(100);}}//数码管显示4,蜂鸣器叫
elseif(!
key5){flag1=0;TR0=0;speak2();P2=display[5];while(flag1==0){d5=1;delay1m(100);d5=0;delay1m(100);}}//数码管显示5,蜂鸣器叫
elseif(!
key6){flag1=0;TR0=0;speak2();P2=display[6];while(flag1==0){d6=1;delay1m(100);d6=0;delay1m(100);}}//数码管显示6,蜂鸣器叫
elseif(!
key7){flag1=0;TR0=0;speak2();P2=display[7];while(flag1==0){d7=1;delay1m(100);d7=0;delay1m(100);}}//数码管显示7,蜂鸣器叫
elseif(!
key8){flag1=0;TR0=0;speak2();P2=display[8];while(flag1==0){d8=1;delay1m(100);d8=0;delay1m(100);}}//数码管显示8,蜂鸣器叫
}
}
}
}
//==========================================================外部中断0中断函数,开始===================================
voidextern_int0()interrupt0
{
if(P2==display[0])//数码管显示0时开始键才响应
{
flag=flag1=1;//允许抢答,允许响应按键
time=10;
P0=0x00;//灯都灭掉
alarm=0;//关蜂鸣器
TR0=1;//倒计时,开定时器
}
}
//==========================================================外部中断1中断函数,停止===================================
voidextern_int1()interrupt2
{
flag1=1;//允许抢答,
flag=0;//不允许响应按键
TR0=0;//关定时器
P0=0x00;//灯都灭掉
alarm=0;//关蜂鸣器
P2=display[0];//显示0
}
(5)导程序
1、利用以下两个软件将程序导入51单片机
图1-21
2、在指定文件夹找到程序并添加
图1-22
五、测试数据及分析
1、程序初始化
图1-23未按下开始键
2、按下开始键,属于正常抢答,显示选手号,led慢闪,蜂鸣器响一声,锁定其他选手
图1-24开始抢答
2、裁判按下开始键时数码管显示倒计时,倒计时0--9--8--7--6--5--4--3--2--1--0共10秒。
选手8按下自己的按键8时,抢答器上显示相应的选手编号8,结果如图
图1-25正常抢答
3、未按下开始键,属于犯规抢答,显示选手号,led快速闪烁,蜂鸣器响两声,锁定其他选手
图1-26犯规抢答
4、按下停止,回到初始状态
图1-27复位
六、总结
此次设计主要以硬件系统为基础,硬件系统关系到电子产品的好坏,如系统的抗干扰性,安全性和可行性等,所以要合理地选择,合理地安排,尽量减少干扰,以提高系统性能。
单片机是很容易受干扰的控制器,当采用外部晶振时,应尽量让其靠近单片机,以减少对其的干扰,防止程序的混乱现象。
硬件系统的好坏很大部分在于经验,比如焊接是否干净利落,器件是否完好,操作是否规范等,所以我们要有好的动手能力。
软件设计确实设计的核心,具有多样化,灵活性高,易移植等优点。
首先我们要深深领会各指令的含义才能更加熟练应用。
中断的合理利用可以有效减少对CPU的占用,更好的处理好其他功能。
延时的应用会顺利地实现显示,鸣笛等功能,同时还可以去掉系统固有的不稳定性。
定时的应用则比较实际,能实现我们所需的功能。
软件的设计大部分采用模块化设计的方法以方便调试,并使其可读性大大增强,方便更改和移植。
通过此次的课程设计,让我们更进一步的巩固了单片机的各种知识。
但在设计的过程中,遇到了很多的问题,有一些知识已经不太清楚了,但是通过一些资料又重新的翻阅并且认真的复习了相关教科书中的内容。
此次的课程设计树立了对自己工作能力的信心,相信会对今后的学习工作生活都有非常重要的影响,而且大大的提高了动手能力,使我们充分的体会到了创造过程中的探索的艰难和成功的喜悦。
虽然这次做出的作品还存在很多需要改进的地方,但是在整个设计过程中所学习到的东西是这次实践所得到的最大收获跟财富,使我们终身受益。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精品 完整版 基于 51 单片机 抢答 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)