51单片机LED与无源蜂鸣器模块

IO口的使用1

本文主要对51单片机的LED灯的使用以及蜂鸣器的使用进行介绍,其中包括一些实例分析:
1.实现发光二极管的从左到右的流水点亮
2.左右来回循环的流水灯
3.蜂鸣器以一定频率响

文章目录

  • IO口的使用1
    • 一、LED灯
      • 举个栗子一
      • 举个栗子二
    • 二、蜂鸣器
      • 2.1 蜂鸣器的分类
      • 2.2 蜂鸣器的原理图
      • 2.3 举个蜂鸣器的栗子

一、LED灯

片内I/O端口作为输出使用时,最常用的应用是控制相应的I/O引脚上的LED点亮与熄灭。

LED模块的原理图如下所示
51单片机LED与无源蜂鸣器模块_第1张图片

首先可以通过原理图得知

  1. 该单片机一共有八个LED灯,接在P2
  2. 而且这八个LED是共阳LED(公共端为VCC),要使LED点亮只需要在对应的引脚口给低电平即可.

举个栗子一

实验要求:
编程来实现发光二极管的从左到右的流水点亮,即按照LED0→LED1→┉→LED7的顺序,每次点亮一个发光二极管,延时一段时间后熄灭这个发光二极管,然后点亮下一个发光二极管,重复循环。

#define LED_PORT P2 //使用宏定义 P2 端口
void main()
{
u8 i=0;
while(1)
{
for(i=0;i<8;i++)
{
LED_PORT=~(0x01<<i); //将 1 右移 i 位,然后取反将结果赋值到 LED_PORT
delay_10us(50000);
}
}
}

