❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括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个灯循环闪烁的流水灯:
文章来源地址https://www.toymoban.com/news/detail-424274.html
一、准备工作
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--;
}
}
两种代码都和第二节种的代码类似,就不一行一行的讲解了。如果有不理解的地方欢迎留言讨论。同样的过程,下载到单片机中即可看到流水灯的效果:文章来源:https://www.toymoban.com/news/detail-424274.html
到了这里,关于51单片机(二)成功点亮LED的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!