【51单片机实验笔记】LED篇(一)单色LED的基本控制

12 篇文章 20 订阅
订阅专栏
本文介绍了如何通过硬件和软件控制LED,包括点亮、闪烁、流水灯和跑马灯效果。内容涵盖单片机基础知识、LED正负极判断、电路原理及C语言编程实现。通过不同方法实现LED的动态效果,强调了模块化编程思想和位操作技巧的重要性。
摘要由CSDN通过智能技术生成


前言

本节内容我们学习如何控制一颗LED,并简单控制它的行为:闪烁。并对多个LED实现流水灯跑马灯效果。

本节涉及到的封装源文件可在 《模块功能封装汇总》中找到。

本节完整工程文件已上传GitHub, 仓库地址,欢迎下载交流!


硬件介绍

LED全称Light Emitting Diode,即发光二极管。其特点是功耗低、高亮度、抗振动、低光衰,属于冷光源

  • 响应时间短LED 的响应时间为纳秒级,而白炽灯的响应时间要达到毫秒级
  • 发光色谱宽。例如:砷化镓二极管发红光磷化镓二极管发绿光碳化硅二极管发黄光氮化镓二极管发蓝光
  • 驱动电压低。通常工作电压为1.6 ~ 2.2V电流在5 ~ 20mA之间亮度电流变化。

封装形式

一般LED两种封装直插式贴片式

图1 直插式
图2 贴片式

正负极判断

如何判断LED的正负极

  • 直插式LED
    • 长脚正极短脚负极
    • 大电极片负极小电极片正极
  • 贴片式LED
    • 三角形顶点所对的为负极底边所对的为正极

原理图分析

LED电路符号如下:

图1 电路符号
图2 开发板原理图

最大的特点即具有单向导通性。由于单颗LED驱动电流比较小,过大的电流会烧毁LED,故一般在电路中串联阻值100Ω左右的电阻,称为限流电阻

由于开发板中已经帮我们焊好了外设和电路,所以我们不需要自己搭建电路,但需要去查看电路原理图(各个开发板不一样,但这没有关系),找到它所对应的控制引脚,这有利于我们的后续编程。

在我的开发板中,可以看到设计的是所有 LED 共阳极(即 LED阳极接在一起),故当对应 IO 引脚置低电平LED 发光,高电平LED 熄灭。


软件实现

点亮一颗LED

方法一

#include <REGX52.H>
#define LED_PORT P2

void main(){
	//法一:直接定义整个P2口的电平
	LED_PORT = 0xfe; //1111 1110  D1灯点亮
	while(1); //使程序在这里死循环。
}

首先引入头文件 “REGX52.H”,这是51系列单片机常用头文件,里面定义了各种寄存器,方便我们操作硬件。这里对P2口使用宏定义是需要注意的编程习惯,因为单片机的P0~P3口不同的硬件电路设计中连接的外设并不相同,并且,通用的引脚名并不能让阅读者立马知晓它的作用,利用宏定义可以增强代码的可读性可维护性。以后的代码中,我都会采用这样的代码风格。

其次,由原理图可知,8颗LED对应P2口的8位引脚,故若要使D1灯点亮,则需要将P2.0置低电平,其余全部置高电平,即1111 1110,常用16进制表示,即0xfe

最后,我们希望灯点亮之后保持这样的状态,而不是反复被点亮,所以应使程序一直停滞main函数中,故采用一个死循环实现这样的目的。当然,如果没有写这样的死循环,你会发现实验现象并没有改变。但事实情况是,当执行完赋值语句后,程序会退出main函数,随后会不断的反复执行main函数P2.0也会反复的置低电平,这当然不会有问题,但当任务复杂时,反复执行main函数会产生意想不到的错误。


方法二

#include <REGX52.H>
#define LED_PORT P2
//法二:定义P2口需要控制的位,并赋值电平
sbit LED_1 = LED_PORT^0; //D1灯

void main(){	
	//赋值低电平
	LED_1 = 0;
	while(1); //使程序在这里死循环。
}

在方法一中,我们定义了8个引脚的电平情况,但事实上这是没有必要的。因为我们P2口内部有上拉电阻,即引脚默认输出高电平,我们实际只需要将一个引脚置低电平即可。故方法二中,我们先定义了需要控制的引脚位,再进行赋值

