




已阅读5页,还剩121页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章单片机C51语言设计基础,3.1C51的数据3.2C51对单片机主要资源的控制3.3C51的基本运算与流程控制3.4C51的数组与指针3.5C51函数3.6C51的预处理命令,3.1C51的数据,3.1.1数据类型3.1.2常量与变量3.1.3数据存储类型3.1.4局部变量与全局变量,3.1.1数据类型,3.1.2常量与变量,1常量C51语言中的常量是不接受程序修改的固定值,常量可以是任意数据类型。C51中的常量有整型常量、实型常量、字符型常量、字符串常量符号常量等。,(1)整型常量,在整型常量后加一个字母“L”或“l”,表示该数位长整型。例如23L、0Xfd4l等。如果需要的是负值,则必须将负号“-”放置于常量表达式的最前面,例如-0 x56、-9等。,(2)实型常量,实型常量又称浮点常量,是一个十进制表示的符号实数。实型常量的值包括整数部分、尾数部分和指数部分。实型常量的形式如下:digits.digitsE+/-digits一些实型常量的示例如下:15.75、1.575E1、1575E-3、-0.0025、-2.5e-3、25E-4。,(3)字符型常量,字符型常量是指用一对单引号括起来的一个字符。如a、9、!等。字符常量中的单引号只起定界作用并不表示字符本身。在C51语言中,字符是按其对应的ASCII码值来存储的,1个字符占1个字节,(4)字符串常量,字符串常量是指用一对双引号括起来的一串字符,双引号只起定界作用,如China、123456等。,(5)符号常量,C51语言中允许将程序中的常量定义为一个标识符,称为符号常量。符号常量一般使用大写英文字母表示,以区别于一般用小写字母表示的变量。符号常量在使用前必须先定义,定义的形式是:#define标识符常量#definePI3.1415926,2变量,变量的定义:数据类型变量名;inti,j,k;unsignedcharsi;unsignedintui;doublebalance,profit,loss;C51中常用的:bit、char、int,(1)整型变量(int)16位数据,有符号:signedint-3276832767无符号:unsignedint0655350 x1234存储形式,例3-1P50,(2)长整型变量(longint)长整型变量长度是32位,占用4个字节(byte),其他方面和整型变量(int)相似。,(3)实型变量,分为单精度(float)型和双精度(double)型。其定义形式为:floatx,y;/指定x,y为单精度实数doublez;/指定z为双精度实数在一般系统中,一个float型数据在内存中占4个字节(32位),一个double型数据占8个字节(64位)。单精度实数提供7位有效数字,双精度实数提供1516位有效数字。,(5)字符变量char,字符变量用来存放字符常量。注意只能存放1个字符。字符变量的定义形式如下:char变量名;例如:charc1,c2;它表示c1和c2为字符变量,各存放1个字符。可以用下面的语句对c1、c2赋值:c1=a;c2=b;字符变量的长度是1字节(byte)即8位。这很适合于8051单片机,因为8051单片机每次可以处理8位数据。,(6)位变量(bit),变量的类型是位,位变量的值可以是1(true)或0(false)。与8051硬件特性操作有关的位变量必须定位在8051单片机片内存储区(RAM)的可位寻址空间中。,3有符号/无符号问题说明,(1)尽量使用无符号变量(2)在编程时,为了书写方便,经常使用简化的缩写形式来定义变量的数据类型:#defineucharunsignedchar#defineuintunsignedint,3.1.3数据存储类型,数据时存放在51单片机的存储器中的,因此要规定数据的存储类型。P53表3-4常用:data、xdata、code另外:bdata,(1)data区,data区的寻址是最快的,所以应该把经常使用的变量放在data区,但是data区的空间是有限的,data区除了包含程序变量外,还包含了堆栈和寄存器组。data区声明中的存储类型标式符为data,通常指片内RAM的低128字节的内部数据存储的变量,可直接寻址。声明举例如下:unsignedchardatasystem_status=0;unsignedintdataunit_id2;chardatainp_string16;,(2)bdata,bdata实际是data中的位寻址区,在这个区中声明变量就可以进行位寻址。位变量的声明对状态寄存器来说是十分有用的,因为它可能仅仅需要某一位,而不是整个字节。bdata区声明中的存储类型标识符为bdata,指内部可位寻址的16字节存储区(20H到2FH),数据类型是可位寻址变量的数据类型。以下是在bdata区中声明的位变量和使用位变量的例子:,unsignedcharbdatastatus_byte;unsignedintbdatastatus_word;unsignedlongbdatastatus_dword;sbitstat_flag=status_byte4;if(status_word15)stat_flag=1;,(3)idata区,idata区也可以存放使用比较频繁的变量,使用寄存器作为指针进行寻址。idata区声明中的存储类型标识符为idata,指内部的256字节的存储区,但是只能间接寻址,速度比直接寻址慢。声明举例如下:unsignedcharidatasystem_status=0;unsignedintidataunit_id2;charidatainp_string16;floatidataout_value;,(4)pdata区和xdata区,pdata区和xdata区属于外部数据存储区,外部数据区是可读可写的存储区,最多可以有64KB。在这两个区,变量的声明与在其他区的语法是一样的,但pdata区只有256字节而xdata区可达65536字节。,声明举例如下:,unsignedcharxdatasystem_status=0;unsignedintpdataunit_id2;charxdatainp_string16;floatpdataout_value;外部地址段中除了包含存储器地址外,还包含I/O器件的地址。对外部器件寻址可以通过指针或C51提供的宏,使用宏对外部器件I/O口进行寻址更具可读性。,(5)程序存储区code,程序存储区的数据是不可改变的,跳转向量和状态表对code段访问和对xdata区访问的时间是一样的。编译的时候要对程序存储区中的对象进行初始化,否则就会产生错误。程序存储区code声明的标识符为code,在C51语言编译器中可以用code存储区类型标识符来访问程序存储区。下面是程序存储区声明的例子:unsignedcharcodea=0 x00,0 x01,0 x02,0 x03,0 x04,0 x05,0 x06,0 x07,0 x08,0 x09,0 x10,0 x11,0 x12,0 x13,0 x14,0 x15;,变量存储类型定义举例:,chardatavar1;bitbdataflags;floatidatax,y,z;unsignedintpdatadimension;unsignedcharxdatavector1044;,3.1.4局部变量与全局变量,从变量的作用范围来区分,变量可以被分为全局变量和局部变量;某些变量在程序运行过程中是始终存在的-全局变量。某些变量只是在进入某个函数时才开始存在-局部变量。,1局部变量,局部变量是在某个函数中存在的变量,也可以称为内部变量,它只在该函数内部有效。局部变量可以分为动态局部变量和静态局部变量,使用关键词auto定义动态局部变量(auto可以省略),使用关键词static定义静态局部变量,例如:autointa;staticunsignedcharj;,动态局部变量在程序执行完毕后其存储空间被释放,而静态局部变量在程序执行完成后其存储空间并不释放,而且其值保持不变。如果该函数再次被调用,则该函数初始化后其初始值为上次的数值。动态局部变量和静态局部变量的区别如下:,动态局部变量在函数被调用时分配存储空间和初始化,每次函数调用时都需要初始化;静态局部变量在编译程序时分配存储空间和初始化,仅初始化一次。动态局部变量存放在动态存储区,在每次退出所属函数时释放;静态局部变量存放在静态存储区,每次调用后函数不释放,保持函数执行完毕之后的数值到下一次调用。如果在建立时动态局部变量不初始为一个不确定的数,静态局部变量不初始化,则它们的值为0或者是空字符。,2全局变量,全局变量是在整个源文件中都存在的变量,又称为外部变量。全局变量的有效区间是从定义点开始到源文件结束,其中的所有函数都可以直接访问该变量,如果定义点之前的函数需要访问该变量,则需要使用extern关键词对该变量进行声明,如果全局变量声明文件之外的源文件需要访问该变量,也需要使用extern关键词进行声明。,全局变量有以下特点:,全局变量是整个文件都可以访问的变量,可以用于在函数之间共享大量的数据,存在周期长,在程序编译时就存在,如果两个函数需要在不互相调用时共享数据,则可以使用全局变量进行参数传递;C51语言程序的函数只支持一个函数返回值,如果一个函数需要返回多个值,除了使用指针外,还要使用全局变量;,使用全局变量进行参数传递可以减少从实际参数向形式参数传递时所必需的堆栈操作;在一个文件中,如果某个函数的局部变量和全局变量同名,则在这个局部变量的作用范围内局部变量不起作用,全局变量起作用;全局变量一直存在,占用了大量的内存单元,并且加大了程序的耦合性,不利于程序的移植或复用。,静态局部变量的作用范围仅仅是在定义的函数内,不能被其他的函数访问,全局变量的作用范围是整个程序,静态全局变量的作用范围是该变量定义的文件;静态局部变量是在函数内部定义,全局变量是在所有函数外定义;静态局部变量仅仅在第1次调用时被初始化,再次调用时使用上次调用结束时的数值,全局变量在程序运行时建立,值为最近一条访问该全局变量的语句执行的结果。,另外,main函数虽然是.c文件的主文件,但也是一个函数,在其内部定义的变量也属于局部变量。全局变量一般在.c文件的开始部分定义或在.h文件中定义,由.c文件引用。C51语言程序多使用全局变量传递参数,因为这样可以降低程序处理的难度,加快程序执行的速度,提高程序的时效性。,3.2C51对单片机资源的控制,3.2.1特殊功能寄存器的C51语言定义3.2.2绝对地址的访问3.2.3位变量的C51语言定义,3.2.1特殊功能寄存器的C51定义,21个特殊功能寄存器。两种方式:1使用关键字sfr定义sfr特功器名字=特功器地址;sfrSCON=0 x98;/*串口控制寄存器地址98H*/sfrTMOD=0X89;/*定时器/计数器方式控制寄存器地址89H*/,2通过头文件访问SFR,#include/使用的单片机为Intel公司的MCS-51voidmain(void)TL0=0 xb0;TH0=0 x3c;TR0=1;/启动定时器0.,3SFR中位定义3种方式,(1)第1种方法sbit位名=特殊功能寄存器名位置;(2)第2种方法sbit位名=字节地址位置;(3)第3种方法sbit位名=位地址;,例:,sfrPSW=0 xD0;sbitOV=PSW2;sbitOV=0 xD02;sbitOV=0 xD2;,unsignedcharbdataflag;sbitflag0=flag0;sfrP1=0 x90;sbitP1_0=P10;sbitP1_1=P11;sbitP1_6=P16;sbitP1_7=P17;,P60例3-3sbit型变量的定义P60例3-4片内I/O口及其位的定义,3.2.2绝对地址的访问,包括:片内RAM、片外RAM及I/O口可以有两种方式:1、通过宏定义2、_at_,1、通过宏定义,用#include可使用其中声明的宏来访问绝对地址,DBYTE以字节形式对data区寻址;DWORD以字形式对data区寻址;XBYTE以字节形式对xdata区寻址;XWORD以字形式对xdata区寻址;,另外:,CBYTE以字节形式对code区寻址;CWORD以字形式对code区寻址;PBYTE以字节形式对pdata区寻址;PWORD以字形式对pdata区寻址。,如:,#include#definePORTAXBYTE0 xFFC0/*将PORT定义为外部I/O口,地址为0 xFFC0,长度为8位*/#defineNRAMDBYTE0 x40/*将NRAM定义为片内RAM,地址为40H,长度为8位*/,例3-5(P61),#include#definePAXBYTE0 xffec/将PA定义为外部I/O口,地址为0 xffec#defineNRAMDBYTE0 x40/*将NRAM定义为片内RAM,地址为40H,长度为8位*/voidmain()PA=0 x3A;NRAM=0 x01;,2、_at_关键词,可以使用关键字_at_对指定的存储器空间的绝对地址进行访问。一般格式如下:【存储类型】数据类型符变量名_at_地址常数;,例3-6(P62),dataunsignedcharx1_at_0 x40;/*在data区定义字节变量x1,它的地址为40H*/xdataunsignedintx2_at_0 x2000;/*在xdata区定义字变量x2,它的地址为2000H*/voidmain(void)x1=0 xff;x2=0 x1234H;.while(1);,3.2.3位变量的C51语言定义,1位变量的C51语言定义采用关键字bit进行定义。例如:bitdirection_bit;/*将direction_bit定义为位变量*/bitlock_pointer;/*将lock_pointer定义为位变量*/bitdisplay_invers;/*将display_invers定义为位变量*/,2可位寻址对象,可位寻址对象指可以字节或位寻址的对象。该对象应位于8051片内可位寻址RAM区中,C51语言编译器允许数据类型为idata的对象放入8051片内可位寻址RAM区。位变量的存储类型只能是bdata。在程序设计时,对于可位寻址的对象,即可以字节寻址也可以位寻址的变量,但其存储类型只能是bdata。使用时应先说明字节变量的数据类型和存储类型,然后可使用bit定义可独立寻址访问的对象位。,例如:,bdataintibase;/*ibase定义为bdata整型变量*/bdatacharbary4;/*bary定义为bdata字符型数组*/sbitmybit0=ibase0;/*mybit0定义为ibase的第0位*/sbitmybit15=ibase15;/*mybit15定义位ibase的第15位*/sbitAry07=bary07;/*Ary07定义为bary0的第7位*/sbitAry37=bary37;/*Ary37定义为bary3的第7位*/,Ary37=0;/*bary3的第7位赋值为0*/bary3=a;/*字节寻址:bary3赋值为a*/sbit定义要求基址对象的存储类型为bdata,只有这样其特殊位定义(sbit)是合法的。位置(操作符)后的最大值依赖于指定的基类型,对于char/uchar而言是07,对于int/uint而言是015,对于long/ulong而言是031。,3.3C51的基本运算与流程控制,3.3.1基本运算3.3.2选择(分支)控制语句3.3.3循环结构流程控制语句3.3.4break语句、continue语句、goto语句,3.3.1基本运算(运算符),运算符是表示特定的算术或逻辑运算的符号,也称操作符。把需要进行运算的各个量通过运算符连接起来,便构成表达式。算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、特殊运算符,一、算术运算,算术运算的操作符:+(加法运算符)、-(减法运算符)*(乘法运算符)、/(除法运算符)(模运算或取余运算符)+为自增运算符-为自减运算符。,注意:,/:结果的整数部分%:结果的余数部分-:除进行减法外,还可以进行取负操作。+:自增。表示操作数加1。X+等同于X=X+1。+X表示先加1,再取值X+表示先取值,再加1。,例3-8:自增和自减运算符的程序,#includevoidmain()intx,y,z1,z2;x=10;y=21;z1=(x+)+(x+);printf(“x=%d,z1=%dn”,x,z1);z2=(+y)+(+y);printf(“y=%d,z2=%dn”,y,z2);,二、关系运算成立或不成立,主要用于比较操作数的大小关系。包括:(大于)、=(大于等于)、=(等于)、!=(不等于)看关系是否成立。结果:0或1,例3-9关系运算符运算的程序示例,#includevoidmain()inta,b,c,d;a=-2.30;b=71=32;c=7!=0;d=-12(位右移)位运算的操作对象只能是整型和字符型数据。这些位运算和汇编语言中的位操作指令十分类似。位操作指令是单片机的重要特点,所以位运算在C51语言控制类程序设计中的应用比较普遍。,例3-11位运算程序示例,将a值循环右移2位main()unsignedchara=0 xc3,b,c;intn=2;b=an;a=c|b;,例3-12位运算程序示例,#includevoidmain()inta,b,c;a=23;b=217;c=a,五、赋值运算,变量名=表达式;例如:a=(b=4)+(c=6);该表达式的值为10,变量a的值为10。,复合赋值运算符:,赋值符号前加上其他运算符构成复合运算符。C51语言提供以下10种复合运算符:+=,-=,*=,=,=,=,=,=,=例如:a+=b;/等价于a=(a+b)x*=a+b;/等价于x=(x*(a+b)a/等价于a=(ay)max=x;elsemin=y;,形式三:,if(表达式1)语句1;elseif(表达式2)语句2;elseif(表达式3)语句3;elseif(表达式m)语句m;else语句n;,如:,if(x1000)y=1;elseif(x500)y=2;elseif(x300)y=3;elseif(x100)y=4;elsey=5;,例3-13分支编程示例,#includemain()intx,y;scanf(%d,例3-14:,#includevoidmain()inta,b;a=200;b=321;if(a=b)a+;b+;printf(a=%d,b=%dn,a,b);,例3-15:,#includevoidmain()inta,b;a=12;b=21;if(a=b)a+;b+;a-;b-;printf(a=%d,b=%dn,a,b);,例3-16:,#includevoidmain()intscore;chargrade;score=45;if(score=90)grade=A;elseif(score=80)grade=B;elseif(score=70)grade=C;elseif(score=60)grade=D;elsegrade=E;printf(score=%d,grade=%cn,score,grade);,二、switch语句,switch语句是多分支选择语句一般形式如下:switch(表达式)case常量表达式1:语句1;break;case常量表达式2:语句2;break;.case常量表达式n:语句n;break;default:语句n+1;,例3-17,3.3.3循环结构流程控制语句,四种形式:ifgotowhiledo-whilefor,一、基于if和goto构成的循环,1、采用if和goto可以构成“当型”循环loop:if(表达式)语句;gotoloop;,2、采用if和goto也可以构成“直到型”循环程序loop:语句;if(表达式)gotoloop;3、goto语句为无条件转向语句goto语句标号;,二、while,while(表达式)语句;,例:,#includevoidmain()inti,s;i=100;s=0;while(i0)s=s+i;i=i-1;printf(“1+2+100=%dn”,s);,注意:,先判断,后执行;如果循环体内只有一个语句,可以不用While循环体后无分号;,三、do-while,do语句;while(表达式);,例:,#includevoidmain()inti,s;i=100;s=0;dos=s+i;i=i-1;while(i0);printf(“1+2+100=%dn”,s);,注意:,先执行,后判断;如果循环体内只有一个语句,可以不用循环体后无分号;while(表达式)后的分号不能省;,四、for,for(表达式1;表达式2;表达式3)语句;for(y=0;y=99;y=y+3)delay(33);px=px;,例:,#includevoidmain()inti,s;s=0;for(i=0;i100)break;printf(“1+2+100=%dn”,s);,2、continue,continue语句用于退出当前循环,不再执行本轮循环,程序代码从下一轮循环开始执行,直到判断条件不满足为止。与break的区别是该语句不是退出整个循环。形式:continue;,例:,#includevoidmain()charch=a,B,c,D,e,F;inti=-1;while(i=a,3、goto,goto是一个无条件转移语句。当执行goto语句时,将程序指针跳转到goto给出的下一条代码,基本格式如下:goto标号;,例:,voidmain(void)unsignedcharcounter;intsum;sum=0;sumadd:sum=s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 节能电梯改造项目可行性研究报告
- 第四单元 多姿多彩的乐音世界 第5课时《G大调弦乐小夜曲》教学设计-2025-2026学年湘艺版(2024)初中音乐八年级上册
- 废玻璃加工回收项目可行性研究报告
- 防汛知识培训开班动员课件
- 在线课程开发合作协议
- 情境感知学习-洞察及研究
- 防性侵安全知识培训记录课件
- 深度学习模型-第1篇-洞察及研究
- 2025年高考政治总复习哲学生活全册基础知识复习宝典
- 指导土地流转合同6篇
- 教科版小学科学一年级上册全册教案【全套】
- 成人肠造口护理
- 人教版英语七年级上册阅读理解专项训练16篇(含答案)
- 高效压缩空气系统供应规范(TCECA-G 0225-2023)
- 安徽省宣城市宣州区宣城市第六中学2024-2025学年九年级上学期开学物理试题
- 【多彩的黄土高原论文3800字】
- 2024届重庆巴川量子中学毕业升学考试模拟卷数学卷含解析
- 3.3天气系统气旋与反气旋课件高中地理选择性必修1
- 金川集团社招考试题
- 个人独资企业的会计制度
- JJG 693-2011可燃气体检测报警器
评论
0/150
提交评论