IO口的使用1
本文主要对51单片机的LED灯的使用以及蜂鸣器的使用进行介绍,其中包括一些实例分析:
1.实现发光二极管的从左到右的流水点亮
2.左右来回循环的流水灯
3.蜂鸣器以一定频率响
文章目录
- IO口的使用1
- 一、LED灯
- 举个栗子一
- 举个栗子二
- 二、蜂鸣器
- 2.1 蜂鸣器的分类
- 2.2 蜂鸣器的原理图
- 2.3 举个蜂鸣器的栗子
一、LED灯
片内I/O端口作为输出使用时,最常用的应用是控制相应的I/O引脚上的LED点亮与熄灭。
LED模块的原理图如下所示
首先可以通过原理图得知
- 该单片机一共有八个LED灯,接在
P2
口 - 而且这八个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为延时参数,可根据实际需要调整*/
}
}
上面代码中需要注意的地方
- 头函数使用:使用了
#include <intrins.h>
,是因为使用了移位函数_crol_(0,1)
.用于实现循环左移(Circular Rotate Left)操作。。循环左移是指将二进制表示的数据向左移动,超出最高位的位数被移动到最低位
,形成一个循环。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 蜂鸣器的分类
蜂鸣器是一种用来产生声音的装置,根据其结构和工作原理的不同,可以分为多种类型。以下是一些常见的蜂鸣器类型:
-
压电蜂鸣器(Piezoelectric Buzzer): 这种蜂鸣器利用压电效应产生声音。当施加电压时,压电材料会发生形变,导致蜂鸣器的振膜振动,从而产生声音。压电蜂鸣器具有体积小、功耗低的优点,广泛用于电子设备中。
-
磁性蜂鸣器(Magnetic Buzzer): 这种蜂鸣器使用电磁铁和振膜。当电流通过线圈时,产生的磁场使振膜振动,从而发出声音。磁性蜂鸣器通常比压电蜂鸣器体积稍大,但也被广泛应用。
-
电动蜂鸣器(Electromagnetic Buzzer): 这种蜂鸣器包含一个电磁线圈和一个振动片。当电流通过线圈时,产生的磁场引起振动片振动,从而产生声音。电动蜂鸣器在一些应用中常见,但相对而言体积较大。
-
有源蜂鸣器(Active Buzzer): 有源蜂鸣器
内置振荡器
,只需外部提供电源电压即可工作。这种蜂鸣器通常具有简单的驱动电路,方便使用。 -
无源蜂鸣器(Passive Buzzer): 无源蜂鸣器
需要外部提供振荡信号
,相对而言需要更复杂的驱动电路。它不具备自己的振荡器,需要外部提供频率适当的方波信号来驱动。 -
数字蜂鸣器: 这种蜂鸣器可以通过数字信号产生不同音调的声音,通常与数字电路和微控制器一起使用。
每种类型的蜂鸣器都有其适用的场景和特点,选择合适的蜂鸣器类型通常取决于应用的具体要求。
左:无源蜂鸣器(体积大,裸露电路板) 右:有源蜂鸣器
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;//关闭蜂鸣器
}
}