【51单片机】点亮LED之经典流水灯

开发环境

  1. 开发板:普中51-单核-A2
  2. 单片机:STC89C52RC(双列直插40引脚 DIP40)
  3. Keil uVision5 v9.61

最新版破解方法自行百度,相关文档和视频资料很多,我自己将这一操作记录下来当做博客发布,CSDN以版权问题审核不通过。在这里插入图片描述

入门学习单片机的第一个教学程序基本都是点灯,无论是51单片机还是STM32,点灯程序在单片机学习的地位无异于其他编程语言学习的"hello,world"程序。点灯程序简单且效果明显,很容易上手,学过单片机的人人都能成为点灯大师。

思路分析

  1. 查看开发板原理图,找到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很难受(强迫症),可以删除实际上没有被调用的无用函数,毕竟嵌入式开发非常看重内存资源,这一点没用的小代码也会占用一定的空间。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通信工程学习:什么是ICMP因特网控制报文协议

ICMP&#xff1a;因特网控制报文协议 ICMP&#xff08;Internet Control Message Protocol&#xff0c;因特网控制报文协议&#xff09;是TCP/IP协议簇中的一个重要子协议&#xff0c;主要用于在IP主机和路由器之间传递控制消息。以下是关于ICMP协议的详细解释&#xff1a; 一…

用CSS创造三角形案例

6.3.2 用CSS创造三角形 用div来创建&#xff0c;角上是平分的&#xff0c;所以要是内部宽高为0&#xff0c;其他边透明&#xff0c;正好是三角形。 代码 div {border: 12px solid;width: 0;height: 0;border-color: transparent red transparent transparent; } 与伪元素aft…

HUAWEI WATCH GT 系列安装第三方应用

文章目录 适用机型概述官方文档从源码构建 hap 文件和对源码签名下载和安装DevEco Studio下载和安装首次启动推荐&#xff1a;设置IDE推荐的兼容版本环境&#xff08;可选&#xff09;安装并启用中文菜单插件 使用DevEco Studio打开项目并进行构建构建问题解决一、生成密钥和证…

Grafana链接iframe嵌入Web前端一直跳登录页面的问题记录

概述 公司有个项目使用到Grafana作为监控界面,因为项目方的环境极其复杂,仅物理隔离的环境就有三四个,而且每个都得部署项目,今天在某个环境测试,查看界面遇到一个比较奇怪的Grafana问题,后面针对该问题进行跟踪分析并解决,故而博文记录,用于备忘。 问题 登录项目We…

Hive数仓操作(十三)

一、JSON 数据 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;在不同的编程语言之间进行数据传输时非常通用和常用。JSON 格式简单直观&#xff0c;易于阅读和编写&#xff0c;并且可以被大多数编程语言轻松解析和生成。 1.…

数据结构与算法——Java实现 27.双端队列

很多人觉得做一件事付出了10分的努力&#xff0c;却只得到5分的汇报。 其实剩下的五分&#xff0c;是在填补你过往的懒惰。 只有将过往的懒惰填满&#xff0c; 努力才会有正向结果 —— 24.10.3 一、概述 双端队列、队列、栈对比&#xff1a; 队列 一端删除&#xff08;头&am…

C++ STL 初探:打开标准模板库的大门

文章目录 C STL 初探&#xff1a;打开标准模板库的大门前言第一章: 什么是STL&#xff1f;1.1 标准模板库简介1.2 STL的历史背景1.3 STL的组成 第二章: STL的版本与演进2.1 不同的STL版本2.2 STL的影响与重要性 第三章: 为什么学习 STL&#xff1f;3.1 从手动编写到标准化解决方…

探索云计算中的 Serverless 架构:未来的计算范式?

目录 引言 一、Serverless架构概览 二、Serverless 架构的优势 三、Serverless架构的挑战 四、Serverless架构的未来展望 五、结论 引言 在当今快速发展的 IT 行业中&#xff0c;云计算无疑占据了举足轻重的地位。随着技术的不断演进&#xff0c;云计算的一个新兴分支——…

Go语言实现长连接并发框架 - 请求分发器

文章目录 前言接口结构体接口实现项目地址最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;我们上篇博客实现了任务管理器的功能&#xff0c;接下来这篇博客我们将要实现请求分发模块的开发 接口 trait/dispatcher.go type Dispatcher interface {Start()Dispatch(conn…

