从一个简单的项目,学会单片机的使用:51单片机设计的8路抢答器
单片机作为可编程器件,简化了电路的设计、方便了逻辑设计,从此再也不用使用一大堆电路做硬件逻辑了。拆开任何一件功能稍微复杂一点电子产品,里边都可以看到单片机的身影。学会单片机对找工作也很有利,而且待遇还不错,今天就从实例分享的角度和大家共享一个案例,用单片机来实现一个抢答器。
在电视节目中,经常看到抢答器出现在知识竞赛、答题竞赛节目中,如江苏卫视的《一站到底》,抢答器可以准确、公正、直观、公平的显示出抢答选手的编号,可以更好的促进各选手之间的竞争意识,营造紧张的抢答气氛,增加节目的趣味性和观赏性。
抢答器的设计框图
抢答器要实现如下功能:抢答功能、显示功能、倒计时功能、自锁功能。节目后台需要控场,拥有抢答器的绝对控制权。功能需求 如下:
开始、结束功能 :只有按下开始按键后,现场选手才可以开始抢答,否则抢答事件不被处理视为无效;自锁、互锁功能 :为了保证抢答的公平性,在开始抢答后,第一个按下抢答的视为有效抢答,产生有效抢答后其他抢答视为无效;计时、设置功能 :后台/主持人可以设置抢答时间的长短,以倒数秒的方式显示,增强紧张气氛;显示、声音功能 :用数码管显示倒计时秒数,选手抢答成功后显示抢答者编号和剩余时间;在该设计中,按键采用机械式的四腿按键来实现,按键数量10个;显示采用三位数码管来实现,两位显示时间,一位显示选手编号;声音提示用蜂鸣器来实现。核心器件采用51单片机来实现。其功能框图如下图所示。
1-抢答器功能框图
按键输入电路设计
该抢答器设计中总共有10个按键,其中8个按键用于给用户抢答用,所代表的编号为1-8,另外两个按键分别为开始键和结束键,由主持人或者后台控制。由于8路输入抢答按键具有互锁功能,所以只要有一个有效输入后,其他抢答都是无效的,这个功能可以在程序中实现,为了方便程序设计,这里采用8输入与非门来实现,所用型号为74LS30,该与非门有8路输入,1个输出,功能框图如下所示。
2-74LS30与非门框图
8个按键作为74LS30的输入,输出通过NPN三极管接入51单片机的外部中断0接口,以中断的方式实现按键功能的检测,单片机的中断资源为低电平有效,为了提高电路稳定性在三极管的集电极上加入上拉电阻,以防误动作。
3-按键输入电路设计
开始和结束两个按键采用独立式按键设计,占用掉单片机的两个IO口,程序中采用轮询来实现。
数码管显示电路设计
显示部分采用数码管来实现,根据设计要求,两位用于显示倒计时时间,最大可以显示99;一位用于显示选手编号,故需要3颗数码管,该设计中采用共阳数码管来实现,所谓共阳数码管是指公共端接高电平,段选管脚接低电平后相应的字段才会被点亮。共阴数码管正好相反,公共端接低电平,段选管脚接高电平后相应的字段才会被点亮。数码管的实物图如下所示。
4-数码管实物图
数码管的引脚比较多,除了8个段选管脚外,还有公共端/位选引脚,如果用三颗独立的数码管可能需要较多单片机引脚资源,为了解决这个问题,本例设计采用74HC595作为数码管驱动。74HC595是串入并出的移位寄存器,只需要三个引脚就可以控制8个引脚的输出,而且还可以实现级联。所以74HC595通常在数码管驱动和点阵屏中应用比较多。
这三颗数码管中,分为时间显示和编号显示两组,用到三颗74HC595,其中两颗级联用于控制时间显示的数码管,总共用到6个单片机的IO口,驱动电路如下图所示。
5-数码管驱动电路
蜂鸣器发声电路设计
需求中提到发声设计,当有效按键事件发生时,蜂鸣器发声作为提示音,当倒计时进入5秒之内后还没有人按键抢答时,蜂鸣器每隔1秒发声,制造现场紧张的气氛,提高节目的观赏性和娱乐性,增强节目效果。本例中选择了蜂鸣器,蜂鸣器驱动电路如下图所示。
6-蜂鸣器驱动电路
由于单片机的IO口驱动能力有限,所以采用三极管来驱动,这里选用了PNP三极管。三极管驱动蜂鸣器时工作于饱和状态,为了让三极管充分饱和,将蜂鸣器接在了三极管的集电极,这个地方初学者在设计电路时要注意。图中当单片机的IO口输出低电平时蜂鸣器工作发声。
抢答器程序设计
该设计使用keil5作为编程环境,涉及到数码管显示、按键检测/互锁、蜂鸣器发声、定时器等相关功能模块的程序编写。程序设计的流程图如下所示。
7-程序设计流程图
程序的功能逻辑介绍如下,上电后数码管显示FFF字样,并首先检测“开始”按键是否按下,如果没有按下开始按键则表示抢答未开始。如果按下了开始按键,抢答器启动,秒显示开始倒计时,有人按下抢答键时蜂鸣器发声、倒计时停止并显示抢答者编号,整个抢答事件结束,直到主持人/后台按下结束按键后再显示FFF。如果倒计时进入5秒内,仍未有人抢答,则每个整秒蜂鸣器响一次,直至结束。
以上为程序逻辑设计和程序的流程图讲解,下面介绍各功能模块的程序设计。
首先介绍数码管的程序编写 ,再编写程序时,都会预先定义好数码管的字段表,根据共阳数码管和共阴数码管的不同,其字段表也是不一样的,但是两者是互补的,数码管可显示的字段表如下图所示。
8-数码管字段表
程序代码如下:
/*共阳数码管的0-9数字字码表*/
uchar code seg_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x8e,0xff};
其次是按键部分 ,抢答按键采用中断来实现,开始/结束按键采用轮询实现,部分定义代码如下所示。
//定义抢答按键
sbit KEY_1=P0^0; //1
sbit KEY_2=P0^1; //2
sbit KEY_3=P0^2; //3
sbit KEY_4=P0^3; //4
sbit KEY_5=P0^4; //5
sbit KEY_6=P0^5; //6
sbit KEY_7=P0^6; //6
sbit KEY_8=P0^7; //6
//定义开始/结束按键
sbit START = P2^4;
sbit STOP = P2^5;
仿真电路的设计和验证
在做板子之前,先用Proteus仿真软件做了仿真。Proteus仿真支持51单片机并可以实现运行程序的功能,当把程序写好后加载至Proteus即可实现程序的调试,Proteus还可以与Keil软件实现联调功能。所设计的仿真电路如下图所示。
9-仿真电路-初始显示FFF字样
在上电初期,显示“FFF”字样,前两个数码管代表倒计时时间,后一个数码管代表抢答者的编号。按下开始按键后,抢答器开始工作,如下图所示。
10-抢答成功界面
上图表示,在倒计时时间还有7秒的时候,5号选手完成了有效抢答,直至主持人/后台按下结束后再显示FFF,否则一直显示该界面。
抢答器的焊接调试
为了实现功能验证,选择用万用板手工焊接实现这个设计。最终的实物图如下所示:
11-最终实物图正面
电源供电为DC5V,可以使用电池盒供电,也可以选择5V输出的手机充电器供电,导线走在了电路板正面,虽然丑了点,但是方便一点。电路板的反面如下图所示。
12-最终实物图背面
反面是用焊锡连接实现的。由于功能不是很复杂,程序写完后,调试了没几次就完成了功能,前文中所描述的功能都实现了。按键互锁的功能也实现了。下图是通电运行的界面,表示5号抢答者在倒计时28秒的时候抢答成功,这时候其他抢答者的按键无效。只有开始或者结束按键是其作用的。
13-抢答成功界面
该抢答器的设计虽然是一个很简单的练手项目,但是却涉及到了单片机中最常用的外设电路,可以帮助初学者熟悉数码管、按键、蜂鸣器的使用和控制方法。初学者可以借助这个产品熟悉单片机开发过程中所用的各种软件和产品开发的流程。
对这个电路进行PCB Layout,设计个外壳就成了一个不错的产品。还可以增加蓝牙模块或者WiFi模块,实现电子屏的控制和显示,再把功能完善一下,就可以用在舞台上了。
高级单片机实战开发-蜂鸣器
一、 蜂鸣器的类型和原理
1. 压电式
使用压电陶瓷片作为发声器件,通过给 压电陶瓷加交流信号发声
2. 电磁式
通过线圈产生的磁场和磁铁作用,类似于扬声器的工作原理
3. 贴片式
有贴片和直插安装方式
4. 有源蜂鸣器
加电就响,内置信号发生器驱动发声器件,一般的音调都是固定的。
5. 无源蜂鸣器
加电后有咔嚓声, 要用2-5K的方波驱动。无源蜂鸣器的声调会随着外加方波的频率而改变。
二、 蜂鸣器产品参数
下面是某一蜂鸣器的具体参数:
★尺寸(size):φ30mm×19.5mm
★电压范围(Voltage Range):3-20VDC
★额定电压(Rated Voltage):12VDC
★使用频率(frequency):3600±500Hz
★声压(SPL):Min.90dB(12VDC/30cm)
★电流(Current):≤50mA
★成品重量(weight):2g
★支持定制:XXXXXX
三、 蜂鸣器的检测
1. 有源与无源的区分
(1) 外形区别
有源蜂鸣器
无源蜂鸣器
两者的高度略有区别,有源蜂鸣器a,高度为9mm,而无源蜂鸣器b的高度为8mm。如将两种蜂鸣器的引脚郡朝上放置时,可以看出有绿色电路板的一种是无源蜂鸣器,没有电路板而用黑胶封闭的一种是有源蜂鸣器。
(2) 电参数的区别
把可调电源设定到蜂鸣器的额定电压,一般的常见蜂鸣器额定电压为1.5v、5v、10v、12v这几种,串联一个100-200欧姆的限流电阻,给蜂鸣器加电,有源蜂鸣器会连续的发出滴滴的声音,或者有规律的滴滴声音。
无源蜂鸣器只在接通或者断开电源的瞬间有咔咔声
使用万用表,测量蜂鸣器的电阻,有源蜂鸣器电阻比较大,一般的都在几百欧以上,无源的蜂鸣器阻值在8、16欧姆左右。
2. 好坏的检测
使用可调电源调至蜂鸣器的额定电压,串联100欧姆电阻,有源蜂鸣器加上额定电压和电流后如果不能产生明亮的滴滴声,如果声音不正常或者不发声,说明质量不良或者已经损坏。
无源蜂鸣器的测试,使用信号发生器调至2KHz,信号经过100欧姆限流电阻后加到蜂鸣器上,如果蜂鸣器发出明亮的滴声,说明产品是良好的,反之如果声音不正常或者干脆没有声音,说明有蜂鸣器不良或者故障。
四、 驱动电路的设计
我们为了使用更多的功能,因此使用无源蜂鸣器。
1. 为什么要用三极管?
因为单片机的IO驱动电流较小,直接驱动容易损坏单片机,所以要用三极管来扩大电流
2. 用什么样的三极管?
MPSA92三极管参数:
VCEO:-300V
VCBO=-300V
IC=-500mA
PD=625mA
hFE = 最小25
三极管的选择,因为单片机上电是高电平,因此选用PNP的三极管,上电后蜂鸣器并没有电流,只有在驱动的控制下才会导通。蜂鸣器的工作电流通常在100mA以下,此蜂鸣器工作电流设定为25mA,因此MPSA92是能够满足的,而且也是常用的型号。
3. 电阻R2的计算
设计三极管IC电流25mA,三极管的放大倍数取最小值25,所以基极电流为1mA,
R2=(5-0.7)/0.001=4.3K
功率:4.3*0.001=0.0043W 使用1/8W足够,其它温度系数和耐压也没有问题
五、 驱动程序
//-----------------------------------------------------------------
//名称:蜂鸣器驱动
//设计:非凡创客
//日期: 2015-05-01
//版本:V1.0
//-----------------------------------------------------------------
#include <reg51.h>
#define unc unsigned char
#define uni unsigned int
sbit BUZER = P3^0;//蜂鸣器驱动引脚的定义
//-----------------------------------------------------------------
// 毫秒延时程序
//-----------------------------------------------------------------
void DL(uni x)
{ unc t; while(x--) for(t=0;t<120;t++);
}
//-----------------------------------------------------------------
// 蜂鸣器驱动程序
//-----------------------------------------------------------------
void BUZ()
{
unc t;
for(t=0;t<50;t++)
{
DL(1);
BUZER=~BUZER;
}
}
//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
void main()
{
while(1)
{
BUZ();
}
}
欢迎评论和点赞,不喜欢的请拍砖!觉得不完美的请给出您的宝贵建议。
本文属于原创首发,未经授权,请勿用于商业用途!
头条号:非凡创客 QQ: 782659135
相关问答
求助 51单片机 怎么 让蜂鸣器 每隔一秒 响 两次-ZOL问答蜂鸣器分有源和无源,有源的通电就响,无源的要给一个频率信号。定时器设个一秒的延时不就行了#include
不知道你硬件怎么接的,如果有加三极管控制,应该是可以的。要区分一下蜂鸣器是交流的还是直流的,直流的直接接上电源就响了,交流的是要给它一个能发出声音的频...
单片机蜂鸣器 怎么 响 ?需要进行以下步骤:首先,在程序中定义好蜂鸣器所连接的引脚,然后将这个引脚设置为输出模式。接着,将这个引脚输出高电平或低电平,控制蜂鸣器的通断。如果将...
肿么使用 单片机 控制 蜂鸣器 发声-ZOL问答两种蜂鸣器用单片机的控制方法是一样的,对于无源的,要求单片机送出一组断续的音频信号,使蜂鸣器按要求发声,对于有源蜂鸣器,要求单片机送出一组断续的电脉冲信号...
51单片机 控制 蜂鸣器 发出911声音c程序如下,求老师详细讲解,...[最佳回答]什么叫911声音??不明白看程序应该是发出的声音频率越来越高,然后突然降低,再越来越高,如此循环main(){TMOD=0x01;//设定时方式1,16位定时器frq...
单片机 开发板上 蜂鸣器 一直 响 是怎么回事,怎么才能不响啊?1.程序代码有错误,导致蜂鸣器持续响。2.蜂鸣器接触不良,导致持续响。3.蜂鸣器的驱动电路有问题,导致持续响。4.芯片有损坏或者烧毁的情况。建议检查代...
51单片机蜂鸣器 隔一秒 响 一次程序?完整的源程序:#includedefineuintunsignedintsbitspk=P1^2;//与喇叭相连接的单片机引脚的定义voiddelayms(uint);...wh...
51单片机蜂鸣器 不工作?你所使用的蜂鸣器是无源蜂鸣器,蜂鸣器分为无源蜂鸣器和有源蜂鸣器(源指震荡源)。有源蜂鸣器内部有发声电路,直接上电就可以响,而无源蜂鸣器则需要给它一定...
51单片机蜂鸣器 连接哪个引脚?对于51单片机,最简单且常见的连接方法是I/O口输出经4.7k电阻连接PNP三极管的基极,三极管发射机接+5V电源端,三极管集电极连接蜂鸣器的正极,蜂鸣器负极接GND。...
51单片机 开发板上 蜂鸣器 的位置?在51单片机开发板上,蜂鸣器通常被放置在开发板的边缘位置,或者在板子的中央位置。具体位置因开发板的不同而异。在使用时,需要先确定蜂鸣器的引脚位置,并根据...