注意

  • sbitC51扩展标识符,而非数据类型sbit声明的部分是编译器预处理的部分,是在函数没有编译之前必须完成的,所以必须写在main函数外且不能写进数组或是结构体循环调用
  • 位定义时,^代表的是位的位置,而不是异或运算符

LED闪烁

#include <REGX52.H>
#define LED_PORT P2
//typedef可以将一些复杂的关键字重命名
typedef unsigned char u8; //0-255,1字节
typedef unsigned int u16; //0-65535,2字节

void main(){
	//申明延时函数
	void delay(u16 msec);
	while(1){
		LED_PORT = 0xfe; // 1111 1110
		delay(50000); //大约450ms
		LED_PORT = 0xff; // 1111 1111
		delay(50000); 
	}
}

//延时函数 大致10微秒
void delay(u16 msec){
	while(msec--);
}

所有视频、动画、游戏的理论基础都是人眼的暂留效应。一般暂留时间大约为50ms,即一秒钟20帧以上的画面就会产生动态的视觉效果。单片机的晶振频率约为12MHz,计算其机器周期大约为1微秒,也就是说,两个连续的语句执行时间间隔相当短暂,以致于人眼根本无法分别LED灯的实际状态。

为了能够看到闪烁的效果,必须在点亮熄灭的语句之间加入延时函数延时函数的本质即让运行中的程序暂停一段时间(CPU空转一段时间)。经过Keil软件仿真50000次自减循环大致消耗450ms,这个时间间隔足以让人眼观察到灯的熄灭和点亮了。

当然你也可以自己去计算精确的延时时间,但这在本节中意义不大,我们仅需观察到闪烁现象即可。精确的延时需要配合定时器实现。


流水灯

我理解的流水灯是这种累加的效果
在这里插入图片描述
具体代码实现

#include <REGX52.H>
#define LED_PORT P2

typedef unsigned char u8;
typedef unsigned int u16;

void delay(u16 t){
	while(t--);
}

void main(){
	
	while(1){
		u8 i;
		LED_PORT = 0xfe; //1111 1110
		delay(50000);
		for(i=0;i<8;i++){
			LED_PORT <<= 1; //左移一位
			delay(50000); //延时450ms
		}
	}
}

实现的关键是左移运算符<<,每往左移1位,最低位补0,即表现为LED 逐一点亮的效果。


跑马灯

跑马灯应该是单个灯循环跑动的效果
在这里插入图片描述

方法一

#include <REGX52.H>
#define LED_PORT P2
#define DELAY_TIME 20000 //设置跑马灯时间间隔

typedef unsigned char u8;
typedef unsigned int u16;

void delay(u16 sec){
	while(sec--);
}

//法一:列举法,流水灯一共8种状态。
void ledTest_1(){
	LED_PORT = 0xfe; // 1111 1110
	delay(DELAY_TIME);
	LED_PORT = 0xfd; // 1111 1101
	delay(DELAY_TIME);
	LED_PORT = 0xfb; // 1111 1011
	delay(DELAY_TIME);
	LED_PORT = 0xf7; // 1111 0111
	delay(DELAY_TIME);
	LED_PORT = 0xef; // 1110 1111
	delay(DELAY_TIME);
	LED_PORT = 0xdf; // 1101 1111
	delay(DELAY_TIME);
	LED_PORT = 0xbf; // 1011 1111
	delay(DELAY_TIME);
	LED_PORT  = 0x7f; // 0111 1111
	delay(DELAY_TIME);
}

void main(){
	while(1){
		ledTest_1();
	}
}

方法一的思路就是把所有情况对应的十六进制都写出来,总共也就8种状态,写呗。但缺陷也很明显,当LED数量多了之后,这种代码写起来就很痛苦了。


方法二

#include <REGX52.H>
#define LED_PORT P2
#define DELAY_TIME 20000 //设置跑马灯时间间隔

typedef unsigned char u8;
typedef unsigned int u16;

void delay(u16 sec){
	while(sec--);
}

//法二:使用左移和取反运算,配合循环实现
void ledTest_2(){
	u8 i;
	for(i=0;i<8;i++){
		LED_PORT = ~(0x01<<i); //将1左移i位后补0,取反,即第i+1位灯亮
		delay(50000); //延迟450ms
	}
}

