第3章单片机C语言课件_第1页
第3章单片机C语言课件_第2页
第3章单片机C语言课件_第3页
第3章单片机C语言课件_第4页
第3章单片机C语言课件_第5页
已阅读5页,还剩119页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机C语言

单片机C语言 1C51特点结构化语言丰富的数据类型便于维护管理与汇编语言相比,C语言的优点如下:不要求编程者详细了解单片机的指令系统,但需了解单片机的存储器结构;寄存器分配、不同存储器的寻址及数据类型等细节可由编译器管理;结构清晰,程序可读性强;编译器提供了很多标准库函数,具有较强的数据处理能力。C51特点结构化语言2C51-1:C51基本结构C51-1:C51基本结构3//功能:控制八个信号灯闪烁程序#include<AT89X52.H> //定义了MCS-52单片机的特殊功能寄存器voiddelay(unsignedchari); //延时函数声明voidmain() //主函数{while(1){P1=0x00;//点亮八个LEDdelay(200);//延时P1=0xff;//熄灭八个LEDdelay(200); //延时}}//功能:控制八个信号灯闪烁程序4//函数名:delay//函数功能:实现软件延时//形式参数:unsignedchari;voiddelay(unsignedchari) //延时函数,无符号字符型变量i为形式参数{unsignedcharj,k; //定义无符号字符型变量j和kfor(k=0;k<i;k++) //双重for循环语句实现软件延时for(j=0;j<255;j++);}//函数名:delay5

C51的程序结构#include<reg51.h>voiddelay(){……;}voidmain(){delay();P0=0x33;}头文件(一个或若干个)主函数程序的入口

函数名固定,且与书写的位置无关有且仅有一个函数声明或定义库函数或用户自定义的函数可以有若干个C51程序大体上是若干函数的集合C51的程序结构#include<reg51.h>头文件6C程序基本结构C程序基本结构7一个或若干个函数有(且仅有)一个主函数main预处理命令“;”作为语句的结束符区分大小写。用/**/或//注释。Main主函数名;void函数类型,空类型无返回值;()内为形参,{}内为函数体C51编程要点一个或若干个函数C51编程要点8C语言编程的三大要素数据数据类型、数据结构、存储类型运算算术运算、关系运算、逻辑运算、位操作控制顺序结构、选择结构、循环结构、函数C语言编程的三大要素数据9C语言标识符

C语言中由字母、数字和下划线组成的字符序列称为----标识符。用于在程序中给变量、符号常量、数组、函数、数据类型等操作对象“起名”。1.编译系统定义标识符由编译系统定义,具有固定名字和特定含义分为①关键字和②预定义标识符

2.用户自定义标识符

用于对用户使用的变量、数组、函数等操作对象进行命名。

C语言标识符C语言中由字母、数字和下划线组成的字符序列称为10C语言对标识符的规定

用户自定义标识符:由字母、数字和下划线构成,但必须以字母或下划线“_”开头,不能以数字开头不能含有除字母、数字和下划线“_”外的其他字符如:!、&、*等。标识符中大小写字母含义不同如:abc和Abc为不同的标识符关键字:必须用小写字母。不允许使用关键字为变量、数组、函数等操作对象命名。预定义标识符:允许用户对它们重新定义,当重新定义后将改变它们原来的含义。C语言对标识符的规定用户自定义标识符:11正确区分标识符正确区分哪些是合法标识符,哪些是不合法标识符。AbcP1_02xP1.0studentm+ya#b-4_1Whileintletx%yLEDdoπwtmCtrlswicthinclude正确区分标识符正确区分哪些是合法标识符,哪些是不合法标识符。12C51-2数据类型C51-2数据类型13C51的数据3-1、C51的数据类型C51的数据3-1、C51的数据类型141.char字符类型 char类型的长度是一个字节,通常用于定义处理字符数据的变量或常量。 分无符号字符类型unsignedchar和有符号字符类型signedchar,默认值为signedchar类型。

1.char字符类型15字符型变量分为:[signed]

char和unsignedchar编译系统为其分配1Byte(字节)的存储空间(TurboC、VC++6.0和Keil中均分配1B的存储空间)表示的数值范围:[signed]

char:-128~127unsignedchar:0~255字符型变量定义形式:char字符变量名[=初值];例如:char

ch1,c1;

unsignedchar

c2=‘a’,c3=‘A’;

字符型变量分为:[signed]char和unsigne16例如:

inta,b;(指定变量a、b为整型)

charx,y;(指定变量x、y为字符型)

unsignedintw,u;

(指定变量w、u为无符号整型)

unsignedcharc,d;

(指定变量c、d为无符号字符型)

例如:172.int整型 int整型长度为两个字节,用于存放一个双字节数据。 分有符号int整型数signedint和无符号整型数unsignedint,默认值为signedint类型2.int整型183.long长整型

long长整型长度为四个字节,用于存放一个四字节数据。分有符号long长整型signedlong和无符号长整型unsignedlong,默认值为signedlong类型。4.float浮点型

float浮点型在十进制中具有7位有效数字,是符合IEEE-754标准的单精度浮点型数据,占用四个字节。5.指针型

