用户工具

站点工具


侧边栏

抱歉,您没有权限增加页面
3.单片机c语言:4.运算符和表达式

八位流水灯学单片机C语言之运算符

运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 语言内置了丰富的运算符,并提供了以下类型的运算符:

  1. 算术运算符
  2. 关系运算符
  3. 逻辑运算符
  4. 位运算符
  5. 赋值运算符

本章将逐一介绍算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符。

算术运算符

下表显示了 C 语言支持的所有算术运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:

运算符 描述 实例
+ 把两个操作数相加 A + B 将得到 30
- 从第一个操作数中减去第二个操作数 A - B 将得到 -10
* 把两个操作数相乘 A * B 将得到 200
/ 分子除以分母 B / A 将得到 2
% 取模运算符,整除后的余数 B % A 将得到 0
++ 自增运算符,整数值增加 1 A++ 将得到 11
-- 自减运算符,整数值减少 1 A-- 将得到 9

关系运算符

下表显示了 C 语言支持的所有关系运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:

运算符 描述 实例
== 检查两个操作数的值是否相等,如果相等则条件为真。 (A == B) 不为真。
!= 检查两个操作数的值是否相等,如果不相等则条件为真。 (A != B) 为真。
> 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 (A > B) 不为真。
< 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 (A < B) 为真。
>= 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 (A >= B) 不为真。
<= 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 (A <= B) 为真。

逻辑运算符

下表显示了 C 语言支持的所有关系逻辑运算符。假设变量 A 的值为 1,变量 B 的值为 0,则:

运算符 描述 实例
&& 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 (A && B) 为假。
|| 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 (A || B) 为真。
! 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 !(A && B) 为真。

位运算符

位运算符作用于位,并逐位执行操作。&、 | 和 ^ 的真值表如下所示:

p q p & q p | q p ^ q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:

A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A  = 1100 0011

下表显示了 C 语言支持的位运算符。假设变量 A 的值为 60,变量 B 的值为 13,则:

运算符 描述 实例
& 两个操作数按位与,有0出0,全1为1。 (A & B) 将得到 12,即为 0000 1100
| 两个操作数按位或,有1出1,全0为0。 (A | B) 将得到 61,即为 0011 1101
^ 两个操作数按位异或,相同为0,不同为1 (A ^ B) 将得到 49,即为 0011 0001
~ 取反,具有"翻转"位效果。 (~A ) 将得到 -61,即为 1100 0011,2 的补码形式,带符号的二进制数。
<< 二进制左移运算符。操作数的值向左移动指定的位数。 A << 2 将得到 240,即为 1111 0000
>> 二进制右移运算符。操作数的值向右移动指定的位数。 A >> 2 将得到 15,即为 0000 1111

赋值运算符

下表列出了 C 语言支持的赋值运算符:

运算符 描述 实例
= 简单的赋值运算符,把右边操作数的值赋给左边操作数 C = A + B 将把 A + B 的值赋给 C
+= 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 C += A 相当于 C = C + A
-= 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 C -= A 相当于 C = C - A
*= 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 C *= A 相当于 C = C * A
/= 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 C /= A 相当于 C = C / A
%= 求模且赋值运算符,求两个操作数的模赋值给左边操作数 C %= A 相当于 C = C % A
<<= 左移且赋值运算符 C <<= 2 等同于 C = C << 2
>>= 右移且赋值运算符 C >>= 2 等同于 C = C >> 2
&= 按位与且赋值运算符 C &= 2 等同于 C = C & 2
^= 按位异或且赋值运算符 C ^= 2 等同于 C = C ^ 2
|= 按位或且赋值运算符 C |= 2 等同于 C = C | 2

下面来看两个运算符的例子,第一个,for循环条件运算,每次结果赋值到P0口,形成流水灯效果

#include<stc12.h> //STC12系列头文件 复制到工程目录下

sbit LEDK = P1^4;// 控制三极管基极

void main(void)	 
{   
    unsigned int i,k; //定义变量
    LEDK=0;  //置0使PNP型三极管导通LED负极接地
    P0=0x00;	//P0口电平初始化为0 关闭全部LED
    P0M1=0x00;
    P0M0=0xff; //P0口全部设置为推挽输出 见手册87页 IO口模式配置
	while(1) 
	{
		//K=1 2 4 8 16 32 64 128转化为十六进制0x01 0x02 0x04 0x08 ....0x40 0x80			 
	   for(k=1;k<256;k=k*2) //变量K每次累计乘以2
	   {
	     P0=k; //赋值到P0口
		 for(i=0;i<50000;i++);  //延时一会
	   }
	}
}
   本示例完整代码在\STC51 Discovery\实验例程\基础实验\实验六

第二个,使用左移运算配合for循环,实现流水灯效果

#include<stc12.h> //STC12系列头文件 复制到工程目录下

sbit LEDK = P1^4;// 控制三极管基极

void main(void)
{
  unsigned char i,j; //定义变量
  unsigned int k;
  LEDK=0;  //置0使PNP型三极管导通LED负极接地
  P0=0x00;	//P0口电平初始化为0 关闭全部LED
  P0M1=0x00;
  P0M0=0xff; //P0口全部设置为推挽输出 见手册87页 IO口模式配置
  while(1)
  {
      j=0x01;//赋初值点亮最低位的LED 为左移做准备0000 0001 <<
      for(i=0;i<8;i++) //循环八次配合左移依次点亮
      {
	 P0=j;  // 当第一次循环i=0时,P0初始值j=0x01 
	 for(k=0;k<50000;k++);  //延时一会 
	 j=j<<1;//j左移一位准备下一次循环j的值再赋给P0口 0000 0010
			   
      }     
  }
}
   本示例完整代码在\STC51 Discovery\实验例程\基础实验\实验七
3.单片机c语言/4.运算符和表达式.txt · 最后更改: 2017/02/26 15:40 由 wawooo