四路抢答器的文档.docx
- 文档编号:12163486
- 上传时间:2023-06-04
- 格式:DOCX
- 页数:18
- 大小:98.90KB
四路抢答器的文档.docx
《四路抢答器的文档.docx》由会员分享,可在线阅读,更多相关《四路抢答器的文档.docx(18页珍藏版)》请在冰点文库上搜索。
四路抢答器的文档
“融园杯”电子竞赛之
四
路
抢
答
器
的
设
计
组长:
组员:
设计时间:
2010、11、11
一、前言:
在电视中,我们经常会看到一些抢答题目,而抢答器却是这个衡量时间的至关重要的工具。
而作为设计者的我们需要就是把那些看似很远的东西拿到身边,让科学与我们越来越近,体会到科学真正给我们带来的喜悦以及给生活带来的便利。
单片机具有CPU所具有的功能,从而使我们的产品更接近智能化和高可控制性等特点。
本次设计主要是通过数码管实现四路抢答器的功能。
数码管拥有蜂鸣器和数码管以及LED显示,因此,选择数码管进行实现四路抢答器功能是合理并且实现方便。
因此对于四路抢答器的硬件设计便是对数码管的硬件电路的设计。
本次竞赛作品,主要针对一些时间限制的抢答,因此,本产品具有较强的实用性和比较合适的价钱。
二、设计目的:
1、熟悉抢答器的工作原理
2、了解和熟悉单片机的软硬件的设计方法
3、加强自己的实践动手能力,在做实物的过程中充分锻炼自己能力,扬长避短,达到更进一步的提高自己综合素质
三、设计任务和要求:
1.设计任务
(1)设计一台可供4名选手参加比赛的智力竞赛抢答器。
用数字显示抢答倒计时间,由“20”倒计到“0”时,无人抢答,蜂鸣器鸣响。
选手抢答时,数码显示选手组号,同时蜂鸣器鸣响,倒计时停止。
(2)分组:
负责抢答硬件电路的设计和调试。
负责编写程序和相关调试工作。
2.设计要求
(1)4名选手编号为:
1,2,3,4。
各有一个抢答按钮,按钮的编号与选手的编号对应,也分别为1,2,3,4。
(2)当选手按下自己抢答器时候,数码立即显示从20秒开始逐秒递减,抢答的开始。
(3)如果抢答定时已到,却没有选手抢答时,本次抢答无效。
系统扬声器报警,并封锁输入编码电路,禁止选手超时后抢答,时间显示器显示0。
四、总体方案选择:
1)硬件电路的设计:
1、原理图(附件一)
2、硬件电路的PCB
2、protues仿真图
2)程序设计:
程序清单(附件一):
五、元器件清单:
元器件名称
规格
数量
AT89S52
1
底座
3
晶振
12MHZ
1
发光二极管
9
单排插
40脚
1
三极管
9012
9
蜂鸣器
1
小按键
9
下载口座子
十芯
1
18b20温度传感器
1
六脚开关
1
USB电源线加接口
1
电阻
200Ω
1
电阻
4.7KΩ
1
电阻
1KΩ
3
电阻
470Ω
24
电解电容
220uF
1
瓷片电容
33pF
2
排阻
10KΩ
2
短路帽
3
杜邦线8p
1
PCB板子
1
电源黄色插座
1
五、设计感想:
通过本次参与竞赛,我们获得不少。
首先,从知识积累和技术提高方面来讲。
无论是对硬件电路的设计、调试以及检查错误还是对电路的工作原理的都需要我们运用自己已有的知识以及自己掌握一些自己不熟悉的知识。
需要我们较强的学习能力和较强的领悟能力,和理解分析能力。
对于程序的设计方面,让我更加熟练的运用自己已学的C语言,对于自己提高C语言和更加熟练的掌握C语言有很好的巩固作用。
其次,对于仿真电路的设计以及调试工作让我更加对电路的原理以及工作方式有更明确的理解。
对使用Protues、multisim以及keil的调试,让我们更加熟悉它们的使用和调试。
更加有助于我们的学习和实践相结合。
再次,对于自己的一些综合素质提高也很有帮助。
当问题出现时,我们可能会有点不开心,但是这个时候我们需要更加坚定自己的信念和决心。
我们需要自己学会分析和解决问题,有自己的独立见解。
同时,我们学会更加懂得分析的重要性。
七、参考文献:
[1]康华光.电子技术基础数字部分.北京:
高等教育出版社,2006
[2]王彦朋.大学生电子设计与应用.北京:
中国电力出版社,2007
[3]张钦双.实用电子电路200例.北京:
机械工业出版社,2003
[4]李光弟朱月秀单片机基础.北京:
北京航空航天大学出版社,2006
[5]马忠梅.单片机的C语言应用程序设计.北京航空航天大学出版社,2006
[6]常华.仿真软件教程.北京:
清华大学出版社,2006
附件一:
程序清单
/********************************************************************项目名称:
四路抢答器的设计
设计者:
刘军
设计日期:
2010年11月11日
*********************************************************************
功能要求:
(1)显示系统提示符“P.”。
(2)设计一个四路抢答器。
键功能:
S2:
抢答开始;S3:
抢答结束;S4、S5、S6、S7为四路抢答按键;S8:
抢答器复位。
指示灯:
LED0:
抢答开始指示;LED1:
抢答结束指示;LED2:
违规指示;LED3:
超时指示;LED4、LED5、LED6、LED7为四路位置指示;
要求:
在抢答开始键S2按下之前,有S4、S5、S6、S7键按下,视为违规,违规指示灯LED2亮,蜂鸣器报警,数码管显示违规回路号;抢答开始键S2键按下后,抢答开始指示灯LED0亮,蜂鸣器报警;如20秒之内无人抢答,抢答结束指示灯LED1亮,蜂鸣器报警;抢答开始键S2键按下后,如20秒之内有人抢答,则相应回路指示灯亮,蜂鸣器报警,数码管显示回路号并开始倒计时,计时初值20秒:
如在20秒内没有回答完毕,则超时指示灯LED3亮,蜂鸣器报警;如在20秒内回答完毕,则需按抢答结束键S3,抢答结束指示灯LED1亮,蜂鸣器报警;按下S8键抢答器复位,重新开始抢答。
***********************************************************
LED数码管显示器设定;
P0.7---P0.0段控线,接LED的显示段dp,g,f,e,d,c,b,a
P2.0---P2.7位控线,从左至右(LED7,LED6,LED5,LED4,LED3,LED2,LED1,LED0)
***********************************************************
独立式键盘设定;
8个按键S2至S9分别依次接在P1.0至P1.7口线
/**********************************************************
宏定义
***********************************************************
数组区
共阳数码管字型码
P.显示序号
***********************************************************函数区
voidDelayX1ms(uintcount)延时函数
voidfind_code_auto_flush(void)显示缓冲区更新函数
voidtimer0(void)定时器t0中断服务函数
voidput_on_leds(void)显示输出函数
voidinit_sys(void)定时器初始化函数
keychuli()键值处理函数
key()键盘扫描函数
voidmain()主函数
***********************************************************
变量定义
ucharsec计时变量
ucharpos段码序号数组下标
uchardmask位控码
uchark返回键值
ucharkeyzhi,keyzhii键盘按键值临时存放
ucharbiaozhi标志位
位变量定义
bitbiaozhi0=biaozhi^0;超时标志位
bitbiaozhi1=biaozhi^1;抢答标志位
bitbiaozhi2=biaozhi^2;开始标志位
*/
#include"reg52.h"
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
/*定义定时器TO时间常数和方式控制字*/
#definev_th00x3c
#definev_tl00xb0
#definev_tmod0x01
ucharsec;//定义计时变量
/*共阳数码管字型码*/
/*0,1,2,3,4,5,6,7,8,9,p.,灭*/
charcodedispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x0c,0xff};
/*"P."显示代码序号*/
charfind_code[8]={10,11,11,11,11,11,11,11};
/********************************************************/
//函数名:
voidDelayX1ms(uintcount)
//功能:
延时时间为1ms
//调用函数:
//输入参数:
count,1ms计数
//输出参数:
//说明:
总共延时时间为1ms乘以count,crystal=12Mhz
/********************************************************/
voidDelayX1ms(uintcount)
{
uintj;
while(count--!
=0)
{
for(j=0;j<80;j++);
}
}
/***********显示缓冲区更新函数**************/
voidfind_code_auto_flush(void)reentrant
{
find_code[7]=sec/10;//获得秒十位
find_code[6]=sec%10;//获得秒个位
}
/**********定时器t0中断服务函数***********************/
voidtimer0(void)interrupt1using2//选用定时器0工作方式为1
{
staticucharclick=0;//定时器0定时中断次数
TH0=v_th0;TL0=v_tl0;//设置初始值50ms为循环20次为1ms,12MHz
++click;
if(click>=20)
{
click=0;
if(--sec<=0)
{
TR0=0;P3=0x77;
DelayX1ms(30);
}
}
find_code_auto_flush();//LED显示缓冲区时间值更新
}
/***************显示输出函数******************/
voidput_on_leds(void)
{
uchardmask=0xFE;//位控码初始化
ucharpos;
for(pos=0;pos<8;pos++)
{
P2=dmask;//位控码输出到位控口
P0=dispcode[find_code[pos]];//取显示段码并输出到段控口
DelayX1ms
(1);//延时
dmask=_crol_(dmask,1);//修改位控码
}
}
/*********************************************************
*函数原型:
voidinit_sys(void);
*功能:
对系统进行初始化并接受用户的初始化时间设置。
************************************************************************/
voidinit_sys(void)
{
TMOD=v_tmod;TH0=v_th0;TL0=v_tl0;//设置时间初值
TR0=0;EA=1;ET0=1;//开启中断,关闭定时器
}
/**********************************************************
*函数原型:
keychuli();
*功能:
处理与键盘相连的P1口的内容,作为键值。
***********************************************************ucharkeychuli()
{
uchark;
k=P1;//P1口内容送K
k=~k;//取反
return(k);//返回键值
}
/**********************************************************
*函数原型:
key();
*功能:
键盘扫描函数,函数返回值即键值。
***********************************************************ucharkey()
{
ucharkeyzhi,keyzhii;//键盘按键键值临时存放
keyzhi=keychuli();//调P1口处理函数
if(keyzhi!
=0)//有键动作延时去抖动,否则函数返回
{
put_on_leds();
put_on_leds();
keyzhi=keychuli();//再次调P1口处理函数
if(keyzhi!
=0)//真正有键按下,取键值并暂存
{
keyzhii=keyzhi;
while(keyzhi!
=0)//判按键是否释放,没有释放延时去抖动等待释放
{
put_on_leds();
put_on_leds();
keyzhi=keychuli();
}
keyzhi=keyzhii;//按键释放后恢复按键键值
}
}
return(keyzhi);//返回按键键值
}
/*主函数*/
voidmain()
{
ucharkeyzhiii;//定义键值变量
ucharbiaozhi;//定义标志位
bitbiaozhi0=biaozhi^0;//定义超时标志位
bitbiaozhi1=biaozhi^1;//定义抢答标志位
bitbiaozhi2=biaozhi^2;//定义开始标志位
biaozhi0=0;
biaozhi1=0;
biaozhi2=0;
sec=20;//赋计时初值
init_sys();//定时器初始化
find_code[0]=10;
find_code[6]=11;
find_code[7]=11;
while
(1)
{
put_on_leds();
DelayX1ms
(2);
if(sec>0)//超时标志位处理
biaozhi0=0;
else
{
biaozhi0=1;
if(biaozhi1==0)
P3=0xfd;//有人抢答则LED3亮
else
P3=0xf7;//无人抢答则LED1亮
}
keyzhiii=key();//调键盘扫描函数得到按键键码
switch(keyzhiii)//按键功能控制
{
case0:
//没有键按下,则返回
put_on_leds();
DelayX1ms
(2);
break;
case1:
//S2按下开始抢答
TR0=1;
P3=0xfe;
biaozhi2=1;
find_code[0]=11;
TR0=1;find_code_auto_flush();put_on_leds();break;
case2:
//S3按下,结束抢答
biaozhi0=1;TR0=0;
find_code_auto_flush();put_on_leds();break;
case4:
//S4按下,一号抢答
if(biaozhi2==0)//判断是否开始
{
P3=0x7b;find_code[0]=1;break;}//违规抢答、显示一号,蜂鸣器叫
if(biaozhi0==1||biaozhi1==1)break;//判断是否超时或已有其他选手抢答
else
{
find_code[0]=1;//显示一号
P3=0xef;//LED4亮,置计时初值
sec=20;
biaozhi1=1;//抢答标志位
}
find_code_auto_flush();put_on_leds();break;
case8:
if(biaozhi2==0)
{
P3=0x7b;find_code[0]=2;break;}
if(biaozhi0==1||biaozhi1==1)break;
else
{
find_code[0]=2;
P3=0xdf;
sec=20;
biaozhi1=1;
}
find_code_auto_flush();put_on_leds();break;
case16:
if(biaozhi2==0)
{
P3=0x7b;find_code[0]=3;break;}
if(biaozhi0==1||biaozhi1==1)break;
else
{
find_code[0]=3;
P3=0xbf;
sec=20;
biaozhi1=1;
}
find_code_auto_flush();put_on_leds();break;
case32:
if(biaozhi2==0)
{
P3=0x7b;find_code[0]=4;break;}
if(biaozhi0==1||biaozhi1==1)break;
else
{
find_code[0]=4;
P3=0x7f;
sec=20;
biaozhi1=1;
}
find_code_auto_flush();put_on_leds();break;
case64:
//S8键按下复位
TR0=0;//关定时器
P3=0xff;//等灭
biaozhi0=0;//标志位清零
biaozhi1=0;
biaozhi2=0;
sec=20;
find_code[0]=10;
find_code[6]=11;
find_code[7]=11;
put_on_leds();break;
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 四路 抢答 文档
![提示](https://static.bingdoc.com/images/bang_tan.gif)