指针型本身就是一个变量,在这个变量中存放的是另一个数据的地址。这个指针变量要占据一定的内存单元,对不同的处理器长度也不尽相同。3.long长整型196.bit位变量bit类型---定义1个位变量,值为0或1.其存储器类型只能是bdata、data、idata,严格讲只能是:bdata所有的bit变量都放在80C51内部存储区的可位寻址区,而该区域只有16字节长,所以在某个范围内只能声明最多128个位变量。bitflag; //定义一个位变量flagbitflag=1; //定义一个位变量flag并赋初值16.bit位变量20对位变量定义的限制不能定义成一个指针,

如不能定义:bit*pointer;

不存在位数组

如不能定义:bitb_array[]

位变量定义时,存储类型只允许为data、bdata或者idata,如果将位变量的存贮类型定义成其它类型都将导致编译出错。对位变量定义的限制217

sfr类型---用于定义1个8位的特殊功能寄存器定义形式:

sfr

标识符=8位特殊功能寄存器在内部RAM中的实际地址;标识符可为特殊功能寄存器名或自己任意命名如:sfrP0=0x80;sfrPSW=0xd0;sfrTMOD=0X89;7sfr类型---用于定义1个8位的特殊功能寄存器228

sfr16类型---用于定义1个16位的特殊功能寄存器定义形式:

sfr16标识符=16位特殊功能寄存器的低字节地址;51子系列中只有DPTR为16位的特殊功能寄存器:由DPH和DPL组成,其地址分别为0x82和0x83,地址连续。sfr16DPTR=0x82;/*地址为低字节单元的地址*/52子系列中T2可定义如下:sfr16T2=0xCC;T0和T1不能用sfr16进行定义:sfr16T0=0x8A;/*错误,TL0和TH0地址不连续*/sfr16T1=0x8B;/*错误,TL1和TH1地址不连续*/8sfr16类型---用于定义1个16位的特殊功能寄存器239.sbit可寻址位

sbit是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。sbit类型---定义bdata区或可位寻址特殊功能寄存器(字节地址的末位为0或8)中的位,值也为0或1.如:sfrP1=0x90;sbitP1_0=P1^0;

或sbitP1_0=0x90^0;

