01_单片机_LED

上手学习单片机,编写第一个LED程序


 

1. 控制单个LED亮灭

1.1. 分析电路硬件图,如图,LED一端全部连接至Vcc,共阳连接方式,J19连接单片机端口I/O:Port0

 

1.2. 控制单个LED闪烁,比如控制D1亮灭,只要将连接D1的端口置于0(low),D1会点亮;置于1(High),D1会灭。代码如下:

 1 #include <REG51.H>
 2 
 3 // 延时函数
 4 void delay(void)
 5 {
 6     unsigned char i, j;
 7     for(i=150; i--; i>0)
 8         for(j=200; j--; j>0);
 9 }
10     
11 void main(void)
12 {
13     P0 = 0xfe;    // 1111 1110
14     delay();
15     P0 = 0xff;    // 1111 1111
16     delay();
17 }
View Code

 2. 制作流水灯,D1~D8,从D1到D8向流水似的,保证其中一颗处于亮的状态

2.1. 原始方法,将8种状态逐个写出来(1111 1110,1111 1101, 1111 1011, 1111 0111, 1110 1111, 1101 1111, 1011 1111, 0111 1111)

 1 #include <REG51.H>
 2 
 3 // 延时函数
 4 void delay(void)
 5 {
 6     unsigned char i, j;
 7     for(i=150; i--; i>0)
 8         for(j=200; j--; j>0);
 9 }
10     
11 void main(void)
12 {
13     P0 = 0xfe;    // 1111 1110
14     delay();
15     P0 = 0xfd;    // 1111 1101
16     delay();
17     P0 = 0xfb;    // 1111 1011
18     delay();
19     P0 = 0xf7;     // 1111 0111
20     delay();
21     P0 = 0xef;    // 1110 1111
22     delay();
23     P0 = 0xdf;    // 1101 1111
24     delay();
25     P0 = 0xbf;    // 1011 1111
26     delay();
27     P0 = 0x7f;     // 0111 1111
28     delay();
29 }
View Code

2.2. 上述方法,若是需要更多LED状态,就得继续增加,缺点代码会很多;优点个人感觉易理解

2.3. 接下来使用移位方法,向左或向右移动1位(符号 >> or <<),空出位置自动补0

       由于当前LED状态置于0(low)会点亮,采用反码方式(符号 ~),为了区别和前面使用的方法,流水灯方向从D8-->D1

 1 #include <REG51.H>
 2 
 3 // 延时函数
 4 void delay(void)
 5 {
 6     unsigned char i, j;
 7     for(i=200; i--; i>0)
 8         for(j=200; j--; j>0);
 9 }
10     
11 void main(void)
12 {
13     unsigned char i;
14     unsigned char dat = 0x80;
15     for(i=0; i<8; i++)
16     {
17         P0 = ~(dat>>i);
18         delay();
19     }
20 }
View Code

3. 制作跑马灯,与流水灯不同的是,跑马灯1个灭其他都亮;流水灯1个亮其他都灭

3.1. 原始方法实现,D1-->D8 (0000 0001, 0000 0010, 0000 0100, 0000 1000, 0001 0000, 0010 0000, 0100 0000, 1000 0000)

 1 #include <REG51.H>
 2 
 3 // 延时函数
 4 void delay(void)
 5 {
 6     unsigned char i, j;
 7     for(i=200; i--; i>0)
 8         for(j=200; j--; j>0);
 9 }
10     
11 void main(void)
12 {
13     P0 = 0x01;    // 0000 0001
14     delay();
15     P0 = 0x02;    // 0000 0010
16     delay();
17     P0 = 0x04;    // 0000 0100
18     delay();
19     P0 = 0x08;    // 0000 1000
20     delay();
21     P0 = 0x10;    // 0001 0000
22     delay();
23     P0 = 0x20;    // 0010 0000
24     delay();
25     P0 = 0x40;     // 0100 0000
26     delay();
27     P0 = 0x80;    // 1000 0000
28     delay();
29 }
View Code

 3.2. 移位方法实现,D8-->D1

 1 #include <REG51.H>
 2 
 3 // 延时函数
 4 void delay(void)
 5 {
 6     unsigned char i, j;
 7     for(i=200; i--; i>0)
 8         for(j=200; j--; j>0);
 9 }
10     
11 void main(void)
12 {
13     unsigned char i;
14     unsigned char dat = 0x80;
15     for(i=0; i<8; i++)
16     {
17         P0 = dat>>i;
18         delay();
19     }
20 }
View Code

4. 制作中间往外扩散流水灯

4.1. 原始方法:每个LED状态

 1 #include <REG51.H>
 2 
 3 // 延时函数
 4 void delay(void)
 5 {
 6     unsigned char i, j;
 7     for(i=200; i--; i>0)
 8         for(j=200; j--; j>0);
 9 }
10     
11 void main(void)
12 {
13     P0 = 0xe7;    // 1110 0111
14     delay();
15     P0 = 0xdb;  // 1101 1011
16     delay();
17     P0 = 0xbd;  // 1011 1101
18     delay();
19     P0 = 0x7e;  // 0111 1110
20     delay();
21 }
View Code

4.2. 移位方法,同时增加”或“运算

 1 #include <REG51.H>
 2 
 3 // 延时函数
 4 void delay(void)
 5 {
 6     unsigned char i, j;
 7     for(i=200; i--; i>0)
 8         for(j=200; j--; j>0);
 9 }
10     
11 void main(void)
12 {
13     unsigned char i;
14     unsigned char dat1 = 0x10;    // 0001 0000
15     unsigned char dat2 = 0x08;    // 0000 1000
16     for(i=0; i<4; i++)
17     {
18         P0 = ~((dat1<<i) | (dat2>>i));
19         delay();
20     }
21 }
View Code

以上为暂时所学,可能存在错误或理解错误的地方,请指正,谢谢~

posted on 2023-03-29 21:08  Ivan2023  阅读(61)  评论(0)    收藏  举报