基于单片机的八路智能竞赛抢答器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

摘要
抢答器在现实生活中应用广泛,比如在各类娱乐节目中,像中央电视台的幸运52,开心辞典,因此做一个抢答器是具有现实意义的。

抢答器具有人数限制,我们选择做八路抢答器。

当某人抢答时,能够显示他的号码,限定他的答题时间,别人不能抢答,主持人要有启动和清空的权利。

八路抢答器在抢答过程中,为了知道哪一组或哪一位选手先答题,必须要设计一个系统来完成这个任务。

如果在抢答中,靠视觉是很难判断出哪组先答题。

利用单片机系统来设计抢答器,使以上问题得以解决,即使两组的抢答时间相差几微秒,也可分辨出哪组优先答题。

抢答组数可以在八组以内任意使用,本系统采用AT89S52单片机作为核心,控制系统的四个模块分别为:单片机最小系统、显示模块、显示驱动模块、抢答开关模块。

关键词抢答器;单片机;数码管
ABSTRACT
Qiangda in real life applications in a wide range, such as the various types of entertainment, such as China Central Television's lucky 52, Happy Dictionary, it is a Qiangda practical significance. Qiangda restrictions on the number of features, we choose to do Qiangda eight-way device. Qiangda when a person can show his numbers, to limit his time to answer, other people can not Qiangda, and the host must start to empty. Qiangda Qiangda in eight-way process, in order to know which group or which one's first answer, we must design a system to accomplish this task. If Qiangda, it is difficult to rely on visual determine which group to answer. The use of single-chip design Qiangda system, so that the above problems are resolved, even if the two groups Qiangda the difference in time, a few microseconds, can tell which group the priority answer. Qiangda group in a number of the eight groups within the arbitrary use of this system as a single-chip
AT89S52 core of the control system of the four modules are: the smallest single-chip systems, display modules, display driver module, Qiangda switch module.
Key words Single-chip computer; qiangda device; digital control
目录
1 功能要求及方案选择 (3)
1.1 功能要求 (3)
1.2 方案选择 (3)
2 硬件设计 (4)
2.1 设计原理 (4)
2.2 抢答器原理图 (4)
2.3 PCB (6)
3 软件设计 (9)
3.1 资源分配 (9)
3.2 设计思想 (9)
3.3 流程图 (9)
3.4 程序清单 (12)
4 使用说明及设计体会 (18)
4.1 使用说明 (18)
4.2 设计体会 (18)
参考文献 (20)
致谢 (21)
1 功能要求及方案选择
1.1 功能要求
设计一个具有特定功能的抢答器。

该抢答器上电或按键复位后能自动显示系统提示符“P.”,进入准备工作状态。

主持人按下开始按钮后,抢答开始并限定时间30S;10S内无人抢答,蜂鸣器发出音响;主持人按下开始按钮之前有人按下抢答器,抢答违规,显示器显示违规台号,违规指示灯亮,其它按钮不起作用;正常抢答,显示器显示台号,蜂鸣器发出音响,其它抢答按钮无效;正常抢答下,从按下抢答按钮开始30S内,答完按钮没按下,则作超时处理,超时处理时,违规指示灯亮,数码管显示违规台号。

蜂鸣器发出音响;各台数字显示的消除,蜂鸣器音响及违规指示灯的关断,都要通过主持人按复位按钮。

1.2方案选择
1.2.1 利用译码芯片
先根据74LS148的优先功能,确定了先抢答到的选手的编码号,再根据74LS279的锁存功能,将其信号保持下来,并实现了锁定功能,将选手的编码锁定。

再者,根据74LS48的译码功能,将74LS279锁定的数字编译成二进制,将信号送到显示器中。

这样就实现了抢答功能。

原理框图如图1.1所示。

图1.1 原理框图
1.2.2 利用单片机
可以利用单片机的定时/计数器进行计时,设定抢答时间和答题时间;可以利用单片机的I/O口线接按键,通过按键按下后,所接口线电平的变化来判断那位选手按下键。

我选择利用单片机做抢答器。

2 硬件设计
2.1 设计原理
本系统采用AT89S52单片机作为核心,控制系统的四个模块分别为:单片机最小系统、显示模块、显示驱动模块、抢答开关模块。

抢答器原理框图如图2.1所示。

图 2.1 抢答器原理框图
2.2 抢答器原理图
抢答器原理图如图2.2所示。

图 2.2 抢答器原理图
2.3 PCB
2.3.1 PCB顶层线
PCB顶层线如图2.3所示。

图2.3 PCB顶层线2.3.2PCB底层线
PCB底层线如图2.4所示。

图 2.4 PCB底层线
2.3.3元器件布局图
元器件布局图如图2.5所示。

