单片机运算符及表达式
C51的基本运算

C51的基本运算1) C51的算术和赋值运算(1)算术运算符和算术表达式C51语言一共支持5种算术运算符号。
运算符意义说明+加法运算或正值符号-减法运算或负值符号*乘法运算符号/除法运算符号,求整5/2,结果为2%除法运算符号,求余5%2,结果为1在C51语言中把用算术运算符和括号将运算对象连接起来的式子称为算术表达式,运算对象包括常量、变量、函数、数组和结构等。
在算术表达式中需要遵守一定的运算优先级,规定先乘(余),后加减,括号优先级最高,同级别从左到右,规律和数学计算相同。
2)赋值运算符和赋值表达式赋值运算符包括普通赋值运算符和复合赋值运算符两种,普通的赋值运算符使用“=”,复合赋值运算符是在普通赋值运算符之前加上其他运算符所构成的赋值符。
使用赋值运算符连接的变量和表达式构成赋值表达式。
赋值运算表达式举例:a=3*z;a+=b; /*等同于a=a+b*赋值运算涉及变量类型的转换,一般分为两种:一种是自动转换,一种是强制转换。
自动转换:不使用强制类型转化符,而是直接将赋值运算符号右边表达式或变量的值类型转化为左边的类型,一般是从“低字节宽度”向“高字节宽度”转换。
类型说明浮点型和整型浮点类型变量转化为整型时小数点部分被省略,只保留整数部分;反之只把整型修改为浮点型单、双精度浮点型单精度变量转化为双精度时在尾部添0,反之进行四舍五入的截断操作字符型和整型字符型变量转化为整型时,仅仅修改其类型;反之只保留整型的低八位强制转换:使用强制类型转化符来将一种类型转化为另一种类型,强制类型转化符号和变量类型相同。
强制类型转化举例double(y);/*将y转化为double类型*/int(x);z=unsigned char(x+y);/*将double类型数据y和int类型数据x相加之后转化为unsigned char类型赋给z/*1)逻辑运算C51语言有3种逻辑运算符。
①逻辑与:&&。
C51运算符和表达式

1.4关系运算符
关系运算符用于判断某个条件是否满足,条件满足结果 为1,条件不满足结果为0。
C51支持的关系运算符有:>(大于)、<(小于)、>= (大于等于)、<=(小于等于)、==(等于)和!=(不 等于)。其中前4种是高优先级,后2种是低优先级。
用关系运算符将2个表达式连接起来的式子称关系表达式, 关系表达式的格式如下:
1.2 算术运算符
由算术运算符将运算对象连接起来的式子称算术表达式, 算术表达式的格式如下:
表达式1 算术运算符 表达式2 各算术运算符的优先级参见表3-7,计算时按“从左至右”
的结合方式,即相同优先级算术运算符按照从左至右原则。
运算符 + - * / %
功能 加或取正 减或取负
乘 除 取余
举例 19+23、+7 56-41、-9
13*15 5/10=0、5.0/10.0=0.5
9%5=4
1.3 增减运算符
增减运算符是单目运算符,它对运算对象加1或减1操作 后回存至自身。增减运算符参见表3-5。增减运算符运算 对象只能是变量,不能是常数或表达式。
运算符 ++ ――
功能 自加1 自减1
举例 ++i:先执行i+1,再使用i值 i++:先使用i值,再执行i+1 ――i:先执行i-1,再使用i值 i――:先使用i值,再执行i-1
1.9 条件运算符
条件运算符(?:)是一个三目运算符。其一般格式如 下: 逻辑表达式?表达式1:表达式2
条件运算符先计算逻辑表达式,若其值为真(或非0值), 将表达式1作为整个条件表达式的值;若其值为假(或0 值),将表达式2作为整个条件表达式的值。 如:max = (a > b)?a : b, 执行结果是将a和b中较大的值赋值给变量max。
STC单片机C语言程序设计 第 章 STC单片机C语言运算符

员可以通过使用()修改运算的优先级顺序。
算术运算符
对于整数除法运算来说,遵循以下的规则: 整数相除且不能整除时,如果除数和被除数其中只有一个为负数,
运算符“/”的运算结果就为负数;如果除数和被除数两个均为负 数,运算符“/”的运算结果就为正数,这与代数运算的结果一致。 整数相除且不能整除时,如果除数和被除数中出现负数,则运算 符“%”的运算结果由表达式(a/b)*b+a%b=a确定,即a%b=a(a/b)*b。 对于运算符“/”和“%”来说,除数(第二个操作数)不能为0。
赋值运算符
从上面的过程可以清楚地看出来赋值的过程:
赋值过程是从右到左,即先等到“=”号右侧表达式的值;然后,在将右侧 表达式的值赋值给“=”号左侧的变量。
在赋值过程中,如果“=”号左右两侧的数据类型不相同的时候,将右侧表 达式的值自动的转换到与“=”左侧的数据类型相一致。
赋值运算符
在调试器模式下,在keil μVision集成开发环境右下角的Watch 1窗口中,分别输入两个变量a和b的名字,在右侧可以清楚地显 示这两个变量的值,一目了然。
无符号整数。将一个无符号型unsigned数据赋值给一个占用相 同存储单元的整型变量时,比如 unsigned int到int,unsigned long到long,unsigned short到short,原值照赋,内部存储方 式不变,但是外部的值可能变化,对于下面的代码:
volatile unsigned int a=40001;
赋值运算符
当a赋值給c后,c的值也是-32768。只不过a和c在8051单片机内 表示的形式不同而已,a=-32768用两个字节表示为0x8000,而 c=-127用四个字节表示为0xFFFF8000,从实质上来说,也是符 号扩展。当变量a值的符号位为1,表示负数时,使用1扩展,即 用1将高位填满得到长整型变量的值;而当变量a的符号位为0, 表示正数时,使用0扩展,即用0将高位填满得到长整型变量的值。
C51的基本运算

C51的基本运算1)C51的算术和赋值运算(1)算术运算符和算术表达式象包括常量、变量、函数、数组和结构等。
在算术表达式中需要遵守一定的运算优先级,规定先乘(余),后加减,括号优先级最高,同级别从左到右,规律和数学计算相同。
2)赋值运算符和赋值表达式赋值运算符包括普通赋值运算符和复合赋值运算符两种,普通的赋值运算符使用“=”,复合赋值运算符是在普通赋值运算符之前加上其他运算符所构成的赋值符。
使用赋值运算符连接的变量和表达式构成赋值表达式。
赋值运算表达式举例:a=3*z;a+=b;/*等同于a=a+b*赋值运算涉及变量类型的转换,一般分为两种:一种是自动转换,一种是强制转换。
自动转换:不使用强制类型转化符,而是直接将赋值运算符号右边表达式或变量的值类型转化为左边的类型,一般是从“低字节宽度”向“高字节宽度”转换。
量类型相同。
强制类型转化举例double(y);/*将y转化为double类型*/int(x);z=unsigned char(x+y);/*将double类型数据y和int类型数据x相加之后转化为unsigned char类型赋给z/*1)逻辑运算C51语言有3种逻辑运算符。
①逻辑与:&&。
②逻辑或:‖。
③逻辑非:!。
使用逻辑运算符将表达式或变量连接起来的表达式称为逻辑表达式,逻辑运算内部运算次序是先逻辑非后逻辑与和逻辑或,相同等级时从左到右,逻辑表达式的值为“真”或“假”,在C51系统中使用“0”代表“假”,使用“非0”代表逻辑“真”,但是逻辑运算表达式结果只能使用“1”来表示“真”。
逻辑表达式。
若a=3,b=6,则!a=0;/*a=3,为真,则!a为假0*/a&&b=1;a‖b=1;3)关系运算C51语言有6种关系运算,如下所示。
①小于:<。
②大于:>。
③小于等于:≤。
④大于等于:≥。
⑤如果等于:= =。
⑥如果不等于:!=。
关系运算符。
如果x,y,z的值分别为4,3,2,则x>y=1;y+z<y=0x>y>z=0;/*因为x>y为真,则为1,1小于2,则表达式结果为0*/4)位操作单片机有位寻址空间,支持位变量操作,恰当的位操作会大大提高单片机程序的运行速度,还能极大地方便用户编程。
51单片机位操作

