学习单片机离不开C语言,C51中的运算符与通用C语言基本一致,常用的主要是位运算符、算术运算符、关系运算符、逻辑运算符和赋值运算符等。
C51中定义位变量需要寄存器,sbit是定义特殊功能寄存器的位变量。bit和sbit都是C51扩展的变量类型。典型应用是:sbit P0_0=P0^0; //即定义 P0_0 为 P0 口的第1位,声明地址中的某一位,以便进行位操作。bit, sbit 和 int ,char 之类的差不多,都可以定义变量,只不过char=8位,bit=1位。
"sfr"用来直接描述硬件地址,一组IO口的起始地址中数据 可以这样定义。
sfr P0 = 0x80; P0=0; //也就是对 P0 口全部给 0
sfr P0 = 0x80; 将地址 0x80 叫做引脚 P0, 字节为单位
sfr(special function register):特殊功能寄存器声明
例:sfr P0 = 0x80; 声明P0口寄存器,物理地址为0x80
sbit(special bit):特殊位声明
例:sbit P0_1 = 0x81; 或 sbit P0_1 = P0^1;
一、逻辑运算
1.1逻辑运算符
运算符 | 说明 | 结合性 | 举例 |
&& | 与运算,双目,对应数学中的 "且" | 左结合 | 1&&0,(9>3) && (a<b) |
|| | 或运算,双目,对应数学中的 "或" | 左结合 | 1 || 0,(9>3) || (a<b) |
! | 非运算,双目,对应数学中的 "非" | 右结合 | ! a、 ! (2>5) |
&& 逻辑与 条件式 1 && 条件式 2 如果两个条件式都为非零,则条件为真。
|| 逻辑或 条件式 1 || 条件式 2 如果两个条件式任意一个为非零,则条件为真。
! 逻辑非 !条件式 如果条件式为非零,则条件为真
二、位运算
汇编语言对位的处理能力是很强的,但是C语言也能对运算对象进行按位操作,从而使C语言也能具有一定的对硬件直接进行操作的能力。
2.1 & 按位与
运算中对应的数都为1则结果为1,任意一个数为0,则结果为0。
例如:0x53 & 0x24
0x53二进制 0101 0011
0x24二进制 0010 0100
与运算结果 0000 0000 0x00
2.2 | 按位或
运算中有任意一个数为1则结果为1。
例如:0x53 & 0x24
0x53二进制 0101 0011
0x24二进制 0010 0100
或运算结果 0111 0111 0x77
2.3 ~ 按位取反
- ~ 是对位取反,1变为0,0变为1
2.4 ^ 按位异或
运算中两个数都为0或者都为1则结果为0(相同为0,不同为1).
例如:0x53 & 0x24
0x53二进制 0101 0011
0x24二进制 0010 0100
异或运算结果 0111 0111 0x77
2.5 << 左移
运算符 | 意义 | 示例 | 结果 |
<< | 向左移位 | X<<Y | X的每个位向左移动Y位 |
>> | 向右移位 | X>>Y | X的每个位向右移动Y位 |
超过的位将丢失,而空出的位则补0。
例如:0x53
0x53二进制 : 0101 0011
左移一位: 1010 0110 十六进制:0xA6
左移两位: 0100 1100 十六进制:0x4C
2.6 >> 右移
超过的位将丢失,而空出的位则补0。
例如:0x53
0x53二进制 : 0101 0011
右移一位: 0010 1001 十六进制:0x29
右移两位: 0001 0100 十六进制:0x14