图 2.5 元器件布局图2.2.4元器件清单
元器件清单如表2.1所示。

表2.1 元器件清单
3 软件设计
3.1 资源分配
(1)定时/计数器的使用
定时/计数器0,定时功能,工作方式1,定时50ms。

定时/计数器1,定时功能,工作方式1,定时50ms。

(2)中断源的使用
定时/计数器0,计满20次即得秒计时单位。

定时/计数器1,计满20次即得秒计时单位。

(3)按键设定
S9(启动)接P3.0。

S01(复位)接单片机的复位脚RST。

八个选手按键接在P1口。

(4)定时/计数器的使用
P0.7-P0.0段控线,分别接led的显示dp,g,f,e,d,c,b,a。

P2.0-P2.3位控线,分别接led1,led3,led4。

3.2 设计思想
把八个选手的按键接在P1口,在P1口接上拉电阻。

如果有键按下,接这个键的口线将被拉低,通过键扫判断那根口线被拉低,得到键值,显示到数码管上。

主持人按启动键,开启定时器0,有选手抢答,开启定时器1。

3.3 流程图
3.3.1 主程序流程图
主程序流程图如图3.1所示
图 3.1主程序流程图
3.3.1 显示程序流程图
显示程序流程图如3.2所示
图 3.2 显示程序流程图
3.3.2 定时器中断服务程序流程图
定时器中断服务程序流程图如图3.3所示。

