久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2206|回復: 13
收起左側

問兩個關于單片機C語言編程的問題

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

************舉例子**********************
以下是頭文件Display.h的內容,其中有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
復制代碼

以下是Display.c源文件的內容,有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. }
復制代碼


/***********************第二個問題*******************************************/
    第二個問題:在用C語言編寫程序時需要經常用到unsigned char和unsigned int,我一般習慣typedef unsigned char uchar;typedef unsigned int uint;
但是頭文件里用typedef會報錯,而且因為我把內容分成好幾個源文件寫了,所以在每一個頭文件里都要#define uchar unsigned char  #define uint unsigned int,這樣會搞的比較麻煩。我想問下有什么好辦法能夠只寫一次#define uchar unsigned char  #define uint unsigned int讓所有頭文件都能夠識別使用嗎?
回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

ID:557861 發(fā)表于 2019-6-8 19:57 | 顯示全部樓層
董董 發(fā)表于 2019-6-8 05:44
我知道不同功能分文件寫是為了方便移植,我想問的是main()函數(shù)在最后鏈接的時候會調用在別的源文件中定義 ...

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

使用道具 舉報

ID:523537 發(fā)表于 2019-6-7 06:47 | 顯示全部樓層
如果使用typedef就會出現(xiàn)符號錯誤,如下圖所示 question3.png
question2.png


回復

使用道具 舉報

ID:523537 發(fā)表于 2019-6-7 20:37 | 顯示全部樓層
各位進來看下指點下呀,多謝了
回復

使用道具 舉報

ID:382454 發(fā)表于 2019-6-7 22:28 來自觸屏版 | 顯示全部樓層
這個就是多文件,模塊化編程的原理了,每個個功能分開編寫,清晰明了。放便以后移植。
回復

使用道具 舉報

ID:525821 發(fā)表于 2019-6-8 04:17 | 顯示全部樓層
與編譯器有關吧。
回復

使用道具 舉報

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

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

使用道具 舉報

ID:552592 發(fā)表于 2019-6-8 15:13 | 顯示全部樓層
typedef的頭文件你加了嗎?
回復

使用道具 舉報

ID:93224 發(fā)表于 2019-6-8 17:31 | 顯示全部樓層
頭文件相互包含
回復

使用道具 舉報

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倒是一個很好的解決辦法,多謝指點了!
回復

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 超碰伊人| 欧美日韩高清 | 一区二区三区网站 | 久久久久久国产免费视网址 | 久久久久亚洲视频 | www.久久精品 | 综合久久99| 午夜精品一区二区三区在线观看 | 久久精品色视频 | 国产三区在线观看视频 | 日韩av在线一区二区 | 午夜精品视频一区 | 成人小视频在线 | av色噜噜 | 国产在线精品一区二区 | 日韩精品一区二区三区中文字幕 | 成人网在线观看 | 国产欧美日韩精品在线观看 | 国产高清在线精品 | 天天看天天爽 | 男人阁久久 | 国产不卡视频在线 | 欧美韩一区二区三区 | 亚洲女人天堂成人av在线 | 污书屋 | 久久久www成人免费无遮挡大片 | 亚洲啪啪一区 | 性在线 | 国产特级毛片 | 欧美成视频 | 成人精品国产一区二区4080 | 国产亚洲精品久久久优势 | 日韩中文字幕一区 | av黄色在线播放 | 亚洲高清成人 | 九九热免费视频在线观看 | 91黄在线观看 | 国产亚洲精品久久久久动 | 中文字幕第一页在线 | 国产成人福利在线观看 | 国产一区二区三区视频 |