内容
点亮第一个led;
led闪烁;
led流水灯;
led简介
led即发光二极管,它具有单向导电性,通过5mA左右电流即可发光,电流越大,其亮度越强,但若电流过大,会烧毁二极管,一般我们控制在3mA-20mA之间,通常我们会在led管脚上串联一个电阻,目的就是为了限制通过发光二极管的电流不要太大,因此这些电阻又可以称为“限流电阻”;
发光二极管正极又称阳极,负极又称阴极,电流只能从阳极流向阴极;直插式发光二极管长脚为阳极,短脚为阴极;
贴片式发光二极管正面的一端有彩色标记,通常有标记的一端为阴极;
原理图
线路连接
由线路连接图可知,led灯D1-8连接P20-27口,且阳极管脚接电源VCC,要让led发光,只需使对应阴极口为低电平就行;
点亮第一个led
思路
第一个led阴极对应P20口,只需要让P20口为低电平就行;
编码
main.c
/*
* @Description: 点亮第一个led(led2-8同理)
*/
#include "reg52.h"
sbit LED1 = P2 ^ 0; // 表示p2.0管脚设置为led1
void main()
{
LED1 = 0; // 把p2.0电位设置为0(低电位),即灯亮
while (1)
{
// 无限循环,使程序一直运行
}
}
编译和结果
按F7编译,无错误,生成.hex文件,使用pz-isp将hex文件下载到单片机
结果如图
第一个led灯亮
led闪烁
思路
- 要实现led闪烁,只需循环让D1指示灯先亮一会后熄灭;
- 这里就有一个延时问题,如何来产生延时呢?因为单片机执行每条代码指令都是需要时间的,所以我们可以编写一个循环函数,让cpu不干其它事,专门在那循环运行即可实现延时功能;
- 依据人的肉眼余晖效应,延时时间不能太短,否则就无法观察到led闪烁;
编码
main.c
/*
* @Description: led闪烁
*/
#include "reg52.h"
typedef unsigned int u16; // 对系统默认数据类型进行重定义
typedef unsigned char u8;
sbit LED1 = P2 ^ 0; // 表示p2.0管脚设置为led1
/**
* @description: 延时函数(循环一次大约10us)
* @param {u16} ten_us
* @return {*}
*/
void delay_10us(u16 ten_us)
{
while (ten_us--)
;
}
void main()
{
while (1)
{
LED1 = 0; // 点亮
delay_10us(50000); // 大约延时450ms
LED1 = 1; // 熄灭
delay_10us(50000);
}
}
编译和结果
按F7编译,无错误,生成.hex文件,使用pz-isp将hex文件下载到单片机
结果:
第一个led灯持续闪烁
led流水灯
思路
- 实现led流水灯,只需循环让D1-D8指示灯逐个点亮即可;
- 点亮D1(其他不亮),延时一段时间后再点亮D2,延时一段时间后再点亮D3,如此循环,就可以很简单的实现LED流水灯的效果;
- 我们只需通过移位,使变量LED循环代表P20-27管脚,即可依次点亮led灯;
编码
main.c
/*
* @Description: led流水灯
*/
#include "reg52.h"
#include "intrins.h" //_crol_或_cror_函数依赖
typedef unsigned int u16; // 对系统默认数据类型进行重定义
typedef unsigned char u8;
#define LED_PORT P2 // 使用宏定义P2端口
/**
* @description: 延时函数(循环一次大约10us)
* @param {u16} ten_us
* @return {*}
*/
void delay_10us(u16 ten_us)
{
while (ten_us--)
;
}
void main()
{
u8 i = 0;
LED_PORT = ~0x01; // 0x01即p20,对其取反即置低电平,点亮led
delay_10us(50000);
while (1)
{
// 方法1:使用移位+循环实现流水灯
for (i = 0; i < 8; i++)
{
LED_PORT = ~(0x01 << i); // 将1右移i位,然后取反将结果赋值到LED_PORT
delay_10us(50000);
}
// 方法2:使用循环+_crol_或_cror_函数实现流水灯
// for (i = 0; i < 7; i++) // 左移一位
// {
// LED_PORT = _crol_(LED_PORT, 1);
// delay_10us(50000);
// }
// for (i = 0; i < 7; i++) // 右移一位
// {
// LED_PORT = _cror_(LED_PORT, 1);
// delay_10us(50000);
// }
}
}
编译和结果
按F7编译,无错误,生成.hex文件,使用pz-isp将hex文件下载到单片机
结果:
led灯依次点亮,关闭