图3.3定时器中断服务程序流程图
3.4程序清单
#include"reg52.h"
#include"intrins.h"
#include"absacc.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/* 定义定时器T0和T1时间常数和方式控制字 */
#define v_th0 0x3c
#define v_tl0 0xb0
#define v_tmod 0x11
sbit P30=P3^0;
sbit P36=P3^6;
sbit P32=P3^2;
sbit P31=P3^1;
uchar led_buf[8];//显示缓冲数组
uchar code dispcode[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x0c};
//段码数组
uchar keyzhi;
uint m,time,time2;
void delay(uint a) //延时程序
{
while(a--)
}
void led() //违规指示灯亮程序
{
P32=0;
delay(2000);
delay(2000);
}
void ring() //蜂鸣器程序
{
P36=0;
delay(20000);
P36=1;
}
void ledk() //P.显示程序
{
uchar dmask=0x01; //位控码初始化
uchar pos;
for(pos=0;pos<3;pos++)
{
P2=dmask; //位控码输出到位控口
P0=dispcode[10]; //取显示段码并输出到段控口
delay(200);
dmask=_crol_(dmask,1); //位控码左移一位
}
}
void led_buf_auto_flush(void) reentrant //显示缓冲区更新函数
{
led_buf[0]=m; //获得选手的号码
led_buf[1]=time/10; //获得秒十位
led_buf[2]=time%10; //获得秒的个位
}
void timer0(void) interrupt 1 //定时器t0中断服务函数,选用定时器0工作方式为1 {
uchar j;
static uchar click=0;
TH0=v_th0;TL1=v_tl0; //设置初始值50ms为循环20次为1ms,12MHz
++click;
if(click==20) //定时器0定时中断次数
{
--time;
click=0;
if((time==20)&&(j=0xff))
{ P36=0;
delay(1000);
P36=1;
}
led_buf_auto_flush(); //LED显示缓冲区时间值更新
}
}
void timer1(void) interrupt 3 //选用定时器1工作方式为1
{
uchar j;
static uchar click=0; //定时器0定时中断次数
TH1=v_th0;TL1=v_tl0; //设置初始值50ms为循环20次为1ms,12MHz
++click;
if(click==20)
{
--time2;
click=0;
if((time2==0)&&(j!=0xff))
{
P32=0;
P36=0;
delay(10000);
TR1=0;
}
}
time=time2;
led_buf_auto_flush(); //LED显示缓冲区时间值更新
}
void put_on_leds(void) //显示输出函数
{
uchar dmask=0x01; //位控码初始化
uchar pos;
for(pos=0;pos<4;pos++)
{
P2=dmask; //位控码输出到位控口
P0=dispcode[led_buf[pos]]; //取显示段码并输出到段控口
delay(100); //延时
delay(100);
dmask=_crol_(dmask,1); //修改未控码
}
}
void init_sys(void) //进行初始化并接受用户的初始化时间设置
{
TMOD=v_tmod; TH0=v_th0;TL0=v_tl0;TH1=v_th0;TL1=v_tl0; //设置时间初值TR0=0; EA=1; ET0=1;TR1=0;ET1=1; //开启中断,关闭定时器}
uchar keychuli() //处理与键盘相连的P1口的内容,作为键值
{
uchar k;
k=P1; //P1口内容送K
return(k); //返回键值
}
uchar key()//键盘扫描函数,函数返回值即键值
{
uchar keyzhi,keyzhii; //电子钟键盘按键键值临时存放
keyzhi=keychuli(); //调P1口处理函数
if(keyzhi!=0xff) //有键动作延时去抖动,否则函数返回
{
delay(100); //再次调P1口处理函数
if(keyzhi!=0xff) //真正有键按下,取键值并暂存
{
keyzhii=keyzhi;
while(keyzhi!=0xff) //判按键是否释放,没有释放延时去抖动等待释放{
put_on_leds();
put_on_leds();
keyzhi=keychuli();
}
keyzhi=keyzhii; //按键释放后恢复按键键值
}
}
return(keyzhi); //返回按键键值
}
void main() //主函数调用init_sys()函数对系统初始化,调用put_on_leds()函数{
uchar j;
uchar keyzhiii,c;
while(1)
{
keyzhiii=key(); //调键盘扫描函数得到按键键码
ledk(); //调P.程序
if(P30==0) //主持人是否按下启动键
delay(100);
if(P30==0)
break;
if(keyzhiii!=0xff)
{
c=1;
led();
break;
}
}
init_sys(); //调用init_sys()函数对系统初始化
TR0=1; //开定时器0
time=31;
j=keyzhiii;
time2=30;
while(1)
{
put_on_leds(); //调显示函数
delay(100); //调延时函数
if(c!=1) //判断有没有违规
keyzhiii=key(); //调键盘扫描函数得到按键键码
switch(keyzhiii) //按键功能控制
{
case 0xff: //没有键按下,则返回
put_on_leds();
delay(100);
break;
case 0xfe: //1号选手抢答,抢答时间设定为三十秒{
if(c!=1)
ring(); //有人正常按下,蜂鸣器发出声音
TR1=1; //开定时器1,关定时器0
TR0=0;
m=1;
if(c==1)
{
TR1=0;
time=0;
}
led_buf_auto_flush();
put_on_leds();
P1=0xfe;
break;
}
case 0xfd: //2号选手抢答
{
if(c!=1)
ring();
TR1=1;
TR0=0;
m=2;
if(c==1)
{
TR1=0;
time=0;
}
led_buf_auto_flush();
put_on_leds();
P1=0xfd;
break;
}
case 0xfb: //3号选手抢答
{
if(c!=1)
ring();
TR1=1;
TR0=0;
m=3;
if(c==1)
{
TR1=0;
time=0;
}
led_buf_auto_flush();
put_on_leds();
P1=0xfb;
break;
}
case 0xf7: //4号选手抢答{
if(c!=1)
ring();
TR1=1;
TR0=0;
m=4;
if(c==1)
{
TR1=0;
time=0;
}
led_buf_auto_flush();
put_on_leds();
P1=0xf7;
break;
}
case 0xef: //5号选手抢答{
if(c!=1)
ring();
TR1=1;
m=5;
TR0=0;
if(c==1)
{
TR1=0;
time=0;
}
led_buf_auto_flush();
put_on_leds();
P1=0xef;
break;
}
case 0xdf: //6号选手抢答{
if(c!=1)
ring();
TR1=1;
TR0=0;
m=6;
if(c==1)
{
TR1=0;
time=0;
}
led_buf_auto_flush();
put_on_leds();
P1=0xdf;
break;
}
case 0xbf: //7号选手抢答{
if(c!=1)
ring();
TR1=1;
m=7;
TR0=0;
if(c==1)
{
TR1=0;
time=0;
}
led_buf_auto_flush();
put_on_leds();
P1=0xbf;
break;
}
case 0x7f: //8号选手抢答{
if(c!=1)
ring();
TR1=1;
TR0=0;
m=8;
if(c==1)
{
TR1=0;
time=0;
}
led_buf_auto_flush();
put_on_leds();
P1=0x7f;
break;
}
}
}
}
4 使用说明及设计体会
4.1 使用说明
该抢答器上电或按键复位后能自动显示系统提示符“P.”,进入准备工作状态。

主持人有两个键,启动键和复位键。

主持按下开始按钮后,抢答开始并限定时间30S;10S内无人抢答,蜂鸣器发出音响;主持人按下开始按钮之前有人按下抢答器,抢答违规,显示器显示违规台号,违规指示灯亮,其它按钮不起作用。

比如1号选手在主持人按下启动键之前抢答,他违规,显示器显示违规台号1,同时违规指示灯亮。

正常抢答,显示器显示台号,蜂鸣器发出音响,其它抢答按钮无效。

比如1号选手正常抢答,显示器显示台号1,蜂鸣器发出声响。

