3八位竞赛抢答器课程设计资料报告材料Word文档格式.docx
《3八位竞赛抢答器课程设计资料报告材料Word文档格式.docx》由会员分享,可在线阅读,更多相关《3八位竞赛抢答器课程设计资料报告材料Word文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
编码部分是对锁存的数据进行编码,由于只有八个参赛选手,故只需要用八个不同的数字便可以代表所有的参赛选手,只要采用能对八位数据进行编码并能有八种或八种以上的输出的编码器即可达到要求。
(4)数据显示部分的实现
对于这样的一个仅需要显示数字的设计,很容易联想到使用七段数码管来实现的数字的显示,而且七段数码管可以显示16种不同的输出,对于这种只需要有不少于八种的输出的设计来说,七段数码管完全可以达到要求。
一般的七段数码管有10个数据输入端,所以需要有相应的译码器对输送过来的编码后的数据进行译码操作,并且这种译码器的选择必须结合数码管是共阴还是共阳的情况而定。
2.1.3关于实现功能拓展的设计思路
(1)实验设计的基本要求中没有提到主持人实现清零后,数码管该显示什么,这样在设计过程中我们就可以有多重选择了,本设计中设计的是让主持人清零之后,数码管显示FFF。
这一功能可以通过基本的门电路来实现,把主持人和参赛选手接入的信号作为输入信号,通过门电路整合,使得到的输出信号来控制数据显示部分。
(2)设计要求中没有提到参赛选手提前抢答会造成犯规的这一功能,理论上会存在有参赛选手犯规的情况的发生,这样实际中增加一个抢答犯规的功能是有一定的必要性的,同样要实现这一功能,可以通过门电路的组合,收集主持人和参赛选手接入的信号,把输出信号接到一个报警装置上,实现当主持人还未发出开始抢答指令的时候,若有参赛选手抢答了,报警装置会报警的功能。
2.2总体功能框图
下图所示为总体方框图。
其工作原理为:
接通电源后,主持人将开关断开,抢答器处于禁止状态,定时器显示设定时间;
主持人将开关接通,宣布开始抢答器工作。
定时器倒计时,扬声器给出声响提示。
选手在定时时间抢答时,抢答器完成:
优先判断、编号锁存、编号显示、扬声器提示。
当一轮抢答之后,定时器停止、禁止二次抢答、定时器显示剩余时间。
如果再次抢答必须由主持人再次操作状态开关。
抢答按钮
编码电路
锁存电路
译码电路
显示电路
主持人控制开关
控制电路
秒脉冲
定时电路
报警电路
2.2总体功能框图
2.3元器件清单
仿真图中所需要的各种元器件如表2.3
表2.3元器件清单
元件名称
型号
数量/个
用途
单片机
AT89C51
1
控制核心
晶振
12MHZ
晶振电路
电容
22uF
3
排阻
Respack8
上位电阻
电阻
10k
复位电路
电源
+5v
提供电源
拨码开关
BUTTON_1
13
发出信号
数码管
7SEG-MPX4-BLUE
3硬件设计
3.1元器件及其作用
在八位抢答器的设计中,我主要用到了AT89C51型号单片机、晶振、电容、排阻、电阻、电源、拨码开关、7SEG-MPX4-BLUE数码管等元器件。
芯片是由ISIS7PROFESSIONAL仿真软件系统提供(AT89C51)。
它主要由CPU,存储器和管脚组成。
所谓排阻就是若干个参数完全相同的电阻,它们的一个引脚都连到一起,作为公共引脚。
其余引脚正常引出。
所以如果一个排阻是由n个电阻构成的,那么它就有n+1只引脚,一般来说,最左边的那个是公共引脚。
它在排阻上一般用一个色点标出来。
排阻一般应用在数字电路上,比如:
作为某个并行口的上拉或者下拉电阻用。
使用排阻比用若干只固定电阻更方便。
排阻有a型和b型的区别。
a型排阻的引脚总是奇数的。
它的左端有一个公共端(用白色的圆点表示),常见的排阻有4、7、8个电阻,所以引脚共有5或8或9个。
B型排阻的引脚总是偶数的。
它没有公共端,常见的排阻有4个电阻,所以引脚共有8个。
图3.1AT89C51单片机图示及引脚排列
3.2原理图设计
根据设计要求及用protues仿真软件做出八位竞赛抢答器电路图如下:
4软件设计
4.1软件设计思路
当主持人启动“开始”键后,定时器进行减计时,同时扬声器发出短暂的声响,持续时间0.5S左右。
参赛选手在设定的时间进行抢答,抢答有效,定时器工作停止,显示器上显示选手的编号和抢答的时间并保持到主持人将系统清除为止。
如果定时时间已到,无人抢答,系统报警并禁止抢答。
按键发声
显示抢答号,剩余时间
停止键按下?
抢答键按下?
开始键按下?
程序初始化
倒计时显示
倒计时开始
准备状态,显示FFF
倒计时大于5s?
显示法规号码
非法抢答?
提醒发声
倒计时结束?
Y
N
4.2C语言源程序
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
chars;
ucharnum=0;
chartime=20;
//抢答时间
chardatitime=30;
//答题限时时间
uinttt,t1;
//T0,T1定时器定一秒时
bitflag,s_flag=1,b_flag,fall_flag;
//标志位
bitK_startcountflag,K_timecountflag;
//时间调整标志位
sbitK0=P3^0;
sbitbeep=P3^7;
//蜂鸣器
sbitrled=P3^1;
//指示灯
sbitK1=P1^0;
sbitK2=P1^1;
sbitK3=P1^2;
sbitK4=P1^3;
sbitK5=P1^4;
sbitK6=P1^5;
sbitK7=P1^6;
sbitK8=P1^7;
sbitK_Time=P3^2;
//答题计时键
sbitK_startcount=P3^3;
//开始抢答时间调整键
sbitK_timecount=P3^4;
//答题计时时间调整键
voiddelay(ucharms)
{
uchary;
for(;
ms>
0;
ms--)
for(y=120;
y>
y--);
}
ucharcodetabledu[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
ucharcodetablewe[]={0XFE,0XFD,0XFB,0XF7};
voidT0_Init(void)
TMOD=0X01;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;
ET0=1;
ET1=1;
EA=1;
P0=0;
voidKey_Scan(void)//开始键扫描
if(K0==0)
{
delay(10);
if(K0==0)
{
while(!
K0);
TR0=1;
s=time;
tt=0;
flag=1;
s_flag=1;
b_flag=1;
num=0;
beep=1;
rled=1;
fall_flag=0;
//清除违规标志位
K_startcountflag=0;
K_timecountflag=0;
}
}
voidScan(void)//八路热键扫描(哪个键先按下,哪个优先级最高)
if(K1==0)
if(K1==0)
K1);
num=1;
//数码管显示1号"
1"
TR0=0;
//关闭定时器0,时间停止
TR1=1;
//打开定时器1,使扬声器响一声
s_flag=0;
//关闭开始键标志位,使再按其他七个键不会响应
if(K2==0)//下面七个键的处理同上
if(K2==0)
K2);
num=2;
//重要
if(K3==0)
if(K3==0)
K3);
num=3;
if(K4==0)
if(K4==0)
K4);
num=4;
if(K5==0)
if(K5==0)
K5);
num=5;
if(K6==0)
if(K6==0)
K6);
num=6;
if(K7==0)
if(K7==0)
K7);
num=7;
if(K8==0)
if(K8==0)
K8);
num=8;
voiddisplay(void)
if(flag==1)//开始键按下,开始计时抢答
if(num!
=0)//如果有人抢答,则显示相应的几号
P0=tabledu[num];
//显示几号抢到了
P2=tablewe[0];
delay
(2);
P0=0;
P2=0XFF;
else//否则没人抢答,则前面不显示几号
P0=tabledu[s/10];
//下面为显示抢答倒计时
P2=tablewe[2];
delay
(2);
P0=0;
P2=0XFF;
P0=tabledu[s%10];
P2=tablewe[3];
else//如果开始键没有按下,则显示FFF(若有违规者,则显示违规及FF)或时间调整
if(fall_flag==1)//违规显示
if(num!
=0)
{
P0=tabledu[num];
//显示几号违规了
P2=tablewe[0];
delay
(2);
P0=0;
P2=0XFF;
P0=tabledu[15];
//下面显示FF,表示违规了
P2=tablewe[2];
//消隐
P2=tablewe[3];
}
else
else//没有人违规才显示调整时间
if(K_startcountflag==1)
P0=0X6D;
//第一位数码管显示"
5(S)"
(表示抢答时间调整)
P0=tabledu[time/10];
//下面显示调整的抢答时间
P0=tabledu[time%10];
elseif(K_timecountflag==1)
P0=0X07;
//第一位与第二位数码管合起来显示"
T"
表示答题时间调整
P0=0X31;
P2=tablewe[1];
P0=tabledu[datitime/10];
P0=tabledu[datitime%10];
else//否则显示FFF
}
}
voidTime_Scan(void)//调整时间键扫描
if(K_startcount==0)//抢答时间调整
if(K_startcount==0)
K_startcount);
time++;
if(time==50)
time=20;
K_startcountflag=1;
//将抢答时间标志位置1
//同时关闭答题时间标志位
if(K_timecount==0)//答题时间调整
if(K_timecount==0)
K_timecount);
datitime++;
if(datitime==60)
datitime=30;
K_timecountflag=1;
voidmain(void)
T0_Init();
while
(1)
Key_Scan();
//开始键扫描
if((flag==0)&
(s_flag==1))//当开始键没按下及没有人违规时才可进行时间调整
Time_Scan();
if((flag==1)&
(s_flag==0))//当开始键按下及有人抢答才进行开始回答计时倒计时
if(K_Time==0)
delay(10);
if(K_Time==0)
{
while(!
K_Time);
s=datitime;
TR0=1;
tt=0;
TR1=1;
}
(s_flag==1))//违规
Scan();
=0)//开始键没有按下时,有人按下了抢答器,则置违规标志位
fall_flag=1;
rled=0;
(s_flag==1))//如果开始键按下且抢答键没有人按下,则进行八路抢答键扫描
display();
//显示到数码管上
voidtimer0(void)interrupt1
//2ms
if(b_flag)//开始(START)键按下,嘟一声(长1秒),表示开始抢答
beep=~beep;
else
beep=1;
if(s<
5)//抢答时间快到报警,隔1秒响一声且红灯闪烁,响三声
if(s%2==0)
rled=0;
else
b_flag=0;
tt++;
if(tt==500)//1秒
tt=0;
s--;
b_flag=0;
//关闭开始键按下响一秒的嘟声
if(s==-1)
s=20;
flag=0;
//显示FFF
voidtimer1(void)interrupt3//定时器1处理有人按下抢答器嘟一声(长1秒)
beep=~beep;
t1++;
if(t1==500)
t1=0;
TR1=0;
5软件仿真调试
在软件硬件都已连接设计好以后,我们需要用Keil、preoteus软件对其进行仿真调试。
软件调试是通过对程序的编译、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。
图5.1keil调试结果图
Keil、preoteus联调效果图
6总结
在这两周的单片机课程设计实训中,我通过对八位竞赛抢答器的设计学会了运用Keil、preoteus软件,并且对单片机这门课程有了更深一步的了解。
在短时间学会一门电路设计软件看,并且要使用proteus实现电路的仿真,这些在我眼里都不是很容易完成的任务,但是最后我以及我们的小组均能在规定的时间之学会proteus的基本操作,单独完成各自的设计,这与小组之间的合作是离不开的,在这里我也更要感我们指导老师对我们的谆谆教导!
八位竞赛抢答器这种类似的抢答器在日常生活中应该挺常见的,只是很多人忽视了这种小设计,但它确实在实际生活中有较为广泛地应用,可是即使我们生活中有见到过并且不以为然的东西,等到我们亲自来独立的完成这个作品的设计,分析以及仿真结果分析甚至连接实体电路时,也许就不会觉得那么容易的。
虽然这是一种简单的小设计,但却包含了很多我们刚刚所学过的电路知识,特别是数字电子技术的基础知识,这次课程设计不仅使我们温习了刚学过的知识,也使我们对电路的整体布局有了更深的学习。
在小组方案的设计过程中,我有参与到电路图的布局,新增功能