每日一题学习笔记

统计字符串中的单词个数&#xff0c;这里的单词指的是连续的不是空格的字符。 请注意&#xff0c;你可以假定字符串里不包括任何不可打印的字符。 示例: 输入: "Hello, my name is John" 输出: 5 解释: 这里的单词是指连续的不是空格的字符&#xff0c;所以 "…

Golang | Leetcode Golang题解之第454题四数相加II

题目&#xff1a; 题解&#xff1a; func fourSumCount(a, b, c, d []int) (ans int) {countAB : map[int]int{}for _, v : range a {for _, w : range b {countAB[vw]}}for _, v : range c {for _, w : range d {ans countAB[-v-w]}}return }

骨架屏 (懒加载优化)

骨架屏 &#xff08;懒加载优化&#xff09; 即便通过 Webpack 的按需加载、CDN 静态资源缓存 和 代码分割 等技术来减少首屏的代码体积&#xff0c;首屏加载时的白屏时间&#xff08;也称为首屏等待时间&#xff09;仍然可能存在&#xff0c;尤其在网络条件较差或页面内容复杂…

【前端安全】js逆向之微信公众号登录密码

❤️博客主页&#xff1a; iknow181 &#x1f525;系列专栏&#xff1a; 网络安全、 Python、JavaSE、JavaWeb、CCNP &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 随着发展&#xff0c;越来越多的登录页面添加了密码加密的措施&#xff0c;使得暴力破解变得不在简单&a…

el-table添加fixed后错位问题

1 方案1 return {isShow:false, }mounted() {this.isShowtrue},watch: {$route(newRoute) {this.monitoredRoute newRoute; // 将新的路由信息保存到组件的monitoredRoute属性中// 执行其他操作或调用其他方法},//或$route(newRoute) {this.monitoredRoute newRoute; // 将新…

python三局两胜游戏

分为以下步骤实现这个功能 1、猜拳 2、机器产生数值 3、人去猜数字&#xff0c;定义剪刀石头布 4、控制机器产生&#xff0c;123程序运行的时候可能会出现一点玄学问题&#xff0c;就是&#xff0c;提示n1这一行不符合pep8然后报错&#xff0c;不用管&#xff0c;运行就可以&am…

在Linux系统安装Nginx

注意&#xff1a;Nginx端口号是80(云服务器要放行) 我的是基于yum源安装 安装yum源(下面这4步就好了) YUM源 1、将源文件备份 cd /etc/yum.repos.d/ && mkdir backup && mv *repo backup/ 2、下载阿里源文件 curl -o /etc/yum.repos.d/CentOS-Base.repo ht…

【三步 完全离线搭建 openwebui 】

完全离线linux 版open webui 的搭建 1.在具有网络连接的环境中下载whl 在有网络的环境&#xff0c;使用pip download可以保存所有的依赖包,可以使用-i 指定清华的镜像源加速下载速度。 # 命令&#xff1a; pip download <package_name> --only-binary:all: --wheel --…

VS Code Python 文件导入提示 xxx Module 不存在解决方式

VS Code Python 文件导入提示 xxx Module 不存在解决方式 引言正文如何打开 setting.json 文件引言 之前在 https://blog.csdn.net/u011699626/article/details/142612579?spm=1001.2014.3001.5501 一文中我们介绍了如何配置 VS code 中 Jupyter Notebook 的文件导入环境,这…

接口+内部类

接口和内部类是Java中两个重要的概念&#xff0c;可以在代码中使用它们来实现更灵活和模块化的设计。 接口是一种定义了一组抽象方法的特殊类&#xff0c;其中的方法没有具体的实现。通过实现接口&#xff0c;一个类可以获得接口中定义的方法&#xff0c;并提供实际的实现。接…

使用rust写一个Web服务器——多线程版本

文章目录 模拟慢请求多线程Web服务器实现为每个请求单独生成一个线程限制创建线程的数量ThreadPool的初始化ThreadPool的存储ThreadPool的设计 关闭和资源清理为ThreadPool实现Drop停止工作线程测试 仓库地址&#xff1a; 1037827920/web-server: 使用rust编写的简单web服务器 …