正常抢答下,从按下抢答按钮开始30S内,答完按钮没按下,则作超时处理,超时处理时,违规指示灯亮,显示器显示违规台号,蜂鸣器发出音。

比如1号选手在答题30s内没有答完题,超时处理,违规指示灯亮,显示器显示违规台号1。

显示器各台数字显示的消除,蜂鸣器音响及违规指示灯的关断,都要通过主持人按复位按钮,主持人有权在任何时候停止抢答。

4.2 设计体会
通过本次单片机课程设计熟悉了PCB制作的流程,硬件设计和软件设计。

protel99中画PCB时应意线的宽度,线距,最重要的是布局,如果布局合理,线就比较少,甚至布出单面板,一定要注意焊盘的大小,太小了,打孔时会把焊盘打掉,太大了布出的线会有很多。

在转印PCB时一定要把板子清洗干净。

我第一次转印时由于板子不干净,结果把纸印到了板子上。

印板要注意电熨斗的温度。

如果转印到板子上的电路图有短线,还有补救的方法,用油性笔补线。

为了以后使用的方便和焊盘的牢固,可以在板子加上四个螺丝,把板子撑起来。

在腐蚀板子时要注意水温,加入的三氯化铁要适量,如果想减少腐蚀板子的时间,可以摇动水盆。

板子腐蚀了以后要清洗干净。

硬件设计方面:学会了如何把设计要求转化为原理图,原理图十分重要,如果原理图错了,那么做出来的板子必然错了,因此原理图一定要准。

开始我三极管驱动数码管,但是在Proteus中不能仿真,所以我换用了74LS244驱动。

选用数码管时要注意是共阴的还是共阳的。

软件设计方面:学会了用C51编写程序。

我学习了汇编语言和C51,发现单片机用C51更易于理解。

学习汇编语言是为了了解单片机的内部结构和工作原理,而C51更侧重于应用。

汇编语言比C51在编程时更精确,比如一个延时程序,用C51编只需用一个for循环,而汇编要用到一两个寄存器,但是汇编语言编写的程序可以比较准确的算出延时时间,C51编写的程序要通过调试才能得到延时时间,不够准确。

C51具有丰富的函数库,可以直接调用。

用C51
其实就是编函数,调函数。

在实物调试发现应显示P.可实际显示为P,对照原理图,发现共阳数码管的3脚是点的显示段控,对照电路板上数码管的3脚检查,发现连接3脚的底层线断了,把线连通之后,P.正常显示了。

要根据现象分析问题,找出问题出现的原因,解决它。

此次课程设计用理论指导了实践,实践又强化了理论。

在此次课程设计时,我发现交流非常重要,同学之间相互交流,可以从别人那里学到你不会的知识,也可以把自己会的东西与别人分享,每个人会一点,汇合起来就有很多知识,大家都得到提高,而且比自己单独研究效率高的多。

刚开始的时候觉得单片机课程设计很难,老师要求又高,所以没有信心去做。

后来没办法才开始做,去做发现并不是太难,通过自己的努力和别人的指导,做了PCB板,下载程序到板子上,经过调试,基本实现所要求的功能。

因此做事情前,要有信心,相信自己做得好,这样才有动力认真的去做,把事情想得简单一点,积极的思考,解决出现的问题,逐渐向要求靠近,最后达到要求。

做好一个东西都有一个过程,不可能一次就成功,要给自己时间,通过改变达到要求。

通过这次课程设计,我学会了如何与别人合作,如何在合作中把自己会的东西应用到合作中,不仅要相信自己,也要相信别人,积极的与团队中的人交流,表达自己的意见,使合作成功。

合作共赢是时代的需求,也是我们大学生应该做到的。

参考文献
[1]马忠梅,籍顺心,马凯等.单片机的C语言应用程序设计[M].第四版北京:北京航天航空大学出版社,2007. 1~142
Ma Zhongmei, Ji Shunxin,Ma Kai, and so on.'s Single-chip C language application
programming [M]. Fourth edition of Beijing: Beijing Aeronautical and Astronautical University Press, 2007.1 ~ 142
[2]李广弟,朱月秀,冷祖祁籍.单片机基础[M].第三版北京:北京航天航空大学出版社,2007. 1~156
Li Guangdi, Zhu Xiu, cold Qi ancestral home. MCU-based [M]. The third edition of the Beijing: Beijing Aeronautical and Astronautical University Press, 2007.1 ~ 156
致谢
感谢王老师一年来的教学,使我们熟悉了单片机的基本原理,能进行汇编和C 语言的编程。

王老师教学认真负责,对我们要求严格,培养了我们的工程思维。

再次感谢!感谢Google在线翻译!
20。

相关文档
最新文档