嵌入式开发学习(STC51-3-点亮led)

内容

点亮第一个led;
led闪烁;
led流水灯;

led简介

led即发光二极管,它具有单向导电性,通过5mA左右电流即可发光,电流越大,其亮度越强,但若电流过大,会烧毁二极管,一般我们控制在3mA-20mA之间,通常我们会在led管脚上串联一个电阻,目的就是为了限制通过发光二极管的电流不要太大,因此这些电阻又可以称为“限流电阻”;
发光二极管正极又称阳极,负极又称阴极,电流只能从阳极流向阴极;直插式发光二极管长脚为阳极,短脚为阴极;
贴片式发光二极管正面的一端有彩色标记,通常有标记的一端为阴极;

原理图

线路连接
嵌入式开发学习(STC51-3-点亮led)_第1张图片
由线路连接图可知,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灯依次点亮,关闭

你可能感兴趣的:(嵌入式开发学习,学习,51单片机)