51单片机(二)成功点亮LED

news2024/10/6 6:45:26

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其实STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。
☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋。
🌙专栏目标:实现从零基础入门51单片机和STM32单片机,力求在玩好单片机的同时,能够了解一些计算机的基本概念,了解电路及其元器件的基本理论等。

⭐️ 专栏主要内容: 主要学习51单片机的功能、各个模块、单片机的外设、驱动等,最终玩好单片机和单片机的外设,全程手敲代码,实现我们所要实现的功能。
🌴 专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。
💑专栏主页:http://t.csdn.cn/HCD8v

本学习过程参考:https://space.bilibili.com/383400717

单片机安装软件、各种资料以及源码的路径:
https://pan.baidu.com/s/1vDTN2o8ffvczzNQGfyjHng
提取码:gdzf

文章目录

  • 本节目标
  • 一、准备工作
    • 1.1 LED原理介绍(很重要!!!!)
    • 1.2 建立keil工程并添加源文件
    • 1.3 选择生成hex文件
  • 二、点亮一个LED
  • 三、LED闪烁
  • 四、LED流水灯

本节目标

本节会学习如何利用51单片机去控制开发板上的LED。LED模块在开发板上的位置如下图所示:图中红框框出来的就是LED模块;

在这里插入图片描述
本节将写三个程序代码,分别实现的功能是:

第一个代码点亮一个LED:

在这里插入图片描述

第二个代码实现的功能是让第一个灯以1s为周期闪烁:

在这里插入图片描述

第三个代码实现的功能是D1-D88个灯循环闪烁的流水灯:

在这里插入图片描述

一、准备工作

1.1 LED原理介绍(很重要!!!!)

在这里插入图片描述

LED灯在开发板上的连接方式:

请见51单片机入门教程资料\开发板资料包\HC6800-ES V2.0\开发板原理图\HC6800-ES+V2.0+新版.pdf

在这里插入图片描述
按照左边红色的引脚图,结合pdf文件中的MCU引脚图总览可以看到,LED是大致接在MCU的右下角位置的,如下图所示:
在这里插入图片描述

LED具体结构如下:
在这里插入图片描述
单片机的P2口(P20-P27)都对应着TTL电平,即高电平5v低电平0v,例如当P20口输出低电平时,则D1灯点亮,P20口输出高电平时,D1灯不亮;所以控制单片机接口的高低电平输出,即可实现对D1等LED灯的控制;那么如何实现对P20口高低电平的控制呢?
在这里插入图片描述

以P2口为例,MCU中的结构如上图所示,CPU和寄存器相连,寄存器和硬件i/o口相连;寄存器寄存器8个为一组,分别对应着硬件i/o口的P20-P27,最下面的低地址寄存器对应着P20口,依次类推,最上面的高地址寄存器对应着P27口;每个寄存器中存放1和0两个数字,如果寄存器中放的是数字1,那么对应的i/o口就会输出高电平,反之,如果寄存器中放的是数字0,那么对应的i/o口就会输出低电平;所以i/o口输出高电平还是低电平,就由CPU向寄存器中写入的数字决定;例如,如果寄存器中存放的数字是1111 1110(从左往右是高地址->低地址,即对应着上图中的寄存器从上到下) ,即说明P27口到P21口都是1即高电平,P20口对应的是低电平,则只有P20口对应的LED灯会亮

CPU通过配置寄存器中的1和0,实现对硬件电路i/o口的高低电平配置

1.2 建立keil工程并添加源文件

打开keil5软件,新建一个工程:
在这里插入图片描述
选择路径
在这里插入图片描述
然后弹出窗口让我们选择单片机的型号,找到我们单片机的型号,比如本文用的是STC89C52,但是keil软件里对中国生产的单片机不太友好,找不到该型号,因此可以选择Atmel里的AT89C5代替:
在这里插入图片描述
在这里插入图片描述
是否自动添加启动文件,选择否即可:
在这里插入图片描述
此时我们的工程就建好了,其中Source Group 1就是我们编写代码的文件夹:
在这里插入图片描述