C51单片机位操作方法C51对位的操控能力是非常强大的。
从这一点上,就可以看出C不光具有高级语言的灵活性,又有低级语言贴近硬件的特点。
这也是在各个领域中都可以看到C的重要原因。
在这一节中将详细讲解C51中的位操作及其应用。
1、位运算符C51提供了几种位操作符,如下表所示:1)“按位与”运算符(&)参加运算的两个数据,按二进位进行“与”运算。
原则是全1为1,有0为0,即:0&0=0; 0&1=0; 1&0=0; 1&1=1;如下例:a=5&3; //a=(0b 0101) & (0b 0011) =0b 0001 =1那么如果参加运算的两个数为负数,又该如何算呢?会以其补码形式表示的二进制数来进行与运算。
a=-5&-3; //a=(0b 1011) & (0b1101) =0b 1001 =-7在实际的应用中与操作经常被用于实现特定的功能:1.清零“按位与”通常被用来使变量中的某一位清零。
如下例:a=0xfe; //a=0ba=a&0x55;//使变量a的第1位、第3位、第5位、第7位清零a= 0b2.检测位要知道一个变量中某一位是‘1’还是‘0’,可以使用与操作来实现。
a=0xf5; //a=0bresult=a&0x08; //检测a的第三位,result=03.保留变量的某一位要屏蔽某一个变量的其它位,而保留某些位,也可以使用与操作来实现。
a=0x55; //a=0ba=a&0x0f; //将高四位清零,而保留低四位a=0x052)“按位或”运算符(|)参与或操作的两个位,只要有一个为‘1’,则结果为‘1’。
即有‘1’为‘1’,全‘0’为‘0’。
0|0=0; 0|1=1; 1|0=1; 1|1=1;例如:a=0x30|0x0f; //a=(0b)|(0b)=(0b)=0x3f“按位或”运算最普遍的应用就是对一个变量的某些位置‘1’。
C51基本语法

