導航:首頁 > 操作系統 > 單片機中宏定義變數

單片機中宏定義變數

發布時間:2022-06-29 22:29:49

Ⅰ C語言 單片機 嵌入式 宏定義問題 #define

宏定義
#define只是在預編譯時簡單的文字替換,其實並沒有定義任何的變數。
#define
a
1
uchar
i;
main()
{i=a;}
其實在預編譯以後,程序就成了{i=1;}程序裡面根本就沒有a。
猜測sizeof得到的並不是a,是宏定義下的那個東西的長度。因為sizeof(a),預編譯後就是sizeof(1)。
立即數、常數都在ROM裡面,佔用程序空間。當程序取用這些數時,會將值賦給RAM裡面的某一個變數(或送入某一寄存器),參與程序的運行。
局部變數則是在RAM裡面,調用函數時臨時分配的。

Ⅱ 單片機C語言宏定義問題

宏定義:
sfr WORKPD = 0x80;
#define work 0x00
#define k_add 0x01
#define k_sub 0x02
#define k_stop 0x03

void main()
{
while(1) {

//位操作指令:
WORKPD |= (1 << k_add); //置一 WORKPD.1
WORKPD &= ~(1 << k_sub); //清零 WORKPD.2
WORKPD &= (1 << k_stop); //保留 WORKPD.3,清除其它位
……

Ⅲ 單片機c語言宏定義有幾種

宏定義
宏定義是C提供的三種預處理功能的其中一種,這三種預處理包括:宏定義、文件包含、條件編譯
編輯本段1.不帶參數的宏定義:
宏定義又稱為宏代換、宏替換,簡稱「宏」。
格式:
#define 標識符 字元串
其中的標識符就是所謂的符號常量,也稱為「宏名」。
預處理(預編譯)工作也叫做宏展開:將宏名替換為字元串。
掌握"宏"概念的關鍵是「換」。一切以換為前提、做任何事情之前先要換,准確理解之前就要「換」。
即在對相關命令或語句的含義和功能作具體分析之前就要換:
例:
#define PI 3.1415926
把程序中出現的PI全部換成3.1415926
說明:
(1)宏名一般用大寫
(2)使用宏可提高程序的通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如:數組大小常用宏定義
(3)預處理是在編譯之前的處理,而編譯工作的任務之一就是語法檢查,預處理不做語法檢查。
(4)宏定義末尾不加分號;
(5)宏定義寫在函數的花括弧外邊,作用域為其後的程序,通常在文件的最開頭。
(6)可以用#undef命令終止宏定義的作用域
(7)宏定義可以嵌套
(8)字元串" "中永遠不包含宏
(9)宏定義不分配內存,變數定義分配內存。
編輯本段2.帶參數的宏定義:
除了一般的字元串替換,還要做參數代換
格式:
#define 宏名(參數表) 字元串
例如:#define S(a,b) a*b
area=S(3,2);第一步被換為area=a*b; ,第二步被換為area=3*2;
類似於函數調用,有一個啞實結合的過程:
(1)實參如果是表達式容易出問題
#define S(r) r*r
area=S(a+b);第一步換為area=r*r;,第二步被換為area=a+b*a+b;
正確的宏定義是#define S(r) ((r)*(r))
(2)宏名和參數的括弧間不能有空格
(3)宏替換只作替換,不做計算,不做表達式求解
(4)函數調用在編譯後程序運行時進行,並且分配內存。宏替換在編譯前進行,不分配內存
(5)宏的啞實結合不存在類型,也沒有類型轉換。
(6)函數只有一個返回值,利用宏則可以設法得到多個值
(7)宏展開使源程序變長,函數調用不會
(8)宏展開不佔運行時間,只佔編譯時間,函數調用占運行時間(分配內存、保留現場、值傳遞、返回值

C語言宏定義技巧(常用宏定義)

寫好C語言,漂亮的宏定義很重要,使用宏定義可以防止出錯,提高可移植性,可讀性,方便性 等等。
下面列舉一些成熟軟體中常用得宏定義:
1,防止一個頭文件被重復包含

#ifndef COMDEF_H

#define COMDEF_H

//頭文件內容

#endif

2,重新定義一些類型,防止由於各種平台和編譯器的不同,而產生的類型位元組數差異,方便移植。

typedef unsigned char boolean; /* Boolean value type. */

typedef unsigned long int uint32; /* Unsigned 32 bit value */

typedef unsigned short uint16; /* Unsigned 16 bit value */

typedef unsigned char uint8; /* Unsigned 8 bit value */

typedef signed long int int32; /* Signed 32 bit value */

typedef signed short int16; /* Signed 16 bit value */

typedef signed char int8; /* Signed 8 bit value */
3,得到指定地址上的一個位元組或字

#define MEM_B( x ) ( *( (byte *) (x) ) )

#define MEM_W( x ) ( *( (word *) (x) ) )

4,求最大值和最小值

#define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )

#define MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )

5,得到一個field在結構體(struct)中的偏移量

#define FPOS( type, field ) \

/*lint -e545 */ ( (dword) &(( type *) 0)-> field ) /*lint +e545 */

6,得到一個結構體中field所佔用的位元組數

#define FSIZ( type, field ) sizeof( ((type *) 0)->field )

7,按照LSB格式把兩個位元組轉化為一個Word

#define FLIPW( ray ) ( (((word) (ray)[0]) * 256) + (ray)[1] )

8,按照LSB格式把一個Word轉化為兩個位元組

#define FLOPW( ray, val ) \

(ray)[0] = ((val) / 256); \

(ray)[1] = ((val) & 0xFF)

9,得到一個變數的地址(word寬度)

#define B_PTR( var ) ( (byte *) (void *) &(var) )

#define W_PTR( var ) ( (word *) (void *) &(var) )

10,得到一個字的高位和低位位元組

#define WORD_LO(xxx) ((byte) ((word)(xxx) & 255))

#define WORD_HI(xxx) ((byte) ((word)(xxx) >> 8))

11,返回一個比X大的最接近的8的倍數

#define RND8( x ) ((((x) + 7) / 8 ) * 8 )

12,將一個字母轉換為大寫

#define UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )

13,判斷字元是不是10進值的數字

#define DECCHK( c ) ((c) >= '0' && (c) <= '9')

14,判斷字元是不是16進值的數字

#define HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||\

((c) >= 'A' && (c) <= 'F') ||\

((c) >= 'a' && (c) <= 'f') )

15,防止溢出的一個方法

#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))

16,返回數組元素的個數

#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )

17,返回一個無符號數n尾的值MOD_BY_Power_OF_TWO(X,n)=X%(2^n)

#define MOD_BY_POWER_OF_TWO( val, mod_by ) \

( (dword)(val) & (dword)((mod_by)-1) )
18,對於IO空間映射在存儲空間的結構,輸入輸出處理
#define inp(port) (*((volatile byte *) (port)))

#define inpw(port) (*((volatile word *) (port)))

#define inpdw(port) (*((volatile dword *)(port)))

#define outp(port, val) (*((volatile byte *) (port)) = ((byte) (val)))

#define outpw(port, val) (*((volatile word *) (port)) = ((word) (val)))

#define outpdw(port, val) (*((volatile dword *) (port)) = ((dword) (val)))

[2005-9-9添加]

19,使用一些宏跟蹤調試

A N S I標准說明了五個預定義的宏名。它們是:

_ L I N E _

_ F I L E _

_ D A T E _

_ T I M E _

_ S T D C _

如果編譯不是標準的,則可能僅支持以上宏名中的幾個,或根本不支持。記住編譯程序

也許還提供其它預定義的宏名。

_ L I N E _及_ F I L E _宏指令在有關# l i n e的部分中已討論,這里討論其餘的宏名。

_ D AT E _宏指令含有形式為月/日/年的串,表示源文件被翻譯到代碼時的日期。

源代碼翻譯到目標代碼的時間作為串包含在_ T I M E _中。串形式為時:分:秒。

如果實現是標準的,則宏_ S T D C _含有十進制常量1。如果它含有任何其它數,則實現是

非標準的。

可以定義宏,例如:

當定義了_DEBUG,輸出數據信息和所在文件所在行

#ifdef _DEBUG

#define DEBUGMSG(msg,date) printf(msg);printf(「%d%d%d」,date,_LINE_,_FILE_)

#else

#define DEBUGMSG(msg,date)

#endif

20,宏定義防止使用是錯誤

用小括弧包含。

例如:#define ADD(a,b) (a+b)

用do{}while(0)語句包含多語句防止錯誤

例如:#difne DO(a,b) a+b;\

a++;

應用時:if(….)

DO(a,b); //產生錯誤

else

解決方法: #difne DO(a,b) do{a+b;\

a++;}while(0)
宏中"#"和"##"的用法
一、一般用法
我們使用#把宏參數變為一個字元串,用##把兩個宏參數貼合在一起.
用法:
#include<cstdio>
#include<climits>
using namespace std;

#define STR(s) #s
#define CONS(a,b) int(a##e##b)

int main()
{
printf(STR(vck)); // 輸出字元串"vck"
printf("%d
", CONS(2,3)); // 2e3 輸出:2000
return 0;
}

Ⅳ 單片機中宏定義與重新定義數據類型(typedef)區別,並且各自的優勢(初學單片機)

1) #define宏定義有一個特別的長處:可以使用 #ifdef ,#ifndef等來進行邏輯判斷,還可以使用#undef來取消定義。

2) typedef也有一個特別的長處:它符合范圍規則,使用typedef定義的變數類型其作用范圍限制在所定義的函數或者文件內(取決於此變數定義的位置),而宏定義則沒有這種特性。

