zl程序教程

您现在的位置是:首页 >  Java

当前栏目

【51单片机】点亮LED灯(四种形式)

2023-02-18 15:50:05 时间

?作者简介:大家好,我是泽奀。全栈领域新星创作者?  ?个人主页:weixin_52632755的博客_泽奀_CSDN博客 ?点赞➕评论➕收藏 == 养成习惯? ?本系列:也会跟着我男神哔哩哔哩江科大的视频为主! https://blog.csdn.net/weixin_52632755/category_11316267.html

  • 介绍两个比较好用的软件 1、网易有道词典         2、福昕阅读器(PDF)
  • 网易有道词典对我这种英语渣渣来说就是福星了
  • 福昕阅读器我个人认为也是我比较喜欢去用的一款阅读器了。

目录

?LED介绍 

?LED原理图

?如何控制IO口输出高低电平 

?进制转换

?点亮一个LED代码

?程序下载

?LED灯闪烁 

?LED流水灯

?LED流水灯高阶操作


?LED介绍 

  • 中文名:发光二极管。
  • 英文名:Light Emitting Diode。
  • 简称:LED。
  • 应用:LED显示屏、交通信号灯、广告灯、液晶屏背光源等。
  • 特点:节能是LED灯最突出的特点、环保、跟其它的灯光源相比之下,LED灯会更加"干净"(干净不是指的是表面,而是这个LED灯它其实是属于一种冷光源)、响应速度快等。

 二极管灯在电路图当中所表示的一个符号,在电路图当中左边是正极、右边是负极。

  • 在LED当中只有正极接入正极负极接入负极它才会有电流流通进去。

 这个是二极管实物里面的一些知识点

  • 51开发板用的是普通的贴片发光的二极管,这种二极管通常是正向导通电压1.8~2.2V。
  • 工作电流一般在1~20mA。其中,当电流在1~5mA变化的时候,随着通过LED的电流越大,人们的肉眼会明显的感觉到这个灯越来越亮,而当电流处于5~20mA变化时候,看到的发光二极管的亮度变化就不太明显了。当电流超过20mA时候,LED灯就会有烧坏的危险了。
  • 电流越大,烧坏的速度也就会变快。所以,在使用过程当中应该要特别区注意它的电流参数上面的设计要求,这很重要。

?LED原理图

  • 这里的VCC就是电源的正极,左边红色的字其实就是一个网络的一个标号也被称之为网络编号,这里的引脚低电平这个LED灯才是亮的。
  • 那我们可以看下正极出来之后,通过一个电阻(这个电阻其实是④个一体的),那么这上面说电阻是1kΩ的是怎么样看出来的,其实就是我们仔细看单片机开发板上的RP9和RP10上面都有个数字是102。那么其实原理图上写的102就是1000Ω,前面两位数是一个有效数字10,第三位数字就是倍率00。其实102拆开来 = 10*10^2,那么473呢?也是一样473 = 47*10^3 = 47 000 = 47k,1001 = 1000 = 1k。这就是电阻的一个读数的方式包括电容啊以及其它的一些元器件其实一个这样的一个方式来的。
  • 那我们继续看到这个图纸经过这个电阻,这个电阻在这里的作用是起到一个限流的作用,从而这个电阻也被称作是:限流电阻。就比如说假设VCC = 5V,LED 直接 5V 的话,由于电流过大会把这个LED灯给烧毁。所以在这里的串联电阻就很好的起到了一个限流的作用。而到达LED已经接入到正极了,那么LED负极在接入的话。此时LED灯就将会点亮了,高低电平的一个应用。高电平就是5V,低电平就是0V,单片机把这种电平叫做TTL电平。P2口决定了你的高低电平,也就是CPU通过配置这些控制的寄存器来控制我们的硬件电路来执行我们想要去完成的一个功能!

?如何控制IO口输出高低电平 

