A. 在單片機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
B. 單片機 C語言中 ^是啥意思
^ 這是按位異或運算,屬於算術運算。
按位運算的邏輯是:相同位置的位,按相同出0,不同出1的方法,進行對齊的位運算,如 0x55 ^0x69:
0101 0101(0x55)
0110 1001(0x69)
————————
0011 1100(0x3c)
C. 在8位單片機如何實現16位運算
如果你是用C編譯器,那麼根本就不用考慮這個問題,因為編譯器都為你解決了,你只需要定義16位的變數(如int型)
但如果你是用匯編語言寫程序,那麼就得為程序分配內存單元(字型變數),利用四個或四個以上的八位寄存器,先低八位進行運算,然後進行高八位的運算,但其中要注意狀態寄存器的變化。
D. 單片機機 中怎樣和哪幾種位元組位操作的方式,最好給點C語言代碼並解釋
1、ANSIC中,一般採用「讀-修改-寫」的方法實現單個位的位操作,通過與0「與」操作,將某一位清0。如使i變數的b0位為0,實現方法為i=i&0xfe。通過與1「或」操作,將某一位置1。如使i變數的b0位為1,實現方法為i=i|0x01。通過與1「異或」操作,將某一位取反。如使i變數的b0位取反,實現方法為i=i^0x01。
2 、通過位域的方法實現位操作
標准C提供了一種基於結構體的數據結構--位域(BitField),位域就是把一個存儲單元中的二進制劃分為幾個不同的區域。並說明每個區域的位數。每一個域有一個域名,允許在程序中按域名進行操作,位域的定義格式如下:
struct 位域結構名{
位域列表 };
位域列表格式為:類型說明符 位域名:位域長度如:
struct k{
unsigned int a:1
unsigned int :2
unsigned int b:3
unsigned int :0 //空域
}k1;
說明:
1)各位依次從低位到高位排列,排滿一個存儲單元,按地址接著排下一單元;
2)位域可以無域名,但不能被引用,如第二域,這時其只用來填充或調整位置;
3)第四行稱空域,目的是將目前存儲單元的剩餘部分分為一個域,且填充0。
位域的引用很簡單,如:
k1.a=1; //置k1的b0位為1
k1.b=7; //將k1的b3-5位置111
通過位域定義位變數,是實現單個位位操作的重要途徑和方法,採用位域定義位變數,產生的代碼緊湊、高效。
E. 51單片機匯編語言:位操作指令有哪些
數據位傳送指令
MOV C, bit ;bit 可直接定址位 C←(bit)
MOV bit,C ;C 進位位 (bit) ← C
位變數修改指令
CLR C ; 將C=0
CLR bit
CPL C ; 將C求反再存入C
CPL bit ; 將bit求反再存入bit
SETB C ; 將C=1
SETB bit ; (bit) ← 1
位變數邏輯指令
ANL C, bit ANL C, bit ORL C, bit ORL C, bit
F. 單片機系統指令的位操作指令
一、數據位傳送指令
MOV C,bit
MOV bit,C
如MOV C,06H ;(20H).6→Cy
06H是內部RAM 20H位元組位6的位地址。
MOV P1.0,C ;Cy→P1.0
可定址位的具體定義:從20H單元的第一位開始一直到2FH單元的最後一位分別為00H~7FH以及特殊功能寄存器中80H~F7H。
二、位變數修改指令
CLR C ;清「0」Cy
CLR bit ;清「0」bit位
CPL C ;Cy求反
CPL bit ;bit位求反
SETB C ;置「1」 Cy
SETB bit ;置「1」bit位
三、位變數邏輯與指令
ANL C,bit ;bit ∧Cy →Cy
ANL C,/bit; ;/ bit ∧Cy →Cy
四、位變數邏輯或指令
ORL C,bit ;bit ∨ Cy →Cy
ORL C,/bit ;/ bit ∨ Cy →Cy
五、條件轉移類指令
JC rel ;如果進位位Cy=1,則轉移
JNC rel ;如果進位位Cy=0,則轉移
JB bit,rel ;如果直接定址位=1,則轉移
JNB bit,rel ;如果直接定址位=0,則轉移
JBC bit,rel ;如果直接定址位=1,則轉移,並對bit位清0