【51单片机】第一个小程序 —— 点亮LED灯-练习

时间:2024-10-25 14:11:20

编程软件使用Keil5

创建第一个项目

首先介绍如何创建第一个程序

  1. 点击工具栏的"Project",选择新建项目
    在这里插入图片描述
  2. 选择项目目录,输入项目名称
    在这里插入图片描述
  3. 选择单片机类型。因为STC是中国公司,该软件并没有兼容,但是其中的AT89C52STC89C52几乎是一样的,我们可以选其作为替代
    在这里插入图片描述
  4. 选择是否生成STARTUP.A51文件,目前选择不生成
    在这里插入图片描述

STARTUP.A51 文件通常是用于8051系列微控制器的汇编启动代码。它的主要功能包括:

  • 初始化堆栈:设置堆栈指针,以便程序在执行过程中可以正确地进行函数调用和返回。
  • 全局变量初始化:在主程序开始运行之前,对静态和全局变量进行初始化,确保它们具有正确的初始值。
  • 中断向量表:设置中断服务例程的入口地址,确保在发生中断时能够正确响应。
  • 调用主函数:完成所有初始化后,跳转到主程序的入口点,开始执行主逻辑。

如果不添加"startup.a51"文件,编译器就会自动加入一段初始化内存以及堆栈等的代码,这时的内存初始化部分你就无法去控制了,当然这在大部分情况下没什么关系。但是如果你想你的程序在复位后,内存里面的信息依然还保存着(所说的“热复位”),那么你就需要添加该启动文件,并且去里面修改内存初始化部分,不要初始化你需要保留的部分内存。

  1. 添加文件
    在这里插入图片描述
  2. 选择C语言文件
    在这里插入图片描述

如此就可以将代码编写在该文件中

点亮LED灯

上面我们说到,只要让LED灯对应的串口为0,就可以让灯亮,为1则让灯熄灭
为此,我们需要能操作P2系列的串口。
<REGX52.H>函数中,就包含了P2串口的地址,CPU可以通过地址访问该串口。
可以通过右键快速添加该头文件
在这里插入图片描述

8位操作数,对应8个LED灯,操作P2是一次性操作8个灯
在这里插入图片描述
代码如下:

//让灯亮
void test1()
{
	//P2寄存器连接LED的负极,设置二进制位为0则为亮灯
	P2 = 0xFE;//1111 1110
}

int main()
{
	test1();
	return 0;
}

代码编写完后,接下来就是要将代码下载到开发板上,这个过程称之为烧录
使用的烧录软件是STC-ISP

  1. 首先我们要生成项目,因为烧录需要.hex文件,Keil5生成目标文件默认不会生成.hex文件,需要在"控制生成文件"中设置
    在这里插入图片描述
  2. 设置生成.hex文件

在这里插入图片描述
3. 点击“生成项目”——Build
4. 打开STC-ISP
在这里插入图片描述

  • 首先选择“单片机型号”!!!!如果没有选择匹配,后续点击“下载/编程”后会一直显示“正在检测目标单片机···”
    在这里插入图片描述
  • 其次选择串口号,一般通过USB接口连接开发板和电脑时,会自动匹配(前提是驱动已经下载好)。也可以手动查看。设置 -> 设备管理器 -> 端口(需要连接开发板才会显示)
    在这里插入图片描述
  • 选择程序文件,该Project.hex就是Keil5点击Build生成的
    在这里插入图片描述
  • 点击下载/编程(保证已连接开发板和电脑),重启开发板——按下左下角的按键
    在这里插入图片描述
    先下载,再重启STC-ISP显示如下信息即为成功
    在这里插入图片描述
    如果一直显示"正在检测目标单片机···",大概率是单片机型号不匹配!如遇到其他问题,欢迎在评论区讨论
    D1成功点亮
    在这里插入图片描述

LED周期闪烁

要想实现周期闪烁,可以在亮起后等一段时间再熄灭,然后再等一段时间再亮起
即指定的P2先为0,等一段时间再为1,再等一段时间为0

STC-ISP不仅可以烧录程序,还可以生成一些方法
在这里插入图片描述

  • 选择“软件延时计算器”
  • 注意选择系统频率,STC89C52STC89C52RC都是12MHz
  • 定时长度单位有毫秒和微秒
  • 指令集一定要选对,右侧有显示该指令集适用于哪些单片机
  • 最后生成C代码,复制
  • 如图是生成延迟1ms的方法

PS:其他方法可能包含_nop_()方法,该方法是个空函数,也是用来延迟一定时间,使用该方法需要包含<INTRINS.H>这个头文件

我们可以延迟500ms,代码如下:

//等待500ms
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 test2()
{
	while(1)
	{
		P2 = 0xFE;//D1亮灯
		Delay500ms();//等待500毫秒,0.5秒
		P2 = 0xFF;//D1灭灯
		Delay500ms();//等待
	}
}

PS:有两个头文件<REG52.H><REGX52.H>,两者都包含P2等的地址信息,但后者还包含了P2_0、P2_1…允许我们操控单个串口
在这里插入图片描述
周期闪烁的代码可以改成如下代码:

void test2()
{
	while(1)
	{
		P2_0 = 0;//单独控制
		Delay500ms();//等待500毫秒,0.5秒
		P2_0 = 1;//灭灯
		Delay500ms();//等待
	}
}

以上就是本篇博客的所有内容,感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述