最新课件
8
1.2.2 变量 1.2.2.1变量类型 在程序运行中,其值可以改变的量称为变量
一个变量主要由两部分构成:一个是变量名, 一个是变量值。
每个变量都有一个变量名,在内存中占据一 定的存储单元(地址),并在该内存单元中存 放该变量的值。
最新课件
9
C51支持的变量通常有如下类型:
1. 位变量(bit)——位变量的值可以是1(true)或0(false)。与 805l硬件特性操作有关的位变量必须定位在8051CPU片内 存储区(RAM)的可位寻址空间中。
LARGE
参数及局部变量直接放入片外RAM(默认的存储类型是XDATA, 最大64KB);使用数据指针DPTR间接寻址。因此访问效率较低 且直接影响代码长度.
最新课件
16
1.2. 3 8051片内资源及位变量
1.2.3.1 特殊功能寄存器的C51定义
8051单片机的内部高128个字节为专用寄 存器区,其中51子系列有21个(52子系列 有26个)特殊功能寄存器(SFR),它们 离散的分布在这个区中,分别用于CPU并 行口、串行口、中断系统、定时/计数器等 功能单元及控制和状态寄存器。
2.浮点型常量。分为十进制和指数表示形式。十进制由数字 和小数点组成,如0.888,3345.345,0.0等,整数或小数部 分为0时可以省略0但必须有小数点。指数表示形式为: [±]数字[.数字]e[±]数字 [ ]中的内容为可选项,其中内容根据具体情况可有可无, 但其余部分必须有,如123e3,5e6,-1.0e-3。而e3,5e4.0则是 非法的表示形式。
4. 浮点型变量(float)——浮点型变量占4个字节(byte),许多 复杂的数学表达式都采用浮点变量数据类型。它用符号位 表示数的符号,用阶码和尾数表示数的大小。用它们进行 任何数学运算都需要使用由编译器决定的各种不同效率等 级的库函数。(补充存储格式)
单片机C51语言及程序设计

贰
壹
叁
C51编译器在头文件“REG51.H”中定义了全部sfr/sfr16和sbit变量。 用一条预处理命令#include <REG51.H>把这个头文件包含到C51程序中,无需重新定义即可直接使用它们的名称。
应用举例:
片内数据存储器,片外数据存储器和程序存储器。
通常下划线开头的标识符是编译系统专用的,因此在编写C语言源程序时一般不使用以下划线开头的标识符,而将下划线用作分段符。C51编译器规定标识符最长可达255个字符,但只有前32个字符在编译时有效,因此标识符的长度一般不要超过32个字符。
关键字是一种已被系统使用过的具有特定含义的标识符。用户不得再用关键字给变量等命名。C语言关键字较少,ANSI C标准一共规定了32个关键字,见表
变量名具有字母大小写的敏感性,如SUM和sum代表不同的变量。
【存储类别】 数据类型 【存储器类型】 变量名
变量名不得使用标准C语言和C51语言的关键字。
unsigned char data system_status = 0;
//定义system_status为无符号字符型自动变量,该变量位于data区中且初值为0。
sfr或sfr16型 51MCU中有21个SFR,如何定义与这些单元相关的变量?
例如,sfr P0 = 0x80; //定义P0口地址80H sfr PCON = 0x87; //定义PCON地址87H sfr16 DPTR=0x82; //定义DPTR的低端地址82H
单精度浮点数
for
程序语句
构成for循环结构
goto
程序语句
构成goto转移结构
if
程序语句
单片机C51教程

例9-2 求三个数a、b、c的和。 #include“stdio.h” main() /*主函数*/ {int a,b,c,sum; /*定义变量*/ a=12;b=34;c=56; /*给变量赋值*/ sum=a十b十c; /*求和*/ printf(“sum is %d\n”,sum);/*显示结果*/ } 执行以上程序,可在屏幕上输出a、b、c的和,并显示: sum is 102
5
例9-3 从输入的两个数a,b中,求出较大的 数的程序。
#include“stdio.h” int max(int x,int y) /*定义max函数,函数返回 值为整型;x,y为形式参 数,整型*/ { int z; if(x>y) z=x; else z=y; return(z); /*将z的值返回到调用 处*/ }
19
2.逻辑运算符的优先级 2.逻辑运算符的优先级
符 优先顺序为 !(非) 算术运算符 &&和¦¦ 。最低为赋值运算符。 关系运算
3.逻辑表达式
用逻辑运算符将关系表达式或逻辑量连接起来 的式子称为逻辑表达式。逻辑表达式的值只能是 0(假)或1(真)。
例:已知a=2,b=3,求!a、a&&b、!a && b !a为0(假) a=2非0故为假 a&&b为1(真) !a&&b 为0(假) 先执行!a为0故!a&&b为0
定义存储类型
例:int data x , y ; 表示变量x , y 为16位整数并 指定存储在片内数据存储区。 1.若未定义存储类型,则C51编译器自动选择默 认存储类型如下表: 存储模式 SMALL COMPACT LARGE 默认的存储类型
单片机C51语句 教案