首先要有一个单片机是MCU那么单片机里面就有一个CPU(代码都是在这里面执行的),我们外部都是有引脚都是P2口的引脚。那么CPU是怎么样控制引脚的呢?那么就要说说寄存器里面其实就是存储器以八个为一组的,就比如说是单片机里面就有一个寄存器它是P2口的寄存器,那么它就有八位每一位背后都有一根导线在通过驱动器增大它的电流,然后在连到我们这个IO口的端口上后面其实也都是一样的。这种东西就叫做是驱动器。那么我们的CPU可以通过我们的这个软件直接访问我们的这个寄存器:假设我们给它写①那么我们这个就可以通驱动器就可以给我们的IO口置高电平,那么如果是写零的话那么我们的IO口就是低电平0,同理。给高低电平是不是就是给P2口当中转换的寄存器,我们的硬件电路都是这个样子的。

  • 一句话就是说:CPU通过配置这些控制的寄存器来控制我们的硬件电路,硬件电路来执行我们想要去完成的功能

?进制转换

那么如果我们要让第一个LED灯点亮,其余的全是灭的话该怎么办。很简单给第一个LED灯低电平0,其余的LED都给上一个高电平1。这样你的LED灯就可以实现点亮第一个了。 P2 = 1111 1110 这种写法是❌(因为它会默认你是十进制) ,           P2 = 0xFE 这样才是✔。 所以这里就会遇到一个问题进制的转换,只是需要把二进制转换成十六进制就可以了      。 

如果还不了解的话,可以看看原码,补码和反码 - wqbin - 博客园 这篇博客? 

?点亮一个LED代码

#include <REGX52.H>
int main(void)
{
	P2=0xFE;	//1111 1110
	while(1)
	{
		
	}
}
  1. 双斜杠:其实就是把后面的内容给注释掉,编译器是不会看的是留给我们编程序的人来看的,这个就是单行注释。/* 注释内容 */这个是多行注释。
  2. P2 = 0xFE,P2当中的0x:是一个前缀,代表后面的是十六进制数。
  3. FE就是十六进制我们把 1111 1110 转换成十六进制。
  4. #include <REGX52.H>这个是我们单片机的头文件,在上面代码中如果没有这个头文件的话,我们的程序就无法去识别P2口了。
  5. while循环在这里的作用是:其实就是一直绕着这个圈跑来跑去,这样就不用一直从main主函数那里走来走去了。表达式的值为真(1)它就会一直去执行里面是一个逻辑表达式的值也就是判断条件和表达式的值为真还是为假,非0即使真。
  6. 那么就是程序下载到STC系列的单片机下载软件上去就可以了。

那么如果我们想要控制LED灯 亮灭亮灭 亮灭亮灭 怎么办呢?其实很容易。 P2 = 0x55;// 0101 0101        其它保持不变这样就可以了? 

?程序下载

  1. 选择单片机的型号,现在用的单片机的型号是 STC89C52RC,注意:不要选错了。
  2. 单击"打开程序文件",打开建立工程的那个文件夹,找到xxx.hex文件,单击打开。
  3. 选择刚才查到的COM入口,波特率使用默认就可以了。
  4. 这里的所有选项都选择默认设置,不要随意更改,有的选项错误可能会导致麻烦。
  5. 因为STC单片机要冷启动下载的,就是我们先点击下载,然后你再给你的单片机上电,所以先要关闭板子的电源开关,然后再单击Download按钮,等待软件提示你上点后,再按下板子的电源开关,就可以下载到单片机里了。

?LED灯闪烁 

