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

一、LED基本概念

什么是LED

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

是一种常用的发光器件

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

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

直插式

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

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

贴片式

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

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

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


二、LED工作参数

LED工作参数

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

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

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

工作电流为:1~20mA


三、LED原理图分析

LED原理图分析

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


四、实践编程

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

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

如何在Keil4中进行编程

1、建立工程文件

2、建立一个.c文件

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

点亮第一个LED灯

在Keil4中

在烧录软件中

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

点亮第一个LED

//引用51头文件
#include <reg52.h>

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

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

开发板上第一个LED灯亮了

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

//引用51头文件
#include <reg52.h>

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

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

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

同时点亮LED2,LED3,LED5

#include <reg52.h>

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

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

LED闪烁

常用的延时方法有:

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

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

没有熄灭效果的LED

#include <reg52.h>

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

有熄灭效果的LED

#include <reg52.h>

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

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

LED闪烁

#include <reg52.h>

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口与一个字节位的对应关系

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

#include <reg52.h>

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

流水灯
#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 <intrins.h>

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

    a = 0xFE;  

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

}

#include <intrins.h> 头文件,里面有一些库函数,包括

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

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


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

b = a<<1; 左移运算

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


从LED1开始实现流水灯

#include <reg52.h>
#include <intrins.h>

//宏定义
#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单片机,跟我一起学单片机吧(内含单片机驱动、烧录软件、程序开发软件的安装和使用)🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀

  • 16
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值