在Source Group 1上面右键,添加代码文件(我们选择C语言文件),并起名为main:

在这里插入图片描述
在这里插入图片描述
然后就可以对main.c进行编写,编译,构建等操作了:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一般我们写好代码之后都会点击build进行构建,如下例子,我们写个main函数,进行构建:
在这里插入图片描述
会发现构建结果为0错误0警告。

1.3 选择生成hex文件

要想将程序下载到单片机中,必须生成HEX文件,配置过程如下步骤1 2 3 4所示:
在这里插入图片描述

二、点亮一个LED

有了1.1 LED介绍节的基础,我们可以知道操作P2口对应的寄存器即可实现对P2口高低电平的控制,进而控制P2口对应的LED灯的亮和灭,在main.c中输入以下代码:
在这里插入图片描述
其中P2定义在REGX52.H头文件中,代表P2口,0xFE代表16进制,换算成2进制就是1111 1110;然后将这段代码build,会发现0错误0警告:

#include <REGX52.H>

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

在这里插入图片描述

然后将此段代码下载到单片机中,打开STC-ISP软件,单片机型号选择STC89C52系列下面的STC89C52,如下图
在这里插入图片描述
串口号选择如下:
在这里插入图片描述
然后“打开程序文件”,选择刚刚我们建好的工程下面build生成的的Project.hex文件,打开->下载/编程:
在这里插入图片描述
在这里插入图片描述

然后将开发板上的开关按两次,即可发现第一个LED灯亮了。

在这里插入图片描述

三、LED闪烁

源码路径:
51单片机入门教程资料\课件及程序源码\程序源码\KeilProject\2-2 LED闪烁

按照上面1.2和1.3新建另一个工程,可以起名为2-2LED灯闪烁,并新增源文件。源文件中输入以下代码:

#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=0xFF;	//1111 1111
		Delay500ms();
	}
}

下面解释一下代码的含义:
首先P2=0xFE; //1111 1110,通过上面的学习,可以得知该代码可以控制第一个LED亮。
Delay500ms()函数的功能是延时500ms,至于这个函数是如何生成的,下面会讲解。
P2=0xFF可以控制第一个LED亮;
所以代码最终的效果是,第一个LED灯先亮,500ms后灭,500ms后再亮,一直循环。

Delay500ms()函数是如何实现的呢?过程如下:
在STC-ISP工具中,找到“软件延时计算器”,按照下图分别设置系统频率、定时长度和8051指令集,然后点复制代码,在Keil5中粘贴即可。
在这里插入图片描述
需要注意的是,Delay500ms()中包含_nop_()函数,该函数是包含在INTRINS.H头文件中的,所以在main.c文件中要包含该头文件。

代码写好后,点击rebuild,然后参考第一节的过程,将写好的程序下载到单片机上,重新开关两次开发板的开关,即可看到LED灯闪烁的效果。

在这里插入图片描述

四、LED流水灯

源码路径:51单片机入门教程资料\课件及程序源码\程序源码\KeilProject\2-3 LED流水灯
51单片机入门教程资料\课件及程序源码\程序源码\KeilProject\2-4 LED流水灯Plus

和第二节类似,重新建立工程,将main.c文件换成以下代码,提供两种方法:
方法1:

#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();
	}
}

方法2:

#include <REGX52.H>

void Delay1ms(unsigned int xms);		//@12.000MHz

void main()
{
	while(1)
	{
		P2=0xFE;//1111 1110
		Delay1ms(1000);
		P2=0xFD;//1111 1101
		Delay1ms(1000);
		P2=0xFB;//1111 1011
		Delay1ms(100);
		P2=0xF7;//1111 0111
		Delay1ms(100);
		P2=0xEF;//1110 1111
		Delay1ms(100);
		P2=0xDF;//1101 1111
		Delay1ms(100);
		P2=0xBF;//1011 1111
		Delay1ms(100);
		P2=0x7F;//0111 1111
		Delay1ms(100);
	}
}

