【蓝桥杯单片机入门记录】LED灯(附多个例程)

目录

一、LED灯概述

[1.1 LED发光原理](#1.1 LED发光原理)

1.2电路原理图

1.3电路实物图

[1.4 开发板LED灯原理图](#1.4 开发板LED灯原理图)

1.4.1共阳极LED灯操控原理(本开发板)

(非实际原理图,便于理解版本)由图可以看出,每个LED灯的左边(即正极)通过限流电阻连接到电源的正极,如果想点亮一个灯(以L1为例),则需要P00输出一个低电平;熄灭L1,则需要P00输出一个高电平1.4.2共阴极LED灯操控原理

二、单片机的I/O口

[(1) I/O输出/输出(Input/Output)的简称主要用于工业现场需要用到数字量输入/输出的场合](#(1) I/O输出/输出(Input/Output)的简称主要用于工业现场需要用到数字量输入/输出的场合)

(2)并行I/O接口是实际应用中使用最多、最普遍的接口类型,开关量的输入/输出都是通过并行I/O接口实现的。

(3)单片机I/O口的使用

(4)STC15系列单片机强大的I/O口功能

三、LED例程

(1)点亮其中某个LED灯:以L1灯为例,其他LED保持熄灭

(2)点亮其中某个LED灯:以L6灯为例,其他LED保持熄灭

(3)一个LED闪烁:以L6闪烁为例,其他LED保持熄灭

(4)多个LED交替闪烁:以L1灯和L2灯交替闪烁为例,其他LED保持熄灭

(5)多个LED交替闪烁:以L1灯和L2灯交替闪烁为例,其他LED保持熄灭(采用sbit关键字)

(6)流水灯(也称跑马灯),若干个LED依次点亮:以开发板上的8个LED诸葛点亮,循环不止。

(7)点亮一个LED灯(并口控制方式):以点亮L1灯为例

(8)点亮一个LED(并口控制方式):以点亮L1、L8为例(涉及sfr关键字)

sfr关键字

(9)流水灯(库函数实现)


一、LED灯概述

1.1 LED发光原理

从物理学角度来理解:当电流通过晶片时,N型半导体内的电子与P型半导体内的空穴在发光层剧烈地碰撞复合产生光子,以光子的形式发出能量(即大家看见的光)

1.2电路原理图

1.3电路实物图

1.4 开发板LED灯原理图

1.4.1共阳极LED灯操控原理(本开发板)
(非实际原理图,便于理解版本)由图可以看出,每个LED灯的左边(即正极)通过限流电阻连接到电源的正极,如果想点亮一个灯(以L1为例),则需要P00输出一个低电平;熄灭L1,则需要P00输出一个高电平

1.4.2共阴极LED灯操控原理

通常情况下,LED的负极接地,正极接芯片的IO口

二、单片机的I/O口

(1) I/O输出/输出(Input/Output)的简称主要用于工业现场需要用到数字量输入/输出的场合

输出功能:继电器、LED、蜂鸣器等的控制

输入功能:传感器状态、高低电平等信息的读取

复用功能:片内外设的对外接口

时序模拟:模拟SPI、I2C、和UART灯常用接口的时序

(2)并行I/O接口是实际应用中使用最多、最普遍的接口类型,开关量的输入/输出都是通过并行I/O接口实现的。

(3)单片机I/O口的使用

  • 对单片机的控制,主要就是对I/O口的控制,无论单片机对外接进行何种控制,或接受外部的何种控制,都是通过I/O进行的
  • STC15/STC8/STC32G系列单片机最多有P0、P1、P2、P3、P4、P5,P6,P7四个8位双向输、 入输出端口(除P5)
  • 本开发板所用到的单片机型号IAP15F2K61S2仅用到P0-P4五组I/O口

(4)STC15系列单片机强大的I/O口功能

  • 四种工作模式:准双向口上拉(标准8051输出模式),推挽输出上拉,高阻输入,开漏输出;
  • 其他功能复用模式:串行通信、A/D转换、PWM输出、外部中断、SPI通信等等
  • STC15F系列、STC15W系列、STC8H、STC32G系列引脚功能略有区别;
  • 等等;

三、LED例程

(1)点亮其中某个LED灯:以L1灯为例,其他LED保持熄灭

cs 复制代码
//头文件声明区域
#include <STC15F2K60S2.H>
//变量声明区域

//函数定义区域
//关闭蜂鸣器
void cls_buzz(void)
{
    P2 = (P2 & 0x1F | 0xA0);
    P0 = 0x00;
    P2 &= 0x1F;
}

//程序主体
void main()
{
	    cls_buzz();
	//初始化部分
	P2 = 0xA0;
	P0 = 0x00;
	P2 = 0X80;
	P0 = 0xFF;
	while(1)
	{
		P00 = 0;//点亮L1(单个赋值)

	}
	
	
}

(2)点亮其中某个LED灯:以L6灯为例,其他LED保持熄灭

cs 复制代码
//头文件声明区域
#include <STC15F2K60S2.H>
//变量声明区域

//函数定义区域
//关闭蜂鸣器
void cls_buzz(void)
{
    P2 = (P2 & 0x1F | 0xA0);
    P0 = 0x00;
    P2 &= 0x1F;
}

//程序主体
void main()
{
	    cls_buzz();
	//初始化部分
	P2 = 0xA0;
	P0 = 0x00;
	P2 = 0X80;
	P0 = 0xFF;
	while(1)
	{
		P05 = 0;//点亮L6(单个赋值)

	}
	
	
}
  • 补充:STC15W/STC8H/STC32G系列单片机增加初始化程序
  • STC15W系列单片机的部分I/0口;
  • STC8A系列单片机、STC8H系列单片机、STC32G系列单片机的全部I/0口上电之后,都默认不是准双向口(弱上拉)模式,所以需要加载1/0端口初始化程序,将所有1/0口初始化为准双向口(弱上拉)模式即可。

(3)一个LED闪烁:以L6闪烁为例,其他LED保持熄灭

cs 复制代码
//头文件声明区域
#include <STC15F2K60S2.H>
#include<intrins.h>
//变量声明区域

//函数定义区域
//关闭蜂鸣器
void cls_buzz(void)
{
    P2 = (P2 & 0x1F | 0xA0);
    P0 = 0x00;
    P2 &= 0x1F;
}
void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 22;
	j = 3;
	k = 227;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}



//程序主体
void main()
{
	    cls_buzz();
	//初始化部分
	P2 = 0xA0;
	P0 = 0x00;
	P2 = 0X80;
	P0 = 0xFF;
	while(1)
	{
		P05 = 0;
		Delay500ms();
		P05 = 1;
		Delay500ms();
	}
	
	
}

(4)多个LED交替闪烁:以L1灯和L2灯交替闪烁为例,其他LED保持熄灭

cs 复制代码
//头文件声明区域
#include <STC15F2K60S2.H>
#include<intrins.h>
//变量声明区域

//函数定义区域
//关闭蜂鸣器
void cls_buzz(void)
{
    P2 = (P2 & 0x1F | 0xA0);
    P0 = 0x00;
    P2 &= 0x1F;
}
void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 22;
	j = 3;
	k = 227;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}



//程序主体
void main()
{
	    cls_buzz();
	//初始化部分
	P2 = 0xA0;
	P0 = 0x00;
	P2 = 0X80;
	P0 = 0xFF;
	while(1)
	{
		P00 = 0;
		P01 = 1;
		Delay500ms();
		P00 = 1;
		P01 = 0;
		Delay500ms();
	}
	
	
}

(5)多个LED交替闪烁:以L1灯和L2灯交替闪烁为例,其他LED保持熄灭(采用sbit关键字)

cs 复制代码
//头文件声明区域
#include <STC15F2K60S2.H>
#include<intrins.h>
//变量声明区域
sbit LED2 = P0^1;
//函数定义区域
//关闭蜂鸣器
void cls_buzz(void)
{
    P2 = (P2 & 0x1F | 0xA0);
    P0 = 0x00;
    P2 &= 0x1F;
}
void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 22;
	j = 3;
	k = 227;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}



