资讯详情

详细教程||基于51单片开发的十路抢答器设计

一、设计要求

(1)同时为10名选手或10支队伍提供抢答器。

(2)设置一个系统清除和抢答控制开关S,主持人控制开关。

(3)抢答器具有定和显示功能。也就是说,玩家按下按钮,锁定相应的数LED显示在数字管上,扬声器发出声音提示。选手抢答优先锁定,优先选手号码保持到主持人清除系统。

(4)答疑器具有定时答疑功能,答疑时间由主持人设定(如30秒)。主持人启动时"开始"键后,定时器减少计时,扬声器发出短暂的声音,声音持续0.5秒左右。

(5)参赛者应在设定的时间内回答,答案有效,定时器停止工作,显示玩家的号码和答案时间,直到主持人删除系统。

(6)如果时间到了,没有人回答,回答无效,系统报警,禁止回答,000显示在定时显示器上

二、设计准备

Keil uVision编写代码,Proteus 8 Professional模拟调试,立创EDA进行绘制PCB板封装。

已绘制的程序流程图:

faf0fc9ff85141e8bc573f637815dd48.png

三、绘制仿真图

首先,选择符合设计要求的组件,并建立合适的电路图。如果您先编写代码,则不确定一些引脚、开关、晶体振动电路、设备参数等的设计。直接编写代码是不现实的。作者使用的设备包括共阳极四位数字管7SEG-MPX4-CA,单片机AT89C52,按钮开关BUTTON,有源蜂鸣器BUZZER,电容CAP,晶振CRYSTAL,NPN三极管,RES电阻,SW-SPST单刀单掷开关。如图所示,在元器库中搜索所需元器件,其余电源和地线直接在左终端模型中选择。

补充知识:

1.数字管原理:

66e9315f6b0e400ba4c24550cdc421b0.png6cc81b6e61414a2ebabc9ec14ac36b2d.png

单数管内部电路图:a~h每个数字代表一个发光二极管,v是公共端,可接地或电源,对应于共阴极和共阳极。a~g段数管用于显示数字,h显示小数点。为便于包装,数码管外有10个引脚,5和10个连接到公共端,其余对应发光二极管。a~f六个数字管亮能显示数字0;b、c点亮两个数字管,实现数字1的显示。Proteus数字管中有八个引脚,输入八位二进制数可以显示数字。

06f5cbb08a5a47208dc6fa698df84e19.png

四位数字管的段选端口连接在一起。1、2、3、4是位选信号。如果我们将段选信号输入端口,所有数字管显示相同的数字。为了显示不同的数字,禁止每次只使用一个位选信号,禁止其他三个。虽然每时每刻只显示一个数字管,但下一刻切换要显示的数字。因为肉眼捕捉速度慢,信号切换速度快,所以看到四个数字管同时亮起。

共阳数码管是指将所有发光二极管的阳极连接在一起形成公共阳极(COM)当某一字段发光二极管的阴极低电时,相应的字段会被点亮,相反,相应的字段不会被点亮。

共阴数码管是指将所有发光二极管的阴极连接在一起形成公共阴极(COM)当一个字段发光二极管的阳极高电时,相应的字段会被点亮,相反,相应的字段不会被点亮。

数字管公共极连接不同,共阳数字管应用于公共极COM接到 5V,应用共阴数码管时,应使用公共极端COM接到地线GND上

2.有源蜂鸣器和无源蜂鸣器

f190f19d34ec453aae117bd2b7370d5a.png

在Proteus有源蜂鸣器如下。有源蜂鸣器使用简单,不能设置频率,只能发出单音,无源可以设置频率。两者对输入信号有不同的要求:有源蜂鸣器工作的理想信号是直流,通常标记为VDC、VDD等等。蜂鸣器内部有一个简单的振荡电路,它可以将恒定的直流电转化为一定频率的脉冲信号,从磁场交换的面实中驱动钼片的振动发音。两者之间的电路是不同的。选择有源蜂鸣器时,选择其电压为5V。

9ddb47a60ed6415d94768a958a1b5562.png

Proteus电路图

设置总线时,按下英文模式键盘的快捷键a,弹出窗口,写入NET=P0#,可依次注释导线P1、P2……,写入NET=k,可直接标注导线k。

四、编写keil代码生成hex文件

五、进行Proteus仿真