else
语句2
编程者的本意是外层的if与else配对,缩进的if语句为内嵌的if语句,但实际上else将与缩进的那个if配对,因为两者最近,从而造迈岐义。为避免这种情况,建议编程时使用大括号将内嵌的if语句括起来,这样可以避免出现这样的问题。
三、swich语句
当程序中有多个分支时,可以使用if嵌套实现,但是当分支较多时,则嵌套的if语层数多,程序冗长而且可读性降低。C语言提供了switch语句直接处理多分支选择。Switch的一般形式如下:
教 案 纸第1页
学
科
单片机
C51语句汇总
检 查
授课班级
2
授课时数
6
教具
授课时间
教学方法
演示、讲解、
教学目的
掌握C51语句格式和使用方法和范围
教学重点
和难点
C51语句格式和使用方法和范围
复习提问
教学内容、方法、过程和板书设计
教学追记
一、if语句
if语句是用来判定所给定的条件是否满足根据判定的结果(真或假)决定执行给出的两
六、for语句
C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况。
for语句的一般形式为:
for(表达式1;表达式2;表达式3)语句
教 案 纸附页
第7页
教学内容、方法、过程和板书设计
教学追记
它的执行过程是:
(1)先求解表达式1
(2)求解表达式2,其值为真,则执行for语句中指定的内嵌语句(循环体),然后执行第(3)步,如果为假,则结束循环。
{ for(j=0;j<125;j++)
第四讲 C51的运算符,表达式及其规则

第四讲C51的运算符,表达式及其规则一、运算符的概念:运算符是完成某种特定运算的符号。
运算符按其表达式中与运算符的关系可分为单目运算符,双目运算符和三目运算符。
单目就是指需要有一个运算对象,双目就要求有两个运算对象,三目则要三个运算对象。
表达式则是由运算及运算对象所组成的具有特定含义的式子。
C 是一种表达式语言,表达式后面加“;”号就构成了一个表达式语句。
二、Cx51算术运算符及其表达式:1.算术运算符:单片机c语言中的算术运算符有如下几个,其中只有取正值和取负值运算符是单目运算符,其它则都是双目运算符:⏹+ 加或取正值运算符⏹- 减或取负值运算符⏹* 乘运算符⏹/ 除运算符⏹% 取余运算符2.算术表达式的形式:⏹表达式1 算术运算符表达式2如:a+b*(10-a), (x+9)/(y-a)等;除法运算符和一般的算术运算规则有所不一样,如是两浮点数相除,其结果为浮点数,如10.0/20.0 所得值为0.5,而两个整数相除时,所得值就是整数,如7/3,值为2。
3.算术运算的优先级与结合性:⏹1)先乘除,后加减,括号最优先;⏹2)一个运算对象两侧的运算符的优先级别相同时的运算顺序;注意:如果一个运算符的两侧的数据类型不同,则必须通过数据类型转换,将其转换成同种类型。
三、Cx51关系运算符及其表达式:1.Cx51提供的六种关系运算符:⏹> 大于⏹>= 大于等于⏹< 小于⏹<= 小于等于⏹== 测试等于(该符号只对等式进行测试,不赋值)⏹!= 测试不等于?2.关系表达式的形式:⏹表达式1 关系运算符表达式2⏹如:c>a+b,a>b!=c等;3.关系运算符的优先级及结合性:⏹1)前四种关系运算符优先级相同,后两种相同,但是前四种要高于后两者;⏹2)关系运算符的优先级低于算术运算符;⏹3)关系运算符的优先级高于赋值运算符;⏹4)关系运算符的结合性为左结合;⏹5)关系表达式的结果总是一个逻辑值,即真(逻辑1)或假(逻辑0);四、Cx51逻辑运算符及其表达式:1.逻辑运算符:⏹&& 逻辑"与"(AND)¦¦逻辑"或"(OR)! 逻辑"非"(NOT)2.逻辑运算符的行式:关系表达式1(或逻辑量1)逻辑运算符关系表达式2(或逻辑量2)如:!a,a¦¦b,!a&&b等;3.逻辑运算符的优先级:⏹1)逻辑表达式的结合性为自左向右;⏹2)逻辑表达式的值应该是一个逻辑量真(逻辑1)或假(逻辑0);3)注意逻辑运算与位逻辑运算是两个不同的概念;五、Cx51位操作及其表达式:1.Cx51提供的六种位操作运算符:& 按位与¦按位或^ 按位异或~ 按位取反<< 位左移>> 位右移2.位运算表达式的形式:⏹整型或字符型数1 位运算符整型或字符型数2⏹如:a&b,~a,a>>2等;六、Cx51自增减运算符及其表达式:1.自增减运算符:⏹++ 自增;⏹-- 自减;2.自增减运算表达式的形式:⏹自增减运算符表达式或是表达式自增减运算符⏹如:++i,--i;⏹i++,i--;等3.自增减运算表达式的结合性:⏹1)自增减运算符的结合方向是“自右向左”;⏹2)值得注意的是,自增减运算表达式只能用于变量,而不能用于常量表达式;七、Cx51复合运算符及其表达式:1.复合运算符(见表4-1所示):2.复合运算符的表达式:⏹表达式1 复合运算符表达式2;⏹如:a+=b,相当于a=a+b等;。
单片机c51程序结构中的4种选择语句

