本章节介绍51单片机硬件IO口输出模式应用示例。通过对IO输出模式应用,实现对硬件LED灯驱动。
LED 即发光二极管。它具有单向导电性,通过 5mA 左右电流即可发光,电流越大,其亮度越强,但若电流过大,会烧毁二极管,一般我们控制在 3 mA-20mA之间,通常我们会在 LED 管脚上串联一个电阻,目的就是为了限制通过发光二极管的电流不要太大,因此这些电阻又可以称为“限流电阻”。当发光二极管发光时,测量它两端电压约为 1.7V,这个电压又叫做发光二极管的“导通压降”。下图左右分别为直插式发光二极管和贴片式发光二极管实物图。发光二极管正极又称阳极,负极又称阴极,电流只能从阳极流向阴极。直插式发光二极管长脚为阳极,短脚为阴极。仔细观察贴片式发光二极管正面的一端有彩色标记,通常有标记的一端为阴极。
-
硬件接口
本次开发板上有8个LED灯,位D1D8,IO驱动端口为P2^0P2^8,硬件原理图如上所示。根据原理图可知,对P2端口写入低电平即可实现LED点亮,写入高电平则熄灭。 -
软件设计
-
创建main.h文件
为了便于后续LED应用,可以创建一个”main.h”头文件,在”main.h”中添加下面代码:
#ifndef _MAIN_H
#define _MAIN_H
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned short u16;
#define LED P2//LED硬件接口
#endif
- 创建delay.c和delay.h文件
为了便于后续延时函数应用,创建”delay.c”和”delay.h”文件,编写延时函数,代码实现如下:
#include "delay.h"
void Delay1us() //@11.0592MHz
{
_nop_();
_nop_();
_nop_();
}
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
void Delay_Us(u16 time)
{
while(time--)
{
Delay1us();
}
}
void Delay_Ms(u16 time)
{
while(time--)
{
Delay1ms();
}
}
注意:其中”Delay1us()”和”Delay1ms()”函数是通过STC工具生成。
- 实现流水灯效果
#include "main.h"
#include "delay.h"
int main()
{
u8 i=0;
LED=~0x1;
while(1)
{
for(i=0;i<7;i++)
{
//LED=~(1<<i);
LED=_crol_(LED,1);//左移一位
Delay_Ms(20);
}
for(i=0;i<7;i++)
{
//LED=~(0x80>>i);
LED=_cror_(LED,1);//右移一位
Delay_Ms(20);
}
}
}
KEIL C51软件内有对应的移位库函数,左移函数是_crol_(),右移函数是_cror_(),要使用这两个函数在我们的程序中,必须包含intrins.h头文件。
-
程序下载
注意:波特率不要调太高,否则会下载失败。