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

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括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

本节目标

本节会学习如何利用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--;
	}
}

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

在这里插入图片描述

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乘凉~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值