单片机c51程序结构中的4种选择语句单片机C51程序结构中的4种选择语句包括if语句、if-else语句、switch语句和三目运算符。
下面将分别对这四种选择语句进行详细介绍。
一、if语句if语句是单片机程序中最常用的选择语句之一,用于根据条件的真假来执行不同的代码块。
语法结构如下:```cif (条件){// 条件为真时执行的代码}```其中,条件可以是任意的逻辑表达式,当条件为真时,if语句后面的代码块将会被执行;当条件为假时,if语句后面的代码块将被跳过。
例如,下面的代码示例中,通过if语句判断变量x的值是否大于10,若成立则执行打印语句:```cif (x > 10){printf("x大于10");}二、if-else语句if-else语句是在if语句的基础上增加了“否则”的情况,用于在条件为真和条件为假时执行不同的代码块。
语法结构如下:```cif (条件){// 条件为真时执行的代码} else {// 条件为假时执行的代码}```当条件为真时,if语句后面的代码块将会被执行;当条件为假时,else语句后面的代码块将会被执行。
例如,下面的代码示例中,通过if-else语句判断变量x的值是否大于10,若成立则执行打印语句,否则执行另外一个打印语句:```cif (x > 10){printf("x大于10");} else {printf("x小于等于10");}三、switch语句switch语句用于根据不同的条件值执行不同的代码块,可以避免使用大量的if-else语句。
语法结构如下:```cswitch (表达式){case 值1:// 当表达式的值等于值1时执行的代码break;case 值2:// 当表达式的值等于值2时执行的代码break;// 可以添加更多的casedefault:// 当表达式的值不等于任何一个case时执行的代码break;}```switch语句首先根据表达式的值与每个case后面的值进行比较,当找到与表达式值相等的case时,执行该case后面的代码,并使用break语句跳出switch语句;若表达式的值不等于任何一个case时,执行default后面的代码。
单片机两个if语句并列运算

单片机两个if语句并列运算单片机中的两个if语句并列运算,是指通过if-else表达式来实现多个条件进行语句的调用与执行。
两个if语句并列运算可以将如下表达式翻译成即时代码:if (condition1) {statement1;}if (condition2) {statement2;}因此,上述条件语句可以用组合语句表示:if (condition1 && condition2) {statement1;statement2;}在C语言中,两个if语句的并列运算可以使用多个if-else语句表达,如下所示:if (condition1) {statement1;} else if (condition2) {statement2;}当多个条件进行并列运算时,C语言中可以使用“嵌套if”的表达式,如下所示:if (condition1) {if (condition2) {statement1;statement2;}}另一种常用的表达式是“条件运算符”,它也可以用来实现两个if语句的并列运算:condition 1 ?statement1: (condition 2 ? statement2 : statement3);其中condition1、condition2和statement1、statement2、statement3分别对应三个条件判断,两个if语句的并列运算可以通过该表达式的布尔值进行结果判断。
综上所述,单片机中的两个if语句并列运算,可以通过多个if-else语句或者条件运算符的表达式进行实现,以实现多个条件的判断和执行。
单片机原理及C51应用设计-理论篇-第3章

1.选择语句if
if语句是用来判断所给定的条件是否满足的一种操 作,它有两种基本形式。
(1) if(表达式) { 语句; }
(2) if(条件表达式) {语句1;}
else {语句2;}
3.2.3 常量与变量
1.常量 常量是在程序执行过程中其值不能改变的量。常量的数
据类型有整型、浮点型、字符型利字符串型等,C51编译器 还扩充了一种位(bit)标量。 (1)整型常量 十进制整数。如1234、-5678、0等。 十六进制整数。以0x开头的数是十六进制数,如0xl23。 (2)浮点型常量 浮点型常量有十进制表示形式和指数表示形式。 如0.3141。
3.1.1 C51与标准C的异同
1. C51虽然继承了标准C语言的绝大部分的特性,而且基本 语法相同。特定的硬件结构上有所扩展,如关键字sbit、 data、idata、xdata、code等。
2. 应用C51特别要注重对系统资源的理解,因为单片机的系 统资源相对PC机来说很贫乏,特别是对内部RAM,其中 的每一字节都要充分利用。
预处理命令 #include< >
函数说明 long fun1( );
float funຫໍສະໝຸດ ( );功能函数1 fun1( )
函数体
{
}
功能函数2 fun2( )
函数体
{
主函数 主函数体
} main( ) {
}
3.2.1 数据类型
表3-1 C51基本数据类型
3.2.2 运算符及表达式
表3-2 C51的运算符
3.2 C51程序设计基础
一般C语言程序具有如下的结构:
预处理命令 #include< >
函数说明 long fun1( );
《单片机原理及应用》教学课件 第7章-单片机C语言编程基础知识

7.1.2 C51 数据类型
3. sfr16
sfr16也是一种扩充数据类型,它定义的变量占用两个 内存单元。sfr16和sfr一样用于操作特殊功能存放器,不同 的是,sfr16定义的变量可访问16位特殊功能存放器,sfr16 类型变量的取值范围为0~65535。
该数据类型的定义格式如下: sfr16 变量名=变量地址; 此处的变量地址为16位地址中的低8位地址。通过sfr16 类型变量访问16位特殊功能存放器时,先读低字节数据,后 读高字节数据;对特殊功能存放器写入数据时,先写入高字 节地址,再写入低字节地址。
要在数字后面加上字母L,如104L,034L,7850L等。
〔2〕浮点型常量
浮点型常量可分为十进制和指数两种表示形式。
① 十进制浮点型常量由数字和小数点组成,整数或小数局部为0时可以省略,
但必须要保存小数点,如,,,.25,300.等。
② 指数浮点型常量表示形式为:[±]数字[.数字]e[±]数字。[]中的内容为可选
C语言程序本身不依赖于硬件开发平台,程序不做修改或做少量修改就可以移植到 不同的单片机中。目前,使用C语言进行程序设计已经成为单片机软件开发的主流。
基于单片机的C语言又称为C51语 言。和标准C语言所不同的是,C51语 言运行于单片机平台上,并根据单片 机的硬件特点扩展了局部关键字。以 下关于C语言的描述都是基于单片机的, 后面不再强调这一点。
项,如125e3,7e9,−3.0e−3等。
15
7.1.3 常量与变量
〔3〕字符型常量 将单个字符放在单引号内的常量就是字符型常量,如'a''d'等。有一类字符型常量专 门用来表示控制字符,如回车符、换行符等,它们被称为转义字符,其表示方式为在字 符前面加上一个反斜杠“\〞,如'\n'。常用转义字符如表7-3所示。
单片机c语言位运算做除法

单片机c语言位运算做除法单片机中的位运算在计算机科学中起着重要的作用。
位运算是指对二进制数字进行操作的一种运算方式,其中包括与、或、非、异或、左移和右移等操作。
在单片机中,位运算可以用来进行除法运算。
在单片机中,除法运算通常使用移位运算符来实现。
移位运算符包括左移运算符(<<)和右移运算符(>>)。
左移运算符将数字的所有位向左移动指定的位数,右移运算符将数字的所有位向右移动指定的位数。
在进行除法运算时,可以使用右移运算符来实现。
具体步骤如下:1. 将被除数和除数转换为二进制表示。
2. 使用右移运算符将被除数向右移动,直到它小于除数为止。
每次移动一位,同时记录移动的次数。
3. 记录移动的次数,即为除法的商。
以下是一个示例,演示如何使用位运算实现除法运算:```c#include <stdio.h>int main() {int dividend, divisor;printf("请输入被除数:");scanf("%d", ÷nd);printf("请输入除数:");scanf("%d", &divisor);int quotient = 0;int count = 0;while (dividend >= divisor) {dividend >>= 1; // 使用右移运算符将被除数向右移动 count++; // 记录移动的次数}quotient = count; // 移动的次数即为商printf("商:%d\n", quotient);return 0;}```在上述示例中,我们从用户输入获取被除数和除数。
然后,我们使用右移运算符将被除数向右移动,直到它小于除数为止。
每次移动一位,同时记录移动的次数。
最后,我们将移动的次数作为商打印出来。
单片机入门基础

(2)字符变量:singed char和unsigned char
(3)整型变量:singed int和unsigned int (4)长整型变量:unsigned long和signed long
(3) 实型变量:float和double (4) 寄存器变量:sfr和sfr16
4、单片机C程序的运算符和表达式
(6)片外扩展的I/O接口,可用#define进行定
义。ne ADC0804 XBYTE[0x7ffe]
程序示例
例1:清零程序 (将2000H—20FFH的内容清零) ★ 汇编语言程序 ORG 0000H SE01: MOV R0,#00H MOV DPTR,#2000H ;(0000H) 送DPTR LOO1: CLR A MOVX @DPTR,A ;0送(DPTR) INC DPTR ;DPTR+1 INC R0 ;字节数加1 CJNE R0,#00H,LOO1 ;不到FF个字节再清 LOOP: SJMP LOOP
(1)算术运算符13个:+、-、*、/、%、=、+=、 -=、*=、/=、%=、++、-(2)关系运算符6个:>、<、==、>=、<=、! = (3)逻辑运算符3个:&&、||、! (4)位操作运算符7个:>>、<<、|、&(相 与)、^、~、&(变量取地址) (5)指针运算符:*
5、单片机C程序的一般语法结构
例:
循环结构 (1)while(表达式){循环体语句;} 例:void delay(unsigned char times) { unsigned char I; i=250; while(--times){while(--i);} }
单片机运算符及表达式

单片机运算符及表达式对于单片机而言,运算符和表达式是编程中非常重要的概念。
它们能够帮助程序员完成各种计算任务,并且在实际应用中发挥着重要的作用。
本文将介绍单片机的运算符和表达式,包括其基本概念、分类以及在编程中的应用。
一、运算符的概念运算符是用于执行各种数学和逻辑运算的符号。
在单片机编程中,常见的运算符包括算术运算符、关系运算符、逻辑运算符、位运算符等。
1. 算术运算符算术运算符用于执行基本的数学运算,包括加减乘除以及取模等。
常见的算术运算符有加法运算符(+)、减法运算符(-)、乘法运算符(*)、除法运算符(/)和取模运算符(%)。
2. 关系运算符关系运算符用于比较两个值的大小关系,并返回一个布尔值(真或假)。
常见的关系运算符有大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)和不等于(!=)。
3. 逻辑运算符逻辑运算符用于执行布尔逻辑运算,常见的逻辑运算符有与(&&)、或(||)、非(!)等。
逻辑运算符通常用于条件判断和控制流程中。
4. 位运算符位运算符用于对数据的二进制位进行操作,包括按位与(&)、按位或(|)、按位取反(~)等。
位运算符在处理数字的二进制表示时非常有用。
二、表达式的概念表达式是由运算符和操作数组成的组合。
在单片机编程中,表达式可以包括常量、变量、运算符和函数调用等。
1. 常量常量是在程序运行过程中其值不会改变的量。
常见的常量包括整数常量、浮点数常量、字符常量和字符串常量等。
2. 变量变量是程序中用于存储和操作数据的一种数据类型。
在表达式中,可以使用变量来表示需要进行运算或比较的值。
3. 函数调用函数调用是使用函数来完成特定操作的方法。
在表达式中,可以调用各种函数,包括数学函数、逻辑函数等。
三、运算符和表达式的应用运算符和表达式在单片机编程中有着广泛的应用。
以下是几个常见的应用场景:1. 数值计算单片机可以使用算术运算符进行各种数值计算,如加减乘除等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三章运算符及表达式说明:Cx51的运算符与普通C语言的几乎完全一样,带复习性质,重点介绍在单片机中应用的特点。
一、运算符及表达式运算符:完成某种特定运算的符号。
运算符按其表达式中与运算符的关系可分为单目运算符,双目运算符和三目运算符。
单目就是指需要有一个运算对象,双目就要求有两个运算对象,三目则要三个运算对象。
运算对象:在程序运行时,有数值或有数值传递给它。
表达式:表达式则是由运算符及运算对象所组成的具有特定含义的式子。
C是一种表达式语言,表达式后面加;号就构成了一个表达式语句。
例:x=a*(b+c-a);子表达式:成对的括号以及在它们之间的全部符号组成的表达式。
上例中(b+c-a)就是子表达式。
二、运算符1、赋值运算符1) 赋值运算符赋值符号“=”完成的操作即为赋值运算,它是右结合性,且优先级最低。
2) 赋值表达式将一个变量与表达式用赋值号连接起来就构成赋值表达式。
形式如下:变量名=表达式赋值表达式中的表达式包括变量、算术运算表达式、关系运算表达式、逻辑运算表达式等,甚至可以是另一个赋值表达式。
赋值过程是将“=”右边表达式的值赋给“=”左边的一个变量,赋值表达式的值就是被赋值变量的值。
例如:a=(b=4)+(c=6);,该表达式的值为10,变量a 的值为10。
3) 赋值的类型转换规则在赋值运算中,当“=”两侧的类型不一致时,要将数据转换成同一数据类型,转换的方式有两种,一种是系统自动转换,一种是强制转换。
(1)系统自动转换编译时,将右边表达式的值转换成左侧变量的类型,再赋给该变量。
转换规则如下:①实型数据赋给整型变量时,舍弃小数部分。
②整型数据赋给实型变量时,数值不变,但以IEEE 浮点数形式存储在变量中。
③长字节整型数据赋给短字节整型变量时,实行截断处理。
如将long 型数据赋给int型变量时,将long 型数据的低两字节数据赋给int 型变量,而将long 型数据的高两字节的数据丢弃。
④短字节整型数据赋给长字节整型变量时,进行符号扩展。
如将int 型数据赋给long型变量时,将int 型数据赋给long 型变量的低两字节,而将long 型变量的高两字节的每一位都设为int 型数据的符号值。
)强制转换2(.使用强制类型转换运算符转换:(类型名) (表达式);将表达式的数据类型转换为前面要求的类型名。
例1:x=(float)a;y=(int)(x+y);例2:unsigned char x,y;unsigned int z;z=x+(unsigned int)y;4)应用在单片机中,经常要给寄存器、I/O口赋值:(1) P1=0xff;//给P1口全置1(2)P2=0x08; //给P2的第三位置1(3)TF0=0;//清定时器T0的溢出标志位(4)sbit P10=P1^0;//注意大写bit x;x=P10;P10=!P10;2、算术运算符c语言中的算术运算符有:+ 加或取正值运算符- 减或取负值运算符* 乘运算符/除运算符%模(求余)运算符上面这些运算符中加、减、乘、除为双目运算符,它们要求有两个运算对象。
这些大家已经很熟悉了。
3、关系运算符c语言中有6种关系运算符:> 大于< 小于>=大于等于<=小于等于==等于=不等于 !.前4种关系运算符具有相同的优先级,后两种关系运算符也具有相同的优先级;但前4种的优先级高于后2种。
优先级别:(低)赋值运算符→关系运算符→算术运算符(高)4、逻辑运算符逻辑运算符用来求某个条件式的逻辑值。
Cx51提供了3种逻辑运算符:|| 逻辑或( AND)&& 逻辑与(OR)! 逻辑非(NOT)逻辑表达式:用逻辑运算符将关系表达式或逻辑量连接起来。
逻辑表达式的一般形式为:逻辑与:条件式l&&条件式2逻辑或:条件式l || 条件式2逻辑非:!条件式例如:x&&y、a|| b、!z都是合法的逻辑表达式。
逻辑表达式的值是一个逻辑量真或假,0代表假,1代表真。
在逻辑运算中,把非0都看作逻辑1。
例:a=4;b=0;c=a||b;// c= 1c=a&&b;//c=0;c=!a;//c=0;5、位运算符1)能对运算对象进行按位操作,C语言中其有6种位运算符:&按位与| 按位或^ 按位异或~按位取反<< 左移>> 右移位运算符的作用是按位对变量进行运算,并不改变参与运算的变量值。
2)位运算符的优先级从高到低依次是:按位取反(~)→左移(<<)和右移(>>)→按位与(&) →按位异或(^)→按位或(|)。
3)所有位运算符的对象是int或 char数据类型,不能为实数。
4)位运算的应用例:P1=P1&0xf8;//将P1口的、、清零,其他位不变st=P0&0x07;//读、、的值,送入变量st,其他位不变1口的置P1将P1|0x08;//= P1.P1=(P1&0xbf)|0x04;//给置低电平,置高电平,其//他位不变X=a^b//判断a是否与b相等,相等为05)位左移和位右移运算符(<<、>>)位左移、位右移运算符“<<”和“>>”,用来将一个数的各二进制位的全部左移或右移1位;移位后,空白位补0,而溢出的位舍弃。
注意汇编语言的区别。
例:若a=EAH=B则表达式: a=a<<2,将a值左移两位,其结果为A8H。
汇编语言是循环移位,而C语言不是循环移位,但有循环移位的函数Unsigned char _cror_(unsigned char c, unsigned char c);上面时循环右移函数,c为待移动字符,b为移动位数。
循环左移函数是:Unsigned char _crol_(unsigned char c, unsigned char c);也可以自己编程循环移位。
下面讲右循环移位的例子。
例1:若a=B=0C3H,将a值右循环位移两位。
对a进行循环右移二位的程序如下:#include<>main(){ unsigned char a=0xc3,b,c,d;char data n=2;b=a<<(8-n);//b像左移6位,1、2位到7、8位c=a>>n;//右移2位d=c|b;//结果为=0xf0,教材中方法c=_cror_(a,2);//用库函数实现}(调“循环移位”演示)例2:LED动态显示时,位码要不断移动,现在用C语言编程实现。
0x08; P1=每显示一位后移位一次 P1=P1>>1;// )位运算与逻辑运算的比较 6逻辑运算位运算)符号比较1(!~取反(非)位运算是对各位进行运算,逻辑运算的对象是逻辑变量。
(2) && & 与例: || | 或 #include <AT89X51> Main().{ unsigned char a=136,b=34,x1,x2,x3,x4,x5,x6;//a=0x88,b=0x22x1=!a; //x1=0x2=~a; //x2=0x77x3=a||b;//x3=1x4=a|b; //x4=0xaax5=a&b; //x5=0x00x6=a&&b;//x6=1}(运行“逻辑运算”)6、自增减运算符、复合运算符1)自增减运算符自增减运算符的作用是使变量值自动加1或减1。
如:++i,- -I “运算符在前,先运算后使用”即:在使用i之前,先使i值加(减)1。
i++,i-- “运算符在后,先使用后运算”即:在使用i之后,再使i值加(减)1。
例:若i值原来为5,则j=++i; j值为6,i值也为6;。
6值为i,5值为 j=i++; j2) 复合运算符及其表达式凡是二目运算符,都可以与赋值运算符“=”一起组成复合赋值运算符。
Cx51共提供了10种复合赋值运算符,即+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=。
采用这种复合赋值运算的目的,是为了简化程序,提高C程序编译效率。
如: a+=b 相当于a=a+ba%=b 相当于a=a%ba-=b 相当于a=a-ba<<=3 相当于a=a<<3a*=b 相当于a=a*ba>>=2 相当于a=a>>2a/=b 相当于a=a/b7、条件运算符:条件运算符,根据条件进行选择的运算符。
关系表达式1 表达式2;表达式3;表达式1的值为1,执行表达式2,否则执行表达式3。
例:z=(a>b)a:b;if(a>b)相当于:z=a;elsez=b;8、应用例子下面举一个使用位操作运算扫描识别键盘的例子。
1)工作原理图示为8051单片机与一个4×4键盘接口的扫描电路。
(1) P1口的高四位作为行驱动线,轮流给高4位输出高电平,经非门变为低电平;(2)读P1的低4位,如无键按下,P1的低4位应全为1;若有键按下,则不全为1。
(3)判断是否为同一次按键,将前次采集的值和本次采集的值相异或,同一次按键异或后为0,则不用新值替换旧值,若不一样,用新值替换旧值。
源程序如下:#include<>#define uchar unsigned charchar data old;//全局变量,传递数据key(){uchar cl;for(cl=0x10;cl!=0;cl=cl<<1)//item1{P1=0x0f|cl;//给高位轮流置1,给低位高电平,准备读端口if((P1&0x0f)!=0x0f)//判断低4为是否全为1{if((P1^old)>0)//用异或判断按下的是否是新键old=P1;//不同将新值存入旧值中}}}main(){uchar i;old=0xff;//先给旧键值赋初值for(i=1;i<10;i++)key();}iteml:在程序中使用了for循环,详细内容将在第四章讨论。
到发现变量cl变成O为止,这段程序将循环四次。
变量cl的初值为Oxl0,在向左移动四次后,有1的位将变为0,变量cl的所有位的值将全为0。
像汇编语言执行一个位移指令一样,一个<<指令逐次将所有移动的值填上0。
)(调“键盘”。