编程软件使用Keil5
创建第一个项目
首先介绍如何创建第一个程序
- 点击工具栏的"Project",选择新建项目
- 选择项目目录,输入项目名称
- 选择单片机类型。因为STC是中国公司,该软件并没有兼容,但是其中的
AT89C52
和STC89C52
几乎是一样的,我们可以选其作为替代
- 选择是否生成
STARTUP.A51文件
,目前选择不生成
STARTUP.A51 文件通常是用于8051系列微控制器的汇编启动代码。它的主要功能包括:
- 初始化堆栈:设置堆栈指针,以便程序在执行过程中可以正确地进行函数调用和返回。
- 全局变量初始化:在主程序开始运行之前,对静态和全局变量进行初始化,确保它们具有正确的初始值。
- 中断向量表:设置中断服务例程的入口地址,确保在发生中断时能够正确响应。
- 调用主函数:完成所有初始化后,跳转到主程序的入口点,开始执行主逻辑。
如果不添加"startup.a51"文件,编译器就会自动加入一段初始化内存以及堆栈等的代码,这时的内存初始化部分你就无法去控制了,当然这在大部分情况下没什么关系。但是如果你想你的程序在复位后,内存里面的信息依然还保存着(所说的“热复位”),那么你就需要添加该启动文件,并且去里面修改内存初始化部分,不要初始化你需要保留的部分内存。
- 添加文件
- 选择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
- 首先我们要生成项目,因为烧录需要
.hex文件
,Keil5生成目标文件默认不会生成.hex文件,需要在"控制生成文件"中设置
- 设置生成
.hex
文件
3. 点击“生成项目”——Build
4. 打开STC-ISP
- 首先选择“单片机型号”!!!!如果没有选择匹配,后续点击“下载/编程”后会一直显示“正在检测目标单片机···”
- 其次选择串口号,一般通过USB接口连接开发板和电脑时,会自动匹配(前提是驱动已经下载好)。也可以手动查看。设置 -> 设备管理器 -> 端口(
需要连接开发板才会显示
)
- 选择程序文件,该
Project.hex
就是Keil5点击Build生成的
- 点击下载/编程(保证已连接开发板和电脑),重启开发板——按下左下角的按键
先下载,再重启
,STC-ISP
显示如下信息即为成功
如果一直显示"正在检测目标单片机···",大概率是单片机型号不匹配!如遇到其他问题,欢迎在评论区讨论
D1成功点亮
LED周期闪烁
要想实现周期闪烁,可以在亮起后等一段时间再熄灭,然后再等一段时间再亮起
即指定的P2先为0,等一段时间再为1,再等一段时间为0
STC-ISP
不仅可以烧录程序,还可以生成一些方法
- 选择“软件延时计算器”
- 注意选择系统频率,
STC89C52
和STC89C52RC
都是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();//等待
}
}
以上就是本篇博客的所有内容,感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。