⑴ 單片機資料里關於IO描述不太懂,求助!
表示連續位的范圍(位域),例如書寫成PORTA[7:5]就是代表由PORTA寄存器第5位到第7位組成的位域。
位域的概念可以參考C語言結構體的位域定義。
⑵ C語言中「位域」與「域寬」有什麼區別。
有些信息在存儲時,並不需要佔用一個完整的位元組,而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1
兩種狀態,用一位二進位即可。為了節省存儲空間,並使處理簡便,c語言又提供了一種數據結構,稱為「位域」或「位段」。所謂「位域」是把一個位元組中的二進位劃分為幾個不同的區域,並說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。這樣就可以把幾個不同的對象用一個位元組的二進制位域來表示。一、位域的定義和位域變數的說明位域定義與結構定義相仿,其形式為:
struct
位域結構名
{
位域列表
};
其中位域列表的形式為:
類型說明符
位域名:位域長度
例如:
struct
bs
{
int
a:8;
int
b:2;
int
c:6;
};
⑶ 解釋下位域,為什麼要用位域,位域的好處
位域是指信息在存儲時,並不需要佔用一個完整的位元組,
而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1
兩種狀態,
用一位二進位即可。為了節省存儲空間,並使處理簡便,C語言又提供了一種數據結構,稱為"位域"或"位段"。所謂"位域"是把一個位元組中的二進位劃分為幾
個不同的區域,
並說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。
這樣就可以把幾個不同的對象用一個位元組的二進制位域來表示。
使用位域的好處是:
1.有些信息在存儲時,並不需要佔用一個完整的位元組,
而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1
兩種狀態,
用一位二進位即可。這樣節省存儲空間,而且處理簡便。
這樣就可以把幾個不同的對象用一個位元組的二進制位域來表示。
2.可以很方便的利用位域把一個變數給按位分解。比如只需要4個大小在0到3的隨即數,就可以只rand()一次,然後每個位域取2個二進制位即可,省時省空間。
⑷ 在單片機c語言中,結構體中的 U16 First_RF:1;是什麼意思怎麼解釋 條件判斷 if
U16 First_RF:1;是某個結構中定義了位域 First_RF,其寬度為1比特。
if (Flag.First_RF) 的意思是 如果 結構Flag的成員First_RF 非零。
⑸ 請問STM32全局位域(位段)怎麼定義
你在.h文件下建立CtrlBit這個共用體類型,然後在對應的.c文件全局處定義這個共用體,最後在.h文件加extern 聲明為外部變數就行了。
這里共用體跟結構體聲明的格式是這樣的喔:union CtrlBit{ ... };或者typedef union{ ... }CtrlBit; 在.c文件全局處定義union CtrlBit CtrlBit1;或者 CtrlBit CtrlBit1;(這個是typdef前提下),最後在.h文件進行外部變數聲明extern union CtrlBit CtrlBit1;
⑹ 51單片機寄存器這個表格是什麼意思
第一列,Bit,也就是位/位域。例如Bit[3:2]就是代表這個8位寄存器中的第3位和第2位。
第二列,Name,也就是位/位域的名稱。
第三列,Reset,也就是復位後的默認值。
第四列,R/W,也就是該位/位域的讀寫屬性。RO = Read Only只讀,WO = Write Only只寫,R/W = Read/Write可讀可寫。此外也有一些特殊的玩意兒例如W1C(寫1清零)之類。
第五列,Description,功能描述。
⑺ 51單片機 bitzone 什麼意思
字面意思就是,位域。
⑻ c語言 關於位域的使用
一、位域
有些信息在存儲時,並不需要佔用一個完整的位元組,
而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1
兩種狀態,
用一位二進位即可。為了節省存儲空間,並使處理簡便,C語言又提供了一種數據結構,稱為「位域」或「位段」。所謂「位域」是把一個位元組中的二進位劃分為幾個不同的區域,
並說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。
這樣就可以把幾個不同的對象用一個位元組的二進制位域來表示。一、位域的定義和位域變數的說明位域定義與結構定義相仿,其形式為:
struct
位域結構名
{
位域列表
};
其中位域列表的形式為:
類型說明符
位域名:位域長度
如
struct
bs
{
int
a:8;
int
b:2;
int
c:6;
};
位域變數的說明與結構變數說明的方式相同。
可採用先定義後說明,同時定義說明或者直接說明這三種方式。例如:
struct
bs
{
int
a:8;
int
b:2;
int
c:6;
}data;
說明data為bs變數,共占兩個位元組。其中位域a佔8位,位域b佔2位,位域c佔6位。對於位域的定義尚有以下幾點說明:
1.
一個位域必須存儲在同一個位元組中,不能跨兩個位元組。如一個位元組所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如:
struct
bs
{
unsigned
a:4
unsigned
:0
/*空域*/
unsigned
b:4
/*從下一單元開始存放*/
unsigned
c:4
}
在這個位域定義中,a占第一位元組的4位,後4位填0表示不使用,b從第二位元組開始,佔用4位,c佔用4位。
2.
由於位域不允許跨兩個位元組,因此位域的長度不能大於一個位元組的長度,也就是說不能超過8位二進位。
3.
位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:
struct
k
{
int
a:1
int
:2
/*該2位不能使用*/
int
b:3
int
c:2
};
從以上分析可以看出,位域在本質上就是一種結構類型,
不過其成員是按二進位分配的。
二、位域的使用
位域的使用和結構成員的使用相同,其一般形式為:
位域變數名·位域名
位域允許用各種格式輸出。
main(){
struct
bs
{
unsigned
a:1;
unsigned
b:3;
unsigned
c:4;
}
bit,*pbit;
bit.a=1;
bit.b=7;
bit.c=15;
printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
pbit=&bit;
pbit->a=0;
pbit->b&=3;
pbit->c|=1;
printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);
}
上常式序中定義了位域結構bs,三個位域為a,b,c。說明了bs類型的變數bit和指向bs類型的指針變數pbit。這表示位域也是可以使用指針的。
程序的9、10、11三行分別給三個位域賦值。(
應注意賦值不能超過該位域的允許范圍)程序第12行以整型量格式輸出三個域的內容。第13行把位域變數bit的地址送給指針變數pbit。第14行用指針方式給位域a重新賦值,賦為0。第15行使用了復合的位運算符"&=",
該行相當於:
pbit->b=pbit->b&3位域b中原有值為7,與3作按位與運算的結果為3(111&011=011,十進制值為3)。同樣,程序第16行中使用了復合位運算"|=",
相當於:
pbit->c=pbit->c|1其結果為15。程序第17行用指針方式輸出了這三個域的值。
⑼ 在單片機C語言中如何對變數的某一位進行操作或賦值。
在C語言中,一般有兩種方法來操作位,一種是使用C語言提供的位運算操作符,一種是使用位域。
1、使用位域
在C語言中定義位域的一般格式如下:
struct位域結構名
{位域列表};
struct:在C語言中定義位域所使用的關鍵字是struct。
位域結構名:是一個C語言中的標識符,有字母、數字、下劃線組成,而且第一個字元必須是字母或者下劃線。
位域列表:組其中位域列表的形式為: 類型說明符 位域名:位域長度
下面的示例代碼,通過位域來計算IEEE754浮點數編碼中單精度數的最大值 、最小值和最小弱規范數。
#include<stdio.h>
typedefstructFP_SINGLE
{
unsigned__int32fraction:23;
unsigned__int32exp:8;
unsigned__int32sign:1;
}fp_single;
intmain()
{
floatx;
fp_single*fp_s=(fp_single*)&x;
fp_s->sign=0;
fp_s->exp=0xfe;
fp_s->fraction=0x7fffff;
printf("float最大數:%le ",(double)x);
fp_s->sign=0;
fp_s->exp=0x1;
fp_s->fraction=0x0;
printf("float最小數:%le ",(double)x);
fp_s->sign=0;
fp_s->exp=0;
fp_s->fraction=0x1;
printf("float最小弱規范數:%le ",(double)x);
return0;
}
2、使用位運算符
C語言中的位運算符有一個基本的常識,即只能操作整數,不能操作浮點數,因為浮點數是使用IEEE754編碼的,使用位操作數沒有任何意義。
C語言提供的位運算符列表:
&按位與如果兩個相應的二進制位都為1,則該位的結果值為1,否則為0
|按位或兩個相應的二進制位中只要有一個為1,該位的結果值為1
^按位異或若參加運算的兩個二進制位值相同則為0,否則為1
~取反~是一元運算符,用來對一個二進制數按位取反,即將0變1,將1變0
<<左移用來將一個數的各二進制位全部左移N位,右補0
>>右移將一個數的各二進制位右移N位,移到右端的低位被舍棄,對於無符號數,高位補0