void main(){
	while(1){
		ledTest_2();
	}
}

方法二的思路是,用一个循环实现每次将 0 移位。但直接应用左移运算符<<会存在一个问题:移位后低位自动补 0 ,这样低位的灯也会被点亮了。那怎么办?正面算法行不通,就尝试从反面去实现,即用一个循环实现每次将 1 移位,再将它按位取反~)即可。

:当我们只想改变某一位的状态不改变其他位的状态时,这是一个非常常用的位操作技巧

// 指定位, 置1
port |= 0x01<<i 
// 指定位, 置0
port &= ~(0x01<<i) 

方法三

#include <REGX52.H>
#include <INTRINS.H> // 定义了移位函数
#define LED_PORT P2
#define DELAY_TIME 20000 //设置跑马灯时间间隔

typedef unsigned char u8;
typedef unsigned int u16;

void delay(u16 sec){
	while(sec--);
}

//法三:使用左移函数_crol_()
void ledTest_3(){
	LED_PORT = _crol_(LED_PORT, 1);  //左移1位(跟左移运算符不同,高位循环补至低位)
	delay(50000); //延迟450ms
}

void main(){
	
	//法三:先初始化P2
	LED_PORT = 0xfe;
	delay(50000); //延迟450ms
	
	while(1){
		ledTest_3();
	}
}

方法三的思路是调用C51定义好的函数实现。首先引入头文件INTRINS.H,然后就可以使用左移函数_crol_()。当然也有相应的右移函数_cror_()


总结

在复杂场景中,LED仅仅作为一个小模块来配合整个项目(比如指示灯)。每次对硬件编程是耗时耗力的。基于模块化硬件抽象的思想,有必要将LED功能封装,像系统库函数或是应用软件API 一样,对外提供接口,直接调用,这样方便以后快速构建项目

LED的总体封装可以在 《模块功能封装汇总》中找到。

单片机是软件和硬件的桥梁,这跟C语言在编程语言中的地位类似。一般是先了解硬件的原理硬件电路图之后,才开始软件的算法编程,实现相应的效果。路还很长,共勉。

