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

 

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

 

 

 

目录

一.  延时函数的生成 

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

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

二.  LED模块编写原理 

1.LED模块图  

2.编写原理

(1)编写原理

(2)快捷编程 

(3)十六进制编程 

三.  具体编写程序 

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

2.可赋值延时函数编写 

四.  LED流水灯视频

 

一.  延时函数的生成 

 

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

 

 

步骤:

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

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

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

源码如下:

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语句生成可赋值改变的延时函数。 

源码:

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口的头文件如下:

#include <REGX52.H>

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

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

点击打开

查看接口

 

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

例如:

1.定义第一个LED点亮 

P2_0=0;

2.定义第一个LED熄灭

P2_0=1;

(3)十六进制编程 

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

例如:

 

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

 

 

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

	P2=0xFE;

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

 

三.  具体编写程序 

 

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

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

需要被调用的语句:

	_nop_();

需要被调用的头文件:

#include <INTRINS.H>

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

 

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

#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.可赋值延时函数编写 

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

源码:

#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流水灯

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/388004.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2月14日作业

1.请编程实现二维数组的杨慧三角 代码&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, const char *argv[]) {int n;printf("please enter n:");scanf("%d",&n);int arr[n][n];for(…

算法——数论——快速幂

目录 快速幂 费马小定理 一、试题 算法训练 A的B的C次方次方 快速幂 快速幂是一种用于快速计算幂运算的算法。计算复杂度 O(log n)基本思想是利用指数 n 的二进制展开形式&#xff0c;将 转化为多个 a 的幂的乘积&#xff0c;然后通过迭代快速计算。 快速幂的示例代码&…

Zabbix图形中文乱码问题(显示口口)解决办法

一 切换到zabbix安装目录assets/fonts下&#xff0c;下载字体 这里使用是nginxphp作为zabbix-web展示&#xff0c;使用find 命令查找 进入目录下&#xff0c;将原有字体备份&#xff0c;下载msyh字体 wget https://www.xxshell.com/download/sh/zabbix/ttf/msyh.ttf 二 修改配…

基于FPGA的UDP实现(包含源工程文件)

1、概括 前文通过FPGA实现了ARP和ICMP协议&#xff0c;ARP协议一般用来获取目的IP地址主机的MAC地址&#xff0c;ICMP通过回显请求和回显应答来判断以太网链路是否通畅&#xff0c;这两个协议都不是用来传输用户数据的。如果用户需要向PC端传输大量数据&#xff0c;那么就必须使…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第四天-ARM Linux编程之IIC与uart (物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1V0E9IHSoLbpiWJsncmFgdA?pwd1688 提取码&#xff1a;1688 教学内容&#xff1a; 1、I2C总线&#xff1a; I2C&#xff08;Inter&#xff0d;Integrated Circuit),PHILIPS公司开发的两线式半双工同步串行总线&#xff1b;可以用来连…

RCS系统之:浅谈系统设计与开发

这是我在开发RCS系统中的一些个人感悟与心得&#xff0c;写出来与大家一起分享下。是想到什么写到什么&#xff0c;如果有什么不对的&#xff0c;欢迎大家一起探讨。 有些人喜欢把WMS系统下面的系统统称为RCS系统。 但我不是这么想的&#xff0c;我这里把WMS/ERP系统与AGV之间…

AtCoder Beginner Contest 332 --- E - Lucky bag --- 题解

目录 E - Lucky bag 题目大意&#xff1a; 思路解析&#xff1a; 代码实现&#xff1a; E - Lucky bag 题目大意&#xff1a; 思路解析&#xff1a; 在方差中平均值只与输入有关为定值。看到数据范围为 2 < D < N < 15&#xff0c;想到是否能使用状压dp来进行解答…

接口测试方法论

第1章 测试那点事 单元测试》接口测试》界面测试 接口就是包含特定输入和特定输出的一套逻辑处理单元&#xff0c;用户无须知晓接口的内部实现逻辑&#xff0c;这也可以称为接口的黑河处理逻辑。因为服务对象不同&#xff0c;接口又可分为两种&#xff1a;一种是系统或服务的…

LLM Visualization可视化

可视化演示网站&#xff1a;https://bbycroft.net/llm 视频解释&#xff1a;https://www.bilibili.com/video/BV1hZ4y1E7DZ/?spm_id_from333.788&vd_sourcecc2da879c044059d9838f660bcaf4664 欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 …

react【六】 React-Router 路由

文章目录 1、Router1.1 路由1.2 认识React-Router1.3 Link和NavLink1.4 Navigate1.5 Not Found页面配置1.6 路由的嵌套1.7 手动路由的跳转1.7.1 在函数式组件中使用hook1.7.2 在类组件中封装高阶组件 1.8 动态路由传递参数1.9 路由的配置文件以及懒加载 1、Router 1.1 路由 1.…

基于BitVM的乐观 BTC bridge

1. 引言 前序博客&#xff1a; 区块链互操作协议Bitcoin Bridge&#xff1a;治愈还是诅咒&#xff1f;BitVM&#xff1a;Bitcoin的链下合约 基于BitVM的乐观 BTC bridge&#xff1a; Trust-minimized two-way peg 机制 BitVM BTC bridge背后的主要思想是&#xff1a; 为比…

几个经典金融理论

完整EA&#xff1a;Nerve Knife.ex4黄金交易策略_黄金趋势ea-CSDN博客 一、预期效用理论 预期效用理论是描述人们在做出决策时如何考虑风险和不确定性的一种理论。该理论最初由经济学家冯诺伊曼&#xff08;John von Neumann&#xff09;和奥斯卡摩根斯坦恩&#xff08;Oskar…

信号量概念,使用场景,本质,接口函数(pv操作),基于环形队列的生产消费者模型(过程,三个原则,单线程,多线程)

目录 引入​​​​​​​ 介绍 概念 使用场景 引入 介绍 注意 本质 计数器的本质 [判断资源是否就绪] 和互斥锁的关联 接口函数 初始化和销毁信号量 sem_init 函数原型 sem pshared value sem_destroy pv操作 sem_wait ​编辑 sem_post 其他接口 s…

【MySQL进阶之路】MySQL 中的分库分表方案解决方案

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

话题——程序员为什么不喜欢关电脑?

程序员为什么不喜欢关电脑&#xff1f; 方向一&#xff1a;工作流程与需求 程序员的工作往往涉及长时间、连续的任务&#xff0c;如代码编写、调试、测试等。这些任务需要高度的集中和专注&#xff0c;而频繁地关机和重启可能会打断他们的工作流&#xff0c;导致他们需要重新…

猫头虎分享已解决Bug || DNS解析问题(DNS Resolution Issue):DNSLookupFailure, DNSResolveError

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

基于决策树的金融市场波动性预测与应用

基于决策树的金融市场波动性预测与应用 项目背景与意义数据概述与分析数据来源数据特征 数据预处理与特征工程模型训练与评估结果与应用总结 LightGBM是一个机器学习算法库&#xff0c;用于梯度提升机&#xff08;Gradient Boosting Machine&#xff09;的实现。梯度提升机是一…

如何书写一个标准JavaBean

前言&#xff1a;在学习Java类的三大特征之一的封装的时候&#xff0c;对封装的数据Java有着自己已经规定好的书写格式&#xff0c;我们需要按照对应的格式进行书写。 我们大致了解一下要学习的内容&#xff1a; 1.封装的概念 如图&#xff08;看不懂没关系&#xff0c;下面会…

iTop-4412 裸机程序(二十二)- RTC时钟

目录 0.源码1. RTC2. iTop4412 中的 RTC使用的相关寄存器3. BCD编码4. 关键源码 0.源码 GitHub&#xff1a;https://github.com/Kilento/4412NoOS 1. RTC RTC是实时时钟&#xff08;Real Time Clock&#xff09;的缩写&#xff0c;是一种用于计算机系统的硬件设备&#xff0…

2024.02.12作业

1. 段错误 2. 段错误 3. hello 4. world 5. int a; int* a; int **a; int a[10]; int* a[10]; int(* a)[10]; int* a(int); int (*a[10])(int); 6. 6&#xff1b; 2&#xff1b; 2 7. 2 8. 2 9. b 10. a 11. a 12. c 13. b 14. c 15. a 16. c 17. b 18. a 19…