基于51单片机的6路抢答器.docx
- 文档编号:12338563
- 上传时间:2023-04-18
- 格式:DOCX
- 页数:24
- 大小:147.93KB
基于51单片机的6路抢答器.docx
《基于51单片机的6路抢答器.docx》由会员分享,可在线阅读,更多相关《基于51单片机的6路抢答器.docx(24页珍藏版)》请在冰豆网上搜索。
基于51单片机的6路抢答器
成绩
课程设计报告
题目基于51单片机的6路抢答器
课程名称单片机原理及接口技术
院部名称
专业自动化
班级
学生姓名
学号
课程设计地点
课程设计学时
指导教师
金陵科技学院教务处制
基于51单片机的6路抢答器
摘要
此次设计提出了用AT89S51单片机为核心控制元件,设计一个简易的抢答器,本方案以AT89S51单片机作为主控核心,与晶振、数码管、蜂鸣器等构成六路抢答器,利用了单片机的延时电路、按键复位电路、时钟电路、定时/中断等电路,设计的六路抢答器具有实时显示抢答选手的号码和抢答时间的特点,还有复位电路,使其再开始新的一轮的答题和比赛,同时还利用C51语言编程,使其实现一些基本的功能。
本设计的系统实用性强、判断精确、操作简单、扩展功能强。
它的功能实现是比赛开始,主持人读完题之后按下抢答键,声音提示,提示音结束后抢答倒计时开始,此时数码管开始进行10s的倒计时,直到有一个选手抢答,选手按下抢答键时有声音提示并在对应的数码管上显示出该选手的编号和抢答所剩的时间。
如果在规定的10s时间内没有做出抢答,鸣笛提示本轮抢答结束,则此题作废,即开始重新一轮的抢答。
下一轮抢答前先将时间归零,再按下抢答键即开始。
抢答者回答正确后,主持人可按下加分键,对应于选手编号的数码管显示数字就增加(按下一次加一分,最高显示9分),反之,抢答者回答错误后,在该选手的得分数不为0时,主持人可按下减分键(按下一次减一分)。
关键词:
单片机、AT89S51、抢答器
第一章概述
随着电子技术的发展,诸如智力竞赛、娱乐项目越来越多,这就需要一个能在人非常多的情况下争取到发言或演示的装置,抢答器就满足了这样的要求欧,近年来由于数字电子技术的发展,数字抢答器也应运而生,因为它设计简单,功能稳定的优点被广泛应用于各种竞赛项目。
此次设计提出了用AT89S51单片机为核心控制元件,设计一个简易的抢答器,本方案以AT89S51单片机作为主控核心,与晶振、数码管、蜂鸣器等构成六路抢答器,利用了单片机的延时电路、按键复位电路、时钟电路、定时/中断等电路,设计的六路抢答器具有实时显示抢答选手的号码和抢答时间的特点,还有复位电路,使其再开始新的一轮的答题和比赛,同时还利用C51语言编程,使其实现抢答器的一些基本的功能。
本设计的系统实用性强、判断精确、操作简单、扩展功能强。
它的功能实现是比赛开始,主持人读完题之后按下抢答键,声音提示,提示音结束后抢答倒计时开始,此时数码管开始进行10s的倒计时,直到有一个选手抢答,选手按下抢答键时有声音提示并在对应的数码管上显示出该选手的编号和抢答所剩的时间。
如果在规定的10s时间内没有做出抢答,鸣笛提示本轮抢答结束,则此题作废,即开始重新一轮的抢答。
下一轮抢答前先将时间归零,再按下抢答键即开始。
抢答者回答正确后,主持人可按下加分键,对应于选手编号的数码管显示数字就增加(按下一次加一分,最高显示9分),反之,抢答者回答错误后,在该选手的得分数不为0时,主持人可按下减分键(按下一次减一分)。
第二章各模块的选择和论证
1.方框图
图2-0功能模块图
第一步按键扫描,AT89C51接收到按键扫描的信息确定是否开始启动本轮抢答,当扫描键被按下,第二步AT89C51启动声音模块,蜂鸣器发声一段时间停止发声,与此同时选手开始抢答,第三步AT89C51启动LED显示模块,显示抢答倒计时,和各选手的的分数,整个过程按键扫描一直执行,当有选手按下抢答键,按键扫描终止对选手按键的扫描,AT89C51启动声音模块提示有选手按键,并将该选手的序号发送到LED显示,第四步,按键扫描对加减分按键扫描,按键每按下一次对相应的选手对应的数码管上显示的分数加减一,直到抢答复位键的按下,开始新的一轮循环。
当倒计时结束时选手仍然没有按键,AT89C51启动声音模块,提示本轮抢答结束。
2.1抢答器显示模块选择
显示模块主要是显示抢答的时间,组别号码和选手得分情况。
在使用传统的数码管显示。
数码管具有:
低能耗、低损耗、低压、寿命长、耐老化、防晒、防潮、防火、防高(低)温,对外界环境要求低,易于维护,同时其精度高,称量快,精确可靠,操作简单。
数码显示是采用BCD编码显示数字,程序编译容易,资源占用较少。
显示功能与硬件关系极大,当硬件固定后,如何在不引起操作者误解的前提下提供尽可能丰富的信息,全靠软件来解决。
在这里我们使用的是七段数码管显示,通常在显示上我们采用的方法一般包括两种:
一种是静态显示,一种是动态显示。
其中静态显示的特点是显示稳定不闪烁,程序编写简单,但占用端口资源多;动态显示的特点是:
显示稳定性没静态好,程序编写复杂,但是相对静态显示而言占用端口资源少。
在本设计中根据实际情况采用的是动态显示方法。
4位8段数码管显示电路如下图所示。
图2-14位七段数码管显示电路图
图中数码管采用的是4位一体七段共阳数码管,其中A~DP段分别接到单片机的P0口,由单片机输出的P0口数据来决定段码值,位选码COM1,COM2,COM3,COM4,(COM1,COM2,
COM3,COM4)分别接到单片机的P2^0,P2^1,P2^2,P2^3,(P2^4,P2^5,P2^6,P2^7)由单片机来决定当前该显示的是哪一位。
在图中还有一个排阻,连接在P0口上,用作P0口的上拉电阻,保证P0口没有数据输出时候处于高电平状态。
通过查表法,将其在数码管上显示出来,其中P0口为字型码输入端,P2口的8位为字选段输入段。
在这里我们通过查表将字型码送给8段数码管显示的数字。
2.2控制器选择
控制器主要用于对显示、抢答、声音、计分等模块进行控制。
采用ATMEL公司的AT89S51作为系统控制器的CPU方案。
单片机算术运算功能强,软件编程灵活、自由度大,可以用软件编程实现各种算法和逻辑控制,并且由于其功耗低、体积小、技术成熟和成本低等优点,使其在各个领域应用广泛。
2.3键盘选择
键盘是单片机不可缺少的输入设备,是实现人机对话的纽带。
键盘按结构形式可以分为非编码键盘和编码键盘,前者用软件方法产生键码,而后者则用硬件方法来产生键码。
在单片机中使用的都是非编码键盘,因为非编码键盘结构简单,成本低廉,非编码键盘的类型很多,常用的有独立式键盘,行列式键盘等。
本设计采用独立式键盘:
键盘接口中使用多少根I/O线,键盘中就有几个按键,键盘接口使用了8根I/O口线,该键盘就有8个按键,这种类型的键盘,其按键比较少,且键盘中各按键的工作互不干扰。
因此可以根据实际需要对键盘中的按键灵活的编码。
如图2-2。
最简单的编码方式就是根据I/O输入口所直接反映的相应按键,按下的状态进行编码,称按键直接状态码,对于这样编码的独立式键盘,CPU可以通过直接读取I/O口的状态来获取按键的直接状态编码值,根据这个值直接进行按键识别,这样形式的键盘结构简单,按键识别容易。
独立式键盘的缺点是需要占用比较多的I/O口线,当单片机应用系统键盘中需要的按键比较少或I/O口线比较富余时,可以采用这样类型的键盘。
图2-2独立式键盘
2.4时钟频率电路的设计
单片机必须在时钟的驱动下才能工作。
在单片机内部有一个时钟振荡电路,只需要外接一个振荡源就能产生一定的时钟信号送到单片机内部的各个单元,决定单片机的工作速度。
时钟电路如下图所示。
图2-3外部振荡源电路
一般选用石英晶体振荡器。
此电路在加电大约延迟10ms后振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率确定。
电路中两个电容C1,C2的作用有两个:
一是帮助振荡器起振;二是对振荡器的频率进行微调。
单片机在工作时,由内部振荡器产生或由外直接输入的送至内部控制逻辑单元的时钟信号的周期称为时钟周期。
其大小是时钟信号频率的倒数。
图中时钟频率为12MHz。
2.5复位电路的设计
单片机的第9脚RST为硬件复位端,只要将该端持续4个机器周期的高电平即可实现复位,复位后单片机的各状态都恢复到初始化状态,其电路图如下所示:
图2-4按键复位电路
2.6报警电路
利用程序来控制单片机某个口线的“高”电平或“低”电平,接上蜂鸣器就能发出声音,若再利用延时程序控制“高”或“低”电平的持续时间,就能改变蜂鸣器鸣叫的时间。
本文设计如下图所示。
图中利用单片机的I/O端口P1^6,单片机通过设定该端口的高、低电平使蜂鸣器发声。
图2-5发声电路
3.系统硬件连接原理总图
图2-6系统硬件连接原理图
4.元器件清单
4位8段数码管2只;
AT89S51芯片1只;
12M晶振1只;
30PF瓷片电容2只;
10UF电解电容1只;
电阻1KΩ、200Ω、2.2KΩ各一只;
按键BUTTON11只;
三极管85501只;
蜂鸣器1只;
排阻471、102各一只;
74LS245一只;
第三章软件的设计
3.1程序流程图
图3-0
3.2源程序
#include
#defineuintunsignedint
#defineucharunsignedchar
/*-----------------------------------------------------------
共阳极0-9的数码管段码
------------------------------------------------------------*/
unsignedcharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0xc0};
/*-----------------------------------------------------------
变量定义
------------------------------------------------------------*/
sbitstart=P3^6;
sbitreset=P3^7;
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitkey4=P1^3;
sbitkey5=P1^4;
sbitkey6=P1^5;
sbitkey7=P1^6;
sbitkey8=P1^7;
sbitjia=P3^4;
sbitjian=P3^5;
bitaction=0;
ucharsecond=10,a[7]={0};
uchartimer0_count=0;
ucharnumber=0;
ucharnumber_display=0;
uchark;
/*-----------------------------------------------------------
延时函数
------------------------------------------------------------*/
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
/*-----------------------------------------------------------
显示函数
------------------------------------------------------------*/
voiddisplay(ucharnumber,ucharsecond)
{
P2=0x01;
P0=table[second];
delay
(1);
P2=0x02;
P0=table[number];
delay
(1);
P2=0x04;
P0=table[a[0]];
delay
(1);
P2=0x08;
P0=table[a[1]];
delay
(1);
P2=0x10;
P0=table[a[2]];
delay
(1);
P2=0x20;
P0=table[a[3]];
delay
(1);
P2=0x40;
P0=table[a[4]];
delay
(1);
P2=0x80;
P0=table[a[5]];
delay
(1);
}
/*-----------------------------------------------------------
抢答开始按键检测函数
------------------------------------------------------------*/
voidstart_keyscan()
{
voidfengling();
while(start==0)
{
key7=0;
display(number_display,second);
if(start==1)
{
key7=1;
action=1;
TR0=1;
}
}
}
/*-----------------------------------------------------------
抢答者按键检测函数
------------------------------------------------------------*/
ucharkey_scan8()
{
if(key1==0)
{
delay(8);
if(key1==0)
{
number=1;
number_display=number;
}
}
if(key2==0)
{
delay(8);
if(key2==0)
{
number=2;
number_display=number;
}
}
if(key3==0)
{
delay(8);
if(key3==0)
{
number=3;
number_display=number;
}
}
if(key4==0)
{
delay(8);
if(key4==0)
{
number=4;
number_display=number;
}
}
if(key5==0)
{
delay(8);
if(key5==0)
{
number=5;
number_display=number;
}
}
if(key6==0)
{
delay(8);
if(key6==0)
{
number=6;
number_display=number;
}
}
if(number_display!
=0)
{
returnnumber_display;
}
else
{
return0;
}
}
/*-----------------------------------------------------------
抢答复位函数
------------------------------------------------------------*/
voidreset_keyscan()
{
if(reset==0)
{
delay(8);
if(reset==0)
{
number_display=0;
second=10;
}
}
}
/*-----------------------------------------------------------
主函数
------------------------------------------------------------*/
voidmain()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=0;
P2=0x00;
while
(1)
{
reset_keyscan();
start_keyscan();
if(jia==0&&a[number-1]<9)
{
delay(10);
while(jia==0)
display(number_display,second);
a[number-1]=a[number-1]+1;
}
if(jian==0&&a[number-1]>0)
{
delay(10);
while(jian==0)
display(number_display,second);
a[number-1]=a[number-1]-1;
}
while(action)
{
while(!
key_scan8())//无人抢答
{
display(number_display,second);
if(second==0)
{
second=10;
break;
}
}
TR0=0;
key7=0;
delay(80);
display(number_display,second);
key7=1;
action=0;
break;
}
display(number_display,second);
}
}
/*-----------------------------------------------------------
定时中断
------------------------------------------------------------*/
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
timer0_count++;
if(timer0_count==20)
{
second--;
timer0_count=0;
if(second==0)
{
key7=0;
delay(60);
key7=1;
}
}
}
第四章系统调试
系统调试包括硬件调试和软件调试,而且两者是密不可分的。
我们设计好的硬件电路和软件程序,只有经过联合调试,才能验证其正确性;软硬件的配人情况以及是否达到设计任务的要求,也只有经过调试,才能发现问题并加以解决、完善,最终开发成实用产品。
硬件调试分单元电路调试和联机调试,单元电路试验在硬件电路设计时已经进行,这里的调试只是将其制成印刷电路板后试验电路是否正确,并排除一些加工工艺性错误(如错线、开路、短路等)。
这种调试可单独模拟进行,也可通过开发装置由软件配合进行,硬件联机调试则必须在系统软件的配合下进行。
软件调试一般包括分块调试和联机调试两个阶段。
程序的分块调试一般在单片机开发装置上进行,可根据所调程序功能块的入口参量初值编制一个特殊的程序段,并连同被调程序功能块一起在开发装置上运行;也可配合对应硬件电路单独运行某程序功能块,然后检查是否正确,如果执行结果与预想的不一致,可以通过单步运行或设置断点的方法,查出原因并加以改正,直到运行结果正确为止。
这时该程序功能块已调试完毕,可去掉附加程序段。
其它程序功能块可按此法进行调试。
程序联机调试就是将已调试好的各程序功能块按总体结构联成一个完整程序,在所研制的硬件电路上运行。
从而试验程序整体运行的完整性、正确性和与硬件电路的配合情况。
在联调中可能会有某些支路上的程序、功能块因受条件制约而得不到相应的输入参数,这时,调试人员应创造条件进行模拟调试。
在联调中如发现硬件问题也应及时修正,直到单片机系统的软件、硬件全部调试成功为止。
系统调试完成后,还要进行一段时间的试运行,从而检验系统的稳定性和抗干扰能力,验证系统功能是否达到设计要求,是否达到预期的效果。
本设计的调试方法:
先仿真,达到预期效果,
4.1硬件调试问题分析
数码管显示问题:
本次设计的最终方案是采用数码管显示屏实现显示功能,最初数码管显示不正常,亮度不够。
通过调试发现这是由于数码管的驱动电流不够,头一次增加了数码管驱动74LS245芯片在P0口,数码管依旧亮度不够,经分析,驱动应该加在数码管的位选信号上,再一次在P2口上加上74LS245芯片,数码管亮度正常。
蜂鸣器异常启动问题:
蜂鸣器的启动/关闭是通过单片机输出的控制信号来实现的,最初蜂鸣器始终不发出声音,经过仔细的检查原件及连接电路,找出了其不发声的原因,三级管用成了NPN型的8050,改动芯片为PNP型的8550后,蜂鸣器发音正常。
4.2软件调试问题分析
蜂鸣器发声异常:
蜂鸣器要发出声音是通过单片机的P1^6输出低电平来实现,最初仿真的时候用的是喇叭,它是需要单片机提供一个具有一定频率的方波信号来发声,所以一直不会发出声音,修改程序后,解决了该问题。
第五章总结
通过这次毕业设计,我才明白学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,努力提高自己知识和综合素质。
总之,不管学会的还是学不会的的确觉得困难比较多,真是万事开头难,不知道如何入手。
最后终于做完了有种如释重负的感觉。
此外,还得出一个结论:
知识必须通过应用才能实现其价值!
有些东西以为学会了,但真正到用的时候才发现是两回事,所以我认为只有到真正会用的时候才是真的学会了。
通过这次课程设计懂得了很多,我们自己去图书馆,上网查资料然后自己和我们这组的成员一起合作商讨完成的,原以为会很简单的,但无论在制作与写作过程中我们都遇到了理论课上所不曾遇到的问题,第一是综合性太强,这次制作与论文不仅涉及到我们以前所学到的单片机,模拟电子技术,数字电子技术,高等数学等课程的知识还涉及到很多
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 抢答