- 如何使用
vscode
代替keil5
编辑多文件项目
如何使用vscode
代替keil5
编辑多文件项目
前提基础
- 了解如何使用keil5开发多文件项目,具体可以参考我的相关文章Keil5 如何创建51单片机多模块项目
- 了解c语言项目构建和基本语法
- 已经下载Keil5和vscode
- 了解vscode的简单使用
- 了解xml的基本知识
vscode插件安装
安装C/C++ Extension Pack
插件
点击左边拓展
按钮,搜索C/C++ Extension Pack
并安装该插件
安装Keil Assistant
插件
在该插件的安装界面,有关于该插件的使用方法,配置方法的详细介绍,读者们可以自行了解
Keil Assistant
插件配置
在安装
界面点击设置
按钮然后打开插件的配置
在配置页面填写自己Keil5可执行文件UV4.exe
的绝对路径。第一个配置是C51
的,第二个配置的是MDK
的。
使用Keil5创建51单片机项目
-
打开文件资源管理器,先预先创建一个空的文件夹,文件名自定义即可
-
打开Keil5,点击菜单栏
Project
然后选择New uVision Project
-
在弹出的文件资源管理器中,选择并进入
步骤一
预创建的文件夹,然后在下方输入项目的名字
,可以自定义,但通常使用通用的项目名字,例如:project
、template
-
在弹出的对话框中,输入芯片搜索
关键字
,从搜索结果中选择相应的芯片类型,作者使用的是STC89C52芯片
,读者需要选择自身开发板的芯片类型,最后点击ok按钮
-
在弹出的对话框中点击否即可完成项目的创建。
-
打开项目所在的目录,新创建的目录结构如下
使用vscode进行项目的编辑
-
使用左侧
Keil Assistant插件
打开项目
-
进入项目目录后选择keil5的项目文件,最后点击打开
-
最后点击确定进入项目工作区目录
-
最后打开效果如下
创建项目模块
在项目工作区创建三个目录,user
,app
,public
,效果如下
public模块主要保存一些常见的头文件、别名和函数。新建public.c
和public.h
文件。以后编写其他模块时可以直接引用public.h
public.h
文件:
#ifndef __PUBLIC_H__
#define __PUBLIC_H__
#include <REGX52.h>
// 定义常见数据类型别名
typedef unsigned int u16;
typedef unsigned char u8;
// 定义常见延时函数
void delay_10us(u16 ten_us);
void delay_1ms(u16 ten_us);
#endif
public.c
文件
#include <intrins.h>
#include "public.h"
/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1时,大约延时10us,@12.000MHz
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
unsigned char i;
while(ten_us--)
{
_nop_();
_nop_();
i = 27;
while (--i);
}
}
/*******************************************************************************
* 函 数 名 : delay_1ms
* 函数功能 : 延时函数,ten_us=1时,大约延时1ms,@12.000MHz
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_1ms(u16 ten_us) //@12.000MHz
{
unsigned char i, j;
while (ten_us--)
{
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
}
app
模块用来存放自己写的外设模块。以定时器
模块为例
在app
目录下创建timer
目录,接着往timer
目录下添加timer0.c
和timer0.h
文件
timer0.c文件
#include "public.h"
// 定时器触发频率对应的寄存器初始化值,依次为每:1ms,100us,触发一次
// static unsigned char timer_init_value [][2] = {{0x18, 0xFC}, {0x9C, 0xFF}};
/**
* @brief 定时器0初始化,默认为1ms产生一次中断,可修改定时器初始值
* @param 无
* @retval 无
*/
void timer_0_init(void)
{
// 只修改后四位,前四位代表Timer1
TMOD &= 0xF0;
TMOD |= 0x01;
// 设置定时器初始值
TL0 = 0x18;
TH0 = 0xFC;
// 设置溢出标志位有效
TF0 = 0;
// 使用TR0控制定时器
TR0 = 1;
// 中断开关及优先级
ET0 = 1;
EA = 1;
PT0 = 0;
}
/*定时器中断函数模板,默认为每一秒执行操作
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count;
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
T0Count++;
if(T0Count >= 1000)
{
T0Count=0;
}
}
*/
timer0.h文件
#ifndef __TIMER_H__
#define __TIMER_H__
void timer_0_init(void);
#endif
在user
目录下创建main.c
文件,用于存放主程序
main.c
#include "public.h"
#include "timer0.h"
void main()
{
while (1)
{
}
}
最后效果如下
编写配置文件
配置组
,组是Keil项目的一个逻辑结构,如果不理解可以参考的我的文章Keil5 如何创建51单片机多模块项目
点击项目文件project.uvproj
,往下拉到最后,可以看到,项目已经默认有一个组了。我们需要按照自己的项目模块创建组。
根据模块创建组
在xml配置文件中,删除默认组,创建我们自己的三个组,user
,app
,public
,修改后如下
往各个组里面添加源文件,修改后如下
添加完源文件后,我们还需要添加头文件路径
找到头文件的配置位置,大约在314行,如下所示
找到位置后,填写我们的头文件路径,使用;
进行分隔。修改后如下
配置生成Hex
文件
使用CTRL+F
快捷键搜索hex
,可以快速找到相关配置
0代表不生成hex
文件,1代表生成,我们修改其为1即可。
构建项目
点击Keil Assistant
插件中的构建
按钮即可构建项目,最后可以观察到控制台输出构建成功
至此,项目的基本框架已经构建成功,如果需要添加新的模块,在app
目录下创建一个新的目录,接着添加源文件和头文件,最后修改xml配置文件即可。
解决vscode头文件找不到问题
首先需要知道的是,只要按照上面的步骤配置好xml文件,项目能够正确运行即可。解决头文件找不到的问题可以让vscode正确跳转相关文件并消除看的心烦的红色波浪线。
找不到C51相关的头文件
这是因为项目的c/c++的头文件配置不是特别准确,打开.vscode
目录,然后打开c_cpp_properties.json
文件。该文件用于保存c/c++项目的相关配置。
修改该行为"F:\\keil\\C51\\INC\\**“即可,报错是因为没有在INC目录下找到,REGX52.h
的实际路径为"F:\keil\C51\INC\Atmel”,所以没有找到,我们在后面添加**
,可以匹配该目录下面的所有文件。
新建模块然后在main.c文件中引用找不到头文件
新建模块文件后,我们直接在main.c
文件中引用的话,是找不到的,因为我们并没有告诉编辑器我们的头文件在什么路径。我们往配置文件中添加${workspaceFolder}\\**
即可,意思是在当前工作区寻找头文件。最后效果如下
分析与总结
读者们可能想知道Keil的xml项目文件该如何写,其实作者也不是很清楚,但我们需要知道,我们之前使用Keil开发时,添加相关模块时,软件自动帮我们完成了xml文件的编写。你可以查找资料或者使用Keil进行相关的操作后查看配置文件的变化,即可学会如何编写xml配置文件。除了C51,STM32也可以使用Keil Assistant
插件进行编辑使用。
觉得作者写的不错的,可以点个赞,你的认可是我创作的动力。
© 2023 zhangproud@qq.com All Rights Reserved.
本文为博主原创文章,遵循CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。