【51单片机】LED流水灯

前言

最近突然想玩一玩单片机,就从拼夕夕上买了个51单片机开发板,客服很好,资料很全,今下午刚到手,就迫不及待的整了个LED流水灯玩玩,体验很不错,Nice!

LED流水灯

什么是单片机 ?

单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器、串口等功能集成到一块硅片上构成的一个小而完善的计算机系统,通常称为微控制器。

这是我从网上买的51单片机的外观图片,大致就是这个样子

在这里插入图片描述

硬件知识

硬件的东西一说就是一大堆,在这就说一说芯片引脚吧,其他的就不多说了,大家有兴趣的可以自己百度一下。

51单片机引脚分类

(1)电源引脚: 引脚图中的 VCCGND 都属于电源引脚。
(2)晶振引脚: 引脚图中的 XTAL1XTAL2 都属于晶振引脚。
(3)复位引脚: 引脚图中的 RST/VPD 属于复位引脚,不做其他功能使用。
(4)下载引脚: 51 单片机的串口功能引脚 (TXD、RXD) 可以作为下载引脚使用。
(5) GPIO (general purpose intput output,通用输入输出端口)引脚: 引脚图中带有 Px.x等字样的均属于GPIO引脚

LED简介

LED发光二极管。它具有单向导电性,通过 5mA 左右电流即可发光,电流越大,其亮度越强,但若电流过大,会烧毁二极管,一般我们控制在 3 mA - 20 mA 之间,通常我们会在 LED 管脚上串联一个电阻,目的就是限制电流。

下面是这个开发板上的LED模块的电路图
在这里插入图片描述
通过分析这个原理图我们可以得知,这个LED 采用共阳接法,即所有LED 阳极管脚接电源 VCC,阴极管脚通过一个 470 欧的限流电阻接到 P2 口上。

从上图中我们可以看到 D1-D8 连接在单片机的 P20-P27 口上,要知道,让 LED 发光即对应的阴极管脚应该为低电平,若为高电平则熄灭,所以我们要想控制开发板上的LED灯,就必须通过单片机管脚在 P2 口上输出低电平。

实现LED流水灯

要实现 LED 流水灯,只需循环让 D1-D8 指示灯逐个点亮,同样我们还需要用到延时,不然无法体现出流水灯的效果。将移位和循环结合起来就可以了

#include<reg52.h>

typedef unsigned int u16;
typedef unsigned char u8;

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

void main()
{
	while (1){
		u8 i = 0;
		for (i = 0; i <= 8; i++)
		{
			P2 = (0x01<<i);
			delay (50000);
		}
	}
}
//51仿真器的调试结果如下
C:0x0000    020029   LJMP     C:0029
    11: void main() 
    12: { 
    13:         while (1){ 
    14:                 u8 i = 0; 
C:0x0003    E4       CLR      A
C:0x0004    F508     MOV      0x08,A
    15:                 for (i = 0; i <= 8; i++) 
C:0x0006    F508     MOV      0x08,A
    16:                 { 
    17:                         P2 = (0x01<<i); 
C:0x0008    AF08     MOV      R7,0x08
C:0x000A    7401     MOV      A,#0x01
C:0x000C    A807     MOV      R0,0x07
C:0x000E    08       INC      R0
C:0x000F    8002     SJMP     C:0013
C:0x0011    C3       CLR      C
C:0x0012    33       RLC      A
C:0x0013    D8FC     DJNZ     R0,C:0011
C:0x0015    F5A0     MOV      P2(0xA0),A
    18:                         delay (50000); 
C:0x0017    7F50     MOV      R7,#0x50
C:0x0019    7EC3     MOV      R6,#0xC3
C:0x001B    120035   LCALL    delay(C:0035)
    19:                 } 
C:0x001E    0508     INC      0x08
C:0x0020    E508     MOV      A,0x08
C:0x0022    D3       SETB     C
C:0x0023    9408     SUBB     A,#0x08
C:0x0025    40E1     JC       C:0008
C:0x0027    80DA     SJMP     main(C:0003)
C:0x0029    787F     MOV      R0,#0x7F
C:0x002B    E4       CLR      A
C:0x002C    F6       MOV      @R0,A
C:0x002D    D8FD     DJNZ     R0,C:002C
C:0x002F    758108   MOV      SP(0x81),#0x08
C:0x0032    020003   LJMP     main(C:0003)
     6: void delay (u16 i) 
     7: { 
     8:         while(i--); 
C:0x0035    EF       MOV      A,R7
C:0x0036    1F       DEC      R7
C:0x0037    AC06     MOV      R4,0x06
C:0x0039    7001     JNZ      C:003C
C:0x003B    1E       DEC      R6
C:0x003C    4C       ORL      A,R4
C:0x003D    70F6     JNZ      delay(C:0035)
     9: } 
C:0x003F    22       RET      
C:0x0040    00       NOP      

最后将程序烧录进我们的开发板就可以了

总结

这小东西还挺好玩儿,后续会持续更新,go语言的最快明天更,感谢观看,若有什么疑问欢迎评论区一起讨论,大家一起进步!

posted @ 2023-02-11 19:58  Seversan-Sickle  阅读(486)  评论(0)    收藏  举报  来源