51单片机入门01--LED流水灯

Catalogue
  1. 1. 51单片机入门01–LED流水灯
  2. 2. 实验环境
  3. 3. 电路图
  4. 4. 代码

51单片机入门01–LED流水灯

实验环境

  • Protues
  • Keil

电路图

能流过LED的电流大概是20mA,所以需要加大于250Ω的电阻

仿真软件单片机内部自带复位和时钟电路

代码

延时程序:通过空执行循环来达到延时的效果,120次大概是1ms

1
2
3
4
5
6
void delay(unsigned int n){
unsigned int i=0,j=0;
for(i=0;i<n;i++){
for(j=0;j<120;<j++);
}
}

LED流水灯程序:通过移位来实现流水灯功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void led1(){
int i=0;
for(i=0;i<9;i++){
P2=~(0x01<<i);//0000 0001 --> 0000 0010 --> 0000 0100
delay(200);
}
}


void led2(){
int i=0;
for(i=0;i<8;i++){
P1=0x01<<i;
delay(200);
}
P1 = 0x00;
}

led1函数为共阳的8个led进行流水灯操作

led2函数为共阴的8个led进行流水灯操作

led2函数执行完之后,P1.7端口依然处于高电平,此处用P1 = 0x00;来熄灭


完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include"reg51.h"
//头文件有两种写法,还有一种是通过<reg51.h>来导入,系统会从默认路径找头文件,通过“”是从用户定义路径查找,然后再去系统路径查找

void delay(unsigned int n){
unsigned int i=0,j=0;
for(i=0;i<n;i++){
for(j=0;j<120;j++);
}
}


void led1(){
int i=0;
for(i=0;i<9;i++){
P2=~(0x01<<i);//0000 0001 --> 0000 0010 --> 0000 0100
delay(200);
}
}


void led2(){
int i=0;
for(i=0;i<8;i++){
P1=0x01<<i;
delay(200);
}
P1 = 0x00;
}


void main(){
P1 = 0x00;
while(1){
led1();
led2();
}
}

主程序里,先将与P1连接的灯全部熄灭再进行16个led的流水灯操作比较好看

流水灯的通用实现方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "reg51.h"

unsigned char leddat[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

void delay(unsigned int n){
unsigned int i=0,j=0;
for(i=0;i<n;i++){
for(j=0;j<120;j++);
}
}


void led(){
int i=0;
for(i=0;i<8;i++){
P2=~leddat[i];
delay(100);
}
}

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