橙色
蜂鸣器采用直流电压供电,分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
无论是压电式蜂鸣器还是电磁式蜂鸣器,都有有源和无源的区分。有源是指蜂鸣器本身内含振荡电路,直接给它一定的电压就可以响;无源是需要靠外部提供一定频率的脉冲信号才可以响的。这里的“源”不是指电源,而是指蜂鸣器内部是否含有振荡电路
对于本章要实现蜂鸣器的控制, 我们能否直接使用 STC89CXX 的 IO 口驱动呢? 答案是否定的, 因为 51 单片机 IO 口的驱动能力较弱(即使外接上拉电阻) , 而蜂鸣器驱动需要约 30mA, 所以非常困难,即使可以驱动, 那对于整个芯片的其 IO 剩下驱动能力就更加弱甚至无法工作。所以我们不会直接使用 IO 口驱动蜂鸣器, 而是通过三极管把电流放大后再驱动蜂鸣器
, 这样 51 单片机的 IO 口只需要提供不到 1mA 的电流就可控制蜂鸣器。所以我们也经常说到 51 单片机芯片是用来做控制的, 而不是驱动。
我们普中 51-单核-A3&A4 开发板上的蜂鸣器模块电路如下图所示:
从上图中可以看出, 该电路是集成的, 蜂鸣器控制管脚直接连接到 51 单片机的 P1^5 IO 口上。
开发板上使用的是无源蜂鸣器, 它需要一定频率的脉冲(高低电平) 才会发声, 图中 TP1 PNP 三极管起到一个电流放大作用, 从而可以驱动蜂鸣器。 当 J7 端子有一个高电平进来时, PNP 三极管 TP1 截止, 蜂鸣器不得电,当 J7 端子有一个低电平进来时, PNP 三极管 TP1 导通, 蜂鸣器得电, 如果 J7 端子有一个一定频率的脉冲信号(高低电平不断翻转) 时, 无源蜂鸣器发出声音。
通过电阻 R2 和 PNP 三极管 TP1 进行电流放大, 从而驱动蜂鸣器。 电阻 R1是一个上拉电阻, 用来防止蜂鸣器误发声。 当 BEEP 引脚输出低电平时, PNP 三极管导通, 蜂鸣器发声; 当 BEEP 引脚输出高电平时, PNP 三极管截止, 蜂鸣器停止发声。对其中原理不清楚的可以参考该篇文章:PNP与NPN两种三极管使用方法
如果要想 51 单片机控制蜂鸣器, 就必须将单片机管脚通过导线连接到 J7 端子上。 本章所要实现的功能是: 让蜂鸣器发出声音。 由于蜂模块电路是集成的,所以直接使用单片机管脚即可。
本章所要实现的功能是: 让蜂鸣器发出声音, 即让 P1.5 管脚输出一个低电平, 完成后可再让 P1.5 输出一定频率的脉冲控制有源蜂鸣器。
#include "reg52.h"
#include
typedef unsigned int u16;
typedef unsigned char u8;
sbit beep=P1^5;
void delay(u16 i)
{
while(i--);
}
void main()
{
while(1)
{
beep=~beep;
delay(100);//通过修改此延时时间达到不同的发声效果
}
}
使用 sbit 关键字来定义 P1.5 管脚, 定义好后即可使用 beep 来替代 P1.5口的操作。 主函数功能非常简单, 直接进入 while 循环, 在循环内不断对 beep取反, 然后延时一定时间, 即 P1.5 间隔一定时间输出高低电平, 这样就会产生脉冲信号。
多位数码管, 即是两个或两个以上单个数码管并列集中在一起形成一体的数码管。 当多位一体时, 它们内部的公共端是独立的, 独立的公共端可以控制多位一体中的哪一位数码管点亮,通常叫做“位选线” 。本开发板中在公共端处连接了74HC138芯片
。只需单片机 3 个 IO 口就可以实现 8 个位选管脚的控制, 大大节省了芯片的 IO 资源。
而负责显示什么数字的段线全部是连接在一起的,连接在一起的段线可以控制这个能点亮数码管亮什么数字, 通常叫做“段选线” , 有了这两个线后, 通过单片机及外部驱动电路就可以控制任意的数码管显示任意的数字了。本开发板中在段选线处连接了74HC245芯片
位选线
控制多位一体中的哪一位数码管点亮,段选线
控制这个能点亮数码管亮什么数字
74HC245 是一种三态输出、 八路信号收发器, 主要应用于大屏显示, 以及其它的消费类电子产品中增加驱动。
三态输出,也称为三态门或三态电路,是一种特殊的数字电路,其输出可以有三种状态:逻辑“0”、逻辑“1”和高阻态。高阻态是一种特殊的输出状态,它既不是高电平也不是低电平,而是处于一种"高阻抗"或"悬浮"状态,也就是说,它不对电路中的其他部分产生任何影响。当输出处于高阻态时,外部电路可以控制其状态,而不会影响其他与该输出连接的电路。三态电路的输出逻辑状态的控制,是通过一个输入引脚实现的。当输入引脚为低电平时,三态电路呈现正常的“0”或“1”的输出;当输入引脚为高电平时,三态电路给出高阻态输出。
管脚功能定义
从上面的管脚功能定义说明及真值表可以知道该芯片使用方法非常简单, 给 OE 使能管脚 低电平, DIR 管脚为高电平,其传输方向是 A->B 输出;DIR 管脚为低电平,其传输方向是 B->A, 至于输出高电平还是输出低电平取决于输入端的状态, 如果输入为低电平, 输出即为低; 输入为高电平, 输出即为高。 如果 OE 使能管脚为高电平,不论 DIR 管脚是高还是低, 输出是高组态。
通常我们使用 74HC245 芯片用作驱动只会让其在一个方向输出, 即 DIR 管脚为高电平, 传输方向是 A->B。
74HC138D 是一种三通道输入、 八通道输出译码器
从上面的管脚功能定义说明及真值表可以知道该芯片使用方法非常简单, 给E1、 E2 使能管脚低电平, E3 管脚为高电平, 至于哪个管脚输出有效电平(低电平),要看 A0, A1, A2 输入管脚的电平状态。
A0、 A1、 A3&A4 输入就相当于 3 位 2 进制数, A0是低位, A1 是次高位, A2 是高位。 而 Y0-Y7 具体哪一个输出有效电平, 就看输入二进制对应的十进制数值。 比如输入是 101(A32, A1, A0) , 其对应的十进制数是 5, 所以 Y5 输出有效电平(低电平) 。
本实验的目的是: 控制动态数码管从左至右显示数字 0-7。
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //显示0~F的值
void delay(u16 i)
{
while(i--);
}
void DigDisplay(){
u8 i;
for(i=0;i<8;i++)
{
switch(i)
{
case(0):
LSA=1;LSB=1;LSC=1;break; //从左往右数第一个管亮
case(1):
LSA=0;LSB=1;LSC=1;break;
case(2):
LSA=1;LSB=0;LSC=1;break;
case(3):
LSA=0;LSB=0;LSC=1;break;
case(4):
LSA=1;LSB=1;LSC=0;break;
case(5):
LSA=0;LSB=1;LSC=0;break;
case(6):
LSA=1;LSB=0;LSC=0;break;
case(7):
LSA=0;LSB=0;LSC=0;break;
}
P0=smgduan[i];//发送端码
delay(100);//间隔一段时间扫描
P0=0x00;//消隐
}
}
void main()
{
while(1)
{
DigDisplay();
}
}
第6、7、8行定义单片机控制 38 译码器的制引脚, 并将共阴数码管 0-F 段码数据使用数组定义好。DigDisplay()数码管动态显示函数是根据前面介绍动态数码管工作原理所编写, 即选中所要显示的那位数码管, 然后发送在该位数码管上所要显示的段码数据, 延时一定时间后在将段选口清零即消隐(消除之前的显示),如此循环8 次即可实现 8 位数码管显示。 在动态显示中, 要注意延时时间, 只要保证在人肉眼所能感觉时间之内即可让我们看到所要显示的内容就像是同时显示一样。 如果时间过长或者过短都可能会影响数码管的显示效果