3)typedef比#define更安全。舉個例子:
typedef char* pStr1;

#define pStr2 char *

pStr1 s1, s2;

pStr2 s3, s4;

在上述的變數定義中,s1、s2、s3都被定義為char *,而s4則定義成了char,不是我們所預期的指針變數,根本原因就在於#define只是簡單的字元串替換而typedef則是為一個類型起新名字。

Ⅳ 單片機C語言編程利用宏定義的好處

如果你的程序在很多個地方都用到同一個量,而這些量都是一樣的,改變其中一個,其他的也要相應的改掉,這時候你就可以用宏定義,把這些量都用一個宏表示,當你需要改變這些值時,只要在定義處改變其值就可以了

Ⅵ 富士通單片機C語言編程中宏定義的問題

就是個條件編譯的宏,當開啟的時候從本模塊進行引用解析,當關閉的時候可以從外部模塊進行引用解析。
其實就是全局變數聲明加不加extern的開關。

Ⅶ 單片機C語言的宏定義有什麼作用!!

跟單片機沒關系,這是C語言的東西
-------------
#是C語言里的預處理命令,編譯器在編譯代碼之前,會預先處理這部分內容,#define 就是宏定義,對於 #define 的內容是怎樣處理的呢?看下面的代碼

#define MAX 128