或sbitP1_0=0x90;sbitEA=0xAF;sbitIT0=0x88;sbitP=0xD0;注:安装Keil软件后,在文件夹“C:\keil\c51\inc”中有一些头文件包含了有关特殊功能寄存器和相应位的定义。9.sbit可寻址位24reg51.h头文件内容:/*BYTERegister*/sfrP0=0x80;sfrP1=0x90;sfrP2=0xA0;sfrP3=0xB0;sfrPSW=0xD0;sfrACC=0xE0;sfrB=0xF0;sfrSP=0x81;sfrDPL=0x82;sfrDPH=0x83;sfrPCON=0x87;sfrTCON=0x88;sfrTMOD=0x89;sfrTL0=0x8A;sfrTL1=0x8B;sfrTH0=0x8C;sfrTH1=0x8D;sfrIE=0xA8;sfrIP=0xB8;sfrSCON=0x98;sfrSBUF=0x99;/*BITRegister*//*PSW*/sbitCY=0xD7;sbitAC=0xD6;sbitF0=0xD5;sbitRS1=0xD4;sbitRS0=0xD3;sbitOV=0xD2;sbitP=0xD0;/*TCON*/sbitTF1=0x8F;sbitTR1=0x8E;sbitTF0=0x8D;sbitTR0=0x8C;sbitIE1=0x8B;sbitIT1=0x8A;sbitIE0=0x89;sbitIT0=0x88;/*IE*/sbitEA=0xAF;sbitES=0xAC;sbitET1=0xAB;sbitEX1=0xAA;sbitET0=0xA9;sbitEX0=0xA8;reg51.h头文件内容:/*BYTERegister25Reg51.h头文件内容(续)/*IP*/sbitPS=0xBC;sbitPT1=0xBB;sbitPX1=0xBA;sbitPT0=0xB9;sbitPX0=0xB8;/*P3*/sbitRD=0xB7;sbitWR=0xB6;sbitT1=0xB5;sbitT0=0xB4;sbitINT1=0xB3;sbitINT0=0xB2;sbitTXD=0xB1;sbitRXD=0xB0;/*SCON*/sbitSM0=0x9F;sbitSM1=0x9E;sbitSM2=0x9D;sbitREN=0x9C;sbitTB8=0x9B;sbitRB8=0x9A;sbitTI=0x99;sbitRI=0x98;Reg51.h头文件内容(续)/*IP*//*26总结:在编程时,如果只强调程序的运算速度而又不进行负数运算,最好采用无符号格式。无论何时,应尽可能地使用unsgnedchar、Bit类型。总结:在编程时,如果只强调程序的运算速度而又不进行负数运算,27C51-3常量和变量

符号常量用大写,变量用小写C51-3常量和变量

符号常量用大写,变量用小写281、常量–又称为标量,常量的值在程序执行过程中不能改变,一般用一个标识符号代表一个常量,称为符号常量。1、使用#define语句定义符号常量例:#defineCONST60 #definePI3.14152、使用”code”关键字指定数据的存储位置为程序存储器C51中常量的定义:符号常量的作用域:定义这个符号常量的整个C文件1、常量–又称为标量,常量的值在程序执行过程中不能改变,292、变量有关概念在程序运行过程中,其值可以改变的量,称为变量,变量名用标识符表示。变量一般有变量名和变量值组成。变量名为RAM单元地址号,变量值为该单元中存放的内容。C规定程序中用到的变量必须“先定义后使用”系统为变量在内存(内部RAM和外部RAM)中分配存储单元,存储变量的值。编写程序时可以通过变量名来存、取变量值。2、变量30

例如:unsignedint

xdatai,j;

unsignedchardatach1,ch2='A';必须使用合法的标识符作变量名不能使用关键字为变量命名变量名一般用小写,长度一般不超过8个字符,最长不得大于32个字符。变量名最好也能做到“顾名知意”变量定义的一般格式:数据类型[存储器类型]

变量名表[=初值];例如:unsignedintxdatai,j;31存储器类型---指明变量所在存储器的区域情况C51根据单片机存储器的结构特点分为以下六种存储类型:1、data---变量定义在片内RAM可直接寻址的低128B空间中。如:unsignedchardatach[5];2、idata---变量定义在片内RAM可间接寻址的256B空间中。如:intidatax=10;3、bdata---变量定义在片内RAM可位寻址的16B空间中(地址范围:0x20---0x2F)。如:intbdataflag;sbitflag0=flag^0;4、

xdata---变量定义在片外RAM64KB空间中。如:floatxdataf[100];5、

pdata---变量定义在片外RAM低256B空间中。如:floatpdatay;6、code---变量定义在程序存储器64KB的空间中。如:#defineucharunsignedcharucharcodedisplay[]={0x7F,0xBF,0xDF,0xFE,0xF7};数据类型说明符[存储器类型]

变量名列表[=初值];存储器类型---指明变量所在存储器的区域情况C51根据单片机32变量的默认存储类型如果变量定义时没有明确指明其存储类型(data、idata、bdata、xdata、pdata、code),则编译器编译时根据工程项目的存储模式自动选择存储类型。三种存储模式:1、small---小存储模式:变量默认分配在data区。2、compact---紧凑存储模式:变量默认分配在pdata区。3、large---大存储模式:变量默认分配在xdata区。如:unsignedinti,j=1000;unsignedcharch1,ch2='A';程序中可以通过预处理命令#pragma声明存储模式,没有明确声明时,系统隐含为small模式。变量的默认存储类型如果变量定义时没有明确指明其存储类型(da33变量的初始化变量的初始化指在声明变量的同时对变量赋初值。例如:inta=5,b=10+2;floatx=23.568,y;charch1='a';

表示声明变量并对变量存储单元赋值。第一条语句相当于:inta,b;a=5;b=12;错误的初始化:inta=3+b,b=5;

改为:

intb=5,a=3+b;floatm=n=23.16;改为:

floatm=23.16,n=23.16;变量的初始化变量的初始化指在声明变量的同时对变量赋初值。34C51运算符

C51运算符

351C语言运算符和表达式简介算术运算符和算术表达式赋值运算符和赋值表达式逗号运算符和逗号表达式逻辑运算符和逻辑表达式位运算符和位运算表达式条件运算符和条件表达式关系运算符和关系表达式其他运算符及其运算(指针、下标等)1C语言运算符和表达式简介362运算符的有关概念作用:对运算对象完成规定的操作运算类型:按运算对象分:单目:只有一个操作对象,如:自增运算符(++)双目:有两个操作对象,如:乘(*),除(/)三目:有三个操作对象

只有一个:条件运算符(?:)按功能分:算术、赋值、关系、逻辑条件、逗号、位、其他2运算符的有关概念作用:373运算符的优先级和结合性优先级指各种运算符号的运算优先顺序例如:算术运算中先*/后+- a-b*c+d结合性指运算符和运算对象的结合方向分为:从左向右(左结合)和从右向左(右结合)例如:算术运算符为左结合

a-b+4

赋值运算符为右结合

a=b=5注:如果一个操作数两边的运算符优先级不同时,按优先级从高到低结合;如果一个操作数两边的运算符优先级相同时,按结合性处理。3运算符的优先级和结合性优先级结合性注:如果一个操作数两边384各种运算符的表示+-*/%++--+-=+=-=*=/=%=&=|=^=>>=<<=><>=<===!=&&||!&|^~<<>>?:,&sizeof(数据类型标识符)4各种运算符的表示+-*/%++--395表达式的有关概念什么是表达式由运算符将运算对象连接成的式子,它描述了一个具体的求值运算过程。计算表达式的值按照运算符的运算规则求值求值时注意运算符的优先级和结合性5表达式的有关概念什么是表达式40例如:表达式:b=(++a)-2a/=a*=(a=2)f=a>b>c--a||++b&&c++max=a>b?a:ba=3,a+=3,a*a 1/(float)a+6例如:表达式:416算术运算符和算术表达式算术运算符的优先级

()+-++--

*/%

+-

同级同级同级

单目双目