介绍:点亮LED小灯的程序就是让LED = 0(低电平)。熄灭小灯的程序也是非常容易的,就是LED = 1(高电平)。这样点亮和熄灭都会了,那么如果在亮和灭之间加个延迟呢,反复不停的点亮和熄灭小灯,那么就可以实现这个LED灯闪烁了。 这里解答大家可能会有的疑问:

  1. LED灯为什么是低电平亮:LED具有单向导电性,当 LED 的正端接了高电位,负端连接了低电位,且正负端电位差超过1.8V以上时,LED就会亮起来。
  2. 为什么LED灯闪烁要加延迟:因为在单片机当中每次都是以MHZ(也就是运行上百万次),所以它们就会执行的特别快。那么就会闪烁的特别快,以我们人类的肉眼是根本看不出来的,所以需要延迟函数。
  3. 怎么样才能反复不停的亮和灭:这个很容易加上while循环,循环的表达式的值为真"1"
  4. 延迟函数的程序:点击软件生成延时器(在STC-ISP中)它可以生成代码来帮助我们,延时函数当中的系统频率也就是晶振要注意一下,我的是12MHZ的。还有8051的指令集也要改一下:SCY-Y1。这个时候我们只需要复制代码、生成代码、即可生成函数。然后在主函数前面右键点击Paste(ctrl+v)粘贴就可以了。
  5. 这里说下我们提到的晶振:晶振又被称之为晶体震荡器,从这个名字就可以看出来,它注定一声都要不停的振荡它起到的作用是:单片机当中的系统提供的一个基准信号,类似于部队的训练时候喊口号的人,单片机的内部所有的系统都是以这个时钟型号为基准的来进行着工作。实际作用:利用一种能将电能和机械能相互转换的晶体,在公振的状态下工作可以提供一个稳定精确的单频震荡。
#include <REGX52.H>
#include <INTRINS.H>    //_nop_();需要的头文件
void Delay500ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
int main(void)
{
	while(1)
	{
		P2=0xFE;		//1111 1110
		Delay500ms();	//调用函数
		P2=0xFF;		//1111 1111
		Delay500ms();	//调用函数
	}
}

?LED流水灯

前面学习了点亮一个LED灯又学了LED小灯闪烁,现在我们就可以进一步的去学习让LED灯依次一个接上一个的开始亮起来,也就是我们常常说的流水灯的实现了。  通过下面的这个程序我们不难看出来,可以通过P2来控制所有的8个LED灯的亮灭状态。从下面的程序当中我们可以看出依次给P2赋值的是:0xFE、0xFD、0xFB、0xF7、0xEF、0xDF、0xBF、0x7F

#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms()		//@12.000MHz
{
	unsigned char i, j, k;
	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
int main(void)
{
	while(1)
	{
		P2=0xFE;//1111 1110
		Delay500ms();
		P2=0xFD;//1111 1101
		Delay500ms();
		P2=0xFB;//1111 1011
		Delay500ms();
		P2=0xF7;//1111 0111
		Delay500ms();
		P2=0xEF;//1110 1111
		Delay500ms();
		P2=0xDF;//1101 1111
		Delay500ms();
		P2=0xBF;//1011 1111
		Delay500ms();
		P2=0x7F;//0111 1111
		Delay500ms();
	}
}

?LED流水灯高阶操作

为什么说这个是高阶操作呢?是因为这个程序我们想让流水灯延迟多少行秒就可以延迟多少行秒,注意这个延迟毫秒并不只是改变之前延迟500ms,它是可以在每个延迟函数阶段,分别延迟出不同的速度,上面的这样一开仿佛就单一,而这个是进行变化的。

#include <REGX52.H>

void Delay1ms(unsigned int xms);	//@12.000MHz
void Delay1ms(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}
int main(void)
{
	while(1)
	{
		P2=0xFE;//1111 1110
		Delay1ms(1000);
		P2=0xFD;//1111 1101
		Delay1ms(900);
		P2=0xFB;//1111 1011
		Delay1ms(800);
		P2=0xF7;//1111 0111
		Delay1ms(700);
		P2=0xEF;//1110 1111
		Delay1ms(600);
		P2=0xDF;//1101 1111
		Delay1ms(500);
		P2=0xBF;//1011 1111
		Delay1ms(300);
		P2=0x7F;//0111 1111
		Delay1ms(100);
	}
}