keil 多文件組織方法

keil 多文件組織方法


方法一:
首先新建一個 main.c 的文件,加入到項目中,該文件中主要寫 main 函數,然後,新建文件,如 delay.c,
編寫內容之後,不要加入到項目,而是在 main.c 文件的開始寫上#includedelay.c,編譯,你會發現 delay.c

已經在你 main.c 下面出現了,其他的函數同樣的道理。下面是 main.c 文件


#include <reg52.h>編譯系統先編譯該文件
#include"delay.c" 接着編譯該文件
#include"display.c"然後編譯該文件

#include"timet0.c"再編譯該文件


main()
{TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
while(1)
{display1();
delay(200);
display2();
delay(200);
}
LED1=0;
}
執行編譯後,你發現所有的。c 文件全部在 main.c 的子目錄下,編譯系統編譯時候按照給定的順序進行編
譯,含有全局變量的文件要放到最前面,否則編譯時候會出現沒有定義變量的錯誤,如在 display.c 文件
unsigned char flag;//全局變量,其他函數中用
sbit LED1=P1^0;//全局變量,其他函數中用
sbit LED2=P2^0;//全局變量,其他函數中用
display1()
{if(flag)
LED1=~LED1;
}
display2()
{delay1m();
LED2=1;
delay(250);
LED2=0;
delay(200);

}

定義的全局變量,會被各個文件用到。
其實這種算不上是多文件形式,而是單一文件的不同組織形式,但是卻清晰了,便於閱讀。
這種組織也不必要要寫頭文件等。


方法二:
首先新建一個 main.c 的文件,加入到項目中,該文件中主要寫 main 函數,然後,新建文件,如 delay.c,
編寫內容之後,加入到項目,但是在 main.c 文件的開始不要寫上#includedelay.c, 其他的函數同樣的處
理。
要調用全局變量的方法:
新建頭文件,如:file.h,在頭文件 file.h 中用寫入:
#ifndef __file_H__ /*防止 graphics.h 被重複引用*/
#define __file_H__
extern void function();//聲明全局函數
#endif
再不管三七二十一,把函數體放在任何一個你寫有#includefile.h的 XX.C 文件中就可以了


方法三:
通常一個 C51 程序工程按功能可以分成多個模塊(文件) , 一個模塊通常由兩個文檔組成,一個頭文件 *.h,
對模塊中的數據結構和函數原型進行描述;另一個爲 C 文件*.C , 對數據實例或對象進行定義,以及函數
算法的具體實現,如 I2C.C, ADC.C, DAC.C, LED.C 等,爲了文件的調用,我們要爲每個模塊定義一個頭
文件,以 I2C.C 來說,定義 I2C.H。
#ifndef GRAPHICS_H /*防止 graphics.h 被重複引用*/
#define GRAPHICS_H
#include <math.h > /*引用標準庫的頭文件*/

#include myheader.h/* 引用非標準庫的頭文件*/
v
oid Function1(); /*全局函數聲明*/

class Box /*類結構聲明*/
{

};
#endif
模塊化的程序是黑盒,只向外提供接口(全局變量、外部函數) ,而不需要讓調用者瞭解其中過程。儘可能
地少定義接口有利於保持模塊的獨立性(不需要讓使用者知道的內部函數與靜態全局變量不需要在 H 文件
中給出以避免使用者疑惑)在需要調用此模塊的文件中寫入 include 語句。一個好的工程,H 文件的組織是
很清晰的,只看 H 文件就能夠寫主程序調用相應的 C 模塊。
頭文件的格式如下(I2C.H 爲例):
********************************************************************
#ifndef I2C_H /*是否沒有定義過 "I2C_H, 防止重定義*/
#define I2C_H /*定義"I2C_H" */
..........
bit SetSDA ( bit Up_Down );
bit SetSCL ( bit Up_Down);
#endif
**********************************************************************
I2C.C 格式如下:
**********************************************************************
#include < stdio.h >
#include "I2C.h"
void SendByte ( uchar c ); /*內部函數在.H 頭文件中不描述*/
bit SetSDA ( bit Up_Down ) { .......... };
bit SetSCL ( bit Up_Down) { .......... };
**********************************************************************
另外一種寫法:
=============================
#ifndef I2C_H
#define I2C_H
..........
exten bit SetSDA ( bit Up_Down );
exten bit SetSCL ( bit Up_Down);
#endif
=================================================
I2C.C 格式如下:
=================================================
#include < stdio.h >
void SendByte ( uchar c ); /*內部函數在.H 頭文件中不聲明*/
bit SetSDA ( bit Up_Down ) { .......... };
bit SetSCL ( bit Up_Down) { .......... };
=================================================


