51单片机入门(2)
本章涉及内容:Keil软件的使用,STC-ISP的使用;点亮一个LED;让一个LED闪烁;流水灯。
目录
前言
从本章开始,将会介绍如何实现单片机的相关功能。涉及到如何创建工程,编写C语言代码,和相关软件的使用(如何烧录程序到单片机)。
一、使用Keil5创建一个项目
1、项目的创建
双击打开Keil5软件后,在菜单栏中点击“Project”后,再点击下方的“New μVision Project”。
之后会提示选择创建项目的位置
这里我创建一个名为KeilProject的文件夹,用来保存所有的Keil文件。点击打开后,还需要在创建一个项目。
再点击打开后,在下方文件名位置输入“Project”(这个文件名可随意,尽量使用通用或易懂的名称)。
点击保存之后,会提示输入所拥有的单片机的型号。
这里我们点击“Atmel”左方加号,并下拉,找到“AT89C52”。
点击OK,界面会提示我们“是否将‘STARTUP.A51’复制到工程文件夹并将文件添加到Project中?”。这里我们选择否,不用创建。
如此便完成了项目的创建。
2、主体文件的创建
首先右键左方项目中“Source Group 1”,在下拉菜单中点击“Add New Item...”。
在弹出的文件设置界面中,选择C File,文件命名为main(第一个项目文件都应是main文件)。
随后点击Add,即可添加完成。
此后,编写有关于单片机的C语言代码用该软件即可。
3、.hex文件的编译
在Keil中编译好程序之后,直接点击Build,是不会创建hex文件的。需要点击Options,再点击Output标签,勾选上“Create HEX File”,再点击OK。即可在点击Build后,创建hex文件。(.hex文件用于使用STC-ISP软件对单片机进行程序烧录)
它会自动将生成的.hex文件保存在Project文件夹中。
二、 STC-ISP辅助软件的使用
1、STC-ISP介绍
STC-ISP是针对STC单片机设计的在线下载程序,可用于对STC单片机进行编程、调试和烧录等操作。同时其内部集成了“定时器计算器”“软件延时计算器”等工具,在使用时会有很大帮助。
2、STC-ISP的使用
(1)首先在单片机型号中选择对应的型号。这里使用的是“STC89C52RC”
(2)选择好后,点击“打开程序文件”。
(3)在弹出的打开文件窗口中,找到我们用Keil编译生成的.hex文件。
(4)导入之后,点击“下载/编程”。(需要重新开关单片机)
注:一定要检查单片机是否与电脑连接成功,在选择对应的型号并连接之后,会自动扫描,显示串口名称。如下。此时COM3是在后方括号内,表示成功连接。
(5)完成以上步骤后,会在右下方的提示区显示“操作成功”,单片机也随之完成相应程序。
三、LED模块及介绍
1、LED模块
2、LED模块介绍
图中D1~D8分别为8个LED灯,RP9与RP10是两组限流电阻,每组四个。P20~P27表示P2寄存器中八个LED的编号,分别对应为0~7。
那如何实现点亮LED灯呢?在单片机中,CPU通过直接访问P2寄存器的方式,让对应的寄存器分别输出高电平或低电平(1代表高电平,0代表低电平)。这样就可以实现控制LED模块中LED灯的发亮或熄灭了。
我们使用的LED模块中有8个LED,只需要让寄存器给对应LED传输发亮或熄灭的指令即可,上面提到用1或0代表高或低电平,高电平熄灭,低电平发亮。这样用8个1或0组合即可控制对应位的灯是否发亮。如1110 1111表示让第五个LED灯发亮(从右往左读),也就是对应图中编号为D5的LED发亮。
这个8个LED灯的状态是由P2寄存器给定的,所以要将该指令给到P2。
可以发现,这一串数就相当于是一个二进制数,而在C语言中无法写二进制数(会自动被识别成十进制),所以就需要学会数制的转换,转换成16进制数。1110 1111转换成16进制数即为0xEF(C语言中表示16进制数要在前方加上0x)。
二进制转换成十六进制可以使用计算器来辅助操作。下面进行C语言实现LED模块相关功能。
四、编写C代码实现LED的活动
1、点亮一个LED
(1)原理分析:
点亮第5个LED,其对应的二进制数为1110 1111,转换成16进制数为0xEF。P2表示寄存器,控制寄存器等于该段数值即可。
注意要引入<REGX52.H>这个头文件。编写好代码后,构建代码并生成.hex文件,使用STC-ISP将程序烧录到单片机中。(程序烧录请详看STC-ISP的使用)
(2)代码示例:
#include <REGX52.H>
void main(){
P2=0xEF; //1110 1111
}
要实现点亮其它LED或多个LED,可以更改赋予P2的值,如0101 0101 对应的十六进制数为0x55。
(3)实物演示:
2、让一个LED闪烁
(1)原理分析:
要实现LED的闪烁,需要有三步。第一将LED点亮,第二将该LED熄灭,第三步将前两步进行循环,以此实现LED的闪烁。
第一步将一个LED点亮,在第一个示例中已经实现。第二步也不难实现,即在P2中将控制该LED状态的命令更改。如点亮D1,二进制数为1111 1110,熄灭即是1111 1111。对应十六进制为0xFE(点亮),0xFF(熄灭)。
再通过一个while循环,将两个状态写入循环结构内。不过因为单片机的计时是近乎瞬间的。所以要设置一个延时器,否则将没法观察出LED的亮灭变化。
这里使用到STC-ISP辅助工具中的延时器功能。
点击STC-ISP中的“软件延时计算器”按钮,将系统频率设置到“12.000Hz”,定时长度改为500,单位改为“毫秒”(1秒=1000毫秒),8051指令集为“STC-Y1”,如下。
点击生成C代码,再点击“复制代码”,将得到的代码复制到Keil项目中去。这样我们便创建了一个延时器。因为创建的函数中有_nop()_函数,所以在代码中还需要调用<INTRINS.H>头文件。
在循环结构中,点亮和熄灭后分别调用该函数,即可实现LED闪烁。
(2)代码示例:
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms(void) //@12.000MHz
{
unsigned char data i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
P2=0xFE;
Delay500ms();
P2=0xFF;
Delay500ms();
}
}
(3)实物演示:
3、LED流水灯
(1)原理分析:
在LED灯闪烁的基础上,改变每次亮灭的灯,即上一个灯熄灭,下一个灯亮,以此往复即可实现流水灯,当然其中仍需要使用延时器。
(2)代码示例:
#include <REGX52.H>
#include <INTRINs.H>
void Delay500ms(void) //@12.000MHz
{
unsigned char data 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();
}
}
(3)实物演示:
总结
本章主要介绍了Keil软件和STC-ISP辅助软件的使用,以及如何编写代码使单片机实现以上三种简单LED模块的功能。
大家也可以尝试在本章基础上,编写代码,来实现更有意思的功能(比如在流水灯的基础上,改进成贪吃蛇式的)
下章内容将使用到“独立按键”模块。
更多推荐
所有评论(0)