找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2108|回復(fù): 13
打印 上一主題 下一主題
收起左側(cè)

問兩個關(guān)于單片機C語言編程的問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:523537 發(fā)表于 2019-6-7 06:32 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
/*************************第一個問題***********************************************/
    第一個問題:如下圖所示,我這里是有五個源文件,然后有四個頭文件,因為函數(shù)只能在頭文件聲明而不能定義,所以函數(shù)都需要寫在對應(yīng)的源文件中。包含main()函數(shù)的主文件再編譯的時候會把源文件中include的頭文件都原封不動地搬到主源文件中來,但是最后鏈接的時候因為所有函數(shù)定義都是在別的源文件中,所以在鏈接的時候主源文件也會把其他源文件中定義的函數(shù)直接搬運過來嗎?我可能表述的不太清楚,下面我就拿我其中一個源文件和頭文件舉例子吧。


************舉例子**********************
以下是頭文件Display.h的內(nèi)容,其中有void Display(uchar firstbit, uchar num)的聲明而不是定義
單片機源程序如下:
  1. #include <reg52.h>
  2. #ifndef __DISPLAY_H__
  3. #define __DISPLAY_H__

  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. #define KeyPort P3
  7. #define DataPort P0

  8. sbit Bit_Latch = P2^1;
  9. sbit Seg_Latch = P2^0;
  10. extern bit ReadTimeFlag;

  11. extern code uchar DuanMa[10];
  12. extern code uchar WeiMa[8];
  13. extern uchar TempData[8];

  14. void Display(uchar firstbit, uchar num);
  15. void Init_Timer0();

  16. #endif
復(fù)制代碼

以下是Display.c源文件的內(nèi)容,有void Display(uchar firstbit, uchar num)的定義但是不會被include到主原函數(shù)中,那么最后主源文件被鏈接成功是怎么
實現(xiàn)Display()函數(shù)的功能呢?

  1. #include "Display.h"
  2. #include "Delay.h"


  3. uchar code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  4. uchar code WeiMa[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  5. uchar TempData[8];



  6. void Display(uchar firstbit, uchar num)
  7. {
  8.         static uchar i = 0;
  9.         
  10.         DataPort=0;
  11.         Seg_Latch = 1;
  12.         Seg_Latch = 0;
  13.         
  14.         DataPort = WeiMa[i+firstbit];
  15.         Bit_Latch = 1;
  16.         Bit_Latch = 0;
  17.         

  18.         
  19.         DataPort = TempData[i];
  20.         Seg_Latch = 1;
  21.         Seg_Latch = 0;
  22.         
  23.         
  24.         
  25.         i++;
  26.         if(i == num)
  27.         {
  28.                 i = 0;
  29.         }
  30. }

  31. void Init_Timer0()
  32. {
  33.         TMOD = 0x01;
  34.         TH0 = (65535-2000)/256;
  35.         TL0 = (65535-2000)%256;
  36.         EA = 1;
  37.         ET0 = 1;
  38.         TR0 = 1;
  39. }

  40. void Timer0() interrupt 1
  41. {
  42.         
  43.         static uchar  num;
  44.         TH0 = (65535-500)/256;
  45.         TL0 = (65535-500)%256;
  46.         Display(0,8);
  47.         num++;
  48.         
  49.         if(num == 50)
  50.         {
  51.                 num = 0;
  52.                 ReadTimeFlag = 1;
  53.         }
  54.         
  55. }
復(fù)制代碼


/***********************第二個問題*******************************************/
    第二個問題:在用C語言編寫程序時需要經(jīng)常用到unsigned char和unsigned int,我一般習(xí)慣typedef unsigned char uchar;typedef unsigned int uint;
但是頭文件里用typedef會報錯,而且因為我把內(nèi)容分成好幾個源文件寫了,所以在每一個頭文件里都要#define uchar unsigned char  #define uint unsigned int,這樣會搞的比較麻煩。我想問下有什么好辦法能夠只寫一次#define uchar unsigned char  #define uint unsigned int讓所有頭文件都能夠識別使用嗎?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

來自 2#
ID:517466 發(fā)表于 2019-6-8 15:24 | 只看該作者
你可以單獨做一個h文件,里面#define uchar unsigned char。然后再每個用到的c文件中引入這個h文件。使用typedef不行,我猜是因為關(guān)鍵字不能包含空格。typedef unsigned char uchar,在unsigned char之間存在空格,所以不行。但是使用typedef char* PCHAR這樣的可以。
回復(fù)

使用道具 舉報

來自 3#
ID:519141 發(fā)表于 2019-6-8 19:21 | 只看該作者
#define是C語言中定義的語法,是預(yù)處理指令,在預(yù)處理時進行簡單而機械的字符串替換,不作正確性檢查,只有在編譯已被展開的源程序時才會發(fā)現(xiàn)可能的錯誤并報錯。
typedef是關(guān)鍵字,在編譯時處理,有類型檢查功能。它在自己的作用域內(nèi)給一個已經(jīng)存在的類型一個別名,但不能在一個函數(shù)定義里面使用typedef。

根據(jù)typedef與define的定義,說明你的頭文件沒有包含標(biāo)準(zhǔn)庫
回復(fù)

使用道具 舉報

來自 4#
ID:557861 發(fā)表于 2019-6-8 19:57 | 只看該作者
董董 發(fā)表于 2019-6-8 05:44
我知道不同功能分文件寫是為了方便移植,我想問的是main()函數(shù)在最后鏈接的時候會調(diào)用在別的源文件中定義 ...

1)第一個問題,你只要在調(diào)用的文件里include被調(diào)用函數(shù)聲明的頭文件即可
2)是因為你重復(fù)定義了一個符號,你可以把所有的類型定義集中到一個頭文件,然后每個要使用的頭文件中都包含這個就可以了,這樣源文件就不用再次包含了
回復(fù)