进入 main 函数后首先定义一个变量 i,然后进入 while 循环,由于要实现 8个 LED 从 D1->D8 循环点亮,因此可以使用 for 循环语句循环 8 次,每循环一次,点亮的小灯向右移动一个,而 D1-D8 是连接到 P2.0-P2.7 的,因此输出的低电平要左移一位,因此可以使用 LED_PORT=~(0x01<0X01< 表示 i增加 1 次,0x01 中的 1 就移动多少位,因为 1(高电平)不会让 LED 点亮,需要取反后变为低电平 0 才能点亮,所以最后的结果需要取反后给 LED_PORT 口,并且每次循环都要延时一段时间,这样才能分辨出来 LED 在流水。

还有另一种写法

#include 
#include    /*包含移位函数的头文件*/
#define uchar unsigned char       
#define uint unsigned int       
void  delay(uint i)     /*延时函数*/
{ 
    uchar t;
    while (i--);
 { 
    for(t = 0; t < 120; t++); 
 }
}
void  main(  )     /*主程序*/
{ 
    P2=0xfe; 
    while (1)
    {
    P2=_crol_( 0,1) ; /*C51函数库中的左移函数,P1中的数据循环左移1位*/
    delay( 500 ); /*500为延时参数,可根据实际需要调整*/
 }
}

上面代码中需要注意的地方

  1. 头函数使用:使用了#include ,是因为使用了移位函数_crol_(0,1).用于实现循环左移(Circular Rotate Left)操作。。循环左移是指将二进制表示的数据向左移动,超出最高位的位数被移动到最低位,形成一个循环。
  2. P2=0xfe; 是给8051单片机的P2端口赋值,在这个语句中,0xFE 是一个二进制数,它的最低位(最右边的位)是 0,其余各位都是 1,表示将二进制数 1111 1110 。

举个栗子二

在栗子一的基础上,实现左右来回循环的流水灯,实现效果如线图所示:
在这里插入图片描述

#include 
#include   /*包含左、右移位函数的头文件*/
#define uchar unsigned char       
void  delay(  )
{ 
    uchar i,j;
    for(i=0; i< 255; i++);
    for(j=0; j< 255; j++);
}
void  main(  )   /*主函数*/
    { 
    uchar i,temp;
    while (1)
    { 
    temp=0xfe;   /*初值为0x11111110*/
    for(i=0; i< 7; i++); 
    { 
        P2=temp;  /* temp 值送入P2口*/
        delay(  );   /*延时*/
        temp=_crol_( temp,1) ; /*执行左移函数,temp 中的数据循环左移1位*/
    }
    for(i=0; i<7; i++); 
    { 
        P2=temp;  /* temp 值送入P2口*/
        delay(  );   /*延时*/
        temp=_cror_( temp,1) ; /*执行右移函数,temp中的数据循环右移1位*/
    }
    }
}

二、蜂鸣器

2.1 蜂鸣器的分类

蜂鸣器是一种用来产生声音的装置,根据其结构和工作原理的不同,可以分为多种类型。以下是一些常见的蜂鸣器类型:

  1. 压电蜂鸣器(Piezoelectric Buzzer): 这种蜂鸣器利用压电效应产生声音。当施加电压时,压电材料会发生形变,导致蜂鸣器的振膜振动,从而产生声音。压电蜂鸣器具有体积小、功耗低的优点,广泛用于电子设备中。

  2. 磁性蜂鸣器(Magnetic Buzzer): 这种蜂鸣器使用电磁铁和振膜。当电流通过线圈时,产生的磁场使振膜振动,从而发出声音。磁性蜂鸣器通常比压电蜂鸣器体积稍大,但也被广泛应用。

  3. 电动蜂鸣器(Electromagnetic Buzzer): 这种蜂鸣器包含一个电磁线圈和一个振动片。当电流通过线圈时,产生的磁场引起振动片振动,从而产生声音。电动蜂鸣器在一些应用中常见,但相对而言体积较大。

  4. 有源蜂鸣器(Active Buzzer): 有源蜂鸣器内置振荡器,只需外部提供电源电压即可工作。这种蜂鸣器通常具有简单的驱动电路,方便使用。

  5. 无源蜂鸣器(Passive Buzzer): 无源蜂鸣器需要外部提供振荡信号,相对而言需要更复杂的驱动电路。它不具备自己的振荡器,需要外部提供频率适当的方波信号来驱动。

  6. 数字蜂鸣器: 这种蜂鸣器可以通过数字信号产生不同音调的声音,通常与数字电路和微控制器一起使用。

每种类型的蜂鸣器都有其适用的场景和特点,选择合适的蜂鸣器类型通常取决于应用的具体要求。
左:无源蜂鸣器(体积大,裸露电路板) 右:有源蜂鸣器
51单片机LED与无源蜂鸣器模块_第2张图片

2.2 蜂鸣器的原理图

我的51单片机的蜂鸣器的原理图,而且它是无源蜂鸣器
51单片机LED与无源蜂鸣器模块_第3张图片

51单片机LED与无源蜂鸣器模块_第4张图片

蜂鸣器控制管脚直接连接到 51 单片机的 P2.5 管脚上。图中并没有使用三极管进行电流放大,而是使用 ULN2003 芯片来驱动.当 P25 输出高电平,BEEP 则输出低电平;当 P25 输出低电平,BEEP 则输出高电平,类似一个非门。
开发板上使用的是无源蜂鸣器,它需要一定频率的脉冲(高低电平)才会发声,因此需要让 P25 脚以一定频率不断输出高低电平信号才能控制蜂鸣器发出声音

2.3 举个蜂鸣器的栗子

#include "reg52.h"

typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;

sbit BEEP=P2^5; //将P2.5管脚定义为BEEP

/*******************************************************************************
* 函 数 名       : delay_10us
* 函数功能   : 延时函数,ten_us=1时,大约延时10us
* 输    入       : ten_us
* 输    出      : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
 while(ten_us--); 
}

void main()
{ 
 u16 i=2000;

 while(1)
 {
     while(i--)//循环2000次
  {
   BEEP=!BEEP;//产生一定频率的脉冲信号
   delay_10us(100);
  }
  i=0;//清零
  BEEP=0;//关闭蜂鸣器
 }  
}

你可能感兴趣的:(51单片机,51单片机,嵌入式硬件,单片机,8051,学习)