低没有乘方运算符,要计算a3要写作a*a*a的连乘,或用标准库函数pow(a,3)“/”的运算对象可为各种类型数据,但是当进行两个整数相除时,运算结果也是整数

“%”要求运算对象必须是整数,功能是求两个整数相除的余数,余数的符号与被除数的符号相同。6算术运算符和算术表达式算术运算符的优先级()42例5/2=2

-5/2.0=-2.5例5%2=1

-5%2=-11%10=

1

5%1=

05.5%2

()例5/2=2例5%2=437自增、自减运算符自增(++)、自减(--)都是单目运算符有前缀和后缀两种形式前缀形式:先自增(自减)再引用;后缀形式:先引用再自增(自减);功能:

前缀形式++a等价于a=a+1

--a等价于a=a–1

后缀形式a++等价于a=a+1

a--等价于a=a–17自增、自减运算符自增(++)、自减(--)都是单目运44例如:当a=5时⑴++a表达式的值为6,且a=6⑵

a++

表达式的值为5,且a=6⑶b=++a等价于a=a+1;b=a表达式的值为6,且a=6,b=6⑷b=a++

等价于b=a;a=a+1表达式的值为5,且a=6,b=5

例如:当a=5时45说明:++

和-

-的运算对象只能是变量,不能是常量或表达式。例如:

5++、(a+2)++

不合法。右结合性,结合方向为从右到左。例如:

–a++等价于-(a++)而不等价(-a)++

如果有多个运算符连续出现时,C编译系统尽可能多的从左到右将多个字符组合成一个运算符例如:

i+++j等价于(i++)+j

-i+++-j等价于-(i++)+(-j)

说明:++和--的运算对象只能是变量,不能是常量或468关系运算符、逻辑运算符及其表达式无论是关系运算还是逻辑运算,其结果都会得到一个逻辑值。逻辑值只有两个,在很多高级语言中都用“真”和“假”来表示。由于没有专门的“逻辑值”,C51语言规定:当关系成立或逻辑运算结果为非零值(整数或负数)时为“真”,用“1”表示;否则为“假”,用“0”表示。8关系运算符、逻辑运算符及其表达式无论是47关系运算符种类:<<===>=>!=结合方向:自左向右优先级别:<<=>>===!=优先级6(高)优先级7(低)例c>a+b//c>(a+b)a>b!=c//(a>b)!=ca==b<c//a==(b<c)a=b>c//a=(b>c)关系表达式的值:是逻辑值“真”或“假”,用1和0表示//表达式值1//表达式值1//表达式值0//d=1//f=0(1)关系运算符与关系表达式(左结合)<优先级6(高)优先级7(低)例c>a+b//48例注意区分“=”与“==”inta=0,b=1;if(a=b)printf(“aequaltob”);elseprintf(“anotequaltob”);关系运算注意(2)例注意区分“=”与“==”关系运算注意(2)49ab!a!ba&&ba||b真假真假假假真真逻辑运算符种类:!&&||逻辑运算真值表C语言中,运算量:

0表示“假”,非0表示“真”,

运算结果:0表示“假”,

1表示“真”,真假假假假假真真假假真真真假真真(2)逻辑运算符与逻辑表达式ab!a!ba&&ba||b真假真假假假真真C语言中,运算量50!(2)&&(11)||(12)高低优先级:结合方向:!:从右向左&&:从左向右||:从左向右逻辑运算符和表达式(2)注意:数学中常用的逻辑关系x≤a≤y,C51语言的正确写法为(x<=a)&&(a<=y)或x<=a&&a<=y高低优先级:结合方向:逻辑运算符和表达式(2)注意:数学中常51!(2)&&(11)||(12)高低优先级:结合方向:!:从右向左&&:从左向右||:从左向右逻辑运算符和表达式(3)高低优先级:结合方向:逻辑运算符和表达式(3)52短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符<>例a&&b&&c//只在a为真时,才判别b的值;只在a、b都为真时,才判别c的值例a||b||c//只在a为假时,才判别b的值;只在a、b都为假时,才判别c的值例a=1;b=2;c=3;d=4;m=1;n=1;(m=a>b)&&(n=c>d)//结果m=0,n=1短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只539赋值运算符和赋值表达式一般的赋值运算符(右结合)

=复合赋值运算符(右结合)

由一个二元运算符和赋值运算符共同构成

C语言共有十种复合赋值运算符:

+=-=*=/=%=&=|=^=>>=<<=赋值表达式:由赋值运算符将变量和一个表达式连接起来的式子。功能:将表达式的值存入变量对应的内存单元中表达式的值:为赋值运算符左边变量的值m=12b=(++a)-2m%=3+n等价于m=m%(3+n)9赋值运算符和赋值表达式一般的赋值运算符(右结合)=54说明:赋值号左边必须是变量,右边可以是C语言任意合法的表达式例如:n=t+2<s合法

相当于:n=((t+2)<s)a+b=15不合法赋值运算符仅优先于“,”,且具有右结合性例如:

a=b=b*c>10等价于:a=(b=(

(b*c)>10)

)赋值号与数学中的等号含义不同例如:数学中a=b等价于b=aC语言中a=b不等价于b=a说明:赋值号左边必须是变量,右边可以是C语言任意合法的表达式5510位运算符和位运算~&^|<<>>位逻辑运算符移位运算符单目低于单目、算术运算符,高于其他运算符低于单目、算术和关系运算符,高于其他运算符位运算符的运算对象只能是整型数据或字符型数据,不能是实型数据运算对象一律按二进制补码参加运算,并按位进行运算位运算的结果是一个整型数据10位运算符和位运算~&^56位运算符的运算规则假设ai和bi均是一个二进制位(bit)

位运算符的运算规则假设ai和bi均是一个二进制位(bit)57已知x为:00010011,y为:11110111。求~x、x&y、x|y、x^y的结果。例:(1)~x是将x中原为1的位变成0,原为0的位变成1。因此,~x为:11101100。(2)x&y、x|y、x^y的结果为:00010011&:111101110001001100010011

|:111101111111011100010011

^:1111011111100100已知x为:00010011,y为:11110111。求~x、58

位逻辑运算符与逻辑运算符的区别位逻辑运算符是对二进制位的,逻辑运算符是对整个表达式的。位逻辑运算符要计算表达式的具体数值,逻辑运算符只判别表达式的真(成立)与假(不成立)。位逻辑运算符与逻辑运算符的区别位逻辑运算59移位运算例如:a<<ba+8>>b-1等价于(a+8)>>(b-1)例如:假设a=10,b=2,求a<<b、a+8>>b-1#include<stdio.h>voidmain(){inta=10,b=2;printf("%d%d\n",a<<b,a+8>>b-1);}移位运算例如:例如:假设a=10,b=2,求a<<b、a+86011逗号运算符和逗号表达式逗号表达式的一般形式

表达式1,表达式2,……,表达式n逗号表达式的值从左向右,依次对表达式求值,最后得到表达式n

的值就是逗号表达式的值例如:⑴a=5,

a++,

a*3表达式值为18,且a=6⑵t=1,t+5,t++表达式值为1,且t=2⑶x=(a=3*5,

a*4

)赋值表达式的值为60,且x=60,a=1511逗号运算符和逗号表达式逗号表达式的一般形式例如:⑴61小结本节主要内容是:C的算术、运算符,各种运算符的运算优先级,要求能够正确地书写C的表达式。

小结62单片机C语言

单片机C语言 63C51特点结构化语言丰富的数据类型便于维护管理与汇编语言相比,C语言的优点如下:不要求编程者详细了解单片机的指令系统,但需了解单片机的存储器结构;寄存器分配、不同存储器的寻址及数据类型等细节可由编译器管理;结构清晰,程序可读性强;编译器提供了很多标准库函数,具有较强的数据处理能力。C51特点结构化语言64C51-1:C51基本结构C51-1:C51基本结构65//功能:控制八个信号灯闪烁程序#include<AT89X52.H> //定义了MCS-52单片机的特殊功能寄存器voiddelay(unsignedchari); //延时函数声明voidmain() //主函数{while(1){P1=0x00;//点亮八个LEDdelay(200);//延时P1=0xff;//熄灭八个LEDdelay(200); //延时}}//功能:控制八个信号灯闪烁程序66//函数名:delay//函数功能:实现软件延时//形式参数:unsignedchari;voiddelay(unsignedchari) //延时函数,无符号字符型变量i为形式参数{unsignedcharj,k; //定义无符号字符型变量j和kfor(k=0;k<i;k++) //双重for循环语句实现软件延时for(j=0;j<255;j++);}//函数名:delay67

C51的程序结构#include<reg51.h>voiddelay(){……;}voidmain(){delay();P0=0x33;}头文件(一个或若干个)主函数程序的入口

函数名固定,且与书写的位置无关有且仅有一个函数声明或定义库函数或用户自定义的函数可以有若干个C51程序大体上是若干函数的集合C51的程序结构#include<reg51.h>头文件68C程序基本结构C程序基本结构69一个或若干个函数有(且仅有)一个主函数main预处理命令“;”作为语句的结束符区分大小写。用/**/或//注释。Main主函数名;void函数类型,空类型无返回值;()内为形参,{}内为函数体C51编程要点一个或若干个函数C51编程要点70C语言编程的三大要素数据数据类型、数据结构、存储类型运算算术运算、关系运算、逻辑运算、位操作控制顺序结构、选择结构、循环结构、函数C语言编程的三大要素数据71C语言标识符

C语言中由字母、数字和下划线组成的字符序列称为----标识符。用于在程序中给变量、符号常量、数组、函数、数据类型等操作对象“起名”。1.编译系统定义标识符由编译系统定义,具有固定名字和特定含义分为①关键字和②预定义标识符

2.用户自定义标识符

用于对用户使用的变量、数组、函数等操作对象进行命名。

C语言标识符C语言中由字母、数字和下划线组成的字符序列称为72C语言对标识符的规定