//程序主体
void main()
{
	    cls_buzz();
	//初始化部分
	P2 = 0xA0;
	P0 = 0x00;
	P2 = 0X80;
	P0 = 0xFF;
	while(1)
	{
		P00 = 0;
		LED2 = 1;
		Delay500ms();
		P00 = 1;
		LED2 = 0;
		Delay500ms();
	}
	
	
}

(6)流水灯(也称跑马灯),若干个LED依次点亮:以开发板上的8个LED诸葛点亮,循环不止。

cs 复制代码
//头文件声明区域
#include <STC15F2K60S2.H>
#include<intrins.h>
//变量声明区域
unsigned char LED = 0xfe; //LED数据变量
//函数定义区域
//关闭蜂鸣器
void cls_buzz(void)
{
    P2 = (P2 & 0x1F | 0xA0);
    P0 = 0x00;
    P2 &= 0x1F;
}
void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 22;
	j = 3;
	k = 227;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}



//程序主体
void main()
{
	    cls_buzz();
	//初始化部分
	P2 = 0xA0;
	P0 = 0x00;
	P2 = 0X80;
	P0 = 0xFF;
	while(1)
	{
			P00 = 0;P01 = 1;P02 = 1; P03 = 1; P04 = 1;P05 = 1;P06 = 1;P07 =1;
			Delay500ms();
			P00 = 1;P01 = 0;P02 = 1; P03 = 1; P04 = 1;P05 = 1;P06 = 1;P07 =1;
			Delay500ms();
			P00 = 1;P01 = 1;P02 = 0; P03 = 1; P04 = 1;P05 = 1;P06 = 1;P07 =1;
			Delay500ms();
			P00 = 1;P01 = 1;P02 = 1; P03 = 0; P04 = 1;P05 = 1;P06 = 1;P07 =1;
			Delay500ms();
			P00 = 1;P01 = 1;P02 = 1; P03 = 1; P04 = 0;P05 = 1;P06 = 1;P07 =1;
			Delay500ms();
			P00 = 1;P01 = 1;P02 = 1; P03 = 1; P04 = 1;P05 = 0;P06 = 1;P07 =1;
			Delay500ms();
			P00 = 1;P01 = 1;P02 = 1; P03 = 1; P04 = 1;P05 = 1;P06 = 0;P07 =1;
			Delay500ms();
			P00 = 1;P01 = 1;P02 = 1; P03 = 1; P04 = 1;P05 = 1;P06 = 1;P07 =0;
			Delay500ms();

			
	}
	
	
}

