基于51单片机控制的八路抢答器.docx
《基于51单片机控制的八路抢答器.docx》由会员分享,可在线阅读,更多相关《基于51单片机控制的八路抢答器.docx(12页珍藏版)》请在冰豆网上搜索。
基于51单片机控制的八路抢答器
基于51单片机控制的八路抢答器
结题报告
大一第二个学期,在杨老师的教导下,我们参与了八路抢答器的制作,但由于其电路是纯数电的,硬件比较多线路比较复杂。
为了简化电路且实现更好的功能,以单片机为核心的新型智能的抢答器,在保留原始抢答器的基本功能的同时又增加了数码管显示电路实现了其它的一些功能。
一、硬件模块
1、单片机控制模块:
本次的八路抢答器采用的是AT89C52单片机,因为其是一个低功耗高性能单片机,具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用三节电池供电。
该模块包括了晶振以及复位模块。
2、显示模块:
为了更好的显示抢答者的编号以及抢答的时间,使其能够更直观的看到具体真实的显示情况,且节省单片机的I/O口简化电路,所以采用四位一体的共阳数码管,前两位数码管显示抢答者的编号,后两位显示抢答时间。
数码管的1、2、3、4号脚先接了一个三级管再与单片机进行相连。
3、按键模块:
此次的八路抢答器一共采用了十三个按键,其中一个是单片机的复位按键,用来实现单片机的手动复位,两个是对倒计时时间设定的加减按键,一个是抢答器的开始按键,一个是对时间进行复位的按键,其余八个是抢答按键。
按照抢答键盘与单片机的连接方式可分为独立式键盘与矩阵式键盘。
独立式键盘是一种常见的输入装置,但是独立式键盘局限于个数,以及占用较多I/O口,所以本次设计采用的是矩阵式键盘。
4、报警模块:
因为抢答器的报警比较简单,只起提示选手的抢答成功信息及时间警告等少许功能,本次报警电路核心器件采用一个蜂鸣器实现报警。
并用一个三极管对其电流进行放大,从而达到声音进行放大的目的。
5、指示的模块:
因为电路简化比较简单,所以只采用了两个指示灯,一个红灯,一个绿灯。
当按下开始键的时候绿灯亮,此时时间开始倒计时,当有人抢答的时候,绿灯灭红灯亮,当按下复位或者开始的时候红灯灭绿灯亮。
6、整体工作原理:
本系统采用单片机作为整个控制核心。
控制系统的四个模块为:
显示模块、控制模块、报警模块、抢答模块。
工作时,该系统通过矩阵键盘输入抢答信号,经单片机的处理,输出控制信号,利用一个4位数码管来完成显示功能并伴随蜂鸣器报警,用按键来让选手进行抢答,在数码管上显示哪一组先答题的,从而实现整个抢答过程。
当主持人按下开始键时,向单片机P3.2引脚输入一个低电平信号,表示整个电路开始工作,此时数码管前两位显示选手编号(无人抢答显示00),后两位显示倒计时剩余时间。
若在25秒内仍然无人抢答,蜂鸣器在最后5秒发出连续报警,提示抢答时间快要结束;若在30秒内有人抢答,并且抢答成功,则将选手编号显示在数码管前两位上,后两位显示抢答剩余时间,同时蜂鸣器发出一声报警,提示其他没有抢答的选手此题已被人抢答成够完全实现普通抢答器的基本功能。
功。
若在抢答过程中遇见特殊情况,主持人则可以通过时间加,时间减按键来进行时间调节。
若要开始新的一轮抢答,主持人按下复位键再按开始键即可。
此次用单片机设计的抢答器思路简单明了,可操作性强,可靠性高,扩展功能强,能够完全实现普通抢答器的基本功能。
二、软件模块:
由于对程序的不太熟悉,以及接触不深,说以程序是借鉴了网上的资料,再自己的调试改动之后更加的完美,更好的与硬件结合,实现应有的功能。
总结:
通过此次培训,我从中又学到了很多的知识,包括对硬件的认识,程序的理解。
在前期的一个礼拜的资料检索中,我们学习到了很多目前没有学到的知识,可以说是
比同年级的同学在电子这一方面是更快了一步。
当然,也正是因为对八路抢答器的制作,让我明白了一些基本的知识,比如,蜂鸣器要用三级管放大电路,四位共阳数码管是如何控制段选和位选的,如何用三极管使其能够更亮,等等。
也从中体会到了“边做边学,边学边做”的真正意义。
当然此次制作的成功也离不开团队的合作以及老师和学长的指导。
附录1原理图
附录2源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitspeak=P3^4;
sbithuang=P3^0;
sbitred=P3^1;
sbitanjia=P3^6;
sbitanjian=P3^7;
sbitfuwei=P3^3;
sbitkaishi=P3^2;
ucharnum,temp,shijian,shi,ge,ashi,age,aa,tt,bb,i;
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
voiddelay(uintz)
{
ucharx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidbj()
{
for(i=0;i<110;i++)
{
speak=~speak;delay(6);
}
for(i=0;i<230;i++)
{
speak=~speak;delay
(2);
}}
voidkeyscan()
{
if(anjia==0)
{
delay(5);
if(anjia==0)
{
shijian=shijian+1;
if(shijian==99)
{
shijian=0;
}}
while(!
anjia);
}
if(anjian==0)
{
delay(5);
if(anjian==0)
{
shijian=shijian-1;
if(shijian==0)
{
shijian=30;
}}
while(!
anjian);
}}
voidzhuanhuan()
{
shi=shijian/10;ge=shijian%10;ashi=num/10;age=num%10;
}
voidsound()
{
speak=0;
}
voidmain()
{
huang=1;red=1;
EA=1;TMOD=0x11;T2CON=0x01;
TH0=(65536-50000)/256;TL0=(65536-50000)%256;
TH1=(65536-5000)/256;TL1=(65536-5000)%256;
TH2=(65536-50000)/256;TL2=(65536-50000)%256;
ET0=1;TR0=0;ET1=1;TR1=1;ET2=1;TR2=0;IT0=1;EX0=1;IT1=1;EX1=1;
aa=0;bb=0;shijian=30;
while
(1)
{
keyscan();
}}
voidint_0()interrupt0
{
huang=0;TR0=1;TR2=1;red=1;
}
voidtimer_0()interrupt1
{
TH0=(65536-50000)/256;TL0=(65536-50000)%256;
aa++;
if(aa==20)
{
aa=0;shijian--;
if(shijian==5)
{
red=0;huang=1;sound();
}
if(shijian==0)
{
TR0=0;TR2=0;TF2=0;
}}}
voidint_1()interrupt2
{
shijian=30;num=0;TR0=0;TR2=0;huang=1;red=1;
}
voidtimer_1()interrupt3
{
TH1=(65536-5000)/256;TL1=(65536-5000)%256;
tt++;bb++;
if(tt==5)
tt=1;
zhuanhuan();
switch(tt)
{
case1:
P2=0xf4;P0=table[shi];break;
case2:
P2=0xf8;P0=table[ge];break;
case3:
P2=0xf1;P0=table[ashi];break;
case4:
P2=0xf2;P0=table[age];break;
default:
;
}
if(bb==1)
{
bb=0;
if(shijian==5)
{
speak=~speak;
}
if(shijian==4)
{
speak=~speak;
}
if(shijian==3)
{
speak=~speak;
}
if(shijian==2)
{
speak=~speak;
}
if(shijian==1)
{
speak=~speak;
}}}
voidtimer_2()interrupt5
{
TH2=(65536-50000)/256;TL2=(65536-50000)%256;
P1=0xfe;temp=P1;temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);temp=P1;temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;TR2=0;
switch(temp)
{
case0xee:
{TR0=0;TF2=0;num=1;bj();red=0;huang=1;}break;
case0xde:
{TR0=0;TF2=0;num=2;bj();red=0;huang=1;}break;
case0xbe:
{TR0=0;TF2=0;num=3;bj();red=0;huang=1;}break;
case0x7e:
{TR0=0;TF2=0;num=4;bj();red=0;huang=1;}break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}}}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;TR2=0;
switch(temp)
{
case0xed:
{TR0=0;TF2=0;num=5;bj();red=0;huang=1;}break;
case0xdd:
{TR0=0;TF2=0;num=6;bj();red=0;huang=1;}break;
case0xbd:
{TR0=0;TF2=0;num=7;bj();red=0;huang=1;}break;
case0x7d:
{TR0=0;TF2=0;num=8;bj();red=0;huang=1;}break;
}
while(temp!
=0xf0)
{
temp=P1;temp=temp&0xf0;
}}}}