当前位置: 首页 > news >正文

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模块的原理图如下所示
在这里插入图片描述

首先可以通过原理图得知

  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<<i);语句实现。0X01<<i 表示 i增加 1 次,0x01 中的 1 就移动多少位,因为 1(高电平)不会让 LED 点亮,需要取反后变为低电平 0 才能点亮,所以最后的结果需要取反后给 LED_PORT 口,并且每次循环都要延时一段时间,这样才能分辨出来 LED 在流水。

还有另一种写法

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

举个栗子二

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

#include <reg51.h>
#include <intrins.h>  /*包含左、右移位函数的头文件*/
#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. 数字蜂鸣器: 这种蜂鸣器可以通过数字信号产生不同音调的声音,通常与数字电路和微控制器一起使用。

每种类型的蜂鸣器都有其适用的场景和特点,选择合适的蜂鸣器类型通常取决于应用的具体要求。
左:无源蜂鸣器(体积大,裸露电路板) 右:有源蜂鸣器
在这里插入图片描述

2.2 蜂鸣器的原理图

我的51单片机的蜂鸣器的原理图,而且它是无源蜂鸣器
在这里插入图片描述

在这里插入图片描述

蜂鸣器控制管脚直接连接到 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;//关闭蜂鸣器}  
}

相关文章:

  • Python高级算法——动态规划
  • 【期末计算机组成原理速成】第三章:存储器
  • 【MYSQL】单表查询
  • 《算法与数据结构》答疑
  • ACM32F403/F433 12 位多通道,支持 MPU 存储保护功能,应用于工业控制,智能家居等产品中
  • uniapp下拉刷新
  • 基于Html+腾讯云播SDK开发的m3u8播放器
  • 合并区间 Merge intervals
  • Docker部署开源分布式任务调度平台DolphinScheduler并实现远程访问办公
  • 036.Python面向对象_self_cls_super
  • ffmpeg常用命令
  • 倪海厦:教你正确煮中药,发挥最大药效
  • 别再写满屏的 try catch 了,教你如何统一处理异常!
  • uniapp 数组添加不重复元素
  • 【PHP】php发送邮箱验证码格式美化,样式美化
  • idea + plantuml 画流程图
  • nodejs:开发并发布一个nodejs包
  • nodejs调试方法
  • node学习系列之简单文件上传
  • spring + angular 实现导出excel
  • VuePress 静态网站生成
  • Vue实战(四)登录/注册页的实现
  • webpack+react项目初体验——记录我的webpack环境配置
  • 不上全站https的网站你们就等着被恶心死吧
  • 关于List、List?、ListObject的区别
  • 蓝海存储开关机注意事项总结
  • 微信开源mars源码分析1—上层samples分析
  • 我建了一个叫Hello World的项目
  • 小试R空间处理新库sf
  •  一套莫尔斯电报听写、翻译系统
  • 阿里云服务器如何修改远程端口?
  • ​用户画像从0到100的构建思路
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #前后端分离# 头条发布系统
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (09)Hive——CTE 公共表达式
  • (11)(2.1.2) DShot ESCs(四)
  • (27)4.8 习题课
  • (附源码)ssm码农论坛 毕业设计 231126
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (算法)Game
  • (算法)前K大的和
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .FileZilla的使用和主动模式被动模式介绍
  • .Net 知识杂记
  • .NET_WebForm_layui控件使用及与webform联合使用
  • .net分布式压力测试工具(Beetle.DT)
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • @ComponentScan比较
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析