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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2054|回復: 13
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
/*************************第一個問題***********************************************/
    第一個問題:如下圖所示,我這里是有五個源文件,然后有四個頭文件,因為函數只能在頭文件聲明而不能定義,所以函數都需要寫在對應的源文件中。包含main()函數的主文件再編譯的時候會把源文件中include的頭文件都原封不動地搬到主源文件中來,但是最后鏈接的時候因為所有函數定義都是在別的源文件中,所以在鏈接的時候主源文件也會把其他源文件中定義的函數直接搬運過來嗎?我可能表述的不太清楚,下面我就拿我其中一個源文件和頭文件舉例子吧。


************舉例子**********************
以下是頭文件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到主原函數中,那么最后主源文件被鏈接成功是怎么
實現Display()函數的功能呢?

  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讓所有頭文件都能夠識別使用嗎?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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



回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国内自拍视频在线观看 | 黄网免费看 | 欧美黑人狂野猛交老妇 | 中文字幕人成乱码在线观看 | 欧美在线视频一区二区 | 美人の美乳で授乳プレイ | 欧美日韩高清 | 国产美女网站 | 精品美女在线观看视频在线观看 | 在线国产一区 | 日韩欧美网 | 国产良家自拍 | 成人免费淫片aa视频免费 | 天堂久久网 | 久久免费观看视频 | 日本电影一区二区 | 伊人久久免费视频 | 亚洲444kkkk在线观看最新 | 成人伊人| 丁香婷婷综合激情五月色 | 在线观看日本高清二区 | 99tv成人影院 | 玖玖玖在线观看 | 免费99精品国产自在在线 | 国产精品国产a | 日韩色综合 | 成人久久18免费 | 午夜精品一区二区三区在线观看 | 日韩成人| 一级片免费视频 | 欧美v日韩| 亚洲欧美一区二区三区国产精品 | 黄a免费看 | 99久久精品免费看国产四区 | 亚洲精品欧美一区二区三区 | 色播久久 | 网站黄色在线免费观看 | 亚洲国产成人久久综合一区,久久久国产99 | 亚洲精品一二三 | 色就干| 久久精品国产清自在天天线 |