用户自定义标识符:由字母、数字和下划线构成,但必须以字母或下划线“_”开头,不能以数字开头不能含有除字母、数字和下划线“_”外的其他字符如:!、&、*等。标识符中大小写字母含义不同如:abc和Abc为不同的标识符关键字:必须用小写字母。不允许使用关键字为变量、数组、函数等操作对象命名。预定义标识符:允许用户对它们重新定义,当重新定义后将改变它们原来的含义。C语言对标识符的规定用户自定义标识符:73正确区分标识符正确区分哪些是合法标识符,哪些是不合法标识符。AbcP1_02xP1.0studentm+ya#b-4_1Whileintletx%yLEDdoπwtmCtrlswicthinclude正确区分标识符正确区分哪些是合法标识符,哪些是不合法标识符。74C51-2数据类型C51-2数据类型75C51的数据3-1、C51的数据类型C51的数据3-1、C51的数据类型761.char字符类型 char类型的长度是一个字节,通常用于定义处理字符数据的变量或常量。 分无符号字符类型unsignedchar和有符号字符类型signedchar,默认值为signedchar类型。

1.char字符类型77字符型变量分为:[signed]

char和unsignedchar编译系统为其分配1Byte(字节)的存储空间(TurboC、VC++6.0和Keil中均分配1B的存储空间)表示的数值范围:[signed]

char:-128~127unsignedchar:0~255字符型变量定义形式:char字符变量名[=初值];例如:char

ch1,c1;

unsignedchar

c2=‘a’,c3=‘A’;

字符型变量分为:[signed]char和unsigne78例如:

inta,b;(指定变量a、b为整型)

charx,y;(指定变量x、y为字符型)

unsignedintw,u;

(指定变量w、u为无符号整型)

unsignedcharc,d;

(指定变量c、d为无符号字符型)

例如:792.int整型 int整型长度为两个字节,用于存放一个双字节数据。 分有符号int整型数signedint和无符号整型数unsignedint,默认值为signedint类型2.int整型803.long长整型

long长整型长度为四个字节,用于存放一个四字节数据。分有符号long长整型signedlong和无符号长整型unsignedlong,默认值为signedlong类型。4.float浮点型

float浮点型在十进制中具有7位有效数字,是符合IEEE-754标准的单精度浮点型数据,占用四个字节。5.指针型

指针型本身就是一个变量,在这个变量中存放的是另一个数据的地址。这个指针变量要占据一定的内存单元,对不同的处理器长度也不尽相同。3.long长整型816.bit位变量bit类型---定义1个位变量,值为0或1.其存储器类型只能是bdata、data、idata,严格讲只能是:bdata所有的bit变量都放在80C51内部存储区的可位寻址区,而该区域只有16字节长,所以在某个范围内只能声明最多128个位变量。bitflag; //定义一个位变量flagbitflag=1; //定义一个位变量flag并赋初值16.bit位变量82对位变量定义的限制不能定义成一个指针,

如不能定义:bit*pointer;

不存在位数组

如不能定义:bitb_array[]

位变量定义时,存储类型只允许为data、bdata或者idata,如果将位变量的存贮类型定义成其它类型都将导致编译出错。对位变量定义的限制837

sfr类型---用于定义1个8位的特殊功能寄存器定义形式:

sfr

标识符=8位特殊功能寄存器在内部RAM中的实际地址;标识符可为特殊功能寄存器名或自己任意命名如:sfrP0=0x80;sfrPSW=0xd0;sfrTMOD=0X89;7sfr类型---用于定义1个8位的特殊功能寄存器848

sfr16类型---用于定义1个16位的特殊功能寄存器定义形式:

sfr16标识符=16位特殊功能寄存器的低字节地址;51子系列中只有DPTR为16位的特殊功能寄存器:由DPH和DPL组成,其地址分别为0x82和0x83,地址连续。sfr16DPTR=0x82;/*地址为低字节单元的地址*/52子系列中T2可定义如下:sfr16T2=0xCC;T0和T1不能用sfr16进行定义:sfr16T0=0x8A;/*错误,TL0和TH0地址不连续*/sfr16T1=0x8B;/*错误,TL1和TH1地址不连续*/8sfr16类型---用于定义1个16位的特殊功能寄存器859.sbit可寻址位

sbit是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。sbit类型---定义bdata区或可位寻址特殊功能寄存器(字节地址的末位为0或8)中的位,值也为0或1.如:sfrP1=0x90;sbitP1_0=P1^0;

或sbitP1_0=0x90^0;

