Mit #include kann man alle Dateien importieren, die auf .h enden (evtl. auch andere). In solchen Dateien stehen Definitionen, die man in mehreren Quelldateien (.c oder .cpp) benötigt, beispielsweise Funktionsdefinitionen. Damit weiß der Compiler dann in einer Codedatei, die diese Headerdatei (.h) einbindet (mit #include), dass das, was in dem Header drinsteht, irgendwo existiert. Wo genau, ist erst mal egal. Ein Beispiel:
//In der Headerdatei:
void foo(int var);
Somit kennt der Compiler in jeder Quelldatei, die diese Headerdatei einbindet, die Funktion foo() und weiß deren Parameter und Rückgabewert. Erst ganz zum Schluss wird dann nach der tatsächlichen Implementierung gesucht, die in irgend einer anderen Quelldatei liegen kann.
Diese andere Quelldatei kann man entweder direkt mit hineinlinken (linken = verknüpfen; also die "leeren" Definitionen werden mit den "echten" Funktionen verknüpft) oder erst mal nicht weiterverwenden. Wenn man sie nicht weiterverwendet, kann man sie noch als Bibliothek einsetzen - sie gehört dann nicht wirklich zum Projekt, sondern ist ein eigenes Projekt; man kann die Funktionen aber dennoch verwenden, wenn man sie hineinlinkt.
Jetzt überlegst du dir, was für Funktionen du eigentlich so brauchst. Diese gliederst du dann je nach Verwendungszweck, also z.B. kann eine Quelldatei Funktionen für den Timer, eine andere Funktionen zum Ansteuern von LEDs enthalten. Die Funktionen schreibst du dann in Headerdateien, damit auch andere Dateien sie aufrufen können. Wie das geht, wird in jedem halbwegs zu gebrauchenden Buch zu C erklärt.