基于单片机的8路抢答器课程设计报告Word下载.docx
- 文档编号:22763421
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:25
- 大小:338.72KB
基于单片机的8路抢答器课程设计报告Word下载.docx
《基于单片机的8路抢答器课程设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的8路抢答器课程设计报告Word下载.docx(25页珍藏版)》请在冰豆网上搜索。
最先抢答的选手编号会通过数码管显示出来,同时结束抢答,不再显示其他选手编号和倒计时时间。
再次按下开始抢答按钮时,开始下一次的抢答。
8路抢答器的原理图如图2-1所示。
图2-1基于单片机的8路抢答器原理图
本系统硬件主要由按键、蜂鸣器、显示系统等几部分组成。
各模块的主要功能如下:
(1)按键的功能是把抢答选手编号和开始抢答信号送入单片机;
(2)蜂鸣器的功能是抢答结束后进行报警提示;
(3)显示系统的功能是显示抢答选手编号以及倒计时时间。
系统的整体设计方案设计图如图2-2所示。
图2-2系统的整体方案设计图
整体电路原理图如下:
图2-2系统的整体电路原理图
如图所示,电路左上角部分为时钟电路和复位电路,用于给单片机提供时钟信号以及复位。
电路左下角部分为选手抢答电路,按下8个按钮中的一个即可进行抢答,同时将信号发送给单片机并由单片机进行显示输出。
此部分为输入环节。
电路右上角部分为显示电路,进行显示已经开始抢答的时间和抢答选手编号,此处采用7段数码管共阳接法,四个反向器用于提供位选信号。
当没有选手抢答时,此处显示抢答倒计时;
开始有人抢答后,此处显示抢答选手的编号并停止计时。
电路右下角为蜂鸣器部分,当有选手进行抢答或者抢答倒计时结束后,蜂鸣器会发声报警,进行提示。
3.系统硬件电路设计
3.1时钟电路
单片机必须在时钟的驱动下才能工作.在单片机内部有一个时钟振荡电路,只需要外接一个振荡源就能产生一定的时钟信号送到单片机内部的各个单元,决定单片机的工作速度。
图3-1外部震荡源电路
一般选用石英晶体振荡器。
此电路在加电大约延迟10ms后振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率确定。
电路中两个电容C1,C2的作用有两个:
一是帮助振荡器起振;
二是对振荡器的频率进行微调。
C1,C2的典型值为30PF。
单片机在工作时,由内部振荡器产生或由外直接输入的送至内部控制逻辑单元的时钟信号的周期称为时钟周期。
其大小是时钟信号频率的倒数,常用fosc表示。
如时钟频率为12MHz,即fosc=12MHz,则时钟周期为1/12µ
s。
3.2复位电路
单片机的第9脚RST为硬件复位端,只要将该端持续4个机器周期的高电平即可实现复位,复位后单片机的各状态都恢复到初始化状态,其电路图如图所示:
图3-2复位电路
值得注意的是,在设计当中使用到了硬件复位和软件复位两种功能,由上面的硬件复位后的各状态可知寄存器及存储器的值都恢复到了初始值,而前面的功能介绍中提到了倒计时时间的记忆功能,该功能的实现的前提条件就是不能对单片机进行硬件复位,所以设定了软复位功能。
软复位实际上就是当程序执行完毕之后,将程序指针通过一条跳转指令让它跳转到程序执行的起始地址。
3.3显示电路
本设计所用的为4位8段共阳数码管,由P0控制显示数字,P2.0~P2.3控制位选信号。
最高位显示选手编号,低两位显示倒计时时间。
显示功能与硬件关系极大,当硬件固定后,如何在不引起操作者误解的前提下提供尽可能丰富的信息,全靠软件来解决。
使用数码管应该注意位选信号,以及共阳和共阴的区别。
其与单片机的接口电路如图3-3所示。
图3-3数码管与单片机的接口电路
3.4键盘扫描电路
键盘是人与微机系统打交道的主要设备。
关于键盘硬件电路的设计方法也可以在文献和书籍中找到,配合各种不同的硬件电路,这些书籍中一般也提供了相应的键盘扫描程序。
站在系统监控软件设计的立场上来看,仅仅完成键盘扫描,读取当前时刻的键盘状态是不够的,还有不少问题需要妥善解决,否则,人们在操作键盘就容易引起误操作和操作失控现象。
在单片机应用中键盘用得最多的形式是独立键盘及矩阵键盘。
图3-4独立键盘
它们各有自己的特点,其中独立键盘硬件电路简单,而且在程序设计上也不
复杂,一般用在对硬件电路要求不高的简单电路中;
矩阵键盘与独立键盘有很大区别,首先在硬件电路上它要比独立键盘复杂得多,而且在程序算法上比它要烦琐,但它在节省端口资源上有优势得多,因此它更适合于多按键电路。
其次就是消除在按键过程中产生的“毛刺”
现象。
这里采用最常用的方法,即延时重复扫描法,延时法的原理为:
因为“毛刺”脉冲一般持续时间短,约为几ms,而我们按键的时间一般远远大于这个时间,所以当单片机检测到有按键动静后再延时一段时间(这里我们取10ms)后再判断此电平是否保持原状态,如果是则为有效按键,否则无效。
3.5蜂鸣器
由于蜂鸣器的工作电流一般比较大,以致于单片机的I/O口是无法直接驱动的(但AVR可以驱动小功率蜂鸣器),所以要利用放大电路来驱动,一般使用三极管来放大电流就可以了。
当有选手进行抢答或者抢答倒计时结束时,蜂鸣器进行报警提示。
驱动电路如图3-4所示。
图3-4蜂鸣器电路
4.系统程序设计
4.1主程序流程图
当主持人按下开始按钮后,计时器开始倒计时显示。
若有选手抢答,计时终止并显示抢答选手的编号。
本轮抢答结束。
只有当主持人再次按下开始按钮后,才能进行下一轮的抢答。
系统主程序流程图如图4-1所示。
图4-1主程序流程图
4.2倒计时时间显示流程图
当主持人按下开始按钮之后,计时器开始显示倒计时,每过一秒减一。
当倒计时完成后,若还没有人进行抢答,数码管显示00,抢答结束。
其流程图如下:
图4-2倒计时时间显示流程图
4.3选手抢答流程图
当主持人按下开始按钮之后,8位选手进行抢答。
当其中某一位选手进行抢答后,数码管显示抢答选手的编号并锁定,此时其他选手无法再次抢答,本次抢答结束。
直到主持人再次按下开始按钮后,才能进行下一轮抢答。
具体流程图如下:
图4-3抢答选手显示程序流程图
5.系统调试
5.1Proteus软件仿真调试
在proteus中新建工程,搭好电路,保存。
然后在AT89C51单片机中加载C语言编写程序生成的hex文件。
点击左下角的运行按钮(或Debug-RunSimulation),按下结束按钮结束仿真。
开始仿真后,倒计时显示如图5-1.
图5-1抢答开始,进行倒计时
例如3号选手抢答后,显示如图5-2.
图5-22号选手进行抢答
若倒计时结束仍无人抢答,显示如图5-3.
图5-3倒计时结束,仍无人抢答
5.2结果分析
抢答器仿真模拟结果与实际抢答一致,可以进行8路抢答。
6.程序清单
#include<
reg52.h>
//包含51单片机寄存器定义的头文件
#defineN20
unsignedcharcodeTab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
//0xbf为“-”
//数码管显示0~9的段码表
unsignedcharint_time;
//记录中断次数
unsignedcharsecond;
//储存秒
unsignedcharnum;
//记录抢答选手编号
charflag1=0;
//复位标志
/*********************************************************************
对按键的接口进行定义了K1、K2、K3、K4、K5,K6,K7,K8分别为P1.0-P1.7
*********************************************************************/
sbitK1=P1^0;
sbitK2=P1^1;
sbitK3=P1^2;
sbitK4=P1^3;
sbitK5=P1^4;
sbitK6=P1^5;
sbitK7=P1^6;
sbitK8=P1^7;
sbitB0=P3^6;
//蜂鸣器控制
sbitKA=P3^0;
//主持人开始
/***********************************************************************
函数功能:
快速动态扫描延时
************************************************************************/
voiddelay(void)
{
inti;
for(i=0;
i<
3000;
i++)
;
}
显示秒
入口参数:
k
出口参数:
无
voidDisplaySecond(unsignedchark)
P2=0xf7;
//P2.3引脚输出低电平,第4位点亮
P0=Tab[k%10];
//显示个位
delay();
P0=0xff;
//*****************************************
P2=0xfb;
//P2.2引脚输出低电平,第3位点亮
P0=Tab[k/10];
//显示十位
//************************************
P2=0xfd;
//P2.1引脚输出低电平,第2位点亮
P0=Tab[10];
//显示“-”
//*******************************
P2=0xfe;
//P2.0引脚输出低电平,第3位点亮
P0=Tab[num];
//显示抢答选手编号
///***************复位函数*******************
void_reset()
while
(1)
{
if(KA==0)/*复位开关按下*/
{
delay();
/*按键去抖动*/
if(KA==0)/*复位开关按下*/
flag1=1;
}
if(flag1)//出现复位,返回原程序
//flag1=0;
break;
}
/********************************************************************
*名称:
key()
*功能:
进行了独立键盘的键盘扫描,并且二极管发光,扬声器发声
*输入:
无
*输出:
**********************************************************************/
voidkey()
if(K1==0)/*开关0按下*/
if(K1==0)/*开关0按下*/
{
//void_stop();
num=1;
B0=1;
DisplaySecond(N-second);
P2=0xfe;
P0=Tab[num];
while(!
K1);
/*等待按键k0释放*/
_reset();
/*死循环只显示本按键号*/
}/*1号选手抢答成功,数码管显示1,蜂鸣器响*/
if(K2==0)
delay();
if(K2==0)
num=2;
//显示抢答选手
while(!
K2);
/*等待按键k1释放*/
}
}
if(K3==0)/*开关2按下*/
if(K3==0)
{
num=3;
K3);
/*等待按键k2放*/
/*死循环只显示本按键号*/
}/*3号选手抢答成功,数码管显示3,蜂鸣器响*/
}
if(K4==0)/*开关3按下*/
if(K4==0)
num=4;
//显示抢答选手
K4);
/*等待按键k3放*/
}/*4号选手抢答成功,数码管显示4,蜂鸣器响*/
if(K5==0)/*开关5按下*/
if(K5==0)/*开关5按下*/
num=5;
K5);
/*等待按键k5释放*/
/*死循环只显示本按键号*/
}/*5号选手抢答成功,数码管显示5,蜂鸣器响*/
if(K6==0)/*开关6按下*/
if(K6==0)/*开关6按下*/
num=6;
K6);
/*等待按键k6释放*/
}/*6号选手抢答成功,数码管显示6,蜂鸣器响*/
if(K7==0)/*开关7按下*/
if(K7==0)/*开关7按下*/
num=7;
K7);
/*等待按键k7释放*/
//while
(1);
/*死循环只显示本按键号*/
}/*7号选手抢答成功,数码管显示7,蜂鸣器响*/
if(K8==0)/*开关8按下*/
if(K8==0)/*开关8按下*/
num=8;
K8);
/*等待按键k8释放*/
_reset();
}/*8号选手抢答成功,数码管显示8,蜂鸣器响*/
}
voidmain(void)//主函数
num=0;
TMOD=0x01;
//使用定时器T0
TH0=(65536-46083)/256;
//将定时器计时时间设定为46083×
1.085微秒
//=50000微秒=50毫秒
TL0=(65536-46083)%256;
EA=1;
//开启总中断
ET0=1;
//定时器T0中断允许
TR0=1;
//启动定时器T0开始运行
int_time=0;
//中断次数初始化
second=0;
//秒初始化
key();
DisplaySecond(N-second);
//调用秒的显示子程序
if(flag1){flag1=0;
break;
}
}
//********************************************************
//函数功能:
定时器T0的中断服务程序
//*******************************************************
voidinterserve(void)interrupt1using1
TR0=0;
//关闭定时器T0
int_time++;
//每来一次中断,中断次数int_time自加1
if(int_time==20)//够20次中断,即1秒钟进行一次检测结果采样
int_time=0;
//中断次数清0
second++;
//秒加1
if(second==N)//秒等于N就结束
{
EA=0;
ET0=0;
TR0=0;
_reset();
return;
TH0=(65536-46083)/256;
//重新给计数器T0赋初值
TR0=1;
//启动定时器T0
7.小结
制作此次试验,开始很苦恼,无从下手。
后来和同组同学讨论,决定首先借助于网络资料。
网络上的资源大多并不完善,甚至有些根本看不懂。
此时真的恩头疼。
于是回想之前实验课上所学习的知识,寻找借鉴例题。
零零散散下载摘录很多东西。
又结合抢答比赛的实际应用,开始起草最初的设计草案。
想法很多,设计也几近完整,然而很多功能却无法实现。
于是小组讨论决定按照草案一步步依次解决,边解决边定稿最后设计方案。
中间遇到很多问题,困难。
这时我们才了解到对知识的掌握还有许多的生疏和欠缺。
然而此时后悔已经于事无补。
我们只能不停在网络上搜索查找学习,尽量弥补自身知识的不足。
渐渐完善此设计。
有时候在自己创建的元器件的管脚上无法实现连线。
应该是管脚的间距太小了。
因为在ISIS中,每个元器件的管脚都要占据一块区域(就像自己的保护区一样,不容别人随意侵犯),该区域会排斥外部的走线。
解决问题的方法是在走线的同时按住“CTRL”键,直到走线绕过狭窄的保护区。
当然最根本的办法是重新编辑元器件,把其管脚间距调大一些。
主持人按键来控制总开关,主持人按下开关那么选手开始抢答,此时数码管开始20s倒计时,并且选手们必须在规定的时间内进行抢答,若过了20秒还没抢答那么抢答失效,选手们若有一个在规定的时间内抢答成功则其余的选手不可以再抢答,即该选手抢答成功。
在这次试验设计中,我发现了自己知识上的不足,和理论时间上的差距。
通过完成试验,使我对本科知识有了更深入的了解,提高了实践的操作能力。
同时,也规范了我对报告文体格式的掌握。
并让我了解到认真,刻苦,遇到不放弃,不退缩便可以看到曙光的真理。
我们现在掌握的知识还有限,还有很多东西需要我们学习。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 抢答 课程设计 报告