【51单片机】点亮LED之经典流水灯
开发环境
- 开发板:普中51-单核-A2
- 单片机:STC89C52RC(双列直插40引脚 DIP40)
- Keil uVision5 v9.61
最新版破解方法自行百度,相关文档和视频资料很多,我自己将这一操作记录下来当做博客发布,CSDN以版权问题审核不通过。
入门学习单片机的第一个教学程序基本都是点灯,无论是51单片机还是STM32,点灯程序在单片机学习的地位无异于其他编程语言学习的"hello,world"程序。点灯程序简单且效果明显,很容易上手,学过单片机的人人都能成为点灯大师。
思路分析
- 查看开发板原理图,找到LED模块

如图,D1到D8这8个发光二极管的阳极都连接到了VCC(开发板电源正极),这叫做共阳连接,阴极又分别串联一个电阻连接到P2口的0到7这8个引脚。根据二极管导通原理,要让某个LED亮,对应的引脚就业输出低电平(即输出0)。
编码
点亮一个LED
// Version 1: 点亮D1这一个LED
#include <REGX52.H>void main()
{P2=0XFE;while(1){}
}
8个LED呈现亮灭亮灭…的状态
// Version 2: 8个LED交替点亮
#include <REGX52.H>int exitFlag = 0;int main()
{while(1){P2 = 0x55;if (exitFlag == 1){goto EXIT;}}
EXIT:return 0;
}
大部分51单片机教程代码的main函数都是声明为void类型,但是学过C语言的都知道标准的C语言的main函数都是int型的,return 0;是返回给操作系统,告诉系统程序正常执行完毕。但是现在写的点灯程序51单片机没有上操作系统,直接写void main也是有道理的,写成int main(void)纯属我个人习惯,而单片机return 0;又不能写作while(1)里面,否则执行一次就退出,死循环不就失效了,写在循环后面编译又会有一个警告,如下图:
因此只能使用goto语句加标号,去除这个警告,这也纯属个人习惯。虽然初学C语言的时候,被告知少用goto语句,因为会使得程序执行流程非常混乱,但实际上可以灵活应用,只要有把握就好,尽信书,不如无书,goto被发明出来就一定有用得到的地方。
流水灯
延时函数
实现流水灯,就不得不提延时函数了,因为单片机执行程序太快,不加延时看不出流水灯效果,需要加延时,让人眼观察到才行。而STC-ISP就可以生成软件延时代码。
从原理图可以看到开发板载的晶振是12Mhz,所以系统频率也选择12Mhz。指令集选STC-Y1,不同指令集件右边描述适用于哪些系列,正如右边所显示:STC-Y1指令集使用于本开发板的单片机系列。

将生成的代码拷贝到Keil的源代码中。