void main()
{
int max=MAX;
}

編譯器處理時,會直接把 int max=MAX;替換成 int max=128; 注意,是文本替換,而不是變數賦值,程序中自始至終都不存在MAX這個變數,相當於是用「查找-替換」功能一樣,查找 MAX ,替換成 128 。

如果程序中有多個地方要用到同一個值、代碼塊,我們都可以定義成一個宏,如果這些值或代碼塊要改動,只需改下宏定義就行了,不用從代碼中一處一處的改,很方便,而且不會因為漏掉某個地方而導致程序出錯。

Ⅷ c51單片機名詞解釋 宏定義

宏定義本質上是C語言提供的預處理命令,並不是什麼單片機名詞。通俗的說宏就是替代符號,比如說你要定義一個人的年齡變數,在程序中你可以用#define age unsigned char。這樣你在程序中所能用到關於年齡的變數就可以這樣age XiJiping。對於一個復雜的程序,靈活運用宏定義可以讓你的程序更易讀,移植起來也會更容易。

Ⅸ 單片機中位定義和宏定義的區別 優缺點

位定義:定義一個名稱代替一個引腳,例如:JDQ=P1^1;
宏定義的話,就是這樣,A=JDQ;
宏定義的優點在於,當需要修改時會很方便。
比如在開頭宏定義了A=JDQ.當需要修改時,並不用去一個一個改,只要在宏定義里改一下就可以。
位定義和宏定義功能不同。

Ⅹ 單片機中的宏定義

我試過ATmega16的可以通過(codevisionavr環境)、看你現在用哪款AVR單片機,你這里是乘法乘的過程出現了溢出

閱讀全文

與單片機中宏定義變數相關的資料

熱點內容
java合並鏈表 瀏覽:501
pic單片機編譯器 瀏覽:803
麗水四軸加工中心編程 瀏覽:689
國產系統怎麼解壓 瀏覽:552
戰雙程序員 瀏覽:483
him觸摸編程軟體 瀏覽:931
植物大戰僵屍存檔怎麼轉移安卓 瀏覽:852
java棧的元素 瀏覽:737
程序員與籃球事件 瀏覽:675
app反編譯不完整 瀏覽:788
電腦上的文件夾怎麼調整 瀏覽:7
伺服器無響應是什麼原因呀 瀏覽:984
wd文檔里的app怎麼製作 瀏覽:513
電腦里的文件夾沒有了一般能恢復嗎 瀏覽:418
哪裡有配加密鑰匙的 瀏覽:210
伺服器開不了機怎麼把數據弄出來 瀏覽:958
gif動態圖片怎麼壓縮 瀏覽:521
黑猴子棒球壓縮文件解壓密碼 瀏覽:631
如何讓app適應不同的手機屏幕大小 瀏覽:10
蘋果手機如何給安卓手機分享軟體 瀏覽:761