51单片机-控制LED灯

目录

1.硬件设计

2.软件设计

2.1.点亮一颗LED灯

2.2.LED闪烁

2.3.LED流水灯

3.知识点

3.1.while函数的应用

3.2.常用数据类型

3.3.延时函数的自动生成


1.硬件设计

        通过原理图分析,LED 采用共阳接法,即所有 LED 阳极管脚接电源 VCC(5V),阴极管脚通过一个限流电阻接到 P2 口上;要让 LED 发光即对应的阴极管脚应该为低电平,若为高电平则熄灭;所以如何配置P2口的高低电平(P2寄存器),就是怎么去控制这8颗LED灯。

2.软件设计

2.1.点亮一颗LED灯

功能需求:点亮D1这一颗LED灯

程序设计:根据原理图去配置对应的寄存器(P2口),去控制LED灯的亮灭状态,如:D1亮,其他灯不亮,即P20输入低电平,其他管脚输入高电平;

#include <REGX52.H>

void main()
{
	P2=0XFE;//1111 1110 D1灯亮,其他灯不亮
}

进阶1:除了main函数,增加循环语句while,while(1)表示当括号里边的逻辑表达式为真的时候;就执行大括号里边的内容

#include <REGX52.H>

void main()
{
	while(1)
	{
	    P2=0XFE;//1111 1110
	}
}

进阶2:利用头文件中已经定义好的位寄存器,去单独控制我们想要控制的管脚,如:P2=0XFE-相当于P2_0=0

#include <REGX52.H>

void main()
{
	while(1)
	{
		P2_0=0;//P2=0XFE;
	}
}

2.2.LED闪烁

功能需求:要让D1这颗LED灯,按固定延时呈闪烁现象

程序设计:闪烁无非就是将LED点亮,再熄灭,然后重复这个动作,但如果只是如下的程序方案,我们无法看到闪烁现象,因单片机的工作频率是以MHz为单位,亮灭之间,停留的时间太短,所以看到的现象就是个LED常亮的现象

#include <REGX52.H>

void main()
{
	while(1)
	{
		P2=0XFE;//1111 1110 点亮第一颗灯
		P2=0XFF;//1111 1111 熄灭第一颗灯
	}
}

所以想要肉眼能看到LED的闪烁现象,需在亮灭之间,增加延时函数,如下:在亮灭各自的状态下,增加500毫秒延时;

#include <REGX52.H>
#include <INTRINS.H>

void Delay500ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	while(1)
	{
		P2=0XFE;//1111 1110
		Delay500ms();//延时500毫秒
		P2=0XFF;//1111 1111
		Delay500ms();//延时500毫秒
	}
}

        延时函数,对初学者来说,不需要自己去编写,甚至其原理都可以不需要懂,可通过STC等工具自动生成,如:

2.3.LED流水灯

功能需求:LED流水灯的原理是让这8颗LED灯依次点亮,呈流水灯效果

软件设计:考虑LED灯依次点亮,考虑固定延时,如下:从第1-8颗灯依次点亮,且在每颗灯之间加入固定500ms的延时

#include <REGX52.H>
#include <INTRINS.H>

void Delay500ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	while(1)
	{
		P2=0XFE;//1111 1110
		Delay500ms();
		P2=0XFD;//1111 1101
		Delay500ms();
		P2=0XFB;//1111 1011
		Delay500ms();
		P2=0XF7;//1111 0111
		Delay500ms();
		P2=0XEF;//1110 1111
		Delay500ms();
		P2=0XDF;//1101 1111
		Delay500ms();
		P2=0XBF;//1011 1111
		Delay500ms();
		P2=0X7F;//0111 1111
		Delay500ms();
	}
}

        以上流水灯方案的的缺点是:延时固定,且不可调,除非重新修改延时函数;那怎么让流水灯的延时变得可调呢,如下:

进阶1:首先通过STC的延时计算器,生成1个固定的基本延时函数,然后增加无符号整形变量xms,然后通过改变delay函数括号里边的行参,即可调整每颗LED灯的延时参数;

#include <REGX52.H>
#include <INTRINS.H>

void Delay1ms(unsigned int xms)		//@12.000MHz;设置无符号整形变量Xms
{
	unsigned char i, j;
	while(xms)// 当xms非0,即循环后面的延时函数
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
			xms--;
	}
}
void main()
{
	while(1)
	{
		P2=0XFE;//1111 1110
		Delay1ms(100);//延时100ms 执行括号里边的参数(行参)
		P2=0XFD;//1111 1101
		Delay1ms(500);//延时500ms
		P2=0XFB;//1111 1011
		Delay1ms(100);
		P2=0XF7;//1111 0111
		Delay1ms(100);
		P2=0XEF;//1110 1111
		Delay1ms(100);
		P2=0XDF;//1101 1111
		Delay1ms(300);//延时300ms
		P2=0XBF;//1011 1111
		Delay1ms(100);
		P2=0X7F;//0111 1111
		Delay1ms(100);
	}
}

3.知识点

3.1.while函数的应用

/*------------------------------------------------
如果逻辑表达式成立
    执行循环体
执行后再次判断
若还成立则继续执行直到表达式不成立
------------------------------------------------*/
while(逻辑表达式)
{
	循环体;
}

3.2.常用数据类型

3.3.延时函数的自动生成

通过STC生成想要的延时函数,需要注意的是系统频率要选择单片机对应的频率,确定需要延时的长度,选择适用单片机型号的指令集;

  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李十懿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值