51单片机从零开始入门教程 第二章(LED篇)

参考教程:[2-1] 点亮一个LED_哔哩哔哩_bilibili

一、LED(发光二极管)原理

        LED的电路符号如下所示,左边是正极,右边是负极,其本质是一个二极管

        正极的电压高于负极时,电流从正极流向负极,即为有正向电流,LED正向导通,将被点亮正极的电压于负极LED反向截止,不会被点亮

二、开发板中的LED模块

1、电路图分析

(1)LED正极接电源VCC(VCC提供正向5V电压)。

(2)LED负极连接MCU的引脚(P20-P27是MCU的引脚,它们的输出电平由MCU的P2寄存器控制,P2寄存器的8位数据分别控制这8个引脚的输出电平),如果引脚输出高电平,LED不会被点亮,如果引脚输出低电平,LED才会有正向电流,才会被点亮。

(3)下图红框内的是限流电阻,如果不加限流电阻,那么流过LED的电流会很大,可能会对LED造成破坏。

2、通过写代码点亮LED的原理

        程序通过CPU给寄存器进行配置,寄存器根据自身位数据,控制驱动器向外部引脚输出高电平or低电平

三、点灯实验

1、点亮第一个LED灯实验

(1)在main.c文件中输入以下代码,然后点击“编译”。

#include <REGX52.H>  //头文件

void main()
{
	
	P2 = 0xFE;  //给P2寄存器配置成0b11111110,从而控制只有1个LED被点亮
	
	while(1)
	{
		//一般嵌入式开发中都会在主函数写一个死循环,进入死循环后永不退出
	}
	
}

(2)注意要在“Output”中勾选“Create HEX File”,这样才能得到编译生成的.hex文件。

(3)得到编译产生的文件后,打开STC-ISP,选择相应的单片机型号(单片机型号在芯片上往往有标注)以及串口号(电脑连接单片机的端口),再选择“打开程序文件”,找到刚刚生成的.hex文件,接着就可以把该文件下载到开发板中,完成点灯实验。

2、8个LED灯同时进行闪烁实验

(1)由于程序本身的执行速度很快,执行两句顺序相邻的配置P2寄存器代码,肉眼是无法观察到LED闪烁的现象的,这时就需要借助延时函数。在STC-ISP中可以直接生成延时函数,如下图所示,其中系统频率要与开发板的晶振相同,指令集改为STC-Y1(右侧适用系列符合情况就行),然后就能得到延时函数。

(2)在main.c文件中输入以下代码,然后点击“编译”。

#include <REGX52.H>  //一般写程序前都先添加这个头文件
#include <INTRINS.H>  //_nop_()需要这个头文件

void Delay500ms()	//借助STC-ISP生成的500ms延时函数(开发板不同,这个函数也会不同)
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{

	while (1)
	{
		P2 = 0xF0;  //前4个LED灯亮,后4个LED灯灭
		Delay500ms();  //在两句代码间调用延时函数,那么程序将在这里死等500ms,然后再继续往下执行
		P2 = 0x0F;  //前4个LED灯灭,后4个LED灯亮
		Delay500ms();  //程序将在这里再死等500ms,然后再继续往下执行
	}
}

(3)按照上一例的操作将生成的.hex文件下载到开发板中,即可观察LED闪烁的现象。

3、8个LED灯轮流闪烁(流水灯)实验

#include <REGX52.H>
#include <INTRINS.H>  //_nop_()需要这个头文件

void Delay500ms()	//借助STC-ISP生成的500ms延时函数(开发板不同,这个函数也会不同)
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	while(1)
	{
		P2 = 0xFE; //1111 1110,第一盏LED灯被点亮
		Delay500ms();
		P2 = 0xFD; //1111 1101,第二盏LED灯被点亮
		Delay500ms();
		P2 = 0xFB; //1111 1011,第三盏LED灯被点亮
		Delay500ms();
		P2 = 0xF7; //1111 0111,第四盏LED灯被点亮
		Delay500ms();
		P2 = 0xEF; //1110 1111,第五盏LED灯被点亮
		Delay500ms();
		P2 = 0xDF; //1101 1111,第六盏LED灯被点亮
		Delay500ms();
		P2 = 0xBF; //1011 1111,第七盏LED灯被点亮
		Delay500ms();
		P2 = 0x7F; //0111 1111,第八盏LED灯被点亮
		Delay500ms();
	}
	
}

(2)按照上一例的操作将生成的.hex文件下载到开发板中,即可观察LED流水的现象。

4、8个LED灯轮流闪烁(进阶版)实验

(1)在main.c文件中输入以下代码,然后点击“编译”。

#include <REGX52.H>
#include <INTRINS.H>  //_nop_()需要这个头文件

void Delay1ms(unsigned int xms)		//对借助STC-ISP生成的1ms延时函数进行修改
{
	while(xms)  //让这个1ms延时函数重复执行xms次
	{
		unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
	xms--;  //smx作为计数器
	}
}

void main()
{
	P2 = 0xFE;  //1111 1110,初始状态为第一个LED灯亮
	while(1)
	{
		if(P2 == 0xFF)  //一轮循环结束,重置为初始状态(第一个LED灯亮)
			P2 = 0xFE;
		Delay1ms(500);  //500ms延时(可以根据需求传入不同的延时时间)
		P2 = P2 << 1;  //控制下一个LED灯亮(P2中的0左移1位)
		P2 += 1;  //第一轮循环结束前亮过的LED灯不能再亮(左移会导致第一位为0,需要将其修改为1)
		
	}
}

(2)按照上一例的操作将生成的.hex文件下载到开发板中,即可观察LED流水的现象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zevalin爱灰灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值