点亮一个LED+LED闪烁+LED流水灯——“51单片机”

简介: 点亮一个LED+LED闪烁+LED流水灯——“51单片机”

各位CSDN的uu们好呀,这是小雅兰的最新专栏噢,最近小雅兰学习了51单片机的知识,所以就想迫不及待地分享出来呢!!!下面,让我们进入51单片机的世界吧!!!


点亮一个LED

LED闪烁

LED流水灯

LED流水灯PLUS

源代码


点亮一个LED

首先,我们得对进制的转换有一个了解:

十进制 二进制 十六进制
0 0000 0
1 0001 1
2 0010 2
3 0011 3
4 0100 4
5 0101 5
6 0110 6
7 0111 7
8 1000 8
9 1001 9
10 1010 A
11 1011 B
12 1100 C
13 1101 D
14 1110 E
15 1111 F

显示详细信息

然后,点亮一个LED是除了第一个灯是亮的,其余的都不亮。

意思是:它的二进制代码序列是1111 1110

但是,写C语言程序是不支持二进制的,所以我们需要用十六进制。

知道了上面的知识之后,就可以开始写代码啦:

#include <REGX52.H>
 
void main()
{
  P2=0xFE;//1111 1110
}

image.jpeg

如果是想要八个LED间隔着亮,那么它的二进制代码就应该是:0101 0101

#include <REGX52.H>
 
void main()
{
  P2=0x55;//0101 0101
}

image.jpeg


LED闪烁

这个的意思就是第一个灯一会儿亮,一会儿不亮。

这里我们可以用到一个工具,就是STC-ISP的软件延时计算器。

选择系统频率为12.000MHz,定时长度为500毫秒,这样它会自动生成一个代码。

void Delay500ms(void)    //@12.000MHz
{
   unsigned char data i, j, k;

   _nop_();
   i = 4;
   j = 205;
   k = 187;
   do
   {
       do
       {
           while (--k);
       } while (--j);
   } while (--i);
}

那么,我们最后的代码就是这样的:

#include <REGX52.H>
#include <INTRINS.H>
 
void Delay500ms() //@12.000MHz
{
  unsigned char data i, j, k;
 
  _nop_();
  i = 4;
  j = 205;
  k = 187;
  do
  {
    do
    {
      while (--k);
    } while (--j);
  } while (--i);
}
 
void main()
{
  while(1)
  {
        //1111 1110
    P2=0xFE;//只有第一个LED亮
    Delay500ms();
        //1111 1111
    P2=0xFF;//所有LED都不亮
    Delay500ms();
  }
}
  
  


LED流水灯

这边的意思是让LED一个接一个的亮,那么,它的二进制代码序列应该就是这样:

1111 1110

1111 1101

1111 1011

1111 0111

1110 1111

1101 1111

1011 1111

0111 1111

那么,我们的代码也就出来了:

#include <REGX52.H>
#include <INTRINS.H>
 
void Delay500ms() //@12.000MHz
{
  unsigned char data i, j, k;
 
  _nop_();
  i = 4;
  j = 205;
  k = 187;
  do
  {
    do
    {
      while (--k);
    } while (--j);
  } while (--i);
}
 
