嵌入式开发板学习:流水灯

  LED(light-emitting diode),即发光二极管,俗称 LED 小灯。板子上一般用的是普通的贴片发光二极管,具有单向导电性。工作电流一般在 1mA~20mA 之间,电流越大LED小灯会越亮,若电流过大,会烧坏LED小灯。因此需要串联一个电阻,达到限流作用,这个电阻通常称为“限流电阻”。发光二极管通常又分为直插式长脚为阳极,短脚为阴极)和贴片式彩色标记一端为阴极)两种。

(图)发光二极管

LED灯点亮原理

  以清翔QX-mini51开发板为例,流水灯模块为8个贴片LED灯。

(图)QX-mini51功能描述

  根据提供的原理图可以看出,8个LED灯左侧接电源VCC(5V或3.3V),右侧接排阻和单片机P10~P17引脚。因为单片机是可以编程控制的,如果让 P10这个引脚输出一个高电平(1),则LED1左右两侧电压相同,没有电压差就不会产生电流,所以LED1小灯就不会亮;如果让P10这个引脚输出一个低电平(0),电路导通就会有电流通过,LED1小灯因为有了电流通过,所以就会直接发光。其它LED等同理。

(图)LED流水灯模块

点亮LED灯

单片机编程完成I/O口控制

  • 低电平:0;高电平:1。单片机在一上电时,所有I/O口默认为高电平状态。
  • P1为8个LED灯全部I/O口,P1^0 ~ P1^7 分别对应LED1 ~ LED8的I/O口。
  • 可使用十六进制形式控制八个LED灯,例:P1=0xaa(二进制:10101010) 表示LED1、LED3、LED5、LED7灭; LED2、LED4、LED6、LED8亮
led.c
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
/*********************************************************************************
* 【实验平台】: 清翔QX-mini51开发板
* 【外部晶振】: 11.0592mhz
* 【主控芯片】: STC89C52RC
* 【编译环境】: Keil μVisio4
* 【程序功能】: 第一个LED灯闪烁
* 【使用说明】: 注意先用跳线冒将J2短接,使用跑马灯模块
* P1为8个全部LED灯,P1^0 ~ P1^7 分别对应LED1 ~ LED8
**********************************************************************************/

#include <reg51.h> //此文件中定义了51的一些特殊功能寄存器
sbit LED = P1^0 ; // 声明单片机P10引脚
void delay(); //声明延时函数

/*******主函数*************/
void main()
{
LED = 0; //置P0口为低电平(0或0x00)
delay(); // 调用延时程序
LED = 1; //置P0口为高电平(1或0xff)
delay(); // 调用延时程序
}

/*******延时函数*************/
void delay()
{
unsigned int i,j;
for(i=1000; i > 0; i--)
for(j = 110; j > 0; j--);
}

流水灯

使用位移方法进行流水等控制

位移操作

  • << 左移 最高位丢弃,最低位补0,其余位依次左移 移位前是:11110110,移位后:11011010
  • >> 右移 最低位丢弃,最高位补0,其余位依次右移 移位前是:11110110,移位后:00111101

循环位移函数

  • _cror_(x,y)含义是二进制数x右移动y位
  • _crol_ 循环左移 最高位移入最低位,其余位依次左移 移位前是:11110110,移位后:11101101
  • _cror_ 循环右移 最低位移入最高位,其余位依次右移 移位前是:11110110,移位后:01111011

while(1)循环用法

  • C语言中,0为假,非0为真。所以while(1)判断表达式为真,会一直执行循环。
  • while(1) 后接循环体程序 一直执行循环体程序。
  • while(1);放在程序最后 一直执行这条语句且无法跳出循环,从而达到程序停止效果。注意有分号
流水灯.c
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
38
39
40
41
42
43
44
45
/*********************************************************************************
* 【实验平台】: 清翔QX-mini51开发板
* 【外部晶振】: 11.0592mhz
* 【主控芯片】: STC89C52RC
* 【编译环境】: Keil μVisio4
* 【程序功能】: 8个LED灯依次闪烁(循环左移结束,再循环右移)
* 【使用说明】: 注意先用跳线冒将J2短接,使用跑马灯模块
* P1为8个全部LED灯,P1^0 ~ P1^7 分别对应LED1 ~ LED8
**********************************************************************************/

#include<reg52.h> //此文件中定义了51的一些特殊功能寄存器
#include<intrins.h> //51自带的移位库函数

#define uchar unsigned char
#define uint unsigned int
uint n;
uchar LED;

void delay(uint i); //声明延时函数

/*******主函数*************/
void main()
{
LED = 0xfe; //1111 1110
while(1)
{
P1 = LED ; // 先点亮LED1
for (n = 0; n < 7; n++){
P1 = _crol_(P1,1); //左移动一位
delay(500); // 调用延时程序,约500ms
}
for (n = 0; n < 7; n++){
P1 = _cror_(P1,1); //右移动一位
delay(500); // 调用延时程序,约500ms
}
}
}

/*******延时函数 ms*************/
void delay(uint i)
{
uint j;
for(i; i > 0; i--)
for(j = 110; j > 0; j--);
}
+