8个led灯循环点亮程序c语言
07-14
从第一个灯开始 随着时间变化 二进制数的递减 所有的灯都会依次的点亮,当全部的灯都被点亮后再重新开始这个过程 一直循环下去。下面一起来学习一下
51单片机 | 点亮第一个LED | LED 闪烁实验 | LED流水灯实验
F4_Family的博客
11-18 5939
点亮第一个LED | LED 闪烁实验 | LED流水灯实验
51单片机——LED控制
weixin_59334478的博客
08-25 741
中文名:发光二极管外文名:Light Emitting Diode简称:LED用途:照明、广告灯、指引灯、屏幕。
51单片机用一个按键控制8个LED灯的闪烁,每次在按键按下四次后8个LED每隔0.5秒闪烁十次
m0_64355812的博客
05-22 6065
51单片机用一个按键控制8个LED灯的闪烁,每次在按键按下四次后8个LED每隔0.5秒闪烁十次(4个LED亮4个LED灭),然后全部熄灭。下一次再按下四次按键后,LED再闪烁十次,如此重复。按键控制和0.5秒间隔控制,请用定时计数器中断方式进行,可不考虑按键抖动,时钟频率为12MHz。请用PROTEUS绘制原理图,编写程序,给出程序和运行截图。
单片机原理及其应用——单片机控制8只发光二极管交替闪烁
热门推荐
小宇y的博客
11-29 7万+
实验内容】 1.用Proteus绘制硬件原理图,并设置元件参数。 2.用KeilC51软件编写点亮一个发光二极管的程序。 3.Keil C51与Proteus联调,仿真调试和硬件调试观察实验现象。 4.实现P2口连接的8只LED灯交替闪烁。 【硬件要求】 连接方法:P2.0-P2.7采用“拉电流”方式连接8只LED灯,LED的阴极通过保护电阻连接到地端。 【软件实现】 1.编程实现点亮一个发光二极管的程序。 2.编程实现P2口连接的8只LED灯交替闪烁。
一、51单片机控制LED
西西弗的博客
08-23 8172
学习51单片机控制LED
51单片机入门————LED灯的控制
m0_73850645的博客
03-02 5518
LED灯的控制LED灯的闪烁,自定义延时,独立按钮,流水灯的设计
使用51单片机控制LED灯的案例
07-03
通过这个项目,读者可以掌握51单片机基本GPIO操作和延时函数的使用方法,并了解如何通过按键控制LED灯的状态。这对于初学者入门嵌入式系统开发、掌握51单片机基本操作非常有帮助。希望本文能为读者提供有价值的...
51单片机按键控制led
11-17
51单片机STC89C52RC开发板实验:四个按键控制四个LED的亮灭程序源代码。 1、处理器:51单片机STC89C52RC。 2、开发环境:KEIL。 3、功能:四个按键控制四个LED的亮灭。 4、提供配套的PDF格式51单片机STC89C52RC...
51单片机脉冲宽度调制(PWM)控制LED灯亮度
07-31
在电子控制系统中,51单片机是一种广泛应用的微控制器,尤其在教学和小型项目中。虽然51单片机本身并不内置PWM(脉冲宽度调制)接口,但通过软件编程可以模拟实现PWM功能,这正是我们所讨论的51单片机控制LED灯亮度...
基于AT89C51单片机控制LED显示屏的电路设计
01-19
本文设计一种由4个16×16点阵LED模块组成的显示屏,由单片机控制器,平滑移动显示任意多个文字或图形符号,本电路可级联扩展实现由任意多个16×16点阵LED模块组成的显示屏。  1 电路设计  控制电路由AT89C51...
51单片机---点亮LED灯(含源码,小白可入)
m0_56399733的博客
09-24 9029
利用51单片机,通过对CPU中相关寄存器的改写,实现对开发板上的LED灯实现控制
51单片机8个LED任意灯光组合实现(两种方案)
khy13579的博客
05-11 2717
【代码】51单片机LED任意灯光组合实现。
8只灯逐次点亮c语言程序,用c语言编写单片机流水灯程序,(8个发光二极管从左至右循环点亮)...
weixin_35788914的博客
05-17 3万+
#include"reg52.h"//此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16;//对数据类型进行声明定义typedef unsigned char u8;为每个LED灯命名sbit leda=P0;sbit led1=P0^0;sbit led2=P0^1;sbit led3=P0^2;sbit led4=P0^3;sbit led5=P0^4;s...
小白跟做江科大51单片机之基于定时器的按键控制LED流水灯
weixin_58051657的博客
02-27 1392
图3表示SYSclk的工作原理:因为ST89C52开发板上的晶振为12MHZ,所以系统会产生脉冲,慢慢达到12M,达到12MHZ之后经过上面的12兆分频的话,就是1兆赫兹,1兆赫兹1个周期就是1us。定时器工作原理:如图4所示左边的计数系统会发送给定时器脉冲,计数器每隔一个脉冲就会加1,但因为是之前选择定时器工作模式是模式1,所以定时器只能接受到65535,到了65535就会溢出,TF0置于1,计数器归0,产生中断。//定时器0开始计时。TR表示定时器是否开始,TR=1表示开启,TR=0表示中断。
51单片机——定时器中断应用(控制LED灯的循环移动)
ssssshhbh的博客
02-18 6041
51单片机:定时器中断应用(控制LED灯的循环移动),按下key1,LED循环右移;按下key2,LED循环左移。循环中间间隔1s。
51单片机】八位流水灯(含Protues+keil使用方法)
weixin_51387065的博客
07-21 7万+
流水灯的四种实现方法
STM32单片机声控语音识别RGB彩灯多种模式亮度可调WS2812彩灯
LS840233684的博客
05-16 2792
STM32单片机声控语音识别RGB彩灯多种模式亮度可调WS2812彩灯 关键词:语音识别彩灯,WS2812流水灯,WS2812彩灯
51单片机-RGB灯带
weixin_45090595的博客
08-18 5596
下面那个Reset码也是比较重要的,当我们将24bit数据发送出去后,此时灯是不会亮的,它需要有一个大于80us的电平过来,然后才会将刚刚发送过来的24bit数据应用到灯上。这个DIN就是输入口,它输出电平或者电平,然后将电平分配给OUTR(红),OUTG(绿),OUTB(蓝),硬件上用P0_6作为 输入口,配置的时候根据手册配置为输入。0码就是输出0,前提是输出0的时候要电平要延时0.3us ,电平要延时0.9us。这个实验是让灯带的蓝色灯全部亮,大概讲下实现的过程。.........
嵌入式led灯闪烁代码
最新发布
09-05
嵌入式LED灯闪烁的代码通常涉及到微控制器编程,例如Arduino或单片机。这里以C语言的简单示例说明如何让LED灯在一个固定频率上闪烁: ```c #include <avr/io.h> // 对于AVR平台 int main(void) { DDRB |= (1 << PB0); // 设置PB0(LED连接口)为输出模式 while(1) { PORTB ^= (1 << PB0); // 通过位操作,LED亮灭交替 delay_ms(500); // 暂停500毫秒 } } // 函数声明(如果需要外部库) void delay_ms(unsigned int mseconds); ``` 在这个例子中,我们首先设置LED连接到PB0端口,并将其设为输出。然后进入一个无限循环,在每次循环中,我们用异或运算toggle LED的状态,使其亮灭。`delay_ms`函数用于暂停程序执行等待一定时间,使得LED按固定的频率(这里是每两秒闪烁一次)工作。
写文章