void main()
{
  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流水灯PLUS

上面写的LED流水灯的代码不是特别灵活,如果是我们想要修改定时长度呢,难道我们还要把代码全部修改一遍吗,这样显然是比较cuo的,我们可以利用传参的方式,想修改成多少定时长度就可以修改成多少定时长度。

当然,在这之前,又有一个小知识点需要分享:

类型 符号 关键字 所占位数 数的表示范围
整型 (signed)int 16 -32768~32767
(signed)short 16 -32768~32767
(signed)long 32 -2147483648~2147483647
unsigned int 16 0~65535
unsigned short int 16 0~65535
unsigned long int 32 0~4294967295
实型 float 32 3.4e-38~3.4e38
double 64 1.7e-308~1.7e308
字符型 char 8 -128~127
unsigned char 8 0~255

显示详细信息

#include <REGX52.H>
 
void Delay1ms(unsigned int xms) //@12.000MHz
{
  unsigned char data i, j;
  while(xms)
  {
    i = 2;
    j = 239;
    do
    {
      while (--j);
    } while (--i);
    xms=xms-1;
  }
}
 
void main()
{
  while(1)
  {
    P2=0xFE;//1111 1110
    Delay1ms(200);
    P2=0xFD;//1111 1101
    Delay1ms(200);
    P2=0xFB;//1111 1011
    Delay1ms(200);
    P2=0xF7;//1111 0111
    Delay1ms(200);
    P2=0xEF;//1110 1111
    Delay1ms(200);
    P2=0xDF;//1101 1111
    Delay1ms(200);
    P2=0xBF;//1011 1111
    Delay1ms(200);
    P2=0x7F;//0111 1111
    Delay1ms(200);
  }
}
 


源代码

源代码如下:

点亮一个LED

#include <REGX52.H>

void main()
{
   P2=0xFE;//1111 1110
}

间隔点亮LED

#include <REGX52.H>

void main()
{
   P2=0x55;//0101 0101
}


LED闪烁

#include <REGX52.H>
#include <INTRINS.H>

void Delay500ms()    //@12.000MHz
{
   unsigned char data i, j, k;

   _nop_();
   i = 4;
   j = 205;
   k = 187;
   do
   {
       do
       {
           while (--k);
       } while (--j);
   } while (--i);
}

void main()
{
   while(1)
   {
       //1111 1110
       P2=0xFE;//只有第一个LED亮
       Delay500ms();
       //1111 1111
       P2=0xFF;//所有LED都不亮
       Delay500ms();
   }
}


LED流水灯

#include <REGX52.H>
#include <INTRINS.H>

void Delay500ms()    //@12.000MHz
{
   unsigned char data i, j, k;

   _nop_();
   i = 4;
   j = 205;
   k = 187;
   do
   {
       do
       {
           while (--k);
       } while (--j);
   } while (--i);
}

void main()
{
   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流水灯PLUS

#include <REGX52.H>

void Delay1ms(unsigned int xms)    //@12.000MHz
{
   unsigned char data i, j;
   while(xms)
   {
       i = 2;
       j = 239;
       do
       {
           while (--j);
       } while (--i);
       xms=xms-1;
   }
}

void main()
{
   while(1)
   {
       P2=0xFE;//1111 1110
       Delay1ms(200);
       P2=0xFD;//1111 1101
       Delay1ms(200);
       P2=0xFB;//1111 1011
       Delay1ms(200);
       P2=0xF7;//1111 0111
       Delay1ms(200);
       P2=0xEF;//1110 1111
       Delay1ms(200);
       P2=0xDF;//1101 1111
       Delay1ms(200);
       P2=0xBF;//1011 1111
       Delay1ms(200);
       P2=0x7F;//0111 1111
       Delay1ms(200);
   }
}

   


好啦,小雅兰今天的内容就到这里啦,还要继续加油呀!!!


相关文章
【51单片机】Kn独立按键控制【LED亮灭】【LED状态】【LED二进制式显示】【LED不断移位】(4)
【51单片机】Kn独立按键控制【LED亮灭】【LED状态】【LED二进制式显示】【LED不断移位】(4)
|
2天前
|
编译器 C语言 C++
【51单片机】LED的三个基本项目(LED点亮&LED闪烁&LED流水灯)(3)
【51单片机】LED的三个基本项目(LED点亮&LED闪烁&LED流水灯)(3)
定时器+按键控制LED流水灯模式+定时器时钟——“51单片机”
定时器+按键控制LED流水灯模式+定时器时钟——“51单片机”
|
2天前
|
C语言
独立按键控制LED亮灭、独立按键控制LED状态、独立按键控制LED显示二进制、独立按键控制LED移位——“51单片机”
独立按键控制LED亮灭、独立按键控制LED状态、独立按键控制LED显示二进制、独立按键控制LED移位——“51单片机”
|
2天前
|
编译器 C语言 开发者
单片机原理与应用:探索微型计算机世界
单片机原理与应用:探索微型计算机世界
20 1
|
2天前
|
数据采集 数据处理 C语言
单片机:探索其原理、应用与编程实践
单片机:探索其原理、应用与编程实践
22 1
|
2天前
|
物联网
STC51单片机-实验开发装置仿真-物联网应用系统设计
STC51单片机-实验开发装置仿真-物联网应用系统设计
60 0
|
2天前
|
物联网
STC51单片机-控制LED闪亮的仿真-物联网应用系统设计
STC51单片机-控制LED闪亮的仿真-物联网应用系统设计
47 0
|
2天前
|
芯片
AT89S52单片机的最小应用系统
AT89S52单片机的最小应用系统
5 0
|
2天前
|
存储 芯片
【期末不挂科-单片机考前速过系列P11】(第十一章:15题速过串行口的工作原理和应用)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P11】(第十一章:15题速过串行口的工作原理和应用)经典例题盘点(带图解析)