编写main函数实现主要功能
#include <REGX52.H>void Delay100ms();int exitFlag = 0;int main()
{while(1){P2=0xFE;//1111 1110Delay100ms();P2=0xFD;//1111 1101Delay100ms();P2=0xFB;//1111 1011Delay100ms();P2=0xF7;//1111 0111Delay100ms();P2=0xEF;//1110 1111Delay100ms();P2=0xDF;//1101 1111Delay100ms();P2=0xBF;//1011 1111Delay100ms();P2=0x7F;//0111 1111Delay100ms();if (exitFlag == 1){goto EXIT;}}
EXIT:return 0;
}/* 延时100ms的函数 */
void Delay100ms() //@12.000MHz
{unsigned char i, j;i = 195;j = 138;do{while (--j);} while (--i);
}
程序升级-使用循环
#include <REGX52.H>void Delay100ms();int exitFlag = 0;int main()
{int i;P2 = ~0x01; // 初始值,用于初始显示while(1){for(i = 0; i < 7; i++){P2 = ~(0x01 << i);Delay100ms();}if (exitFlag == 1){goto EXIT;}}
EXIT:return 0;
}/* 延时100ms的函数 */
void Delay100ms() //@12.000MHz
{unsigned char i, j;i = 195;j = 138;do{while (--j);} while (--i);
}
任意毫秒的延时函数的实现
以上代码是以固定100ms的周期闪烁,很无聊!!其实可以用STC-ISP生成1ms延时函数,并利用这个1ms延时函数生成延时任意毫秒的函数方法。

#include <REGX52.H>void Delay1ms();
void DelayXms(int xms);int exitFlag = 0;int main()
{int i;P2 = ~0x01; // 初始值,用于初始显示while(1){for(i = 0; i < 7; i++){P2 = ~(0x01 << i);DelayXms(500); // 以500ms为周期运行流水灯}if (exitFlag == 1){goto EXIT;}}
EXIT:return 0;
}/* 延时1ms */
void Delay1ms() //@12.000MHz
{unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);
}// 传入多少参数,就延时多少毫秒
void DelayXms(int xms)
{int i;for(i = 0; i < xms; i++){Delay1ms();}
}
这样之前的延时100ms的函数就可以用
DelayXms(100);代替了,之前的延时100ms函数的代码就可以删除掉了。因为Keil C51的编译器检测到某些函数定义了却没被调用会报警告,如果对程序编译完报的warning很难受(强迫症),可以删除实际上没有被调用的无用函数,毕竟嵌入式开发非常看重内存资源,这一点没用的小代码也会占用一定的空间。
相关文章:
【51单片机】点亮LED之经典流水灯
开发环境 开发板:普中51-单核-A2单片机:STC89C52RC(双列直插40引脚 DIP40)Keil uVision5 v9.61 最新版破解方法自行百度,相关文档和视频资料很多,我自己将这一操作记录下来当做博客发布,CSDN以…...
深度学习数据增强的常用方法
以下是在深度学习中经常使用的图像增强的方法 目录 前言 1、加噪声 2、调整亮度 3、cutout 4、旋转 5、对比度增强 6、仿射变化扩充图像 7、HSV数据增强 8、错切变化扩充图像 9、平移扩充图像,根图像移动的像素距离可自行调整,具体方法如下注释所示 10、…...
影院管理新篇章:小徐的Spring Boot应用
第三章 系统分析 整个系统的功能模块主要是对各个项目元素组合、分解和更换做出对应的单元,最后在根据各个系统模块来做出一个简单的原则,系统的整体设计是根据用户的需求来进行设计的。为了更好的服务于用户要从小徐影城管理系统的设计与实现方面上做出…...
【H2O2|全栈】关于CSS(9)CSS3扩充了哪些新鲜的东西?(二)
目录 CSS3入门 前言 准备工作 伪元素补充 :before :after 文本溢出属性 转换效果 预告和回顾 后话 CSS3入门 前言 本系列博客主要介绍CSS相关的知识点。 这一期主要介绍以下几个CSS3的知识点: 伪元素补充文本溢出属性转换 没有基础的朋友ÿ…...
java中Files和File对象详情和区别比较
Files 和 File 是 Java 中用于文件处理的两个不同类,分别属于 java.nio.file 和 java.io 包,它们的设计思路和用途有所不同。以下是它们的详细区别: 1. File 对象 File 是 Java 中最早用于处理文件和目录的类,它来自 java.io 包&…...
Unity3D PostLateUpdate为何突然占用大量时间详解
在Unity3D中,直接名为PostLateUpdate的函数并不是Unity标准API中的一部分。然而,这个术语可能指的是在LateUpdate之后执行的某些自定义逻辑或Unity内部机制中的某种后续处理。当提到PostLateUpdate或LateUpdate突然占用大量时间时,我们需要考…...
如何快速熟悉项目
背景 最近新入职,对项目很不熟悉,也不能全部依赖别人(别人也不会全心全意去帮你),你大部分还是只能靠自己。材料就是:文档,代码,开发环境。 但是文档,代码,都…...
Spring Boot实现新闻个性化推荐
1系统概述 1.1 研究背景 如今互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等。从而,这种种好处使得互联网成了信息传…...
优化后的版本
docker_operations.sh #!/bin/bash# all definition NETWORK_NAME"net-1" VOLUME_MOUNT"-v /home/norten/Public/tools:/mnt" # 容器内部挂载到主机的路径 SCRIPT_ROUTE"/mnt" # container_run_medium.sh所在的路径 IMAGE_NAME"ubuntu&quo…...
【Linux系统编程】第二十七弹---文件描述符与重定向:fd奥秘、dup2应用与Shell重定向实战
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、文件描述符fd 1.1、0 & 1 & 2 1.2、文件描述符的分配规则 2、重定向 3、使用 dup2 系统调用 3.1、> 输出…...
开放式耳机哪个品牌好?好用且高性价比的开放式蓝牙耳机推荐
相信很多经常运动的朋友都不是很喜欢佩戴入耳式耳机,因为入耳式耳机真的有很多缺点。 安全方面:在安全上就很容易存在隐患,戴上后难以听到周围环境声音,像汽车鸣笛、行人呼喊等,容易在运动中发生意外。 健康方面&…...
区间合并——模板题
题目描述 给定 n 个区间 [li, ri],要求合并所有有交集的区间。注意如果在端点处相交,也算有交集。 输出合并完成后的区间个数。 例如:[1, 3] 和 [2, 6] 可以合并为一个区间 [1, 6]。 输入格式 第一行包含整数 n 。 接下来 n 行,…...
Microsoft Edge 五个好用的插件
🐣个人主页 可惜已不在 🐤这篇在这个专栏 插件_可惜已不在的博客-CSDN博客 🐥有用的话就留下一个三连吧😼 目录 Microsoft Edge 一.安装游览器 编辑 二.找到插件商店 1.打开游览器后,点击右上角的设置&#…...
解决 遇到JWT中claims中获取不到数据的问题
1.先介绍一下JWT的常规流程 用户进行登录将token储存到redis,然后进行其他需要验证的操作时进行验证,比如使用拦截器进行验证,那么id存储的到claims,因为可以在拦截器验证时将其存放到ThreadLocal中,这样通过ThreadLo…...
会议平台后端优化方案
会议平台后端优化方案 通过RTC的学习,我了解到了端对端技术,就想着做一个节省服务器资源的会议平台 之前做了这个项目,快手二面被问到卡着不知如何介绍,便有了这篇文章 分析当下机制 相对于传统视频平台(SFUÿ…...
unixODBC编程(十)分片插入长数据
遇到有LONG数据类型的表,要插入一条数据量很大的行,一次插入的缓冲区会不够大,这时需要一部分一部分的插入LONG数据,这就用到了在执行语句时动态提供数据的机制。在ODBC中要动态提供数据需要几个步骤。 1. 在绑定输入参数时&…...
【Java】—— 集合框架:Collection子接口:Set不同实现类的对比及使用(HashSet、LinkedHashSet、TreeSet)
目录 5. Collection子接口2:Set 5.1 Set接口概述 5.2 Set主要实现类:HashSet 5.2.1 HashSet概述 5.2.2 HashSet中添加元素的过程: 5.2.3 重写 hashCode() 方法的基本原则 5.2.4 重写equals()方法的基本原则 5.2.5 练习 5.3 Set实现类…...
android Activity生命周期
android 中一个 activity 在其生命周期中会经历多种状态。 您可以使用一系列回调来处理状态之间的转换。下面我们来介绍这些回调。 onCreate(创建阶段) 初始化组件:在这个阶段,Activity的主要工作是进行初始化操作。这包括为Ac…...
C#的面向对象
1)对象 算法数据结构 2)对象的行为已方法的形式定义的,属性以成员变量的形式定义的 面向对象程序设计的特点 1)封装性 2)继承性 3)多态性 知识点: 封装性面向对象的核心思想,将…...
【区别】三种命令取消已暂存的文件,处理暂存区和文件的跟踪状态
取消已暂存的文件 git restore --staged <文件>、git reset HEAD <文件> 和 git rm --cached <文件> 都可以用于取消已暂存的文件,但它们的作用和使用场景略有不同。下面是它们的区别: 1. git restore --staged <文件> 该命令…...
把SAC model的数据导出到BW的ADSO中
目录 1. SAC 侧的准备 1.1 OData连接要做好 1.2 SAC里的model设置要配置好允许导出到Odata 2. BW侧要做的准备(先跟着SAP的note走) 3. SAC 模型数据导出 一般都是把planning model的数据导出到一个ADSO中,然后再用Composite Provider里…...
层次聚类实战:从距离选择到树形切割的业务可解释路径
1. 这不是“调个sklearn就能跑”的聚类——为什么 hierarchical clustering 值得你花两小时真正搞懂Hierarchical clustering(层次聚类)这个词,听起来像教科书里一个安静的章节,不如 K-means 那样高频出现在面试题里,也…...
Unity节点化效率工具:ComfyUI范式赋能中大型项目开发
1. 这不是又一个“UI美化插件”,而是Unity开发者每天要敲十次的底层效率杠杆Efficiency Nodes ComfyUI——光看名字,很多人第一反应是“ComfyUI?那不是Stable Diffusion的可视化工作流工具吗?怎么跑Unity里来了?”这恰…...
工具调用优化:减少API延迟对Agent性能的影响
《工具调用优化全指南:彻底解决API延迟拖累大模型Agent性能的痛点》 副标题:从原理到落地,覆盖缓存、并行、调度、轻量化改造全链路可复现方案 第一部分:引言与基础 1.1 摘要/引言 你有没有遇到过这种场景:辛辛苦苦开发的智能Agent功能非常强大,能查订单、搜资料、算数…...
PostHog完整指南:5分钟搭建开源产品分析平台,免费监控用户行为
PostHog完整指南:5分钟搭建开源产品分析平台,免费监控用户行为 【免费下载链接】posthog.com Official docs, website, and handbook for PostHog. 项目地址: https://gitcode.com/GitHub_Trending/po/posthog.com PostHog是一款功能强大的开源产…...
Captain AI:Ozon俄文内容本地化,打破语言壁垒,贴合本土需求
俄文内容本地化是Ozon商家立足俄罗斯市场的核心前提,Ozon平台95%以上的用户为俄语母语者,纯中文或机翻的内容不仅会导致搜索曝光降低,还可能因语言错误引发合规风险、影响买家信任。然而,国内商家普遍面临“俄语专业人才短缺、机翻…...
5分钟快速上手!网易云无损音乐下载完整指南:免费获取高品质音乐
5分钟快速上手!网易云无损音乐下载完整指南:免费获取高品质音乐 【免费下载链接】Netease_url 网易云无损解析 项目地址: https://gitcode.com/gh_mirrors/ne/Netease_url 想要免费获取网易云音乐的无损音质歌曲吗?Netease_url项目让你…...
ElevenLabs台湾话语音上线后用户留存率骤降47%?揭秘方言语料清洗盲区与3步合规性校验法
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs台湾话语音上线后用户留存率骤降47%?揭秘方言语料清洗盲区与3步合规性校验法 ElevenLabs于2024年Q2正式上线台湾话(闽南语)语音合成服务,初期D…...
基于 PyTorch 的 TransU-Net 模型进行不同城市建筑物的精准提取 来继续遥感图像语义分割
基于 PyTorch 的 TransU-Net 模型进行不同城市建筑物的精准提取 来继续遥感图像语义分割 遥感图像语义分割,遥感建筑物数据集,基于Pytorch框架,针对不同城市建筑物精准提取。 遥感图像中包含丰富的地理空间信息,从遥感图像中了…...
OpCore-Simplify:10分钟搞定黑苹果配置,告别3天手动调试的智能神器
OpCore-Simplify:10分钟搞定黑苹果配置,告别3天手动调试的智能神器 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂…...