方法四:
首先,我們需要一個新文檔,這個文檔的建立有兩種方法(以 delay1s 函數爲例) 。第一種,在工程目錄下建立一個 delay1s.txt 然後將其改名爲 delay1s.h。因爲都是同編碼的所以不會出現亂碼,然後在工程中將其打開。第二種方法是直接在工程中新建一個文檔,然後保存的時候將名字保存爲 delay1s.h 即可。如果是需要添加很多文件的話建議使用第一種方法,這是個人建議。其次,我們需要編寫 delay1s.h 這個文件的內容,其內容如下:


#ifndef _DELAY1S_H_
#define _DELAY1S_H_
void delay1s();//延時函數
#endif
這個是頭文件的定義,作用是聲明瞭 delay1s()函數,因爲如果在別的函數中如果我們需要用到 delay1s()
函數的話,若不事先聲明則在編譯的時候會出錯。對於#ifndef……#define……#endif;這個結構大概的意
思就是說如果沒有定義(宏定義)一個字符串,那麼我們就定義它,然後執行後面的語句,如果定義過了
那麼就跳過不執行任何語句。
關於爲什麼要使用這麼一個定義方法,比如在 led_on()函數中我們調用了 delay1s()函數,然後在 main()
函數中我們也調用了 delay()函數,那麼,在 led_on()函數中我就就要包含頭文件 delay1s.h,然後在 main()
函數中也要包含 delay1s.h,若主函數中我們調用過 led_on(),那麼在編譯的時候,遇到 delay1s()和 led_on()
的時候就會對 delay1s.h 進行兩次解釋,那麼就會出現錯誤。若有以上預處理命令的話,那麼在第二次的
時候這個_DELAY1S_H_已經被定義過了,那麼就不會出現重複定義的問題。這就是它的作用。但是注意,
在編譯器進行編譯的時候頭文件不參與編譯。
再次,我們建立一個 led_on.h,起代碼內容如下:
#ifndef _LED_ON_H_
#define _LED_ON_H_
void led_on();//燈閃爍
#endif
作用同 delay1s.h,不理解的話可以再看一下上面的解釋。
最後,將我們上次說的三個函數補充完整。
在 led_on()函數中,我們用到了 51 單片機的一些寄存器的定義,所以我們要包含 reg52.h,而且我們用到了
delay1s()函數,所以我們要包含 delay1s.h,故 led_on()函數的代碼如下:
#include <reg52.h>
#include delay1s.h //注意這裏沒有分號
void led_on()
{
P0=0x00;
delay1s();
P0=0xff;
delay1s();
}
Main 函數的代碼如下:
#include <reg52.h>
#include delay1s.h
void main()
{
led_on();
delay1s();//在這裏其實只有第一句就可以了,這句是不必要的
led_on();//這也是不必要的
}
在這個函數中,爲了再次說明一下#ifndef……#define……#endif 這個結構的定義,大家可以把所有的.h 文
件中的這個結構去掉,然後編譯一下看一下效果。
到這裏相信大家對於這種模塊化的寫法就有大概的瞭解了,如果我們想添加新功能的時候,比如我們要添
加一個流水燈的功能,那麼,我們只需要增加一個 led_circle.c 和 led_circle.h,然後按照上述步驟添加進
工程即可,程序的其他部分不需要任何改動。顯然這是很方便的。其實函數的聲明可以使用 extern 關鍵字,
C 語言中默認都是這個類型的,所以可以不用寫。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章