热门文章

  • 【51单片机实验笔记】LED篇(三) 数码管的基本控制 11887
  • 【51单片机实验笔记】开关篇(一) 独立按键 5980
  • 【51单片机实验笔记】声学篇(一) 蜂鸣器与扬声器的基本控制 5702
  • 【51单片机实验笔记】LED篇(二)多色LED的基本控制 5642
  • 【51单片机实验笔记】中断篇(一) 外部中断 5567

分类专栏

  • Leetcode刷题 4篇
  • Python基础 1篇
  • C语言基础
  • 51单片机 12篇
  • Arduino 2篇
  • STM32单片机
  • 树莓派
  • 编程基础
  • 理论基础
  • 算法笔记 1篇
  • 杂篇 3篇
  • 排错笔记 1篇

最新评论

  • 【51单片机实验笔记】LED篇(三) 数码管的基本控制

    CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)提升标题与正文的相关性。

  • 【51单片机实验笔记】LED篇(三) 数码管的基本控制

    CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)提升标题与正文的相关性。

  • 【51单片机实验笔记】前篇(一)遇到的问题汇总(持续更新)

    CSDN-Ada助手: 如何在51单片机中实现串口通信?

  • 【51单片机实验笔记】前篇(一)遇到的问题汇总(持续更新)

    CSDN-Ada助手: 如何在51单片机中实现串口通信?

  • 【51单片机实验笔记】LED篇(四) LED点阵的基本控制

    Znsnms: 怎么做到一半长亮显示,一半在闪烁吗?

大家在看

  • 基于Java与百度AI能力实现车牌识别案例
  • 【开题报告+文档+源码】基于爬虫技术的咖啡与茶饮料文化平台的设计与实现
  • 软件开发----Java基础每日刷题(转载于牛客)
  • C#实战|人员管理系统[8]:优化用户登录界面用户体验
  • Transformer模型——Attention 1031

最新文章

  • 【51单片机实验笔记】中断篇(二) 定时器与中断
  • 【51单片机实验笔记】开关篇(二) 矩阵按键
  • 【51单片机实验笔记】LED篇(二)多色LED的基本控制
2024年2篇
2023年10篇
2022年13篇
2020年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悬铃木下的青春

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

深圳坪山网站建设公司新建网站内部怎么优化坪山网站改版百科网站优化营销辽宁网站优化排名制作购物网站值得优化的地方莱州网站优化方案黄石企业网站优化廉江网站关键词优化揭阳网站优化搜索广州靠谱网站关键词优化价格莆田市网站优化公司佳木斯网站优化推广眉山网站排名优化费用青海优化网站建设南京网站优化经验如何优化网站ck金手指靠谱优化网站从哪里开始宁国网站优化如何做网站排名优化一对一服务网站优化项目怎么样南通网站优化简历网站单词优化咨询电话霸州网站优化怎样进行网站优化迁安有实力的网站优化哪里不错宿州网站排名优化歙县手机网站优化哪个网站优化好网站产品优化真诚火23星沭阳网站优化公司排名香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化