使用道具 舉報

5#
ID:523537 發(fā)表于 2019-6-7 06:47 | 只看該作者
如果使用typedef就會出現(xiàn)符號錯誤,如下圖所示



回復(fù)

使用道具 舉報

6#
ID:523537 發(fā)表于 2019-6-7 20:37 | 只看該作者
各位進來看下指點下呀,多謝了
回復(fù)

使用道具 舉報

7#
ID:382454 發(fā)表于 2019-6-7 22:28 來自手機 | 只看該作者
這個就是多文件,模塊化編程的原理了,每個個功能分開編寫,清晰明了。放便以后移植。
回復(fù)

使用道具 舉報

8#
ID:525821 發(fā)表于 2019-6-8 04:17 | 只看該作者
與編譯器有關(guān)吧。
回復(fù)

使用道具 舉報

9#
ID:523537 發(fā)表于 2019-6-8 05:44 | 只看該作者
univers 發(fā)表于 2019-6-7 22:28
這個就是多文件,模塊化編程的原理了,每個個功能分開編寫,清晰明了。放便以后移植。

我知道不同功能分文件寫是為了方便移植,我想問的是main()函數(shù)在最后鏈接的時候會調(diào)用在別的源文件中定義的函數(shù)對吧?以及第二個問題為啥typedef在頭文件里不能用呢?
回復(fù)

使用道具 舉報

10#
ID:552592 發(fā)表于 2019-6-8 15:13 | 只看該作者
typedef的頭文件你加了嗎?
回復(fù)

使用道具 舉報

11#
ID:93224 發(fā)表于 2019-6-8 17:31 | 只看該作者
頭文件相互包含
回復(fù)

使用道具 舉報

12#
ID:523537 發(fā)表于 2019-6-8 19:18 | 只看該作者
suncat0504 發(fā)表于 2019-6-8 15:24
你可以單獨做一個h文件,里面#define uchar unsigned char。然后再每個用到的c文件中引入這個h文件。使用ty ...

但是如果我在只有一個main()函數(shù)中用typedef unsigned char uchar是可以的,后面的用uchar沒有報錯,但是我一分開文件在別的源文件寫就報錯,不太明白。不過你說的單獨寫一個頭文件里面#define uchar unsigned char倒是一個很好的解決辦法,多謝指點了!
回復(fù)

使用道具 舉報

13#
ID:523537 發(fā)表于 2019-6-9 16:07 | 只看該作者
a452541823 發(fā)表于 2019-6-8 19:21
#define是C語言中定義的語法,是預(yù)處理指令,在預(yù)處理時進行簡單而機械的字符串替換,不作正確性檢查,只有 ...

一般單片機程序都是#include <reg52.h>不會寫#include <stdio.h>呀,但是包含reg52.h條件下也能typedef unsigned char uchar
回復(fù)

使用道具 舉報

14#
ID:523537 發(fā)表于 2019-6-9 16:08 | 只看該作者
wfy1008 發(fā)表于 2019-6-8 19:57
1)第一個問題,你只要在調(diào)用的文件里include被調(diào)用函數(shù)聲明的頭文件即可
2)是因為你重復(fù)定義了一個符 ...

嗯嗯,我也覺得這是個很好的解決辦法,多謝指點
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表