- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
单片机C语言多文件编程技巧
开场白:
很多人也把多文件编程称作模块化编程,其实我觉得叫多文件编程会更加符合实际一些。多文件编程有两个最大的好处,一个是给我们的程序增加了目录,方便我们查找。另外一个好处是方便移植别人已经做好的功能程序模块,利用这个特点,特别适合团队一起做大型项目。很多初学者刚开始学多文件编程时,会经常遇到重复定义等问题,想知道怎么解决这些问题吗?只要按照以下鸿哥教的规则来做,这些问题就不存在了。
第一个:每个文件保持成双成对出现。每个.c源文件必须有一个.h头文件跟它对应,每个.h头文件必须有一个.c源文件跟它对应。比如:main.c与main.h,delay.c与 delay.h。
第二个:.c源文件只负责函数的定义和变量的定义,但是不负责函数的声明和变量的声明。比如:
unsigned char ucLedStep=0; //这个是全局变量的定义
void led_flicker()? ?//这个是函数的定义
{
? ?//…里面是具体代码内容
??}
第三个:.h头文件只负责函数的声明和变量的声明,以及常量和IO口的宏定义,但是不负责函数的定义和变量的定义。比如:
#define const_time_level 200??//这个是常量的宏定义
sbit led_dr=P3^5;? ? //这个是IO口的宏定义
void led_flicker();? ???//这个是函数的声明
extern unsigned char ucLedStep;? ?//这个是全局变量的声明,不能赋初始值
第四个:每个.h头文件都必须固定以#ifndef,#define,#endif语句为模板,此模板是用来避免编译时由于重复包含头文件里面的内容而导致出错。其中标志变量_XXX_鸿哥建议用它本身的文件名称加前后下划线_。
比如:
#ifndef _LED_? ?//标志变量_LED_是用它本身的文件名称命名
#define _LED_? ?//标志变量_LED_是用它本身的文件名称命名
#define const_time_level 200??//这个是常量的宏定义
sbit led_dr=P3^5;? ? //这个是IO口的宏定义
void led_flicker();? ???//这个是函数的声明
extern unsigned char ucLedStep;? ?//这个是全局变量的声明,不能赋初始值
#endif??
第五个:每个.h头文件里都必须声明它对应的.c源文件里的所有定义函数和全局变量,注意:.c源文件里所有的全局变量都要在它所对应的.h头文件里声明一次,不仅仅是函数,这个地方很容易被人忽略。
比如:在led.h头文件中:
void led_flicker();? ???//这个是函数的声明,因为在这个函数在led.c文件里定义了。
? ?extern unsigned char ucLedStep;? ?//这个是全局变量的声明,不许赋初值
第六个:每个.c源文件里都必须包含两个文件,一个是单片机的系统头文件REG52.H,另外一个是它自己本身的头文件比如initial.h.剩下其它的头文件看实际情况来决定是否调用,我们用到了哪些文件的函数,全局变量或者宏定义,就需要调用对应的头文件。
比如:在initial.c源文件中:
#include”REG52.H”??//必须包含的单片机系统头文件
#include”initial.h”??//必须包含它本身的头文件
/*?注释:
? ?由于本源文件中用到了led_dr的语句,而led_dr是在led.h文件里宏定义的,所以必须把led.h也包含进来
*/??
#include”led.h”??//由于本源文件中用到了led_dr的语句,所以必须把led.h也包含进来
void initial_myself()??//这个是函数定义
{
??led_dr=0;??//led_dr是在led文件里定义和声明的
}
第七个:声明一个全局变量必须加extern关键字,同时千万不能在声明全局变量的时候赋初始值,比如:
extern unsigned char ucLedStep=0; //这样是绝对错误的。
extern unsigned char ucLedStep; //这个是全局变量的声明,这个才是正确的
第八个:对于函数与全局变量的声明,编译器都不分配内存空间。对于函数与全局变量的定义,编译器都分配内存空间。函数与全局变量的定义只能在一个.c源文件中出现一次,而函数与全局变量的声明可以在多个.h文件中出现。
具体内容,请看源代码讲解,本程序例程是直接把前面第四节一个源文件更改成多文件编程方式。
(1)硬件平台:基于51单片机学习板。把前面第四节一个源文件更改成多文件编程方式。
(2)
您可能关注的文档
最近下载
- 英语被动语态(PPT36张).ppt
- F519133【复试】2024年四川大学125100工商管理《复试管理学》考研复试仿真模拟5套卷.pdf VIP
- 2025年中国废旧手机行业市场发展监测及投资潜力预测报告.docx VIP
- 读后续写动作描写六大微技能课件++2023届高考英语作文备考.pptx
- 2025年1月支委会会议记录 .pdf VIP
- 速冻汤圆制造可行性研究报告 .pdf
- 辽宁省名校联盟2023-2024学年高二下学期3月份联合考试化学试卷(无答案).docx VIP
- 《模拟电子技术实验》实践课程大纲.pdf VIP
- 带头严守政治纪律和政治规矩,维护党的团结统一等四个方面存在的问题与整改材料4.docx VIP
- 幼儿园小班数学教案《哪个大、哪个小》.pptx
文档评论(0)