双击单片机把手hex添加程序文件,然后进行操作模拟。作者所做的只是一个简单的十路回答器,当使用单片机串口时,整个P0口做数码管段选码,整个P在数字管显示过程中,两个串口都实现了这些功能P两口的状态一直在变化,因此很难添加其他功能。因此,在添加控制开关时,选择带电源的单刀单掷开关,不影响数字管的显示。最后设置为倒计时29秒开始响,28秒自然不响,00点报警,但具体时间不能自动停止,只能关闭启动开关,然后按下复位开关,报警解除。其他附加功能难以实现,这是作者设计中最大的不足。咸鱼我有很多肝脏也不能解决问题,如果你用存储器来节省io嘴可能更好,但实际能力有限。添加锁定器时,编写代码不能更好地运行。电路的内部原理和C语言只是一点理解。感兴趣的朋友可以去了解,在数字管和单片机中使用锁定器。但幸运的是,整个设计符合基本的设计要求。

六、立创创建原理图和封装

Proteus文件不能直接转换为立创图。Proteus立创绘图的原理图。在元件库中找不到元件时,朋友们可以先把它们画出来Proteus百度搜索他的中文名或其他英文名,然后在元件库中搜索相应的中文或英文名。单片机上没有使用io口不需要接线了,在后续绘制pcb板铺铜会处理那些多余的引脚。我已经吃过这个亏了。

立创有时候连接导线会突然停下来,让人误以为连上了,放大检查所有线路都连接完整后,转化为pcb。

 

 为了节约材料,选择合适的板子大小,把元件放入板子上,并且按实际情况放置好开关等元件。

下载好本地自动布线程序,开始自动布线。布线后根据实际线路需要再设置其他属性,比如连接电源的导线应该加粗。选择底层视图,去掉元件显示,找到一根电源线,右键查找相似对象,然后再后边的属性栏增加导线宽度。

 最后为了减小回路面积,降低地线阻抗,使电镀层压不变形,给pcb板铺铜。点击铺铜工具,分别在顶层和底层给板子内部四角依次点击 ,最后铺铜完成。详细的铺铜要求可以参考其他文献,笔者只做了简单地线铺铜  。

 


看到周围很多同学因为课设而头疼,自己做出来一个课设也希望能给其他人帮助。第一次写类似的文章,我是自动化专业的,还做了很多课设希望以后再发出来。最后keil软件编写的代码也全部奉献啦,创作不易,期待帅哥美女们一键三连(☆▽☆)也欢迎各位留言交流。

#include <reg52.h>#define uchar unsigned char#define uint unsigned int/****************共阳极数码管9-0***************/char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar code weima[]={0x80,0x40,0x20,0x10,0x08,0x04,0x01};uchar disp[]={0xc0,0xb0,0xbf,0xbf};sbit k=P2^0;sbit Buzzer=P2^2;uchar miao=30;//设定倒计时uchar i=1,count=0,scan=0,shu,shu1;void keys(void);	void delay(uint t){while(t--);}void xianshi(void){     if(++scan==5)scan=1;	 P2=weima[scan-1];	 P0=disp[scan-1];	 delay(200);}main()   	{  TMOD=0x01;//t0,方式1	   TH0=0x3c;TL0=0x0b0;	   EA=1;	   ET0=1;	   P1=0xff;       P3=0xff;	   TR0=1;	   while(1)	 {		  	 	   if(disp[0]==table[9]&&disp[1]==table[2]) 		{ 		  Buzzer=1;		  		}	      if(miao==0)		  {TR0=0;  		  Buzzer=1;		  delay(2000);		  Buzzer=0;		}		  xianshi();		  		    if(miao!=0)			if(P1!=0xff||P3!=0xff)		{	     		  delay(5);              if(P1!=0xff||P3!=0xff)             {              switch(P1)              {                case 0xfe : shu=1; shu1=0;                  break;              case 0xfd : shu=2; shu1=0;                  break;              case 0xfb : shu=3; shu1=0;                  break;              case 0xf7 : shu=4; shu1=0;                  break;              case 0xef : shu=5; shu1=0;                  break;              case 0xdf : shu=6; shu1=0;                  break;              case 0xbf : shu=7; shu1=0;                  break;              case 0x7f : shu=8; shu1=0;                  break;              }              switch(P3)             {case 0xbf : shu=9; shu1=0;break;case 0x7f : shu=0; shu1=1;break;}}	  disp[2]=table[shu];	  disp[3]=table[shu1];      TR0=0;               //定时器停止倒计时	while(1){xianshi();}   //保证第一个按键有效	   }	 } 	 }			  	void Timer0Interrupt(void) interrupt 1{	 if(k==1){delay(10);if(k==1){if(++count==20&&k==1)	 {count=0;	 miao--;	 disp[0]=table[miao%10];	 disp[1]=table[miao/10];	 }	 }}}

标签: 连接器振动盘

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台