keil多文件组织方法_第1页
keil多文件组织方法_第2页
keil多文件组织方法_第3页
keil多文件组织方法_第4页
keil多文件组织方法_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、keil多文件组织方法方法一:首先新建一个main.c的文件,加入到项目中,该文件中主要写main函数.然后,新建文件,如delay c, 编写内容之垢,不要加入到项目,而出在main.c文件的开始写上include"delay c",编隼 你会发现delay.c 已经在你main.c下面出现了,其他的函数同样的道理。下而main.c文件include <reg52 h>编译系统先编译该文件#include"delay.c"接着编译该文件#include"display.c"然后编译该文件nclude'timetO

2、.c"再编译该文件 main()TMOD=0x01;EA=1;ET0=1;TR0=1;TH0=(65536-5000)/256;TL0=(65536-5000)%256;while display 1();delay(200),display2();delay(200);LED1=O;执行编译后,你发现所有的。c文件全部在main.c的子目录匚 编译系统编译时候按照给定的顺序进行编译,含有全局变量的文件耍放到巌前面,否则编译时候会出现没有定义变量的错误,如tE display.c文件unsigned char flag;/全局变量,其他函数中用sbit LED1=P1A0;/全局变量

3、,其他冈数中用sbit LED2=P2A0;/全局变量,其他函数中用display!()if(flag)LED1=-LED1;display2()delay1m();LED2=1;delay(250);LED2=O;delay(200);定义的全局变戢,会被各个文件用到.其实这种算不上圧芬文件形式.而圧单一文件的不同组织形式.但址却涓晰了,便于阅读。这种殂织也不必要要写头文件等.方法二:首先新建一个main.c的文件,加入到项H中,该文件中上要写main函数,然丿占,新建文件,如delay.c, 编写内容之后,加入到项目,但肚在main.c文件的开始不耍写上#includeudelay.c&#

4、176;,其他的函数同样的处 理.要调用全局变戢的方法:新建头文件,如:file h.在头文件file.h中用写入:#ifndef _file_H_ /*防止 graphics.h 破垂复引用/#define _file_H_extern void funotion ();声明全局函数#endif再不管三七二十一把函数体放在任何一个你写冇#includeHfile.hw的XX.C文件中就可以了方法三:通常一个C51程序工程按功能町以分成寥个模块(文件一个模块通常由两个文档组成,个头文件*.h, 对模块中的数据结构和函数原型进行描述:另一个为C文件C ,对数据实例或对象进行定义,以及函数 算法的

5、具体实现,如I2CCADCCDACCLED C等.为了文件的调用,我们要为每个模块定义一个头 文件,以I2C.C来说,定义I2C H#ifndef GRAPHICS.H /*防止 graphics.h 被重复引用/#define GRAPHICSinclude <math h >广引用标准库的头文件*/include ,myheader.h,/t引用非标准库的头文件/void Function”);广全局函数声明*7class Box广类结构声明/;#endif模块化的程序圧黑盘,只向外提供接口(全局变呈、外部函数),而不盅要让调用者了解其中过程。尽可能 地少定义接口有利于保持模块

6、的独立性(不需要让使用者知逍的内部函数与赫态全局变駅不需要在H文件 中给出以避免使用者疑磁)在需妾调用此模块的文件中写入include 句。一个好的工程.H文件的组织绘 很清晰的.只看H文件就能够写主程字调用柑应的C模块。头文件的格式如卜(I2C.H为例):#ifndefl2C_H/讥否没冇定义过"I2C_H”,防止重定义*/#define I2C_H 广定义|2C_H/bit SetSDA ( bit Up_Down )t bit SetSCL ( bit Up.Down); #endifI2C.C格式如下:include < stdio.h >include Hl2C

7、.hHvoid SendByte ( uchar c ), /内部函数在H头文件中不描述/bit SetSDA( bitUp_Down );bit SetSCL ( bit Up_Down) ;另外种写法:#ifndef I2C-H #define I2C H exten bit SetSDA ( bit Up_Down ); exten bit SetSCL ( bit UpDown); #endifI2C.C格式如下:#include < stdio.h >void SendByte ( uchar c ),厂内部函数在H头文件中不声明*/ bitSetSDA( bitUp_D

8、own );bit SetSCL ( bit UpJDown) ;方法四:首先,我们需要一个新文档,这个文档的建立有两种方法(以delayls函数为例人第一种,在工程冃录下 建立一个delay1s.txt然后将其改名为delayls.h, W为都足同编码的所以不会出现占L码,然后在工程中将 其打开。第二种方法兄门接在工程中新建一个文档,然版保存的时候将名字保存为delayls.h UP可。如果 是需耍添加很多文件的话建议使用第一种方法.这於个人建议.梵次,我们需耍编埼delaylsh这个文件 的内容,其内容如下:#ifndef DELAY 1S H#define _DELAY1S_H_void

9、 delay 1s():/延时函数#endif这个是头文件的定义,作用足声明了 delay1s()函数,因为如果在别的函数中如果我们需要用到delaylsf) 函数的话,若不事先声明则在编译的时候会出错。对于#ifndef#define#endif:这个结构大概的意 思就丛说如果没有定义(宏定义)一个字符串,那么我们就应义它,然厉执行后而的语句,如果宦义过了 那么就跳过不执行任何语句.关于为什么要使用这么一个定义方法.比如在led_on()函数中我们调用了 delay 1s()f数,然后在mam() 函数中我们也调用J"delay()函数,那么,<£ led_on()

10、函数中我就就娶包含头文件delayls.h,然后在main() 函数中也要包含delayls.h若丄函数中我们调用过led_on()廉么在编译的时候 遇到delay1s()和led_on() 的时候就会对delayls.h进行两次解释.那么就会出现错決.若冇以上预处理命令的话,那么在第二次的 时候这个_DELAY1S_H_已经被定义过了,那么就不会出现审复定义的问题。这就是它的作用。但足注总, 在编泽器进行编译的时候头文件不参与编译。再次,我们建立一个led_on.h,起代码内容如下:#ifndef _LED_ON_H_#define 丄ED_ON_H_void led_on();/灯闪烁#e

11、ndif作用同delayls.h,不理解的话可以再看一下上面的解用.最后,将我们上次说的三个函数补充完整.在led_on()函数中,我们用到了 51单片机的一些寄存器的定义,所以我们婆包含reg52.h,而口我们用到了 delay 1s()S数.所以我们要包含delayls.h,故led_on()函数的代码如下:#inelude <reg52 h>includeh delay 1 s.h" 注意这里没有分号void led_on()P0=0x00;delay 1s();PO=Oxff,delay 1s();Mam函数的代码如F:#inelude <reg52.h>include "delayls.h"void main()led_on();delay 1s();/在这里英实只冇第一句就可以了,这句足不必要的led_on();/这也是不必要的任这个函数中,为了再次说明一下#ifndef#define#endif这个结构的定义,人家可以把所仃的.h文 件中的这个结构去掉.然后编译一下看一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论