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