1、一、一、C C语言与语言与MCS-51MCS-51二、二、C51C51的数据类型的数据类型三、三、C51C51的运算量与存储类型的运算量与存储类型四、四、C51C51的运算符和表达式的运算符和表达式五、表达式语句与复合语句五、表达式语句与复合语句六、六、C51C51的输入的输入/ /输出输出七、七、C51C51的程序结构的程序结构八、函数八、函数九、九、C51C51构造数据类型构造数据类型1、C语言与语言与51单片机单片机2、C51与标准与标准C3、C51程序结构程序结构nC语言目前已成为电子工程师进行单片机系统语言目前已成为电子工程师进行单片机系统开发时的常用编程语言。开发时的常用编程语言。
2、n用用C语言来编写目标系统软件,会大大缩短开语言来编写目标系统软件,会大大缩短开发周期,且明显地增加软件的可读性,便于改发周期,且明显地增加软件的可读性,便于改进和扩充。进和扩充。n用用C语言编写的应用程序必须经单片机的语言编写的应用程序必须经单片机的C语语言编译器言编译器(简称简称C51),转换生成单片机可执行,转换生成单片机可执行的代码程序。的代码程序。n基于基于51系列单片机的系列单片机的C语言或语言或C语言编译器简语言编译器简称为称为C51语言或语言或C51。n用汇编程序设计用汇编程序设计MCS51系列单片机应用程序系列单片机应用程序时,必须要考虑其时,必须要考虑其存储器结构存储器结构
3、,尤其必须考虑,尤其必须考虑其片内数据存储器与特殊功能寄存器正确、合其片内数据存储器与特殊功能寄存器正确、合理的使用以及按实际地址处理端口数据。理的使用以及按实际地址处理端口数据。n用用C语言编写语言编写MCS51单片机的应用程序,虽单片机的应用程序,虽然不像用汇编语言那样具体地组织、分配存储然不像用汇编语言那样具体地组织、分配存储器资源和处理端口数据,但在器资源和处理端口数据,但在C语言编程中,语言编程中,对数据类型与变量的定义,必须要与单片机的对数据类型与变量的定义,必须要与单片机的存储结构相关联,否则编译器不能正确地映射存储结构相关联,否则编译器不能正确地映射定位。定位。n支持支持MCS
4、51系列单片机的系列单片机的C语言编译语言编译器有很多种。如器有很多种。如American Automation、Avocet、BSO/TASKING、DUNFIELD SHAREWARE、KEIL、Franklin等。等。n其中其中KEIL以它的代码紧凑和使用方便等以它的代码紧凑和使用方便等特点优于其它编译器,目前用得最为普特点优于其它编译器,目前用得最为普遍。遍。nC51的主要语法规定、程序结构及程序设计方的主要语法规定、程序结构及程序设计方法都与标准的法都与标准的C语言相同,但在某些方面有区别。语言相同,但在某些方面有区别。 n具体地说,在以下几个方面不一样:具体地说,在以下几个方面不一
5、样:(1)C51中定义的中定义的库函数库函数和标准和标准C语言定义的语言定义的库函数不同。标准的库函数不同。标准的C语言定义的库函数是按语言定义的库函数是按通用微型计算机来定义的,而通用微型计算机来定义的,而C51中的库函中的库函数是按数是按MCS-51单片机相应情况来定义的;单片机相应情况来定义的;(2)C51中的中的数据类型数据类型与标准与标准C的数据类型也的数据类型也有一定的区别,在有一定的区别,在C51中还增加了几种针对中还增加了几种针对MCS-51单片机特有的数据类型;单片机特有的数据类型;(3)C51变量的变量的存储模式存储模式与标准与标准C中变量的存中变量的存储模式不一样,储模式
6、不一样,C51中变量的存储模式是与中变量的存储模式是与MCS-51单片机的存储器紧密相关的;单片机的存储器紧密相关的;(4)C51与标准与标准C的的输入输出处理输入输出处理不一样,不一样,C51中的输入输出是通过中的输入输出是通过MCS-51串行口来串行口来完成的,输入输出指令执行前必须要对串行完成的,输入输出指令执行前必须要对串行口进行初始化;口进行初始化;(5)C51与标准与标准C在在函数函数使用方面也有一定的使用方面也有一定的区别,区别,C51中有专门的中断函数。中有专门的中断函数。表表1 ANSI C标准关键字标准关键字关键字关键字用用 途途说明说明auto存储种类说明用于声明局部变量
7、,为默认值break程序语句退出最内层循环体case程序语句switch语句中的选择项char数据类型声明单字节整型数或字符型数据const存储种类说明在程序执行过程中不可修改的值continue程序语句转向下一次循环default程序语句switch语句中缺省选择项do程序语句构成dowhile 循环结构double数据类型声明双精度浮点数else程序语句构成ifelse 条件结构enum数据类型声明枚举类型数据extern存储种类说明在其他程序模块中声明了的全局变量float数据类型声明单精度浮点数for程序语句构成for循环结构goto程序语句构成goto循环结构if程序语句构成ifel
8、se 条件结构int数据类型声明整型数long数据类型声明长整型数register存储种类说明使用CPU内部寄存器变量return程序语句函数返回short数据类型声明短整型signed数据类型声明有符号整型数sizeof运算符计算表达式或数据类型的字节数static存储种类说明静态变量struct数据类型声明结构体类型数据switch程序语句构成switch选择结构typedef数据类型声明重新进行数据类型定义union数据类型声明联合类型数据unsigned数据类型声明无符号数据void数据类型声明无类型数据或函数volatile数据类型声明声明该变量在程序执行中可被隐含地改变while程
9、序语句构成while和dowhile循环结构表表2 C51编译器扩充关键字编译器扩充关键字关键字关键字用途用途说明说明_at_地址定位地址定位为变量进行绝对地址定位为变量进行绝对地址定位_priority_ 多任务优先声多任务优先声明明规定规定RTX51或或RTX51 Tiny的任务优的任务优先级先级_task_任务声明任务声明定义实时多任务函数定义实时多任务函数alien函数特性声明函数特性声明用于声明与用于声明与PL/M51兼容的函数兼容的函数bdata存储器类型声存储器类型声明明可位寻址的可位寻址的MCS-51内部数据存储器内部数据存储器bit位变量声明位变量声明声明一个位变量或位类型函
10、数声明一个位变量或位类型函数code存储器类型声存储器类型声明明MCS-51的程序存储空间的程序存储空间compact存储器模式存储器模式按按compact模式分配变量的存储空间模式分配变量的存储空间data存储器类型声存储器类型声明明直接寻址直接寻址MCS-51的内部数据寄存器的内部数据寄存器idata存储器类型声明存储器类型声明间接寻址间接寻址MCS-51的内部数据寄的内部数据寄存器存器interrupt中断函数声明中断函数声明定义一个中断服务函数定义一个中断服务函数large存储器模式存储器模式按按large模式分配变量的存储空间模式分配变量的存储空间pdata存储器类型声明存储器类型声
11、明分页寻址的分页寻址的51外部数据空间外部数据空间sbit位变量声明位变量声明声明一个位变量声明一个位变量sfr特殊功能寄存器特殊功能寄存器声明声明声明一个声明一个8位特殊功能寄存器位特殊功能寄存器sfr16特殊功能寄存器特殊功能寄存器声明声明声明一个声明一个16位特殊功能寄存器位特殊功能寄存器small存储器模式存储器模式按按small模式分配变量的存储空间模式分配变量的存储空间using寄存器组定义寄存器组定义定义定义MCS-51的工作寄存器组的工作寄存器组xdata存储器类型声明存储器类型声明定义定义MCS-51外部数据空间外部数据空间n和标准和标准C程序结构相同,采用函数结构程序结构相
12、同,采用函数结构n每个每个C51程序由一个或多个函数组成,在这程序由一个或多个函数组成,在这些函数中至少应包含一个主函数些函数中至少应包含一个主函数main(),也可以包含一个也可以包含一个main()函数和若干个其它函数和若干个其它的功能函数。的功能函数。程序的执行总是从程序的执行总是从main()函函数开始的,其位置无特殊规定。数开始的,其位置无特殊规定。n程序的开始部分一般是预处理命令、函数程序的开始部分一般是预处理命令、函数说明和变量定义等。说明和变量定义等。 预处理命令预处理命令 include函数说明函数说明 long fun1(); float fun2(); int x,y;
13、float z;功能函数功能函数1 fun1() 函数体函数体 功能函数功能函数2 fun2() 函数体函数体 主函数主函数 main() 主函数体主函数体 n功能要求:功能要求:u系统启动后,当按下一个按钮开关后再系统启动后,当按下一个按钮开关后再闪烁闪烁5次后熄灭。次后熄灭。u以后每次按下按钮开关,发光二极管都以后每次按下按钮开关,发光二极管都会闪烁会闪烁5次。次。 #include #include sbit p10=P10;sbit p20=P20;void delay(unsigned int i);void main() int n,c;P1=0 xff;P2=0 xff;if (
14、p20=0)c=1;if (c=1) n=5; while (n0) p10=0 ; delay(10000000); p10=1; delay(10000000); n-; c=0; void delay(unsigned int i) unsigned int j; for (j=0;ji;j+) org 0000hsjmp mainorg 0030hmain: mov p2,#0ffh mov c,p2.0 jc main mov r0,#5hloop: mov p1,#00h acall delay mov p1,#0ffh acall delay djnz r0,loop sjmp
15、maindelay: mov r1,#05hnext2: mov r2,#0ffhnext1: mov r3,#0FFh djnz r3,$ djnz r2,next1 djnz r1,next2 retend基本数据类型基本数据类型长度长度取值范围取值范围unsigned char1字节字节0255signed char1字节字节-128+127unsigned int2字节字节065535signed int2字节字节-32768+32767unsigned long4字节字节04294967295signed long4字节字节-2147483648+2147483647float4字节
16、字节 1.175494E-38 3.402823E+38bit1位位0或或1sbit1位位0或或1sfr1字节字节0255sfr162字节字节065535n这是这是C51扩充的数据类型,用于访问扩充的数据类型,用于访问MCS-51单片机中的特殊功能寄存器数据,它分单片机中的特殊功能寄存器数据,它分sfr和和sfr16两种类型。两种类型。usfr为字节型特殊功能寄存器类型,占一个内存单元;为字节型特殊功能寄存器类型,占一个内存单元;usfr16为双字节型特殊功能寄存器类型,占用两个为双字节型特殊功能寄存器类型,占用两个字节单元。利用它们可以访问字节单元。利用它们可以访问MCS-51内部的所有内部
17、的所有两个字节的特殊功能寄存器。两个字节的特殊功能寄存器。n在在C51中对特殊功能寄存器的访问必须先用中对特殊功能寄存器的访问必须先用sfr或或sfr16进行声明。进行声明。n这也是这也是C51中扩充的数据类型,用于访问中扩充的数据类型,用于访问MCS-51单片机中的可寻址的位单元。在单片机中的可寻址的位单元。在C51中,支中,支持两种位类型:持两种位类型:bit型和型和sbit型。型。n它们在内存中都只占一个二进制位,其值可以它们在内存中都只占一个二进制位,其值可以是是“1”或或“0”。其中用。其中用bit定义的位变量在定义的位变量在C51编译器编译时,在不同的时候位地址是可以变编译器编译时
18、,在不同的时候位地址是可以变化的,而用化的,而用sbit定义的位变量必须与定义的位变量必须与MCS-51单单片机的一个可以寻址位单元或可位寻址的字节片机的一个可以寻址位单元或可位寻址的字节单元中的某一位联系在一起,在单元中的某一位联系在一起,在C51编译器编编译器编译时,其对应的位地址是不可变化的。译时,其对应的位地址是不可变化的。1、常量、常量2、变量、变量 3、存储模式、存储模式4、绝对地址的访问、绝对地址的访问5、对特殊功能寄存器的访问、对特殊功能寄存器的访问6、对并行口的访问、对并行口的访问7、对位地址的访问、对位地址的访问n常量是指在程序执行过程中其值不能改变的量。nC51中支持整型
19、常量、浮点型常量、字符型常量和字符串型常量。 C51中整型常量可以表示成以下几种形式:u十进制整数。如234、-56、0等。u十六进制整数。以0 x开头表示,如0 x12表示十六进制数12H。u长整数。在C51中当一个整数的值达到长整型的范围,则该数按长整型存放,在存储器中占四个字节,另外,如一个整数后面加一个字母L,这个数在存储器中也按长整型存放。如123L在存储器中占四个字节。 浮点型常量也就是实型常数。有十进制浮点型常量也就是实型常数。有十进制表示形式和指数表示形式。表示形式和指数表示形式。u十进制表示形式又称定点表示形式,由数十进制表示形式又称定点表示形式,由数字和小数点组成。如字和小
20、数点组成。如 0.123、34.645等都等都是十进制数表示形式的浮点型常量。是十进制数表示形式的浮点型常量。u指数表示形式为:指数表示形式为: 数字数字 .数字数字 e 数字数字 例如:例如:123.456e-3、-3.123e2等都是指等都是指数形式的浮点型常量。数形式的浮点型常量。u字符型常量是加字符型常量是加单引号单引号的字符,如的字符,如a、1、F等。等。u可以是可显示的可以是可显示的ASCII字符,也可以是不可显字符,也可以是不可显示的控制字符。示的控制字符。u对不可显示的控制字符须在前面加上反斜杠对不可显示的控制字符须在前面加上反斜杠“”组成转义字符。利用它可以完成一些特殊组成转
21、义字符。利用它可以完成一些特殊功能和输出时的格式控制。常用的转义字符功能和输出时的格式控制。常用的转义字符如课本如课本P73表表4-4所示。所示。 转义字符转义字符含含 义义ASCII码码 0空字符(空字符(null)00H n换行符(换行符(LF)0AH r回车符(回车符(CR)0DH t水平制表符(水平制表符(HT)09H b退格符(退格符(BS)08H f换页符(换页符(FF)0CH 单引号单引号27H ”双引号双引号22H 反斜杠反斜杠5CH(4)字符串型常量)字符串型常量u字符串型常量由字符串型常量由双引号双引号“”“”括起的字符组成。括起的字符组成。如如“D”、“1234”、“AB
22、CD”等。等。u字符串常量与字符常量是不一样的,一个字符字符串常量与字符常量是不一样的,一个字符常量在计算机内只用一个字节存放,而一个字常量在计算机内只用一个字节存放,而一个字符串常量在内存中存放时不仅双引号内的字符符串常量在内存中存放时不仅双引号内的字符一个占一个字节,而且系统会自动的在后面加一个占一个字节,而且系统会自动的在后面加一个转义字符一个转义字符“0”作为字符串结束符。因此不作为字符串结束符。因此不要将字符常量和字符串常量混淆,如字符常量要将字符常量和字符串常量混淆,如字符常量A和字符串常量和字符串常量“A”是不一样的。是不一样的。n在在C51中,变量在使用前必须对变量进行中,变量
23、在使用前必须对变量进行定义,指出变量的数据类型和存储模式。定义,指出变量的数据类型和存储模式。以便编译系统为它分配相应的存储单元。以便编译系统为它分配相应的存储单元。定义的格式如下:定义的格式如下:存储种类存储种类 数据类型数据类型 存储器类型存储器类型 变量名表变量名表(1)存储种类)存储种类n存储种类是指变量在程序执行过程中的作用范存储种类是指变量在程序执行过程中的作用范围。围。nC51变量的存储种类有四种,分别是自动变量的存储种类有四种,分别是自动(auto)、外部、外部(extern)、静态、静态(static)和寄存器和寄存器(register)。n如果省略存储种类,则该变量默认为自
24、动如果省略存储种类,则该变量默认为自动(auto)变量。变量。(2)数据类型说明符)数据类型说明符 数据类型说明符:指明变量的数据类型,指明变量在存储器中占用的字节数。可以是基本数据类型说明符,也可以是组合数据类型说明符,还可以是用typedef或#define定义的类型别名。 在C51中,为了增加程序的可读性,允许用户为系统固有的数据类型说明符用typedef或#define起别名,格式如下: typedef c51固有的数据类型说明符固有的数据类型说明符 别名;别名; 或 #define 别名别名 C51固有的数据类型说明符;固有的数据类型说明符; 定义别名后,就可以用别名代替数据类型说明
25、符对变量进行定义。别名可以用大写,也可以用小写。 例如:u#define uchar unsigned char u#define uint unsigned int 这样,在编程中,就可以用uchar代替unsigned char,用uint代替unsigned int来定义变量。n存储器类型存储器类型:是指定义变量时,根据:是指定义变量时,根据51单片机存单片机存储器的特点,指明该变量所处的单片机的内存空储器的特点,指明该变量所处的单片机的内存空间。间。nMCS-51单片机的单片机的存储区存储区主要有:主要有:片内数据片内数据存储存储器,器,特殊功能特殊功能寄存器、寄存器、片外数据片外数据
26、存储器、存储器、片内程片内程序序存储器和存储器和片外程序片外程序存储器。存储器。n使用汇编指令访问时,使用不同的指令和不同的使用汇编指令访问时,使用不同的指令和不同的寻址方式即可区分。在寻址方式即可区分。在C51中,则要通过定义中,则要通过定义存存储器类型储器类型来加以说明。来加以说明。nC5l编译器支持MCS-51单片机的硬件结构,可完全访问MCS-51硬件系统的所有部分。n编译器通过将变量或者常量定义成不同的存储类型(data,bdata,idata,pdata,xdata,code)的方法,将它们定位在不同的存储区中。存储类型存储类型 与存储空间的对应关系与存储空间的对应关系 data
27、直接寻址直接寻址片内数据片内数据存储区,访问速度快存储区,访问速度快(128字节字节) bdata 可可位寻址位寻址片内数据片内数据存储区,允许位与字节混合访存储区,允许位与字节混合访问问(16字节字节) idata 间接寻址间接寻址片内数据片内数据存储区,可访问片内全部存储区,可访问片内全部RAM地址空间(地址空间(256字节)由字节)由MOV R0,A指令访问指令访问 pdata 分页寻址分页寻址片外数据片外数据存储区存储区(256字节字节)由由MOVX R0,A指令访问指令访问 xdata 片外数据片外数据存储区存储区(64K),由,由MOVX DPTR,A指指令访问令访问 code 代
28、码代码存储区存储区(64K),由,由MOVC A,A+DPTR指令指令访问访问 表 C51存储器类型n若未定义存储类型,则C51编译器自动选择默认存储器类型。默认的存储器类型与C51的存储模式有关。存储模式存储模式 默认的存储器类型默认的存储器类型 SMALL 默认为默认为data,最大为,最大为128字节字节 COMPACT 默认为默认为pdata,每页,每页256字节字节 LARGE 默认为默认为xdata,最大为,最大为64K (4)变量名表)变量名表n变量名表格式:变量名表格式: 变量名变量名1=初值初值,变量名,变量名2=初值初值,.n在在C51中规定变量名可以由字母、数字和中规定变
29、量名可以由字母、数字和下划线三种字符组成,且下划线三种字符组成,且第一个字母必须第一个字母必须为为字母字母或或下划线下划线。n变量名有两种:变量名有两种:普通变量普通变量名和名和指针变量指针变量名。名。指针变量名前面要带指针变量名前面要带“ * ”号。号。char i, j, k;unsigned int xdata m, n;unsigned pdata *dp1;long count; sfr P1=0 x90;n如果在变量定义时省略了存储器类型标识符,C51编译器会选择默认的存储器类型。默认的存储器类型由存储模式决定。n存储模式是编译器的编译选项。可在软件中设置,或用预处理命令设置。nC
30、51的存储模式(memory models)有三种:SMALL、COMPACT和LARGE。(1)小模式小模式 (small model)。在小模式下,所有未声明存储器类型的变量,都默认驻留在内部数据区,即这种方式和用DATA进行显示说明一样。(2)紧凑模式紧凑模式 (compact model)。在紧凑模式下,所有未声明存储器类型的变量,都默认驻留在外部数据区的一个页上。即这种方式和用PDATA进行变量存储器类型的说明是一样的。该模式利用R0和R1寄存器来进行间接寻址(R0和Rl)。(3)大模式大模式(large model)。在大模式下,所有未声明存储器类型的变量,都默认驻留在外部数据存储
31、区,即和用XDATA进行显示说明一样。此时最大可寻址64KB的存储区域,使用数据指针寄存器(DPTR)来进行间接寻址。 设定存储模式的预处理命令:设定存储模式的预处理命令:u#pragma smallu#pragma compactu#pragma large(1)使用预定义宏访问)使用预定义宏访问(2)使用指针访问)使用指针访问(3)使用)使用 _at_ 关键字访问关键字访问n C51编译器提供了一组宏定义来对51系列单片机的code、data、pdata和xdata空间进行绝对寻址。规定只能以无符号数方式访问,定义了8个宏定义,其函数原型放在absacc.h文件中。使用时须用预处理命令把该
32、头文件包含到文件中,形式为: #include n这些宏定义函数原型如下:#define CBYTE(unsigned char volatile*)0 x50000L)#define DBYTE(unsigned char volatile*)0 x40000L)#define PBYTE(unsigned char volatile*)0 x30000L)#define XBYTE(unsigned char volatile*)0 x20000L)#define CWORD(unsigned int volatile*)0 x50000L)#define DWORD(unsigned i
33、nt volatile*)0 x40000L)#define PWORD(unsigned int volatile*)0 x30000L)#define XWORD(unsigned int volatile*)0 x20000L)说明:说明:Cxxxx:code区,区,Dxxxx:data区,区,Pxxxx:pdata区,区,Xxxxx:xdata区。区。 BYTE:以字节形式寻址,:以字节形式寻址,WORD:以字形式寻址。:以字形式寻址。使用预定义宏访问绝对地址的形式如下:使用预定义宏访问绝对地址的形式如下: 宏名宏名地址地址如:如: DBYTE0 x0030 XWORD0 x0005#
34、include #include #define uchar unsigned char #define uint unsigned int void main(void)uchar var1;uint var2;var1=XBYTE0 x0005; /*访问片外访问片外RAM的的0005字节单元字节单元*/var2=XWORD0 x0000; /*访问片外访问片外RAM的的0000字单元字单元*/XWORD0 x0000=0 xAABB; /*将将0 xAABB送入片外送入片外RAM的的0000H0001H单元中单元中*/.while(1); 采用指针的方法,可以在C51程序中对任意指定的存
35、储器单元进行访问。 方法:先定义,后赋绝对地址值#define uchar unsigned char #define uint unsigned int void test_memory(void)uchar idata ivar1;uchar xdata *xdp; /*定义一个指向定义一个指向xdata区的指针区的指针*/char data *dp; /*定义一个指向定义一个指向data区的指针区的指针*/uchar idata *idp; /*定义一个指向定义一个指向idata区的指针区的指针*/xdp=0 x1000; /*xdp指针赋值指向指针赋值指向xdata区的区的1000H单
36、元单元*/*xdp=0 x5A; /*数据数据5AH送到送到xdata区的区的1000H单元单元*/dp=0 x61; /*dp指针赋值指向指针赋值指向data区区61H单元单元*/*dp=0 x23; /*将数据将数据23H送到送到data区区61H单元单元*/idp=&ivar1; /*idp指针指向指针指向idata区的区的ivar1变量变量*/*idp=0 x16; /*数据数据16H送到送到idata区的变量区的变量ivar1所在的地所在的地址单元中,等价于址单元中,等价于ivar1=0 x16*/n格式如下:存储器类型存储器类型 数据类型说明符数据类型说明符 变量名变量名 _at_
37、 地址常数;地址常数;n说明:u地址常数应在有效地址范围内u用_at_定义的变量必须是全局变量#define uchar unsigned char #define uint unsigned int data uchar x1 _at_ 0 x40; /*在在data区中定义字区中定义字节变量节变量x1,它的地址为它的地址为40H*/xdata uint x2 _at_ 0 x2000; /*在在xdata区中定义区中定义字变量字变量x2,它的地址为它的地址为2000H*/void main(void)x1=0 xff;x2=0 x1234;.while(1);n如果不作定义,对如果不作定义
38、,对51单片机的特殊功能寄单片机的特殊功能寄存器只能用存器只能用直接寻址方式直接寻址方式访问。访问。n为了能用名字直接访问这些特殊功能寄存为了能用名字直接访问这些特殊功能寄存器,器,C51提供了定义方法。提供了定义方法。n可分为以下两种方法:可分为以下两种方法:(1)用)用sfr/sfr16数据类型访问特殊功数据类型访问特殊功能寄存器能寄存器(2)用)用sbit数据类型访问特殊位数据类型访问特殊位n访问特殊功能寄存器可用数据类型定义的访问特殊功能寄存器可用数据类型定义的方法来实现。格式如下:方法来实现。格式如下: sfr/sfr16 特殊功能寄存器名特殊功能寄存器名=地址;地址;n说明:说明:
39、u特殊功能寄存器名必须特殊功能寄存器名必须大写大写。usfr定义定义8位寄存器;位寄存器;sfr16定义定义16位寄存器。位寄存器。u定义之后,就可以程序中直接引用寄存器名了。定义之后,就可以程序中直接引用寄存器名了。u标准标准SFR在在reg51.h等头文件中已经定义好,等头文件中已经定义好,只要只要用用#include包含命令申明包含命令申明即可使用。即可使用。n定义举例:定义举例:(地址可在表地址可在表2.4中查出中查出)sfr PSW=0 xd0;sfr SCON=0 x98;sfr TMOD=0 x89;sfr P1=0 x90;sfr16 DPTR=0 x82;sfr16 T1=0
40、X8A; nMCS-51单片机内单片机内21个特殊功能寄存器中,个特殊功能寄存器中,共有共有11个特殊功能寄存器是可位寻址的。个特殊功能寄存器是可位寻址的。访问这些特殊位可用关键字访问这些特殊位可用关键字sbit定义数据类定义数据类型来实现。格式如下:型来实现。格式如下: sbit 特殊功能寄存器位名特殊功能寄存器位名=位地址;位地址;n其中,位地址有其中,位地址有3种表示方法:种表示方法:u特殊功能寄存器名特殊功能寄存器名位号位号 (如:如:P10)u特殊功能寄存器地址特殊功能寄存器地址位号位号 (如:如:0 xD00)u特殊功能寄存器绝对位地址特殊功能寄存器绝对位地址 (如:如:0 xD7
41、)n定义举例:定义举例: sfr PSW=0 xD0; sbit OV=PSW2; sbit AC=0 xD02; sbit CY=0 xD7;n程序中的例子:程序中的例子:#include sbit P10=P10;sbit P12=P12;void main() P10=1; P12=0; .(1) 内部并口内部并口 用用sfr定义(前面已介绍,略)定义(前面已介绍,略)(2) 外部并口外部并口 对片外扩展的并口,应根据其硬件译码对片外扩展的并口,应根据其硬件译码地址,将其看作片外数据存储器的一个单地址,将其看作片外数据存储器的一个单元,使用元,使用#define语句进行定义。定义时用语句
42、进行定义。定义时用绝对地址定义,绝对地址定义在绝对地址定义,绝对地址定义在absacc.h头文件中。头文件中。n例:操作片外并口例:操作片外并口#include #define PA XBYTE 0 xffecvoid main() PA=0 x30; /*将数据将数据30H写入地址为写入地址为0 xffec的存储单元或的存储单元或I/O端口端口*/nC51中可使用中可使用bit和和sbit数据类型对位地址进数据类型对位地址进行访问。行访问。nbit定义格式如下:定义格式如下: bit 位变量名;位变量名;例:例: bit data a1; bit bdata a2;1 1赋值运算符赋值运算符
43、2 2算术运算符算术运算符3 3自增自减运算符自增自减运算符4 4关系运算符关系运算符5 5逻辑运算符逻辑运算符6 6位运算符位运算符7 7复合运算符复合运算符8. 8. 对指针操作的运算符对指针操作的运算符9. 9. 条件运算符条件运算符 1赋值运算符赋值运算符 赋值运算符赋值运算符 =u在在C中它的功能是给变量赋值,如中它的功能是给变量赋值,如x=10。u赋值表达式后面加赋值表达式后面加“;”号就构成了一号就构成了一个赋值表达式语句。个赋值表达式语句。 2算术运算符算术运算符C51中的算术运算符如下:中的算术运算符如下:+ 加或取正值运算符加或取正值运算符 减或取负值运算符减或取负值运算符
44、* 乘运算符乘运算符/ 除运算符除运算符% 模(取余)运算符模(取余)运算符,如,如8 % 5 = 3,即,即8除以除以5的余数是的余数是33自增自减运算符自增自减运算符 自增:自增: + + 自减:自减: 自增自减运算符可用在操作数之前,自增自减运算符可用在操作数之前,也可放在其后,例如也可放在其后,例如“x=x+1”既可以写既可以写成成“+x”,也可写成,也可写成“x+”,其运算结,其运算结果完全相同。但在表达式中这两种用法是果完全相同。但在表达式中这两种用法是有区别的。有区别的。n例:例: x=99; y=+x; 则则y=100,x=100,如果程序改为:,如果程序改为: x=99; y
45、=x+; 则则y=99,x=100。在这两种情况下,。在这两种情况下,x都被置为都被置为100。n一般来说,用自增和自减操作生成的程序代码一般来说,用自增和自减操作生成的程序代码比等价的赋值语句生成的代码要快。比等价的赋值语句生成的代码要快。4关系运算符关系运算符 C51中有中有6种关系运算符:种关系运算符: 大于大于 = 大于等于大于等于 x+12”的计算,应看作是的计算,应看作是“10(x+12)”。5逻辑运算符逻辑运算符逻辑与:逻辑与:& 逻辑或:逻辑或:| 逻辑非:逻辑非:!用法:用法:逻辑与:条件式逻辑与:条件式1 & 条件式条件式2。逻辑或:条件式逻辑或:条件式1 | 条件式条件式
46、2。逻辑非:逻辑非:!条件式。条件式。例如,当例如,当a = 7, b = 6, c = 0时,则:时,则:!a =0,!c=1。a &b =1; !a & b=0;b | c =1。(a0) & (b3) =1;(a8) & (b0) =0。6 6位运算符位运算符 位运算符的作用是按位对变量进行运算,位运算符的作用是按位对变量进行运算,但并不改变参与运算的变量的值。位运算符不但并不改变参与运算的变量的值。位运算符不能用来对浮点型数据进行操作。位运算一般的能用来对浮点型数据进行操作。位运算一般的表达形式如下:表达形式如下: 变量变量1 1 位运算符位运算符 变量变量2 2 6 6位运算符位运算
47、符C51C51中共有中共有6 6种位运算符:种位运算符:& & 按位与按位与| | 按位或按位或 按位异或按位异或 按位取反按位取反 右移右移6 6位运算符位运算符 位运算符也有优先级,从高到低依次是:位运算符也有优先级,从高到低依次是: (按位取反)(按位取反) (右移)(右移)& (按位与)(按位与) (按位异或)(按位异或) | (按位或)(按位或)如:已知如:已知a = 0 x54 = 0101 0100B, b = 0 x3b = 0011 1011B,则:,则: a & b = 00010000; a | b = 01111111; a b = 01101111; a = 1010
48、1011; a1 = 00011101。7复合运算符复合运算符 复合运算符就是在赋值运算符复合运算符就是在赋值运算符“=”的前面的前面加上其他运算符。以下是加上其他运算符。以下是C51语言中的复合赋语言中的复合赋值运算符:值运算符:+= 加法赋值加法赋值 = 右移位赋值右移位赋值-= 减法赋值减法赋值 &= 逻辑与赋值逻辑与赋值*= 乘法赋值乘法赋值 |= 逻辑或赋值逻辑或赋值/= 除法赋值除法赋值 = 逻辑异或赋值逻辑异或赋值%= 取模赋值取模赋值 = 逻辑非赋值逻辑非赋值b)?a:b的执行结的执行结果是将果是将a和和b中较大的数赋值给变量中较大的数赋值给变量max。1、C51基本书写规则基
49、本书写规则u书写格式相对自由,一行可以写若干条语句,书写格式相对自由,一行可以写若干条语句,一个语句也可以写成几行,每个语句须以一个语句也可以写成几行,每个语句须以分分号号“;”结尾。结尾。uC语言是语言是区分大小写区分大小写的一种高级语言。使用标的一种高级语言。使用标识符和关键词时须注意大小写。识符和关键词时须注意大小写。u每个变量必须先说明后引用每个变量必须先说明后引用u程序的注释用程序的注释用 /*.*/ 或或 /. 表示。表示。u函数语句块写在大括号函数语句块写在大括号 里面。里面。u表达式写在小括号表达式写在小括号( )里面。里面。 2、表达式语句表达式语句 在表达式的后边加一个在表
50、达式的后边加一个分号分号“;”就构成就构成了表达式语句,如:了表达式语句,如: a=+b*9; x=8;y=7; 可以一行放一个表达式形成表达式语句,也可以一行放一个表达式形成表达式语句,也可以一行放多个表达式形成表达式语句,这时可以一行放多个表达式形成表达式语句,这时每个表达式后面都必须带每个表达式后面都必须带“;”号,另外,还号,另外,还可以仅由可以仅由个分号个分号“;”占一行形成一个表达占一行形成一个表达式语句,这种语句称为式语句,这种语句称为空语句空语句。 3、复合语句复合语句 复合语句是由若干条语句组合而成的一种语句,在复合语句是由若干条语句组合而成的一种语句,在C51中,中,用一个