本工程以keil4下新建STC89C51工程为例,其他系列处理器工程搭建类似,参考本例即可。
供参考—已搭建完成的 STC51单片机工程模板3.0 下载链接
看到文章标题的小伙伴可能会很疑惑,51单片机新建工程顺手拈来的事,何必去麻烦的要去建一个工程模板,岂不是多此一举。我想说:任何能够提高开发效率的事情都值得去做。当笔者大一时进学校实验室之前,自学51单片机,那时我连程序模块化都不会,几个外设模块的程序统统写在main.c里面,写到最后,代码太多,程序出了问题,都不知道从哪查起,那时让我深知程序模块化的重要性。后来进了实验室主要用的是嵌入式,完成一个项目经常是多个队友合作,更是对程序模块化与模块化的工程框架有极高的要求。因此,搭建一个这样的51工程模板很有必要,帮助初学者形成良好的代码风格,也着实能够方便于团队合作,提高开发效率。
搭建的STC89C51模板主要是仿照STM32的工程,搭建一个51的裸机模板,此模板虽然没有用到库,但是采用STM32裸机模板的工程格式,在很大程度上提高工程的整洁性和易用性。提高工程及代码的可移植性。下面详细介绍一下此51工程模板的搭建过程:
点击桌面 UVision4 图标,启动软件。如果是第一次使用的话会打开一个自带的工程文件,我们可以通过工具栏 Project->Close Project 选项把它关掉。
在工具栏 Project->New μVision Project…新建我们的工程文件,我们将新建的工程文件保存在桌面的 STC89C51工程模板文件夹下(先在电脑桌面上新建一个STC89C51工程模板-文件夹,在 STC89C51工程模板 里面新建一个 USER 文件夹),文件名取为 STC89C51-DEMO(英文 DEMO 的意思是例子),名字可以随便取,点击保存。
接下来的窗口就是让我们选择公司跟芯片的型号,我们用的芯片是 ST 公司的STC89C51(keil编辑器中找不到的,最好用AT89S52——性能兼容),按如下选择即可:
接下来的窗口问我们是否需要拷贝 AT89S52 的启动代码到工程文件中,
这份启动代码在 C51 系列中都是适用的,一般情况下我们都点击是,而且我们这里没有用到 ST 的库,(库文件里面也自带了这一份启动代码),虽然如果不添加STARTUP.A51 这个文件,编译器就会自动加入一段初始化内存的以及堆栈等的代码,但这时的内存初始化部分你就无法去控制了,当然这在大部分情况下没有什么关系。但是如果
所以,我们选择 是,然后STARTUP.A51会被默认跟工程文件一起建立在USER文件夹下,我们暂时先把它在那个文件夹下,稍后把它移动到STARTUP文件夹下。
特别注意:在此之前不要编译工程,否则会生成很多其它文件不便于移植。
接下来我们在STC89C51工程模板文件夹下另外建立四个文件夹,分别为 BSP、STARTUP、
Output、 Listing,效果如图:
文件夹说明:
BSP 文件夹: 存放外设硬件驱动程序
USER 文件夹:用来存放工程文件和用户代码(主要是main.c)
Output 文件夹:用来保存软件编译后输出的文件(主要是HEX文件)
Listing 文件夹:用来存放一些编译过程中产生的文件,具体可不用了解
STARTUP 文件夹:存放启动文件STARTUP.A51. 作用: 清理RAM.设置堆栈等.即执行完start.a51后跳转到.c文件的main函数
接下来回到我们刚刚新建的 Keil51工程中,将 Target 改为 STC89C51-DEMO(不改也行),
在 STC89C51-DEMO 上右键选中 Add Group…选项,新建四个组,分别命名如下:
接下来我们往我们这些新建的组中添加文件, 双击哪个组就可以往哪个组里面添加文件:
最终效果如下图:
至此, 我们的工程已经基本建好,下面来配置一下 MDK 的配置选项,点击
工具栏中的魔术棒按钮 ,在弹出来的窗口中选中Output
选中 选项卡,在 在这里添加文件编译的搜索路径,这样就可以屏蔽掉默认的搜索路径了。
编译路径修改成功之后如下所示:
编译一下,没有错误
至此,我们的51工程模板就建成了。建好了51工程模板,以后就可以很方便的拿来使用了。
当我们写新的项目工程的时候,只需要拷贝此模板,改文件夹名为我们的新项目名称即可。
这样每次成功编译工程输出的HEX文件都是“STC51-DEMO.hex”想要进行匹配新项目名称进行区分,只需
点击工具栏中的魔术棒按钮 ,在弹出来的窗口中选中Output,改为对应的名称即可。
1.此模板为STC51单片机工程模板,模仿stm32裸机工程结构搭建,各类文件放在指定的文件夹,分类明确,易于使用与管理。
2.此模板头文件包含方式可能会存在头文件互相包含的问题(在C++类的使用中会造成编译error),故此,为养成良好的编程风格,并参考了Linux内核源码的头文件包含方式,及网上的良好编程风格建议将改为,头文件只包含在.c文件中,.h文件实在需要包含头文件,一般只包含不修改或不经常修改的系统头文件。
3.还有一种头文件包含方式是:用includes.h包含所有的头文件,每一个.c文件中只包含includes.h,.h文件中不包含头文件或只包含不修改或不经常修改的系统头文件。这种方式广泛应用于实验室stm32工程中,此方式可以避免产生头文件互相包含问题但仍存在不容易看清文件调用了哪些模块问题。
好处是:1.比较容易看清文件调用了哪些模块,方便移植
2.从而避免产生头文件互相包含问题
注:此模板已进行修改。
STC51单片机工程模板2.0
2016.12.20
1.一般在51工程中,写好但暂时没有用到的函数,编译会报警告,提示定义函数未引用,因此针对此问题,在STC51单片机工程模板3.0中更新如下:
优化掉未调用函数,这部分代码将不被编译和链接进最终程序,避免了提示警告以及浪费单片机有限的存储空间。
2.为使程序更加简明清晰,把“Tab键”改为跳4格。
3.添加批处理文件 keilkill.bat。
删除keil软件编译产生的中间文件,避免在copy到其他地方时出现编译错误的问题。点击之后可以删除工程编译过程产生的一些中间文件,让工程变得干净。
对keilkill.bat所在文件夹和所有子文件夹都有效。
STC51单片机工程模板3.0
2017.5.1