一、点亮第一个LED
1.工作原理
根据LED的单向导电性,靠近电源的一段为阳极,也就是数字1,所以只需要将引脚的值设为0,就可以点亮对应的LED。
2.原理图:
3.代码:
#include<reg51.h>
sbit led=P2^0;
void main()
{
while(1)
{
led=0;
}
}
二、LED闪烁
1.原理
这里需要用到延时函数来实现LED的闪烁。
2.仿真
用keil仿真计算延时函数延时的时间:
3.代码:
#include<reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit led=P2^0;
void delay(u16 i)
{
while(i--);
}
void main()
{
while(1)
{
led=0;
delay(50000);
led=1;
delay(50000);
}
}
三、LED流水灯
1.左移右移函数:
crol(a,b);循环左移函数,a是左移的值,b是左移的位数。包含在instrins.h库函数里面;
cror(a,b);循环右移函数,a是右移的值,b是右移的位数。包含在instrins.h库函数里面。
2.原理:
LED模块一共有八个二极管,连接的是P2口,所以这里通过十六进制数和左移右移函数结合,来实现LED的流水效果。
默认情况下P2 = 0xff,对应二进制数为1111 1111,此时LED模块中所有的灯都处于熄灭状态,这八个数字对应八个灯,最低位对应D1,最高位对应D8。如:P2 = 0xd0,即1101 0000,对应LED模块中,D1、D2、D3、D4、D6亮,D5、D7、D8不亮。
另附:
0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e | f |
3.代码:
#include<reg51.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
#define led P2 //这里的#define可以不要,后面直接使用P2也可以
void delay(u16 i)
{
while(i--);
}
void main()
{
int i;
led=0xfe; //1111 1110
delay(50000);
while(1)
{
for(i=0;i<7;i++)
{
led=_crol_(led,1);
delay(50000);
}
for(i=0;i<7;i++)
{
led=_cror_(led,1);
delay(50000);
}
}
}
四、蜂鸣器
1.第一种分类
无源蜂鸣器和有源蜂鸣器:有绿色电路板的是无源蜂鸣器;没有电路板而用黑胶封闭的是有源蜂鸣器。STC89c52开发板上的蜂鸣器是无源蜂鸣器。
左边是无源蜂鸣器,右边是有源蜂鸣器
有源蜂鸣器先通过单片机放大电流,通过高低电平控制来实现发声;无源蜂鸣器还需要一定频率的脉冲才能发声。
2.第二种分类
压电式蜂鸣器:压电式蜂鸣器也是无源蜂鸣器,主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。多谐振荡器由晶体管或集成电路构成,当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。
电磁式蜂鸣器:电磁式蜂鸣器也是有源蜂鸣器,由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
3.蜂鸣器应用
在单片机应用的设计上,很多方案都会用到蜂鸣器,大部分都是使用蜂鸣器来做提示或报警,比如按键按下、开始工作、工作结束或是故障等等。
4.自激蜂鸣器
自激蜂鸣器是直流电压驱动的,不需要利用交流信号进行驱动,只需对驱动口输出驱动电平并通过放大电路放大驱动电流就能使蜂鸣器发出声音,非常简单。
5.如何改变音效
改变单片机引脚输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。
改变输出电平的高低电平占空比,则可以控制蜂鸣器的声音大小。
6.原理图
BZI就是蜂鸣器,BZ连接的是ULN2003芯片,该芯片的主要作用就是放大电流,ULN2003芯片的电路图如下:
ULN2003芯片中的BZ对应连接的是P1^ 5口,所以我们通过P1^5端口来控制蜂鸣器。
7.如何产生脉冲
beep=~beep;
delay(100);
~符号的作用是取反,然后通过延时函数来控制脉冲的周期。
8.代码:
#include<reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit beep=P1^5;
void delay(u16 i)
{
while(i--);
}
void main()
{
while(1)
{
beep=~beep;
delay(100);
}
}
五、静态数码管
1.显示器及其接口
LED显示器:发光二极管LED(Light Emitting Diode)显示器、液晶LCD(Liquid Crystal Display)显示器、TFT液晶显示器等。
LED显示器有两种显示结构:段显示(7段、米字型等)和点阵显示(5×8、8×8点阵等)。
LED数码管根据LED的不同接法可以分为2类:共阴和共阳。
2.两种不同的接法
使用LED显示器时,要注意区分这两种不同的接法。为了显示数字或字符,必须对数字或字符进行编码。七段数码管加上一个小数点,共计8段。因此为LED显示器提供的编码正好是一个字节。我们实验板用共阴LED显示器,根据电路连接图显示16进制数的编码已列在下表。
8段分别对应二进制数的八位,由低位到高位分别对应a,b,c,d,e,f,g,dp
3.静态显示原理
LED显示器工作方式有两种:静态显示方式和动态显示方式。静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法的优点是占用CPU时间少,显示便于监测和控制。缺点是硬件电路比较复杂,成本较高。
4.开发板数码管电路图
数码管电路一共涉及到了两个芯片,分别是74HC573芯片和74LS138芯片,74HC573芯片通过P0口输入的转换后的二进制数控制一个数码管段的显示,并且具有锁存功能;74LS138芯片P2^ 2、P2^ 3、P2^4三个端口控制8个数码管段中哪一个数码管亮,具体使用将在动态数码管显示中介绍。
74HC573锁存器的使用:
- 1.OE为使能端,当他为低电平的时候, 锁存器开始工作。所以原理图中OE端直接和GND相连;
- 2.VCC和GND为电源和地端;
- 3.LE为锁存端,当LE为高电平的时候,Q0~ Q7都跟D0~ D7状态一样,当LE为低电平的时候,Q0~ Q7都锁存数据,无论D0~ D7怎么变化,Q0~Q7都保持锁存之前的那个状态。
5.代码
#include<reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //code可以省略,使用code是为了减小所占内存的大小
void main()
{
LSA=0;
LSB=0;
LSC=0;
P0=smgduan[0];
while(1);
}
六、动态数码管
1.数码管动态显示原理
动态显示的特点是将所有数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。
2. 74HC138译码器的使用
和74LS138基本一样,74HC138是一种三通道输入、八通道输出译码器
其中的A0、A1、A2对应74LS138的P22、P23、P2^4; E1,E2,E3分别对应G2B,G2A,G1; VDD是电源; Y0…Y7对应LED1…LED8。
74HC138译码器的真值表如下(H代表高电平,L代表低电平,X代表任意电平):
由74LS138译码器的原理图可知,G2A,G2B已默认接地,G1与电源相连,所以输出主要由P2^ 2、P2^ 3、P2^4控制。
如:74LS138中,如果P22=0、P23=0、P2^4=1,则只有LED5会亮。
3.代码:
#include<reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(u16 i)
{
while(i--);
}
void DigDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i)
{
case 0:LSA=0;LSB=0;LSC=0;break;
case 1:LSA=1;LSB=0;LSC=0;break;
case 2:LSA=0;LSB=1;LSC=0;break;
case 3:LSA=1;LSB=1;LSC=0;break;
case 4:LSA=0;LSB=0;LSC=1;break;
case 5:LSA=1;LSB=0;LSC=1;break;
case 6:LSA=0;LSB=1;LSC=1;break;
case 7:LSA=1;LSB=1;LSC=1;break;
}
P0=smgduan[i+8];
delay(100);
P0=0x00; //目的是消隐,十分重要
}
}
void main()
{
while(1)
{
DigDisplay();
}
}