void Delay1ms(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

两种代码都和第二节种的代码类似,就不一行一行的讲解了。如果有不理解的地方欢迎留言讨论。同样的过程,下载到单片机中即可看到流水灯的效果:

在这里插入图片描述

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

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

相关文章

nuxt3 + pinia + swiper +element-plus + less + 腾讯地图 创建项目及使用

一。先说优点 1、基于Vue3&#xff1a; Nuxt3是基于Vue.js 3开发的&#xff0c;Vue.js 3是目前最流行的前端框架之一。 这意味着你可以利用Vue3的所有优势&#xff0c;如性能优化、响应式编程、更好的TypeScript支持等。2、服务端渲染&#xff08;SSR&#xff09;&#xff1a…

C++之引用的介绍

目录 前言 引用 1.引用的概念 2.引用特性 3.引用的权限 4. 使用场景 4.1 做参数 4.2 做返回值 5.引用和指针的区别 前言 相信大家都看过水浒传&#xff0c;里面的英雄人物除了自己的名字外都有自己的称号&#xff0c;比如&#xff1a;花和尚——鲁智深&#xff0c;豹…

centOS7.9安装nginx

此示例为安装nginx-1.20.1 &#xff08;小版本无差别&#xff09; 安装过程 sftp上传nginx-1.20.1.tar.gz文件到机器&#xff08;在root目录下&#xff09; #cd /usr/local/nginx/sbin #./nginx -V (查看版本&#xff0c;如果已经有安装过的话会出现版本号) 切换到loca…

k8s 源码分析 informer篇

之前介绍过informer的流程&#xff0c;文章在 informer介绍。今天梳理一下他的源码和流程。 一、概念 什么是 Informer informer 是 client-go 中的核心工具包&#xff0c;informer 其实就是一个带有本地缓存和索引机制的&#xff0c;可以注册 EventHandler 的 client 本地缓存…

L2-1 堆宝塔

堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小&#xff0c;按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明宝宝采取的策略如下&#xff1a; 首先准备两根柱子&#xff0c;一根 A 柱串宝塔&#xff0c;一根 B 柱用于临时叠放。把第 1 块彩虹圈…

Linux下使用Mysql 第一天

目录 安装mysql 更改账户名和密码 启动/关闭mysql mysql的基本操作 数据库CURD 创建数据库 查看数据库 修改数据库 删除数据库 表的CURD 创建表 查看表 修改表 删除表 表数据的CURD create数据 Retrieve数据 update数据 delete数据 DML和DDL的区别&#xf…

波形生成:均匀和非均匀时间向量

波形生成—— 脉冲、chirp、VCO、正弦函数、周期性/非周期性和调制信号 使用 chirp 生成线性、二次和对数 chirp。使用 square、rectpuls 和 sawtooth 创建方波、矩形波和三角形波。 如需了解此处未显示的其他无线波形生成功能&#xff0c;请参阅无线波形发生器 (Communicat…

【腾讯云-2】极简搭建边缘集群

1 创建 流程和https://blog.csdn.net/qq_47058489/article/details/130347795差不多&#xff0c;可参考 查看基本信息&#xff1a; 创建边缘集群的过程中会初始化master&#xff0c;说明包含一个托管master节点 但是没有其他节点 2 开启节点远程登录 通过 SSH 的方式远…

JavaScript模块化开发

目录&#xff1a; 1 认识模块化开发 2 CommonJS和Node 3 require函数解析 4 AMD和CMD&#xff08;了解&#xff09; 5 ESModule用法详解 6 ESModule运行原理 模块化不是两个不同的js文件直接导入到某个页面中的&#xff0c;因为这两个文件只要有相同的变量或函数&#xf…

html学习(标签、css、选择器)

认识HTML HTML是HyperText Markup Language的缩写&#xff0c;中文名为超文本标记语言。它是一种用来创建网页的标准标记语言&#xff0c;由标签&#xff08;tag&#xff09;和文本构成&#xff0c;用于描述网页的结构和内容。HTML文档可以被浏览器解析并呈现出网页的内容和样…

方向梯度直方图(Histogram of Oriented Gradient)

1.方向梯度直方图&#xff08;Histogram of Oriented Gradient&#xff09; 笔记参考&#xff1a;HOG特征提取 笔记参考&#xff1a;一文讲解方向梯度直方图&#xff08;hog&#xff09; 笔记参考&#xff1a;Histogram of Oriented Gradients (HOG) | By Dr. Ry Stemplicity …

【Java-01】深入浅出匿名对象 , 继承 , 抽象类

主要内容 面向对象回顾 匿名对象介绍 面向对象特征 - 继承 抽象类的使用 模板设计模式 1 面向对象回顾 面向对象的核心思想是什么 ? 用代码来模拟现实生活中的事物 , 比如学生类表示学生事物 , 对象表示的就是具体的学生 , 有了类就可以描述万千世界所有的事物了 现有的…

【PaddleNLP-kie】关键信息抽取2:UIE模型做图片信息提取全流程

文章目录 本文参考UIE理论部分step0、UIEX原始模型使用网页体验本机安装使用环境安装快速开始 step1、UIEX模型微调&#xff08;小样本学习&#xff09;微调模型对比step2、服务化部署step3、提升推理速度模型量化更换模型fast-tokenizer提高batch_size&#xff08;没用&#x…

第十一章 组合模式

文章目录 前言一、组合模式基本介绍二、UML类图三、完整代码抽象类&#xff0c;所有类都继承此类学校类以父类型引用组合一个学院类学院类以父类型引用组合一个专业类专业类&#xff0c;叶子节点&#xff0c;不能再组合其他类测试类 四、组合模式在JDK集合的源码分析五、组合模…

51单片机(一)软硬件环境和单片机介绍

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其实STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

delta.io 参数 spark.databricks.delta.replaceWhere.constraintCheck.enabled

总结 默认值true 你写入的df分区字段必须全部符合覆盖条件 .option("replaceWhere", "c2 == 2") false: df1 overwrite tb1: df1中每个分区的处理逻辑: - tb1中存在(且谓词中匹配)的分区,则覆盖 - tb1中存在(谓词中不匹配)的分区,则append - tb1中不存…

热闹之后,香港是否会成为Web3的“应许之地”?

出品&#xff5c;欧科云链研究院 作者&#xff5c;Jason Jiang 自从2022年底有关虚拟资产在港发展的政策宣言发布后&#xff0c;香港始终是Web3世界的焦点。当港府官员频繁现身以鼓励Web3创新发展&#xff0c;当数以万计的Web3 Builders时隔三年再次聚首香江&#xff0c;当传…

密码学报Latex模板使用

密码学报Latex模板使用 首先从密码学报下载模板 然后注册overleaf账号 创建新项目&#xff0c;把.zip包导入 修改编译器为XeLaTeX 然后点击重新编译即可

信息安全复习六:公开密钥密码学

一、章节梗概 1.公开密钥密码模型的基本原理 2.两个算法&#xff1a;RSA&D-H算法 主要内容 1.对称密钥密码的密钥交换问题 2.公钥密码模型的提出 3.设计公钥密码的基本要求 4.数字签名 5.RSA算法 6.公钥密码的特征总结 二、对称密钥密码 对称加密算法中&#xff0c;数据…

SpringCloud --- Feign远程调用

一、RestTemplate问题 先来看我们以前利用RestTemplate发起远程调用的代码&#xff1a; 存在下面的问题&#xff1a; 代码可读性差&#xff0c;编程体验不统一参数复杂URL难以维护 Feign是一个声明式的http客户端&#xff0c;官方地址&#xff1a;GitHub - OpenFeign/feign:…