###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯

前言:感谢您的关注哦,我会持续更新编程相关知识,愿您在这里有所收获。如果有任何问题,欢迎沟通交流!期待与您在学习编程的道路上共同进步。

目录

[一. 延时函数的生成](#一. 延时函数的生成)

1.通过延时计算器得到延时函数

2.可赋值改变的延时函数

[二. LED模块编写原理](#二. LED模块编写原理)

1.LED模块图

2.编写原理

(1)编写原理

(2)快捷编程

(3)十六进制编程

[三. 具体编写程序](#三. 具体编写程序)

1.通过生成没有改写的延时函数

2.可赋值延时函数编写

[四. LED流水灯视频](#四. LED流水灯视频)

一. 延时函数的生成

1.通过延时计算器得到延时函数

步骤:

1.打开STC-ISP找到软件延时计算器

2.先了解所用51单片机的频率(这里的51单片机频率为11.0592),选择你需要定时的长度,然后注意这里51单片机为AT89C52属于89系列,所以8051指令集选择STC-Y1。

3.点击生成C代码再复制代码

源码如下:

cpp 复制代码
void Delay250ms(void)	//@11.0592MHz
{
	unsigned char data i, j, k;

	_nop_();
	i = 2;
	j = 193;
	k = 57;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

2.可赋值改变的延时函数

这里我们可以在原有的延时函数的基础上,进行变量定义并运用while语句生成可赋值改变的延时函数。

源码:

cpp 复制代码
void Delay(unsigned int xms)	//@11.0592MHz
          //在Delay延时函数中新定义一个整型变量xms
{
	unsigned char data i, j;
  while(xms)     //运用while循环,注意while循环括号内非零即增
	{
	i = 2;
	j = 199;    
	do
	{
		while (--j);
	} while (--i);
	xms--;      //注意这里为循环条件改变,不改变无法实现同时写成xms++也无法实现
}
	
}

二. LED模块编写原理

1.LED模块图

1.单片机多个接口图,LED模块接在P2口

2.LED模块图,这里我们需要注意LED的走向便于理解编写原理

3.LED与单片机连接部分

2.编写原理

(1)编写原理

从上面LED的原理图中,我们对于LED知道LED具有单向导电的特征,而反向则电阻很大,所以我们需要使LED单向导电,这里我们规定0为低电平而1为高电平,根据电流的流向,判断当P2口接0即低电平时LED点亮,当P2口接1即高电平时LED不亮。

(2)快捷编程

  1. 在编写时我们需要加上一个定义了P2口的头文件如下:
cpp 复制代码
#include <REGX52.H>

该头文件定义了所有的接口,一般编写都需要,我们可以在开始时鼠标右键空白处找到并添加。

2.由于该头文件定义了确切的接口如图:

点击打开

查看接口

这里直接定义了接口转为十六进制所以只需要对接口赋值0或1,即加高电平还是低电平。

例如:

1.定义第一个LED点亮

cpp 复制代码
P2_0=0;

2.定义第一个LED熄灭

cpp 复制代码
P2_0=1;

(3)十六进制编程

十六进制编程与上述类似即对于接口没有转换为十六进制需要自己通过原理来设计编写,即对于每个LED的状态进行规定,然后写成一个二进制代码再转为十六进制。(之前的博客有具体的转换过程)。

例如:

这里定义D1接0,其余接1,则表示只让D1亮,这里写成二进制串需要从下往上写成1111 1110,接着由二进制转十六进制为FE,部分二进制转十六进制如图:

例如:这里在FE前面需要加上0x用于表明为十六进制,

cpp 复制代码
	P2=0xFE;

对比:对于快捷编写来说即让人容易明白且编写方便,而对于十六进制编写则过于麻烦,但是该编写方式可以让人更加清楚的熟悉编写原理,从而更加灵活的编写同时有利于后续的编写。

三. 具体编写程序

1.通过生成没有改写的延时函数

这里在程序中我们还要引入另一个头文件,由于自动生成的延时函数中有一个语句需要被调用,为了完善程序,我们需要调用该头文件。

需要被调用的语句:

cpp 复制代码
	_nop_();

需要被调用的头文件:

cpp 复制代码
#include <INTRINS.H>

打开可看到(打开方式同另一个头文件)

下面就是一个具体的程序(C语言编写的):

cpp 复制代码
#include <REGX52.H>       //两个头文件的引入
#include <INTRINS.H>

void Delay250ms(void)	//@11.0592MHz    //延时250ms
{
	unsigned char data i, j, k;

	_nop_();    
	i = 2;
	j = 193;
	k = 57;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()    //函数主体
{
	while(1)      //通过while循环让程序循环进行
	{
		P2=0xFF;   //通过十六进制编写
		Delay250ms();    //延时函数的调用
		P2=0xFE;
		Delay250ms();
		P2=0xFD;
		Delay250ms();
		P2=0xFB;
		Delay250ms();
		P2=0xF7;
		Delay250ms();
		P2=0xEF;
		Delay250ms();
		P2=0xDF;
		Delay250ms();
		P2=0xBF;
		Delay250ms();
		P2=0x7F;
		Delay250ms();
		P2=0xFD;
		Delay250ms();
		P2=0xF7;
		Delay250ms();
		P2=0xDF;
		Delay250ms();
		P2=0x7F;
		Delay250ms();
		P2=0xFC;
		Delay250ms();
		P2=0xE7;
		Delay250ms();
		P2=0x3F;
		Delay250ms();
		P2=0xF1;
		Delay250ms();
		P2=0x1F;
		Delay250ms();
		P2=0xF0;
		Delay250ms();
		P2=0x0F;
		Delay250ms();
		P2=0x00;
		Delay250ms();
	}
	
	
	
}

这里主要可以多试试通过十六进制定义LED的亮灭。

2.可赋值延时函数编写

这里由于改写后没有上面的那个语句,所以也不需要添加那个头文件。

源码:

cpp 复制代码
#include <REGX52.H>

void Delay(unsigned int xms)	//@11.0592MHz   //定义变量
{
	unsigned char data i, j;
  while(xms)   //while循环
	{
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
	xms--;   //循环条件改变
}
	
}

void main()   //主函数
{
	while(1)   //while循环非零即增
	{
		P2=0xFE;
		Delay(100);   //调用延时函数,对于延时可赋值改变
		P2=0xFD;
		Delay(200);
		P2=0xFB;
		Delay(300);
		P2=0xF7;
		Delay(400);
		P2=0xEF;
		Delay(500);
		P2=0xDF;
		Delay(600);
		P2=0xBF;
		Delay(700);
		P2=0x7F;
		Delay(800);
		
	}

}

四. LED流水灯视频

大家可以自己设计一个自己的流水灯,如果有问题的话欢迎私聊我哦。

51单片机LED流水灯

感谢老铁的浏览,希望老铁可以一键三连加个关注,您的支持和鼓励是我前进的动力,后续会分享更多学习编程的内容。

相关推荐
网小鱼的学习笔记12 分钟前
html中的table标签以及相关标签
开发语言·前端·python·html
爱上妖精的尾巴40 分钟前
3-18 WPS JS宏 颜色设置实例应用(按条件设置单元格颜色)学习笔记
javascript·笔记·学习·excel·wps·js宏·jsa
重整旗鼓~1 小时前
7.索引库操作
java·开发语言
W说编程1 小时前
算法导论第十四章 B树与B+树:海量数据的守护者
c语言·数据结构·b树·算法·性能优化
Jay Kay1 小时前
深入解析协程:高并发编程的轻量级解决方案
开发语言·c++·算法
mit6.8241 小时前
[Linux_core] “虚拟文件” | procfs | devfs | 上下文
linux·c语言·c++
木子单片机2 小时前
基于STM32电子密码锁
stm32·单片机·嵌入式硬件·proteus
lifallen2 小时前
Java BitSet类解析:高效位向量实现
java·开发语言·后端·算法
学不好python的小猫2 小时前
7-4 身份证号处理
开发语言·python·算法
teeeeeeemo2 小时前
JS数据类型检测方法总结
开发语言·前端·javascript·笔记