或sbitP1_0=0x90;sbitEA=0xAF;sbitIT0=0x88;sbitP=0xD0;注:安装Keil软件后,在文件夹“C:\keil\c51\inc”中有一些头文件包含了有关特殊功能寄存器和相应位的定义。9.sbit可寻址位86reg51.h头文件内容:/*BYTERegister*/sfrP0=0x80;sfrP1=0x90;sfrP2=0xA0;sfrP3=0xB0;sfrPSW=0xD0;sfrACC=0xE0;sfrB=0xF0;sfrSP=0x81;sfrDPL=0x82;sfrDPH=0x83;sfrPCON=0x87;sfrTCON=0x88;sfrTMOD=0x89;sfrTL0=0x8A;sfrTL1=0x8B;sfrTH0=0x8C;sfrTH1=0x8D;sfrIE=0xA8;sfrIP=0xB8;sfrSCON=0x98;sfrSBUF=0x99;/*BITRegister*//*PSW*/sbitCY=0xD7;sbitAC=0xD6;sbitF0=0xD5;sbitRS1=0xD4;sbitRS0=0xD3;sbitOV=0xD2;sbitP=0xD0;/*TCON*/sbitTF1=0x8F;sbitTR1=0x8E;sbitTF0=0x8D;sbitTR0=0x8C;sbitIE1=0x8B;sbitIT1=0x8A;sbitIE0=0x89;sbitIT0=0x88;/*IE*/sbitEA=0xAF;sbitES=0xAC;sbitET1=0xAB;sbitEX1=0xAA;sbitET0=0xA9;sbitEX0=0xA8;reg51.h头文件内容:/*BYTERegister87Reg51.h头文件内容(续)/*IP*/sbitPS=0xBC;sbitPT1=0xBB;sbitPX1=0xBA;sbitPT0=0xB9;sbitPX0=0xB8;/*P3*/sbitRD=0xB7;sbitWR=0xB6;sbitT1=0xB5;sbitT0=0xB4;sbitINT1=0xB3;sbitINT0=0xB2;sbitTXD=0xB1;sbitRXD=0xB0;/*SCON*/sbitSM0=0x9F;sbitSM1=0x9E;sbitSM2=0x9D;sbitREN=0x9C;sbitTB8=0x9B;sbitRB8=0x9A;sbitTI=0x99;sbitRI=0x98;Reg51.h头文件内容(续)/*IP*//*88总结:在编程时,如果只强调程序的运算速度而又不进行负数运算,最好采用无符号格式。无论何时,应尽可能地使用unsgnedchar、Bit类型。总结:在编程时,如果只强调程序的运算速度而又不进行负数运算,89C51-3常量和变量

符号常量用大写,变量用小写C51-3常量和变量

符号常量用大写,变量用小写901、常量–又称为标量,常量的值在程序执行过程中不能改变,一般用一个标识符号代表一个常量,称为符号常量。1、使用#define语句定义符号常量例:#defineCONST60 #definePI3.14152、使用”code”关键字指定数据的存储位置为程序存储器C51中常量的定义:符号常量的作用域:定义这个符号常量的整个C文件1、常量–又称为标量,常量的值在程序执行过程中不能改变,912、变量有关概念在程序运行过程中,其值可以改变的量,称为变量,变量名用标识符表示。变量一般有变量名和变量值组成。变量名为RAM单元地址号,变量值为该单元中存放的内容。C规定程序中用到的变量必须“先定义后使用”系统为变量在内存(内部RAM和外部RAM)中分配存储单元,存储变量的值。编写程序时可以通过变量名来存、取变量值。2、变量92

例如:unsignedint

xdatai,j;

unsignedchardatach1,ch2='A';必须使用合法的标识符作变量名不能使用关键字为变量命名变量名一般用小写,长度一般不超过8个字符,最长不得大于32个字符。变量名最好也能做到“顾名知意”变量定义的一般格式:数据类型[存储器类型]

变量名表[=初值];例如:unsignedintxdatai,j;93存储器类型---指明变量所在存储器的区域情况C51根据单片机存储器的结构特点分为以下六种存储类型:1、data---变量定义在片内RAM可直接寻址的低128B空间中。如:unsignedchardatach[5];2、idata---变量定义在片内RAM可间接寻址的256B空间中。如:intidatax=10;3、bdata---变量定义在片内RAM可位寻址的16B空间中(地址范围:0x20---0x2F)。如:intbdataflag;sbitflag0=flag^0;4、

xdata---变量定义在片外RAM64KB空间中。如:floatxdataf[100];5、

pdata---变量定义在片外RAM低256B空间中。如:floatpdatay;6、code---变量定义在程序存储器64KB的空间中。如:#defineucharunsignedcharucharcodedisplay[]={0x7F,0xBF,0xDF,0xFE,0xF7};数据类型说明符[存储器类型]

变量名列表[=初值];存储器类型---指明变量所在存储器的区域情况C51根据单片机94变量的默认存储类型如果变量定义时没有明确指明其存储类型(data、idata、bdata、xdata、pdata、code),则编译器编译时根据工程项目的存储模式自动选择存储类型。三种存储模式:1、small---小存储模式:变量默认分配在data区。2、compact---紧凑存储模式:变量默认分配在pdata区。3、large---大存储模式:变量默认分配在xdata区。如:unsignedinti,j=1000;unsignedcharch1,ch2='A';程序中可以通过预处理命令#pragma声明存储模式,没有明确声明时,系统隐含为small模式。变量的默认存储类型如果变量定义时没有明确指明其存储类型(da95变量的初始化变量的初始化指在声明变量的同时对变量赋初值。例如:inta=5,b=10+2;floatx=23.568,y;charch1='a';

表示声明变量并对变量存储单元赋值。第一条语句相当于:inta,b;a=5;b=12;错误的初始化:inta=3+b,b=5;

改为:

intb=5,a=3+b;floatm=n=23.16;改为:

floatm=23.16,n=23.16;变量的初始化变量的初始化指在声明变量的同时对变量赋初值。96C51运算符

C51运算符

971C语言运算符和表达式简介算术运算符和算术表达式赋值运算符和赋值表达式逗号运算符和逗号表达式逻辑运算符和逻辑表达式位运算符和位运算表达式条件运算符和条件表达式关系运算符和关系表达式其他运算符及其运算(指针、下标等)1C语言运算符和表达式简介982运算符的有关概念作用:对运算对象完成规定的操作运算类型:按运算对象分:单目:只有一个操作对象,如:自增运算符(++)双目:有两个操作对象,如:乘(*),除(/)三目:有三个操作对象

只有一个:条件运算符(?:)按功能分:算术、赋值、关系、逻辑条件、逗号、位、其他2运算符的有关概念作用:993运算符的优先级和结合性优先级指各种运算符号的运算优先顺序例如:算术运算中先*/后+- a-b*c+d结合性指运算符和运算对象的结合方向分为:从左向右(左结合)和从右向左(右结合)例如:算术运算符为左结合

