51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)

点亮LED

    • 一、LED基本概念
    • 二、LED工作参数
    • 三、LED原理图分析
    • 四、实践编程

一、LED基本概念

什么是LED

LED(light-emitting diode): 发光二极管

是一种常用的发光器件

发光二极管可高效地将电能转化为光能,可以将电信号转换为光信号的发光器件

特点:功耗低、高亮度、色彩鲜艳、抗震动、寿命长

直插式

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第1张图片

可以看出图片上的LED灯引脚有长短之分,记住口诀

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第2张图片

长正短负(长的代表正极,短的代表负极)

贴片式

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第3张图片

根据封装不同,实际大小不同

怎么看贴片式LED灯正负极呢?

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第4张图片

LED灯有一头为绿色,就意味着这头是负极,另外一头就是正极


二、LED工作参数

LED工作参数

LED灯在电路图中的符号为:

它具有二极管的基本特性:正向导通,反向截止。要想点亮LED,那么需要从正向流过工作电流

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第5张图片

普通发光二极管工作压降为:1.6v ~ 2.1v

工作电流为:1~20mA

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第6张图片


三、LED原理图分析

LED原理图分析

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第7张图片

通过电路原理图可以得出:要点亮开发板上LED灯,只需要控制P1口输出低电平即可(编程时,给P1口赋值“0”)

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第8张图片


四、实践编程

keil4软件使用(建立工程、.c文件)

打开软件发现没有Project和Build Output怎么办?

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第9张图片

如何在Keil4中进行编程

1、建立工程文件

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第10张图片

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第11张图片

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第12张图片

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第13张图片

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第14张图片

2、建立一个.c文件

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第15张图片

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第16张图片

3、添加新建的C文件到工程中

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第17张图片

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第18张图片

点亮第一个LED灯

在Keil4中

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第19张图片

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第20张图片

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第21张图片

在烧录软件中

  1. 根据自己单片机的型号进行选择 我的单片机是stc89c52
  2. 选择自己usb的串口号(串口号可以百度怎么查 不知道怎么查 私信我)
  3. 选择内部扩展RAM可用
  4. 勾选所圈出的地方(2个地方都圈出来)
  5. 打开之前在Keil uVision4中建立好的文件
  6. 点击下载/编程就可以烧录进单片机了

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第22张图片

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第23张图片

点亮第一个LED

//引用51头文件
#include 

//位定义
sbit LED1 = P1^0;

//主函数
void main()
{
	LED1 = 0;
}

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第24张图片

开发板上第一个LED灯亮了

如果我们给LED1一个高电平呢?

//引用51头文件
#include 

//位定义
//sbit 标识符 = 地址值 
//P必须为大写
sbit LED1 = P1^0;

//主函数
void main()
{
	LED1 = 1;
}

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第25张图片

发现只有电源指示灯是亮着的,LED1的灯熄灭

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第26张图片

同时点亮LED2,LED3,LED5

#include 

sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED5 = P1^4;

void main()
{
	LED2 = 0;
	LED3 = 0;
	LED5 = 0;
}

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第27张图片

LED闪烁

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第28张图片

常用的延时方法有:

软件延时:使用简单,但是耗费CPU时间

定时器延时:给定时器配值,到达指定时间后,执行熄灭

没有熄灭效果的LED

#include 

int main()
{
	while(1)
	{
	 //点亮P1口8个LED
	 P1 = 0;
	}
}		

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第29张图片

有熄灭效果的LED

#include 

int main()
{
	while(1)
	{
	 //点亮P1口8个LED
	 P1 = 0;
	 //熄灭P1口8个LED
	 P1 = 0xff;
	}
}		

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第30张图片

我们可以发现加了熄灭效果的灯会更暗一点(图片上显示不清,肉眼也很难看出来,但实际就是加了熄灭效果的会更暗一点)

LED闪烁

#include 

unsigned int i;

//main函数自身就会循环
void main()
{
	while(1)
	{
	  i = 65535;
	  P1 = 0;
	  //while用于延时 
	  while(i--);
	  P1 = 0xff;
	  //while用于延时 如果这里的while没有 就会造成熄灭的时间很短 通过肉眼很难察觉出熄灭
	  while(i--);
	}
}

unsigned int i; 数据类型 变量名

变量是在程序执行过程中其值能不断变化的量。

在使用一个变量之前必须进行定义,用一个标识符作为变量名,并指出它的数据类型

while(1) {} 只有当while后面圆括号内条件表达式的值为真时,程序才会重复执行花括号内语句,当条件表达式为假时则不执行花括号内语句

IO口与一个字节位的对应关系

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第31张图片

同时点亮LED2,LED3,LED5(利用IO口与字节对应关系)

#include 

void main()
{
	while(1)
	{
		P1 = 0xe9;
	}
}

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第32张图片

流水灯
#define uchar unsigned char

利用define进行宏定义

注意宏定义后面不能加分号,它是预处理指令不是语句

“uchar”直接替换了"unsigned char"

此时,uchar i;等价于unsigned char i;


//函数定义
void delay(unsigned int z)
{
	unsigned int x,y;
	for(x = z; x > 0; x--)
    {
        for(y = 114; y > 0 ; y--);
    }	
}

//函数调用
delay(100);

函数就是将多条语句集合在一块,来完成一种特定功能

函数分为标准函数和用户自定义函数

标准函数库:keil编译器提供的,不需要用户进行定义

自定义函数:用户根据自己需要编写的函数,它必须在使用前先定义

void delay(unsigned int z)

void 函数返回类型

delay 函数名

unsigned int z 形式参数

unsigned int x,y 定义局部变量

**for(x = z; x > 0; x–)
{
for(y = 114; y > 0 ; y–);
} **
函数体语句

delay(100); 延时100ms


#include 

void test_crol (void)
{
	unsigned char a;
	unsigned char b;

    a = 0xFE;  

    b = _crol_(a,1);
    
    c = _cror_(a,1);

}

#include 头文件,里面有一些库函数,包括

字符型循环左移函数_ crol _(a,b) a代表参与运算的数值 b代表循环左移的位数

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第33张图片

字符型循环右移函数_ cror_(a,b)


a = 0xFE;
b = a<<1;

b = a<<1; 左移运算

51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)_第34张图片

区别:循环左移是把最高位移到最低位上,左移运算符是把最高位移除最低位补0


从LED1开始实现流水灯

#include 
#include 

//宏定义
#define uint unsigned int
#define uchar unsigned char

//函数定义
//延时函数 延时单为ms
void delay(uint z)
{
	uint x,y;
	for(x = z;x>0;x--)
	{
		for(y = 144;y>0;y--);
	}
}

uchar tmp = 0;

int main()

{
	tmp = 0xfe;
	P1 = tmp;
	//函数调用
	//延时100ms
	delay(100);
	while(1)
	{
		tmp = _crol_(tmp,1);
		P1 = tmp;
		delay(100);	
	}
}


有些小伙伴们可能找不到这些开发软件的下载包,可以私信博主,也可以在评论区留言,博主给您私发邮箱


具体食用可以参考这边文章重新回归最初始的51单片机,跟我一起学单片机吧(内含单片机驱动、烧录软件、程序开发软件的安装和使用)

你可能感兴趣的:(重新认识51单片机,51单片机,嵌入式硬件,单片机,c语言,windows)