第一篇:4路抢答器设计程序
#include
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,//0~f显示表
0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};unsigned char code table0[]={0xf1,0xf2,0xf4,0xf8};
//P2口位选
unsigned char code table2[]={0xef,0xdf,0xbf,0x7f};
//P3口送行信号 unsigned char display[]={0,0,0,0};//显示位 void sw1();
//子函数申明 void sw2();void sw3();void sw4();void xianshi();void init();unsigned char temp,num2,x,x1,x2,a,count;
//变量声明 int num,num1;unsigned char key;unsigned char i,j;sbit P3_4=P3^4;sbit P3_5=P3^5;sbit P3_6=P3^6;sbit P3_7=P3^7;sbit k1=P1^0;
//位申明(时间加)sbit k2=P1^1;
//位申明(时间减)sbit k3=P1^2;
//位申明(开始)sbit k4=P1^3;
//位申明(复位)sbit sp=P1^4;
//蜂鸣器 sbit l1=P1^5;
//LED显示 sbit l2=P1^6;
//LED显示
void delay(unsigned char z)
//延时1ms子函数 {
unsigned char x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);}
void init()
//初始化子函数 { a=0;TMOD=0x01;
//定时器T0工作方式设定
TH0=(65536-10000)/256;//装初值
TL0=(65536-10000)%256;EA=1;
//开定时器T0 ET0=1;
if(k1==0)
//判断时间加K1是否按下
{
delay(5);
//延时躲过抖动
if(k1==0)
//再次确认是否按下K1
{
num++;
//时间自加1
if(num==99)
//如果时间num=99,清零num
{
num=0;
}
num2=num;
//将num值赋值给num2
while(k1==0);//等待K1松手
}
}
if(k2==0)
//判断时间减K2是否按下
{
delay(5);
//延时躲过抖动
if(k2==0)
//再次确认是否按下K2
{
num--;
//时间自减1
if(num==-1)//如果时间num=-1,赋值num=99
{
num=99;
}
num2=num;//将num值赋值给num2
while(k2==0);//等待K2松手
}
}
if(k3==0)
//判断开始按钮K3是否按下
{
delay(5);
//延时躲过抖动
if(k3==0)//再次确认是否按下K3
{
x++;
//自加1
if(x==2)//假如x=2,清零x
{
x=0;
}
}
} }
void keyboad()
//按键检测子函数 { while(1)
{
P3=0xff;
//读引脚前需写入高电平
P3_4=0;
//置第一行线为低
temp=P3;
//P3口信息送入temp中
temp=temp & 0x0f;//屏蔽高四位,保留低四位
if(temp!=0x0f)//判断:假如列线有不为高的时候,执行if循环体
{
delay(5);//延时躲过抖动
temp=P3;
temp=temp & 0x0f;
if(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;//判断是哪个键按下
switch(temp)
{
case 0x0e: //第一行第四个按下
{delay(5);num1=4;l2=0;xianshi();} //第一行第一个键按下
break;
case 0x0d:
//第一行第三个按下
{delay(5);num1=3;l2=0;xianshi();}
break;
case 0x0b:
//第一行第二个按下
{delay(5);num1=2;l2=0;xianshi();}
break;
case 0x07: //第一行第一个按下
{delay(5);num1=1;l2=0;xianshi();} break;//第一行第一个键按下
}
}
}
P3=0xff;
P3_5=0;
temp=P3;
temp=temp & 0x0f;
if(temp!=0x0f)
{
delay(5);//延时躲过抖动
temp=P3;
temp=temp & 0x0f;
if(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
{delay(5);num1=8;l2=0;xianshi();} break;
case 0x0d:
{delay(5);num1=7;l2=0;xianshi();} break;
case 0x0b:
{delay(5);num1=6;l2=0;xianshi();} break;
case 0x07:
{delay(5);num1=5;l2=0;xianshi();} break;
}
}
}
P3=0xff;
P3_6=0;
temp=P3;
temp=temp & 0x0f;
if(temp!=0x0f)
{
delay(5);//延时躲过抖动
temp=P3;
temp=temp & 0x0f;
if(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
{delay(5);num1=12;l2=0;xianshi();} break;
case 0x0d:
{delay(5);num1=11;l2=0;xianshi();} break;
case 0x0b:
{delay(5);num1=10;l2=0;xianshi();} break;
case 0x07:
{delay(5);num1=9;l2=0;xianshi();} break;
//第二行第四个键按下//第二行第三个键按下//第二行第二个键按下//第二行第一个键按下//第三行第四个键按下//第三行第三个键按下//第三行第二个键按下//第三行第一个键按下
}
}
}
P3=0xff;
P3_7=0;
temp=P3;
temp=temp & 0x0f;
if(temp!=0x0f)
{
delay(5);//延时躲过抖动
temp=P3;
temp=temp & 0x0f;
if(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
{delay(5);num1=16;l2=0;xianshi();} break;
case 0x0d:
{delay(5);num1=15;l2=0;xianshi();} break;
case 0x0b:
{delay(5);num1=14;l2=0;xianshi();} break;
case 0x07:
{delay(5);num1=13;l2=0;xianshi();} break;
}
temp=P3;
P0=table[key];
}
}
} }
void xianshi(){
TR0=0;
//停止定时计数
num=0;
//倒计时num清零
sp=1;
//成功抢答,蜂鸣器叫
delay(100);
//延时一段时间
sp=0;
//关蜂鸣器
//第四行第四个键按下//第四行第三个键按下//第四行第二个键按下//第四行第一个键按下
while(1)
{
for(a=0;a<4;a++)//显示部分位选
{
delay(5);
P2=table0[a];
P0=table[display[a]];
}
display[0]=num/10;
//倒计时显示0
display[1]=num%10;
display[2]=num1/10;
//显示抢答者号
display[3]=num1%10;
if(k4==0)
//判断复位键K4是否按下
{
num=num2;
//num2值赋值给num
num1=0;
//清零抢答者号显示
TR0=1;
//启动定时器TO
l1=1;
//D1,D2关闭
l2=1;
return;
}
} }
void main()
//主函数 {
l1=1;
//D1,D2关闭
l2=1;
sp=0;//初始化蜂鸣器
x=0;
num=num2=30;
//赋初值
while(1)
{
if(x==1)
//开始键按下
{
delay(5);
TR0=1;
//启动定时
while(1)
{
keyboad();//调用按键检测子函数
if(k4==0)//判断复位键是否按下
{
l1=1;//D1,D2关闭
l2=1;
delay(5);
num=num2;//倒计时时间30秒赋值给num
TR0=1;//启动定时器T0
}
}
}
else
//开始键没有按下
{
for(a=0;a<4;a++)
//显示部分位选
{
delay(5);
P2=table0[a];
P0=table[display[a]];
}
display[0]=num/10;//倒计时显示0
display[1]=num%10;
display[2]=num1/10;
//显示抢答者号
display[3]=num1%10;
init();
//初始化
}
} }
void time0()interrupt 1 //定时器T0中断 {
TH0=(65536-10000)/256;
//重装初值
TL0=(65536-10000)%256;count++;
//中断次数记录
if(k4==0)
//复位键K4检测
{
num=num2;
TR0=1;
num1=0;
return;
}
for(a=0;a<4;a++)
{
delay(10);
P2=table0[a];
P0=table[display[a]];
} display[0]=num/10;
//倒计时显示0
display[1]=num%10;
display[2]=num1/10;//显示抢答者号
display[3]=num1%10;
if(count==100)
//1秒定时是否已到
{
count=0;
//清零记录
num--;
//显示倒计时自减一
if(num<6)
//倒计时倒数6秒,D2亮,蜂鸣器报警
{
l1=~l1;
sp=1;
delay(100);
sp=0;
if(num==0)
//倒计时为0,D2亮,蜂鸣器报警
{
l1=0;
sp=1;delay(200);sp=0;
delay(100);
sp=1;delay(200);sp=0;
delay(100);
sp=1;delay(200);sp=0;
}
if(num==0)
{
while(1)
{
xianshi();
//调用延时子函数
if(k4==0)//假如复位键按下
{
l1=1;
//D1,D2灭
l2=1;
num=num2;//30秒倒计时赋值给num
TR0=1;//启动定时器T0
return;
}
}
}
} } x2++;if(x2==4){
x2=0;} P3=table2[x2];
//分别给行线送低电?
第二篇:抢答器~C51~带程序
前 言
在电视和学校中我们会经常看到一些智力抢答的节目,如果要是让抢答者用举手等方法,主持人很容易误判,会造成抢答的不公平,比赛中为了准确、公正、直观地判断出第一抢答者,所设计的抢答器通常由数码显示、灯光、音响等多种手段指示出第一抢答者。为了使这种不公平不发生,只有靠电子产品的高准确性来保障抢答的公平性。
功能分为基本功能和扩展功能,基本功能是能够实现抢答器的功能,扩展功能进一步丰富了抢答器的功能,更佳人性化。
基本功能可以有同时供8名选手比赛,分别用8个按钮S0 ~ S7表示;设置一个系统复位按钮和抢答控制按钮,这组开关由主持人控制;抢答器具有锁存与显示功能。即选手按动按钮,扬声器发出声响提示,锁存相应的选手号码并且通过数码管显示。选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。
扩展功能有抢答器具有定时抢答功能,且抢答的时间由主持人设定(如30秒)。当主持人按下启动键后,定时器进行倒计时;参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。
此设计可以用三种方法实现:数字电路,单片机,PLC。其中PLC方案与单片机方案原理相似,但成本太高,故不采用此方案,在此不另作比较。主要在数字电路和单片机两个方案中选择。
AT89C52 是美国ATMEL 公司生产的低电压,高性能CMOS 8 位单片机,片内含8k bytes 的可反复擦写的Flash 只读程序存储器和256 bytes 的随机存取数据存储器(RAM),器件采用ATMEL 公司的高密度、非易失性存储技术生产,与标准MCS-51 指令系统及8052产品引脚兼容,片内置通用8 位中央处理器(CPU)和Flash 存储单元,功能强大AT89C52 单片机适合于许多较为复杂控制应用场合。
基于单片机的八路抢答器是针对目前的抢答器市场而设计的,其高度的准确性,低廉的成本,是绝对有竞争优势,其市场前景巨大。通过本课题的训练,不仅可以研制出一套八路抢答器,还可以使我们通过对单片机电路的设计与编程,达到理论与实践相结合的目的,强化我们四年中的学习知识,能提高解决实际问题的能力。
第一章 设计的依据
1.1 课题的提出
在电视和学校中我们会经常看到一些智力抢答的节目,如果要是让抢答者用举手等方法,主持人很容易误判,会造成抢答的不公平,比赛中为了准确、公正、直观地判断出第一抢答者,所设计的抢答器通常由数码显示、灯光、音响等多种手段指示出第一抢答者。为了使这种不公平不发生,只有靠电子产品的高准确性来保障抢答的公平性。
1.2 实现的系统功能简介
功能分为基本功能和扩展功能,基本功能是能够实现抢答器的功能,扩展功能进一步丰富了抢答器的功能,更佳人性化。
1.基本功能:
(1)同时供8名选手比赛,分别用8个按钮S0 ~ S7表示。
(2)设置一个系统复位按钮和抢答控制按钮,这组开关由主持人控制。(3)抢答器具有锁存与显示功能。即选手按动按钮,扬声器发出声响提示,锁存相应的选手号码并且通过数码管显示。选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。
2.扩展功能:
(1)抢答器具有定时抢答功能,且抢答的时间由主持人设定(如30秒)。当主持人按下启动键后,定时器进行倒计时。
(2)参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。
第二章 总体方案确定
2.1 方案论证
此设计可以用三种方法实现:数字电路,单片机,PLC。其中PLC方案与单片机方案原理相似,但成本太高,故不采用此方案,在此不另作比较。2.1.1数字电路总体方案
如下图所示为数字电路总体方框图。其工作原理为:接通电源后,主持人将开关拨到“清除”状态,抢答器处于禁止状态,编号显示器灭灯,定时器显示设定时间;主持人将开关置“开始”状态,宣布“开始”抢答器工作。定时器倒计时,扬声器给出声响提示。选手在定时时间内抢答时,抢答器完成:优先判断、编号锁存、编号显示、扬声器提示。当一轮抢答之后,定时器停止、禁止二次抢答、定时器显示剩余时间。如果再次抢答必须由主持人再次操作“清除”和“开始”状态开关。
图2.1.1 数字电路方案
2.1.2 MCS-51方案
该方案主要由 抢答、声音警示、灯光指示和计时电路组成,借助较少的外围元件完成抢答的整个过程。系统框图如下图所示。
图2.1.2 单片机方案
2.2 方案确定
通过三个方案比较,单片机控制的设计方案外围的元件也很少,成本比较低,制作简单,实现的功能灵活。由于是单片机控制,对抢答器队参赛选手的动作的先后有很强的分辨力,即使先后只相差几毫秒,抢答器也能分辨出来,抢答器直接显示动作选手的编号和答题时间,并保持到主持人清零为止。所以我选择采用单片机控制的方案来完成抢答器电路。
第三章 硬件设计
3.1 整体电路设计
整个系统可以分为五部分:抢答电路,主持人控制按钮,单片机最小系统,显示电路,蜂鸣器。如下图所示
图3.1 整体电路
3.2 复位电路设计
复位电路采用经典的51系列单片机的复位方法:上电复位和开关复位。通电后,给电容充电,在此过程中,单片机复位;运行时,按下复位按钮,RST端口变为高电平,进行复位。复位电路和晶振电路如下:
图3.2 复位电路和晶振电路 3.3 显示电路的设计
显示电路和扬声器电路如下图所示:
图3.3.1 显示电路 图3.3.2 扬声器电路
3.4 控制电路实现
主持人的按键有四个,分别是:开始、复位、加
1、减1。按键一般按下的过程中有抖动,需要消抖处理,本设计中采用了并联电容处理,实际调试过程中证明效果很好,故软件不需要再次做消抖处理。
图3.4.1 选手按键电路 图3.4.2 主持人控制电路
3.5 硬件电路设计小结
经过几十个昼夜奋战,硬件电路终于调试成功,想想开始的时候什么都不确定,第一次焊接好了之后,到处都是问题,到现在的稳定运行,真的有一种莫大的满足感。特别是消抖这一块,一直是我们设计不稳定运行的主因,在指导老师的悉心指导下,在院系领导的关怀下,我们的问题也一一迎刃而解。
第四章 软件设计
4.1 总体设计
第五章 电路调试
5.1硬件调试
基本电路板检查: 根据前面的研究完成各个电路模块的原理设计并生成PCB图,制作电路板,进行实验调试。
(1)检查印制板的印制线是否有断路,是否有毛刺,是否与其它线或是焊盘粘连,焊盘是否有脱落,过孔是否有未金属化现象等等。
(2)先用万用表复核目测中认为可疑的连接或是接点,检查它们的通短状态是否与设计规定相符。再检查各种电源线与地线之间是否有短路现象,如有再仔细检查出并排除。短路现象一定要在器件安装及加电前检查出。
(3)路接通电源后,用手摸一下芯片是否发热,如果发热,立即关掉电源,稍后再进行再次检测;如果没有发热,再测试芯片的VCC端电压是否达到设计要求,接地端是否都接地。
主控模块调试: 在本次设计中,主控模块是非常重要的部分,它不仅是本次设计的核心,同时在后面的8255A显示也是起关键的作用。在本次硬件调试中也遇到了问题,接上电源的时候,数码管不亮,没有任何显示,于是我做了如下的工作:(1)检查电源是否通电,发现指示灯亮着;(2)编程使P1为低电平,检查到P1输出为低;(3)检查P0口未接上拉电阻,接上数码管发亮了。
由次我深刻的认识到:制作电路板是一个比较繁琐的过程,它需要我们时刻都要用心去做,每个环节都不能忽视,只有这样才能达到锻炼的目的。
5.2软件调试
当硬件制作完成后,软件制作也是不可轻视的部分,是实现电路的功能的关键部分,通过本次毕业设计,总结经验如下:
(1)先进行人工检查。写好程序后,不立刻烧入单片机,先对纸面上的程序进行人工检查。由于采用C语言编程,所以要特别小心地检查语法错误,如括号不配对,漏写分号等,通过仔细的检查,发现并排除这些错误。
(2)人工检查无误后,上机调试。在编译时给出的语法错误的信息,根据提示的信息具体找出程序中错误之处并改之,从上至下逐一改正。应当注意的是:有的提示出错行并不是真正出错的行,如果在提示出错的行上找不到错误的话,则应该到上行再找。
(3)当确认程序无语法错误和逻辑错误时,通过直接下载到单片机来调试。采用的是自下到上的调试方法,即单独调好每一个模块,然后再连接成一个完整的系统调试。
(4)程序烧入单片机后,观察各个部件的工作是否正常,功能是否实现。如不能正常工作,则继续检查程序中的相应模块,必要时从上到下重新检查程序。
总 结
抢答器丰富了我们的生活,社会中本来就充满着竞争。只是没有很明显的表现出来,通过运用它我们可以很好的证明自己的胆识和自信,所以做起抢答器来,也很想去了解它,对于八路抢答器原理说起来很简单,也没什么复杂性,所以看似很简单,但实践中却发现不是那么回事,实际调试的过程中,一点问题都不能存在,否则它就不运行,真正体会到了什么叫一丝不苟,什么叫锲而不舍。在以后的工作和学习中,我一定会深刻运用这次的心得体会。
总之,这次实践是非常成功的,我们追求的是理论与实践并存,这次毕业设计就很好的为大学生表现自己综合能力提供有力的平台。实践中也发了自己有一点不懂的地方,通过这次实践才彻底搞懂,这证明了理论学习后还是需要实践课程的。
在这个过程中,通过老师的指导和自己的摸索,学会了自己学习新知识,查找资料的方法,我想这应该是我们大学中应该掌握的方法。
致 谢
本设计经过一个学期的的时间,到今天终于完成了。在此,向我的指导老师表示最诚挚的谢意。从课题的选择,前期的准备工作、方案的制定,系统的开发与调试,到论文的撰写修改定稿都渗透了老师的心血。在这三个月中,老师以他渊博的学识、卓越的才智、严谨的治学精神和求实创新的工作作风以及平易近人的态度使我受益匪浅,在学习中给我很大的启迪和帮助,对我的指导更是给我留下了极为深刻的印象。使我在这次毕业设计中学到了许多知识。
在整个课题的研究和设计过程中,还得到了其他院系和实验室的老师们的帮助和支持,在我设计时遇到困难时,他们给予了我不少的帮助和鼓励,再次表示诚挚的感谢。正是由于他们的帮助,才使这次设计能顺利的完成。
此外,我还要特别感谢大学四年里的老师和同学,感谢我们系的全体老师以及所有关心我,帮助我,鼓励我的人,没有你们的无私帮助,我是很难完成我的毕业设计的,谢谢你们。
参考文献
[1] 康华光,《电子技术基础.数字部分(第四版)》[M],北京:高等教育出版社,2003.
[2] 李广弟,《单片机基础》[M],北京:北航出版社,2001.
[3] 梁超,一款基于单片机技术的电子抢答器[J ],机电工程技术,2005,34(1). [4] 李朝青,单片机原理及接口技术[M],北京:北京航空航天大学出版社,1999. [5] 齐向东,多功能数字显示抢答器[J ].黄石高等专科学院学报,1996.
附录
附录1数字抢答器原理图
附录2 AT89S52芯片主程序
#include
sbit P2_4=P2^4;///加1键 sbit P2_5=P2^5;//减1键 sbit P2_6=P2^6;//确认键 sbit P2_7=P2^7;//蜂鸣器
uchar a=20,b=0,c=0;unsigned
int gong=100,yi=100,er=100,san=100,si=100,wu=100,liu=100,qi=100,ba=100;//8组得分变量
uchar disp[]={0,0,0,0};//四个显示单元
uchar dispbit[]={0xfe,0xfd,0xfb,0xf7};//数码管扫描代码 uchar dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xbf};//共阳数码管数字代码
//------------------------数码管显示子程序
void display(void){ uchar i,j;disp[3]=b;//求得四个单元值 disp[2]=10;disp[1]=a/10;disp[0]=a%10;for(i=0;i<4;i++)//循环四次送四个单元供显示 { P0=dispcode[disp[i]];P2=dispbit[i];for(j=0;j<255;j++);} } //--------------void display1(void){ uchar i,j;disp[3]=b;disp[2]=gong/100;disp[1]=gong%100/10;disp[0]=gong%100%10;for(i=0;i<4;i++){ P0=dispcode[disp[i]];P2=dispbit[i];for(j=0;j<255;j++);} } //------------中断定时50ms子程序 void t0(void)interrupt 1 using 1 { c++;TH0=0x3c;//定时器0附初值 TL0=0xb0;} //--------------------------void main(void){unsigned int d;//条件判断,用于第一个人按到后,后面的人再按不管用.TMOD=0x01;//用定时器定时50MS TH0=0x3c;//定时器0附初值 TL0=0xb0;ET0=1;EA=1;while(1){ P2_7=1;// display();if(c==20)// { c=0;a--;} if(P2_4==0)// { while(P2_4==0);// if(a==99){ a=0;a--;} a++;//} if(P2_5==0)//{ while(P2_5==0);if(a==0)a=100;a--;} if(P2_6==0)//蜂鸣器不响 一秒到,秒减1 加1键 松开键 定时加1 减1键 确认键 { while(P2_6==0);TR0=1;} if(a==0)//定时时间到报警一直响 { TR0=0;P2_7=0;} if(tj==1){ while(P2_6==1){ display1();if(P2_4==0){ while(P2_4==0);if(b==1)//加分
{ yi=yi+10;gong=yi;}
if(b==2){er=er+10;gong=er;}
if(b==3){san=san+10;gong=san;}
if(b==4){si=si+10;gong=si;}
if(b==5){wu=wu+10;gong=wu;}
if(b==6){liu=liu+10;gong=liu;}
if(b==7){qi=qi+10;gong=qi;}
if(b==8){ba=ba+10;gong=ba;}
} if(P2_5==0){while(P2_5==0);if(b==1){yi=yi-10;gong=yi;}//减分
if(b==2){er=er-10;gong=er;}
if(b==3){san=san-10;gong=san;}
if(b==4){si=si-10;gong=si;}
if(b==5){wu=wu-10;gong=wu;}
if(b==6){liu=liu-10;gong=liu;}
if(b==7){qi=qi-10;gong=qi;}
if(b==8){ba=ba-10;gong=ba;}
} }while(P2_6==0);tj=0;a=20,b=0;} if(tj==0){ switch(P1&0xff)//程序判断是哪一组抢答 {case 0xef:b=5;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=wu;break;case 0xdf:b=6;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=liu;break;case 0xbf:b=7;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=qi;break;case 0x7f:b=8;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=ba;break;case 0xfe:b=1;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=yi;break;case 0xfd:b=2;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=er;break;case 0xfb:b=3;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=san;break;case 0xf7:b=4;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=si;break;default: break;} } } }
第三篇:FPGA抢答器设计报告
Vb开办上海电力学院
课程设计报告
信息工程系
抢答器设计报告
一、设计目的:
本课程的授课对象是电子科学与技术专业本科生,是电子类专业的一门重要的实践课程,是理论与实践相结合的重要环节。
本课程有助于培养学生的数字电路设计方法、掌握模块划分、工程设计思想与电路调试能力,为以后从事各种电路设计、制作与调试工作打下坚实的基础
二、实验器材和工具软件:
PC机一台、QuartusII软件、DE2板。
三、设计内容:
(1)抢答器可容纳四组12位选手,每组设置三个抢答按钮供选手使
用。
(2)电路具有第一抢答信号的鉴别和锁存功能。在主持人将系统复位并发出抢答指令后,蜂鸣器提示抢答开始,时显示器显示初始时间并开始倒计时,若参赛选手按抢答按钮,则该组指示灯亮并用组别显示器显示选手的组别,同时蜂鸣器发出“嘀嘟”的双音频声。此时,电路具备自锁功能,使其它抢答按钮不起作用。
(3)如果无人抢答,计时器倒计时到零,蜂鸣器有抢答失败提示,主持人可以按复位键,开始新一轮的抢答。
(4)设置犯规功能。选手在主持人按开始键之前抢答,则认为犯规,犯规指示灯亮和显示出犯规组号,且蜂鸣器报警,主持人可以终止抢答执行相应惩罚。
(5)抢答器设置抢答时间选择功能。为适应多种抢答需要,系统设有10秒、15秒、20秒和3O秒四种抢答时间选择功能。
四、设计具体步骤:
首先把系统划分为组别判断电路模块groupslct,犯规判别与抢答信号判别电路模块fgqd,分频电路模块fpq1,倒计时控制电路模块djs,显示时间译码电路模块num_7seg模块,组别显示模块showgroup模块这六个模块,各模块设计完成后,用电路原理图方法将各模块连接构成系统。
各模块功能及代码:
1、组别判别模块
(1)功能:可容纳四组12位选手,每组设置三个抢答按钮供选手使用。若参赛选手按抢答按钮,则输出选手的组别。此时,电路具
signal rst : std_logic;begin
h<=“0000” when(a=“000” and b=“000” and c=“000” and d=“000”)else
“0001” when(a/=“000” and b=“000” and c=“000” and d=“000”)else
“0010” when(a=“000” and b/=“000” and c=“000” and d=“000”)else
“0100” when(a=“000” and b=“000” and c/=“000” and d=“000”)else
“1000” when(a=“000” and b=“000” and c=“000” and d/=“000”)else
“0000”;process
begin
wait on clock until rising_edge(clock);
if clr='1' then
rst<='1';
g<=“0000”;
end if;
if h/=“0000” then
if rst='1' then
g<=h;
rst<='0';
end if;
end if;
end process;
end behave_groupslct;
2、犯规判别与抢答信号判别模块
(1)功能:若参赛选手在主持人按开始键之后按抢答按钮,则使该组指示灯亮并输出选手的组别,同时蜂鸣器发出响声。
选手在主持人按开始键之前抢答,则认为犯规,犯规指示灯亮并输出犯规组号,且蜂鸣器报警。
(2)原理:c[3..0]接组别判别模块的g[3..0],即此时c为按键组别的信息。go接主持人的“开始”按键。由于无论是在正常情况还是犯规情况下按下按键,都必须显示按键的组别且蜂鸣器响,所以将c的值给hex以输出按键组别,且在有按键按下(c/=“0000”)时输出fm为‘1’,否则为‘0’。若在开始之前有按键按下时,即go='0'且c/=“0000”,输出ledfg为‘1’,否则为‘0’。若在开始之后有按键按下,将c的值给led,使该组指示灯亮,开始之前led输出“0000”。
(3)程序代码:
library ieee;
use ieee.std_logic_1164.all;
entity fgqd is port(c:in std_logic_vector(3 downto 0);
go:in std_logic;
hex:out std_logic_vector(3 downto 0);
led:out std_logic_vector(3 downto 0);
ledfg,fm:out std_logic);
end fgqd;
architecture behave_fgqd of fgqd is begin);end djs;
architecture behave_djs of djs is begin
process(clock,aclr,s)
begin
if(aclr='1')then
if(s=“00”)then
q<=“01010”;
elsif(s=“01”)then
q<=“01111”;
elsif(s=“10”)then
q<=“10100”;
else
q<=“11110”;
end if;
else
if rising_edge(clock)then
if en='1' then
q<=q-1;
if(q=“00000” and grpsl=“0000”)then
time0<='1';
else
time0<='0';
end if;
end if;
end if;
end if;
end process;end behave_djs;
4、分频器模块
(1)功能:实现50MHz—1Hz的分频,为倒计时模块提供时钟。
(2)程序代码
library ieee;
use ieee.std_logic_1164.all;
entity fpq1 is port(clkin :in std_logic;
clkout:out std_logic);end fpq1;
architecture behave_fpq1 of fpq1 is constant N: Integer:=24999999;signal Counter:Integer RANGE 0 TO N;signal Clk: Std_Logic;begin
process(clkin)
begin
if rising_edge(clkin)then--每计到N个(0~n-1)上升沿,输出信号翻转一次
if Counter=N then
Counter<=0;
Clk<=NOT Clk;
else
Counter<= Counter+1;
end if;
end if;
end process;clkout<= Clk;end behave_fpq1;
5、时间显示译码器
(1)功能:将时间信息在7段数码管上显示。
(2)程序代码
library ieee;
use ieee.std_logic_1164.all;
entity num_7seg is port(c:in std_logic_vector(4 downto 0);
hex:out std_logic_vector(13 downto 0));
end num_7seg;
architecture behave_num_7seg of num_7seg is begin
with c(4 downto 0)select
hex<= “10000001000000” when “00000” ,--“0”
“10000001111001” when “00001” ,--“1”
“10000000100100” when “00010” ,--“2”
“10000000110000” when “00011” ,--“3”
“10000000011001” when “00100” ,--“4”
“10000000010010” when “00101” ,--“5”
“10000000000010” when “00110” ,--“6”
“10000001111000” when “00111” ,--“7”
“10000000000000” when “01000” ,--“8”
“10000000010000” when “01001” ,--“9”
“11110011000000” when “01010” ,--“10”
“11110011111001” when “01011” ,--“11”
“11110010100100” when “01100” ,--“12”
“11110010110000” when “01101” ,--“13”
“11110010011001” when “01110” ,--“14”
“11110010010010” when “01111” ,--“15”
“11110010000010” when “10000” ,--“16”
“11110011111000” when “10001” ,--“17”
“11110010000000” when “10010” ,--“18”
“11110010010000” when “10011” ,--“19”
“01001001000000” when “10100” ,--“20”
“01001001111001” when “10101” ,--“21”
“01001000100100” when “10110” ,--“22”
“01001000110000” when “10111” ,--“23”
“01001000011001” when “11000” ,--“24”
“01001000010010” when “11001” ,--“25”
“01001000000010” when “11010” ,--“26”
“01001001111000” when “11011” ,--“27”
来。然后就是将选出的组别锁存。将按下按键的组别赋给一内部信号“h”(没有按键按下时h=“0000”),当复位键按下时(clr=‘1’)输出g=“0000”并且将另一内部信号rst置1。当复位后(rst=‘1’)有按键按下时将h的值给输出信号g,并且将标志信号rst清零。这样就实现最快按键组别锁存功能。
六、心得体会
通过此次设计,我掌握了数字电路的设计方法,尤其是模块划分、工程设计思想与电路调试能力,都有了一定的提高。为以后从事各种电路设计、制作与调试工作打下坚实的基础。
第四篇:基于aduino的抢答器设计
/*
QIANG DA QI
disigned by ckj
2012/12/8
*/
int d[4]={7,12,2,6};//shuju
boolean ds[4]={0,0,0,0};//si ge jie kou de shuju
int lt=3;//ceshi shuruduan
int bi=4;//xiaoyin duankou
int le=5;//suoding kongzhiduan
int xuanshou[9]={0,A0,A1,A2,A3,A4,A5,8,9};//xuanshou int fuwei=10;
int zhishideng=11;//zhishideng
int fengmingqi=13;//xiang
/*************************************/
void shuchushezhi()//shezhi duankou wei shuchu {
int i(0);
for(i=0;i<=3;i++)
pinMode(d[i],OUTPUT);//sige shujuduan zhiwei shuchupinMode(bi,OUTPUT);//xiaoyin
pinMode(le,OUTPUT);//suocun
pinMode(lt,OUTPUT);//dnegceshiduan
pinMode(zhishideng,OUTPUT);
pinMode(fengmingqi,OUTPUT);
}
/*************************************/
void shurushezhi()//shezhi shuchu duankou
{
int i(0);
for(i=0;i<=7;i++)//shezhi xuanshou wei shuchupinMode(xuanshou[i],INPUT);
pinMode(fuwei,INPUT);//fuwei
}
/*************************************/
{
int i(0);
digitalWrite(le,LOW);
digitalWrite(bi,HIGH);//quxiao xiaoyin
digitalWrite(lt,HIGH);//shumaguan quanliang
for(i=0;i<=3;i++)
{
digitalWrite(d[i],ds[i]);
}
delay(200);
digitalWrite(bi,LOW);//xiaoyindelay(200);
digitalWrite(bi,HIGH);//quxiao xiaoyin
digitalWrite(lt,HIGH);//quxiao quanliang
}
/*************************************/
void zhuanhuan(int i)//shijinzhi zhuan erjinzhi bing shuchu shuju
{
switch(i)
{
case 0:
ds[0]=0;
ds[1]=0;
ds[2]=0;
ds[3]=0;
break;
case 1:
ds[0]=1;
ds[1]=0;
ds[2]=0;
ds[3]=0;
break;
case 2:
ds[0]=0;
ds[1]=1;
ds[2]=0;
ds[3]=0;
break;
case 3:
ds[0]=1;
ds[1]=1;
ds[2]=0;
break;
case 4:
ds[0]=0;
ds[1]=0;
ds[2]=1;
ds[3]=0;
break;
case 5:
ds[0]=1;
ds[1]=0;
ds[2]=1;
ds[3]=0;
break;
case 6:
ds[0]=0;
ds[1]=1;
ds[2]=1;
ds[3]=0;
break;
case 7:
ds[0]=1;ds[1]=1;ds[2]=1;ds[3]=0;
break;
case 8:
ds[0]=0;
ds[1]=0;
ds[2]=0;
ds[3]=1;
break;
default:
break;
}
int j;
for(j=0;j<=3;j++)
{
digitalWrite(d[j],ds[j]);//shujuduan xieru shuju
}
}
/*************************************/
void xianshi(int i)//shezhixianshihanshu
{
boolean f(0);//shezhi yi ge biaozhi bianliang
digitalWrite(le,LOW);//suocun bu gongzuo
digitalWrite(fengmingqi,HIGH);//fengmingqi gongzuo
zhuanhuan(i);//diaoyong zhuanhuan hanshu
digitalWrite(le,HIGH);//suocun
delay(200);//yanshi 200 haomiao
digitalWrite(zhishideng,HIGH);//zhishidengliang
digitalWrite(fengmingqi,LOW);//fengmingqi guanbi
while(!f)//meiyou an fuwei jianshi yizhi xunhuan
{
f=digitalRead(fuwei);
if(f)//fangzhidoudong
{
delay(10);
f=digitalRead(fuwei);
if(f)//fuwei jian anxia
{
digitalWrite(le,LOW);//guandiaosuocun
digitalWrite(zhishideng,LOW);//guandiao zhishi deng
zhuanhuan(0);//xianshi0
break;//likai xunhuan
}
}
}
}
/*************************************/
void setup()
{
shuchushezhi();//shuchu chushihua
shurushezhi();//shuru chushihua
ceshi();//ceshi yixia shumaguan
}
/*************************************/
void loop()
{
boolean flag(0);//shezhi yige biaozhi bianliang
int i(0);//shezhi yi ge zhongjian bianliang
for(i=1;i<=8;i++)
{
flag=digitalRead(xuanshou[i]);//jiancha shi fou you xuanshou anxia jianif(flag)//ruguo youren an anjian
{
delay(10);
flag=digitalRead(xuanshou[i]);//fangzhi doudong
if(flag)//ruguo zhende anxiaqule
{
xianshi(i);//xianshi bing sucun
}
else//bushi dehua flagbianwei 0
{
flag=0;//biaoshi bian wei 0;
}
}
}
}
第五篇:抢答器设计心得
回顾上一周课程设计的时间,收获了很多,也付出了很多,周一至周二主要熟悉ewb软件的操作使用,学会仿真,周三至周四是看书查找资料,对相关元器件做一些了解,并把元器件布好线,以待焊接,周五至周六主要是焊接与调试,由于我底子薄弱了一点,刚开始可能会有一点害怕,害怕失败,因为上一次做收音机都不成功,虽说认真努力的做了,但看到舍友们都找资料在桌面上仿真,我也不甘示弱,并认真的去查找资料,在桌面上仿真,布线,焊接等一步一步的慢慢的走过来,当我看到抢答器正常工作时,兴奋不已,给了我自信和勇气,希望以后能有更多的时间和机会和同学一起动手做一些产品出来,不仅提高我们的动手能力,而且巩固了平常所学的知识,通过我们自己去查找总结印象更深刻,与此同时,增进了我们同学之间的友谊,也许某年后的一天看到自己的抢答器,一定会想起我的搭档和一起合作的时间。
在这几天中,体会到了团结协作的重要性和乐趣,有什么问题很想法拿出来一起探讨与分享,将会有更好的答案,活跃了一个人的思维,丰富了我们的头脑,学会去接受别人,肯定别人,同样也得到了别人的尊重与肯定,除了讨论之外,还需积极独立思考,唯独通过自己的独立思考,才能解决相关问题,才能提高对专业知识的熟悉程度,以后才能学会用,同样这也是我该努力的两个方向。
我不敢说以后一定要学得怎么样,至少现在懂得一定要善于观察,积极思考,态度认真,坚持到底做好每一件事,同样对待身边的每个人。
有时会感觉这些并不是我自己摸索到的,而是老师您在教学中无形传授给我们的,虽然我现在学得不怎么样,但我不怕失败,并勇敢地走下去。
抢答器设计心得(2):
一、设计目的:
比赛中为了准确、公正、直观地判断出第一抢答者,所设计的抢答器通常由数码显示、灯光、音响等多种手段指示出第一抢答者。同时还应设计记分、犯规和奖惩记录等多种功能。
设计一四人抢答器,具体要求:当主持人宣布开始时,一旦有任何参赛者最先按下按钮,则此参赛者对应的指示灯点亮,而其余三个参赛者的按钮将不起作用,信号也不再被输出,直到主持人宣布下一轮抢答开始为止。
二、设计任务:
1、基本部分:
(1)抢答气可供四组使用,组别键号可以锁存;抢答指示用发光二极管(led)。
(2)记分部分独立(不受组别信号控制),至少用2位二组数码管指示,步进有10分,5分两种选择,并且具有预置、递增、递减功能。
(3)要求可靠性,操作简便。
2、发挥部分:
(1)增加抢答路数。
(2)数码管显示组别键号。
(3)自动记分:当主持人分别按步进得分键,递增键或递减键后能够将分值自动累计在某组记分器上。
(4)超时报警。
(5)其他。
3、分析各部分工作原理,绘制电路图,撰写设计报告。
三、设计内容:
1、仪器设备及元件:
电工学实验台、集成电路74ls175、74ls20、74ls00,蜂鸣器,电源、逻辑电平显示等。
2、操作步骤:
图示是四人(组)参加智力竞赛的抢答电路,电路中的主要器件是74ls175型四上升沿d触发器,它的清零端和时钟脉冲是四个d触发器公用的。
(1)按照电路图连接电路。
(2)抢答前先清零,q1-q4均为0,相应的发光二极管led都不亮;q1-q4均为1,与非门g1输出为0,扬声器不响。同时,g2输出为1,将g3开通,时钟脉冲cp可以经过g3进入d触发器的cp端。此时,由于s1-s4均未按下,d1-d4均为0,所以触发器的状态不变。
(3)抢答开始,若s1首先被按下,d1和q1均变为1,相应的发光二极管亮;q1变为0,g1的输出为1,扬声器响。同时g2输出为0,将g3关断,时钟脉冲cp便不能经过g3进入d触发器。由于没有时钟脉冲,因此再接着按其他按钮,就不起作用了,触发器的状态不会改变。
(4)抢答判决完毕,清零,准备下次抢答用。
四、设计心得:
电子课程设计是本学期中唯一的一门课程设计,我们理所当然的要认真对待,本次设计我选择的是数字智力竞赛抢答器的设计,这个课题用到了数字电路方面的知识,通过这次课程设计,使我对与非门以及集成电路有了一定的了解,对课本上的知识有了近一步的掌握。
完成本次课程设计的过程,是一个从无到有的过程,因为以前没有过类似的课程设计,所以起初不知该从何下手,后来仔细阅读设计的题目和要求,阅读设计指导书,再到图书馆和网上查找资料,总算是有点眉目了。
知道了如何下手,后面的工作就容易一些了,万事开头难啊,和同学们在一起,不明白的地方可以随时问,互相帮助,完成课程设计,这样的一段经历,或许是我在完成课程设计的同时,收获的一份财富。
埋头苦干的过程是苦涩的,在书山中查找资料的过程是疲倦的,但当课程设计完成时,那感觉是甜蜜的,没有耕耘,哪来得收获的喜悦,不懂付出怎么能知道回报的快乐,一分耕耘一分收获,有付出才会有回报,就在这样的痛与快乐的交换中,我学到了知识,学到了道理,学到了做人的道理。