a-b+4

赋值运算符为右结合

a=b=5注:如果一个操作数两边的运算符优先级不同时,按优先级从高到低结合;如果一个操作数两边的运算符优先级相同时,按结合性处理。3运算符的优先级和结合性优先级结合性注:如果一个操作数两边1004各种运算符的表示+-*/%++--+-=+=-=*=/=%=&=|=^=>>=<<=><>=<===!=&&||!&|^~<<>>?:,&sizeof(数据类型标识符)4各种运算符的表示+-*/%++--1015表达式的有关概念什么是表达式由运算符将运算对象连接成的式子,它描述了一个具体的求值运算过程。计算表达式的值按照运算符的运算规则求值求值时注意运算符的优先级和结合性5表达式的有关概念什么是表达式102例如:表达式:b=(++a)-2a/=a*=(a=2)f=a>b>c--a||++b&&c++max=a>b?a:ba=3,a+=3,a*a 1/(float)a+6例如:表达式:1036算术运算符和算术表达式算术运算符的优先级

()+-++--

*/%

+-

同级同级同级

单目双目

低没有乘方运算符,要计算a3要写作a*a*a的连乘,或用标准库函数pow(a,3)“/”的运算对象可为各种类型数据,但是当进行两个整数相除时,运算结果也是整数

“%”要求运算对象必须是整数,功能是求两个整数相除的余数,余数的符号与被除数的符号相同。6算术运算符和算术表达式算术运算符的优先级()104例5/2=2

-5/2.0=-2.5例5%2=1

-5%2=-11%10=

1

5%1=

05.5%2

()例5/2=2例5%2=1057自增、自减运算符自增(++)、自减(--)都是单目运算符有前缀和后缀两种形式前缀形式:先自增(自减)再引用;后缀形式:先引用再自增(自减);功能:

前缀形式++a等价于a=a+1

--a等价于a=a–1

后缀形式a++等价于a=a+1

a--等价于a=a–17自增、自减运算符自增(++)、自减(--)都是单目运106例如:当a=5时⑴++a表达式的值为6,且a=6⑵

a++

表达式的值为5,且a=6⑶b=++a等价于a=a+1;b=a表达式的值为6,且a=6,b=6⑷b=a++

等价于b=a;a=a+1表达式的值为5,且a=6,b=5

例如:当a=5时107说明:++

和-

-的运算对象只能是变量,不能是常量或表达式。例如:

5++、(a+2)++

不合法。右结合性,结合方向为从右到左。例如:

–a++等价于-(a++)而不等价(-a)++

如果有多个运算符连续出现时,C编译系统尽可能多的从左到右将多个字符组合成一个运算符例如:

i+++j等价于(i++)+j

-i+++-j等价于-(i++)+(-j)

说明:++和--的运算对象只能是变量,不能是常量或1088关系运算符、逻辑运算符及其表达式无论是关系运算还是逻辑运算,其结果都会得到一个逻辑值。逻辑值只有两个,在很多高级语言中都用“真”和“假”来表示。由于没有专门的“逻辑值”,C51语言规定:当关系成立或逻辑运算结果为非零值(整数或负数)时为“真”,用“1”表示;否则为“假”,用“0”表示。8关系运算符、逻辑运算符及其表达式无论是109关系运算符种类:<<===>=>!=结合方向:自左向右优先级别:<<=>>===!=优先级6(高)优先级7(低)例c>a+b//c>(a+b)a>b!=c//(a>b)!=ca==b<c//a==(b<c)a=b>c//a=(b>c)关系表达式的值:是逻辑值“真”或“假”,用1和0表示//表达式值1//表达式值1//表达式值0//d=1//f=0(1)关系运算符与关系表达式(左结合)<优先级6(高)优先级7(低)例c>a+b//110例注意区分“=”与“==”inta=0,b=1;if(a=b)printf(“aequaltob”);elseprintf(“anotequaltob”);关系运算注意(2)例注意区分“=”与“==”关系运算注意(2)111ab!a!ba&&ba||b真假真假假假真真逻辑运算符种类:!&&||逻辑运算真值表C语言中,运算量:

0表示“假”,非0表示“真”,

运算结果:0表示“假”,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论