51单片机——简单点亮LED灯

1.介绍

需要使用的工具有keil5stc-isp
keil5上编写代码,将代码传到stc-isp上使单片机运行。需要一点c语言基础。在开始前可以先看LED部分的原理图,简单了解该模块的结构,便于后续理解。

2.点亮一个LED灯

2.1 创建文件

打开keil5—>点击project—>点击new project—>选择要创建文件的文件夹—>选择单片机的型号(以我自己举例,单片机型号是STC89C52RC,但keil5没有STC系列的单片机,就选择AT89C52)—>右键文件夹添加c语言类型文件

2.2 编写代码

#include <regx52.h>
int main()
{
	P2 = 0xFE;//1111 1110
	while(1)
	{
	}
	return 0;
}

2.2.1 P2的解释

P2(看原理图标注的口是从哪里开始的)是一个寄存器,里面有8位,51单片机上有8个LED灯,所以每一位对应控制一个LED灯。数字电路是二进制,只有0和1,写0对应的LED就是电平,1写对应的LED就是电平。加入<regx52.h>头文件,让程序理解P2的含义。

2.2.2 LED为什么会亮

将第1个LED对应的位给0,其他LED对应的位给1,那么只有第一个LED会亮(所有LED的一侧都接了Vcc,只有当LED另一侧接了低电平时,才会产生电位差,使对应的电路导通,有电流产生,从而点亮LED

2.2.3 进制转换

所以要想使第一个LED点亮,我们要给P2一个值去控制这8个LED。P2=1111 1110(2进制,1和0会赋给对应的端口,端口控制对应的LED)
但程序不支持直接写二进制,需要换成十六进制。
在这里插入图片描述
P2 = 0xFE //1111 1110(0x是前缀,表示十六进制)

2.2.4while的解释

在没有while的时候,程序会不停的重复执行主函数,加入while后,程序在执行打开LED灯的代码后就会一直在while处循环,相当于使程序在执行完打开LED灯的代码后就停止了。

2.2.5 保存代码

在这里插入图片描述
点击如图所示位置,在output选项中勾选第二个,点OK,随后编译代码。
在这里插入图片描述

2.3 运行代码

在这里插入图片描述

用USB将单片机和电脑连接—>打开stc-isp—>选择对应的型号(STC89C52RC)和串口—>点击打开程序文件—>找到对应的文件夹下的Objects文件—>点击下载/编程—>按下单片机开关。会发现单片机的第一个LED灯已经点亮。

3 LED灯闪烁

3.1创建文件

步骤同上

3.2 编写代码

#include <regx52.h>
#include <intrins.h>

void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;
	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

int main()
{
	while(1)
	{
		P2=0xFE;//点亮第一个LED
		Delay500ms();//使点亮和闪烁的过程中间隔500ms
		P2=0xFF;//熄灭第一个LED
	}
	return 0;
}

3.2.1 创建时间延迟函数

打开stc-isp—>点击软件延时计算器—>根据自己的开发板选择对应的系统频率、选择定时长度、指令集—>最后点击生成c代码并复制到主函数前
在这里插入图片描述

3.2.2头文件<intrins.h>的添加

程序无法识别_nop_(),所以需要引用该头文件,也可以删除该代码不引用头文件,只会对精度产生细小误差。

3.2.3使用while循环重复闪烁

将代码写在while循环中,并在点亮和熄灭中间引用一次延迟函数,这样就可以重复点亮和关闭LED灯,达到一直闪烁LED灯的效果。

3.3运行代码

步骤同上

4 LED流水灯

4.1 创建文件

步骤同上

4.2 编写代码

#include <regx52.h>

void Delay1ms(unsigned int x)		//@11.0592MHz
{
	unsigned char i, j;
	while(x)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		x--;
	}
}


int main()
{
	while(1)
	{
		P2=0xFE;//1111 1110 只有第一个LED灯亮
		Delay1ms(500);
		P2=0xFD;//1111 1101 只有第二个LED灯亮
		Delay1ms(500);
		P2=0xFB;//1111 1011 只有第三个LED灯亮
		Delay1ms(500);
		P2=0xF7;//1111 0111 只有第四个LED灯亮
		Delay1ms(500);
		P2=0xEF;//1110 1111 只有第五个LED灯亮
		Delay1ms(500);
		P2=0xDF;//1101 1111 只有第六个LED灯亮
		Delay1ms(500);
		P2=0xBF;//1011 1111 只有第七个LED灯亮
		Delay1ms(500);
		P2=0x7F;//0111 1111 只有第八个LED灯亮
		Delay1ms(500);
	}
	
	return 0;
}

4.2.1 时间延迟函数的改进

先根据前面的步骤创建一个1ms的时间延迟函数,给这个时间延迟函数里传一个无符号整型参数x,将这个时间延迟函数的主体内容放进一个while循环中,while的循环参数为x,while函数末尾加上x--
需要延迟多少ms,就传对应的数字到时间延迟函数,这样时间延迟函数就会执行对应倍数的1ms的时间延迟。改进过后想延迟多久就可以直接传参数,不用每次都去生成对应的时间函数,便于灵活使用。

4.2.2 使用while循环流水闪烁

在while循环中写入每个LED灯开启的代码,每行代码之间加入500ms的时间延迟函数,这样LED灯就会流水型开启并一直循环重复。

4.3 运行代码

步骤同上

5. 总结

以上就是我在学习51单片机过程中对简单点亮LED灯部分的学习内容的总结,希望对大家有所帮助。如有错误的地方,欢迎指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值