(7)点亮一个LED灯(并口控制方式):以点亮L1灯为例

cs 复制代码
/头文件声明区域
#include <STC15F2K60S2.H>
#include<intrins.h>
//变量声明区域
//函数定义区域
//关闭蜂鸣器
void cls_buzz(void)
{
    P2 = (P2 & 0x1F | 0xA0);
    P0 = 0x00;
    P2 &= 0x1F;
}
//程序主体
void main()
{
	cls_buzz();
	//初始化部分
	P2 = 0xA0;
	P0 = 0x00;
	P2 = 0X80;
	P0 = 0xFF;
	while(1)
	{
		P0 = OXFE;// 1111 1110
		
	}
	
	
}

(8)点亮一个LED(并口控制方式):以点亮L1、L8为例(涉及sfr关键字)

cs 复制代码
//头文件声明区域
#include <STC15F2K60S2.H>
#include<intrins.h>
//变量声明区域
sfr LED = 0x80;
//函数定义区域
//关闭蜂鸣器
void cls_buzz(void)
{
    P2 = (P2 & 0x1F | 0xA0);
    P0 = 0x00;
    P2 &= 0x1F;
}


//程序主体
void main()
{
	    cls_buzz();
	//初始化部分
	P2 = 0xA0;
	P0 = 0x00;
	P2 = 0X80;
	P0 = 0xFF;
	while(1)
	{
		LED = 0x7e;//0111 1110

			
	}
	
	
}
sfr关键字
  • 用于声明特殊功能寄存器的变量。
  • sfr关键字的语法格式如下:
cs 复制代码
sfr <register> = <address>;

//<register> 是你定义的变量名称,用于访问特殊功能寄存器;
//<address> 是特殊功能寄存器的物理地址。

(9)流水灯(库函数实现)

cs 复制代码
//头文件声明区域
#include <STC15F2K60S2.H>
#include<intrins.h>
//变量声明区域
unsigned char LED = 0xfe; //LED数据变量
//函数定义区域
//关闭蜂鸣器
void cls_buzz(void)
{
    P2 = (P2 & 0x1F | 0xA0);
    P0 = 0x00;
    P2 &= 0x1F;
}
void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 22;
	j = 3;
	k = 227;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}



//程序主体
void main()
{
	    cls_buzz();
	//初始化部分
	P2 = 0xA0;
	P0 = 0x00;
	P2 = 0X80;
	P0 = 0xFF;
	while(1)
	{
		P0 = LED;
		Delay500ms();
		LED = _crol_(LED,1);
		Delay500ms();
		
	}
	
	
}
相关推荐
智商偏低2 小时前
单片机之helloworld
单片机·嵌入式硬件
青牛科技-Allen3 小时前
GC3910S:一款高性能双通道直流电机驱动芯片
stm32·单片机·嵌入式硬件·机器人·医疗器械·水泵、
森焱森5 小时前
无人机三轴稳定控制(2)____根据目标俯仰角,实现俯仰稳定化控制,计算出升降舵输出
c语言·单片机·算法·架构·无人机
白鱼不小白5 小时前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D5 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
芯岭技术8 小时前
PY32F002A单片机 低成本控制器解决方案,提供多种封装
单片机·嵌入式硬件
youmdt9 小时前
Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间
单片机·嵌入式硬件
嘿·嘘9 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
Meraki.Zhang9 小时前
【STM32实践篇】:I2C驱动编写
stm32·单片机·iic·驱动·i2c
几个几个n12 小时前
STM32-第二节-GPIO输入(按键,传感器)
单片机·嵌入式硬件