收藏 分销(赏)

第4章单片机的C语言编程.ppt

上传人:w****g 文档编号:14636172 上传时间:2026-10-23 格式:PPT 页数:119 大小:1.09MB 下载积分:10 金币
下载 相关
第4章单片机的C语言编程.ppt_第1页
第1页 / 共119页
第4章单片机的C语言编程.ppt_第2页
第2页 / 共119页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,4,章 单片机的,C,语言编程,单片机应用系统是由硬件和软件组成的,这是与一般的数字逻辑电路系统的不同之处。,汇编语言,是能够利用单片机所有特性直接控制硬件的唯一语言,对于一些需要直接控制硬件的场合,汇编语言是必不可少的。,但汇编语言不是一种结构化的程序设计语言,对于较复杂的单片机应用系统,它的编写效率很低。,为了提高软件的开发效率,许多软件公司致力于单片机,高级语言,的开发研究,许多型号的单片机内部,ROM,已经达到,64KB,甚至更大,且具备在,系统编程,(,ISP,In System Programmable,)功能,进一步推动了,高级语言,在单片机应用系统开发中的应用。,51,系列单片机支持三种高级语言,:,PL/M,、,C,、,BASIC,BASIC,语言适用于简单编程而对编程效率、运行速度要求不高的场合,,8052,单片机内固化有,BASIC,语言解释器。,PL/M,是一种结构化的语言,很象,PASCAL,,,PL/M,编译器好象汇编器一样产生紧凑的机器代码,可以说是高级汇编语言,但它不支持复杂的算术运算,无丰富库函数支持,学习,PL/M,无异于学习一种新的语言。,C,语言是一种通用的程序设计语言,其,代码率高,,数据类型及运算符丰富,并具有良好的,程序结构,,适用于各种应用的程序设计,是目前使用最广的单片机编程语言。,C,语言作为一种非常方便的语言而得到广泛的支持,很多硬件开发都用,C,语言编程,如:各种单片机、,DSP,、,ARM,等。,C,语言程序本身不依赖于机器硬件系统,,基本上不作修改或仅做简单修改就可将程序从不同的单片机中,移植,过来直接使用。,C,语言提供了很多数学函数并支持浮点运算,开发效率高,故可缩短开发时间,增加程序,可读性,和,可维护性,。,单片机的,C,语言编程称为,C51,编程,,应用,C51,编程具有以下优点:,(,1,),C51,编译器,管理内部寄存器和存贮器的分配,编程时,无需考虑不同存储器的寻址和数据类型等细节问题,;,(,2,)程序有规范的结构,可分成不同的函数,这种方式具有良好的,模块化结构,使已编好程序容易移植,;,(,3,)有丰富的,子程序库,可直接引用,,具有较强的数据处理能力,,从而大大减少用户编程的工作量;,(,4,),C,语言和汇编语言可以交叉使用,。,汇编语言程序代码短、运行速度快、但复杂运算编程耗 时。,用汇编语言编写与硬件有关的部分程序,,,用,C,语言编写与硬件无关的运算部分程序,,充分发挥两种语言的长处,提高开发效率。,C51,编译器(,Keil C,)与标准,ANSI C,编译器的主要区别,单片机,C,编译器之所以与,ANSI C,有所不同,主要是由于它们所针对的,硬件系统,有其各自不同的特点。,C51,的特点和功能主要是,80C51,单片机自身特点引起的。,(,1,),头文件,:,51,单片机有不同的厂家和系列,不同单片机的主要区别在于内部资源,为了实现内部资源功能,只需将相应的功能寄存器的头文件加载在程序中,就可实现指定的功能。,因此,,C51,系列头文件集中体现了各系列芯片的不同功能。,(,2,),数据类型,:,由于,51,系列器件包含了位操作空间和丰富的位操作指令,因此,C51,比,ANSI C,多一种,位类型,。,(,3,),数据存储类型,:,51,系列单片机有程序存储器和数据存储器。数据存储器又分片内和片外数据存储器。片内数据存储器还分直接寻址区和间接寻址区,分别对应,code,、,data,、,idata,、,xdata,以及根据,80C51,系列特点而设定的,pdata,类型。,(,4,),数据运算操作和程序控制,:,从数据运算操作和程序控制语句以及函数的使用上来讲,它们几乎没有什么明显的区别。只是在函数的使用上,,由于单片机系统的资源有限,它的编译系统不允许太多的程序嵌套,。,由于,51,系列单片机是,8,位机,所以,扩展,16,位字符,Unicode,不被,C51,支持。,ANSI C,所具备的,递归特性不被,C51,支持,,所以在,C51,中如果要使用递归特性,必须用,REETRANT,关键字声明。,(,5,),C51,与标准,ANSI C,库函数,:,部分库函数不适合单片机处理系统,因此被排除在外,如字符屏幕和图形函数。,也有一些库函数继续使用,但这些库函数是厂家针对硬件特点相应开发的,与,ANSI C,的构成和用法有很大的区别,如,printf,和,scanf,。在,ANSI C,中,这两个函数通常用作,屏幕打印,和,接收字符,,而在,C51,中,主要用于,串口数据的发送和接收,。,标识符,用来标识源程序中某个对象的名字,这些对象可以是语句、数据类型、函数、变量、数组等。,标识符区分大小写,第一个字符必须是字母或下划线。,C51,中有些库函数的标识符是以下划线开头的,所以,一般不要以下划线开头命名标识符,。,C51,编译器规定标识符最长可达,255,个字符,但只有前面,32,个字符在编译时有效,,因此在编写源程序时标识符的长度不要超过,32,个字符,这对于一般应用程序来说已经足够了,。,关键字,是编程语言保留的特殊标识符,有时又称为,保留字,,它们具有固定名称和含义,,在,C,语言的程序编写中不允许标识符与关键字相同,。,与其他计算机语言相比,,C,语言的关键字较少,,ANSI C,标准一共规定了,32,个关键字。,Keil C51,编译器的关键字除了有,ANSI C,标准的,32,个关键字外还根据,51,单片机的特点,扩展了相关的关键字,。在,Keil C51,开发环境的文本编辑器中编写,C,程序,系统可以把保留字以不同颜色显示,,缺省颜色为蓝色,。,4.2,C51的标识符和关键字,关键字,用途,说明,auto,存储种类说明,用以说明局部变量,缺省值为此,break,程序语句,退出最内层循环体,case,程序语句,switch,语句中的选择项,char,数据类型说明,单字节整型数或字符型数据,const,存储类型说明,在程序执行过程中不可更改的常量值,continue,程序语句,转向下一次循环,default,程序语句,switch,语句中的失败选择项,do,程序语句,构成,dowhile,循环结构,double,数据类型说明,双精度浮点数,else,程序语句,构成,ifelse,选择结构,enum,数据类型说明,枚举,extern,存储种类说明,在其他程序模块中说明了的全局变量,float,数据类型说明,单精度浮点数,for,程序语句,构成,for,循环结构,goto,程序语句,构成,goto,转移结构,if,程序语句,构成,ifelse,选择结构,ANSI C,标准关键字(,1,),ANSI C,标准关键字(,2,),关键字,用途,说明,int,数据类型说明,基本整型数,long,数据类型说明,长整型数,register,存储种类说明,使用,CPU,内部寄存的变量,return,程序语句,函数返回,short,数据类型说明,短整型数,signed,数据类型说明,有符号数,二进制数据的最高位为符号位,sizeof,运算符,计算表达式或数据类型的字节数,static,存储种类说明,静态变量,struct,数据类型说明,结构类型数据,switch,程序语句,构成,switch,选择结构,typedef,数据类型说明,重新进行数据类型定义,union,数据类型说明,联合类型数据,unsigned,数据类型说明,无符号数据,void,数据类型说明,无类型数据,volatile,数据类型说明,该变量在程序执行中可被隐含地改变,while,程序语句,构成,while,和,dowhile,循环结构,Keil C51编译器扩展的关键字,(1,),关键字,用途,说明,_at_,地址定位,为变量定义存储空间绝对地址,alien,函数特性说明,声明与,PL/M51,兼容的函数,bdata,存储器类型说明,可位寻址的内部,RAM,bit,位标量声明,声明一个位标量或位类型的函数,code,存储器类型说明,程序存储器空间,compact,存储器模式,使用外部分页,RAM,的存储模式,data,存储器类型说明,直接寻址的,8051,内部数据存储器,idata,存储器类型说明,间接寻址的,8051,内部数据存储器,interrupt,中断函数声明,定义一个中断函数,large,存储器模式,使用外部,RAM,的存储模式,pdata,存储器类型说明,“分页”寻址的,8051,外部数据存储器,_priority_,多任务优先声明,RTX51,的任务优先级,reentrant,再入函数声明,定义一个再入函数,sbit,位变量声明,声明一个可位寻址变量,sfr,特殊功能寄存器声明,声明一个特殊功能寄存器(,8,位,),Keil C51编译器扩展的关键字,(2,),关键字,用途,说明,sfr16,特殊功能寄存器声明,声明一个,16,位的特殊功能寄存器,small,存储器模式,内部,RAM,的存储模式,_task_,任务声明,定义实时多任务函数,using,寄存器组定义,定义,8051,的工作寄存器组,xdata,存储器类型说明,8051,外部数据存储器,4.3 C51,的数据类型,C51,的数据有常量和变量之分。,常量,在程序运行中,其值不变,的量。,数值型常量,:可以为十进制数、十六进制数,(,用,0 x,表示,),和字符(括号括起)。,符号型常量,:用符号表示常量,此符号需用宏定义指令,(#define),对其进行 定义,(,相当于汇编的“,EQU”,伪指令,),。,变量,在程序运行中其值可以改变的量。,定义一个变量,编译系统就会自动为它安排一个存贮区,具体的地址值,用户不必在意。,一个变量由,变量名,和,变量值,构成,.,变量名:存贮单元地址的符号表示。,变量的值:变量所在地址单元存放的内容。,数据类型:数据的长度。,C51,编译器支持数据类型,数,据,类,型,长,度,值,域,位 型,bit,1Bit,0,或,1,字,符,型,signed char,1Byte,-128+127,unsigned char,1Byte,0255,整,形,signed int,2Byte,-32768+32767,unsigned int,2Byte,065535,signed long,4Byte,-2147483648+2147483647,unsigned long,4Byte,04294967295,实型,Float,4Byte,1.176E-383.40E+38,指针型,data/idata/pdata,1Byte,1,字节地址,code/xdata,2Byte,2,字节地址,通用指针,3Byte,其中,1,字节为储存器类型编码,,2,3,字节为地址偏移量,访问,SFR,的数据类型,sbit,1Bit,0,或,1,sfr,1Byte,0255,sfr16,2Byte,065535,1,、在,C51,语言程序中,有可能会出现在运算中数据类型不一致的情况。,C51,允许任何标准数据类型的,隐式转换,,隐式转换的优先级顺序如下:,bit,char,int,long,float,signed,unsigned,2,、也就是说,当,char,型与,int,型进行运算时,先自动对,char,型扩展为,int,型,然后与,int,型进行运算,运算结果为,int,型。,C51,除了支持隐式类型转换外,还可以通过强制类型转换符“()”对数据类型进行人为的强制转换。,3,、字符型,(char),、整型,(int),和长整型,(long),均有符号型,(signed),和无符号型,(unsigned),两种,如果不是必须,,尽可能选择,unsigned,型,,这将会使编译器省却符号位的检测,使生成的程序代码比,signed,类型短得多。,C5l,编译器除了能支持以上这些基本数据类型之外,还能支持一些复杂的组合型数据类型,如数组类型、指针类型、结构类型、联合类型等这些复杂的数据类型。,4.4,数据的存储类型和存储模式,同,ANSI C,一样,,C51,规定变量必须先定义后使用。,C51,对变量的进行定义的格式如下:,存储种类,数据类型,存储器类型,变量名表,其中,存储种类和存储类型是可选项。,一、变量的存储种类,按变量的有效作用范围可以将其划分为局部变量和全局变量;还可以按变量的的存储方式为其划分存储种类。,在,C,语言中变量有四种存储种类,即自动,(auto),、外部,(extern),、静态,(static),和寄存器,(register),。,这四种存储种类与全局变量和局部变量之间的关系如图所示,1,、自动变量(,auto,),定义一个变量时,在变量名前面加上存储种类说明符“,auto”,,即将该变量定义为自动变量。自动变量是,C,语言中使用最为广泛的一类变量。,自动变量的作用范围在定义它的函数体或复合语句内部,只有在定义它的函数内被调用,或是定义它的复合语句被执行时,编译器才为其分配内存空间,开始其生存期。当函数调用结束返回,或复合语句执行结束时,自动变量所占用的内存空间就被释放,变量的值当然也就不复存在,其生存期结束。,自动变量始终是相对于函数或复合语句的局部变量。,一、变量的存储种类,2,、外部变量,(extern),使用存储种类说明符“,extern”,定义的变量称为外部变量。,按照缺省规则,凡是在所有函数之前,在函数外部定义的变量都是外部变量,定义时可以不写,extern,说明符。但是,在一个函数体内说明一个已在该函数体外或别的程序模块文件中定义过的外部变量时,则必须要使用,extern,说明符。,一个外部变量被定义之后,它就被分配了固定的内存空间。,外部变量的生存期为程序的整个执行时间,即在程序的执行期间外部变量可被随意使用,当一条复合语句执行完毕或是从某一个函数返回时,外部变量的存储空间并不被释放,其值也仍然保留。,因此,,外部变量属于全局变量,。,C,语言允许将大型程序分解为若干个独立的程序模块文件,各个模块可分别进行编译,然后再将它们连接在一起。,2,、外部变量,(extern),在这种情况下,如果某个变量需要在所有程序模块文件中,使用,只要在一个程序模块文件中将该变量定义成全局变量,而在其它程序模块文件中用,extern,说明该变量是已被定义过的外部变量就可以了。,函数是可以相互调用的,因此函数都具有外部存储种类的,属性。,定义函数时如果冠以关键字,extern,即将其明确定义为一个外部函数。例如,extern int func2(char a,,,b),。如果在定义函数时省略关键字,extern,,则隐含为外部函数。如果要调用一个在本程序模块文件以外的其它模块文件所定义的函数,则必须要用关键字,extern,说明被调用函数是一个外部函数。对于具有外部函数相互调用的多模块程序,可用,C51,编译器分别对各个模块文件进行编译,最后,L51,连接定位器将它们连接成为一个完整的程序。,一、变量的存储种类,3、静态变量(static),使用存储种类说明符“,static”,定义的变量称为静态变量。静态变量分为局部静态变量和全局静态变量。,局部静态变量不象自动变量那样只有当函数调用它时才存在,局部静态变量始终都是存在的,但只能在定义它的函数内部进行访问,退出函数之后,变量的值仍然保持,但不能进行问。,全局静态变量,它是在函数外部被定义的,作用范围从它的定义点开始,一直到程序结束。,当一个,C,语言程序由若干个模块文件所组成时,全局静态变量始终存在,但它只能在被定义的模块文件中访问,其数据值可为该文件内的所有函数共享,退出该文件后,虽然变量的值仍然保持着,但不能被其它模块文件访问。局部静态变量是一种在两次函数调用之间仍能保持其值的局部变量。有些程序需要在多次调用之间仍然保持变量的值,使用自动变量无法实现这一点,使用,全局变量有时又会带来意外的副作用,这时就可采用局部静态变量。,一、变量的存储种类,4、寄存器变量(register),为了提高程序的执行效率,,C,语言允许将一些使用频率最高的,那些变量,定义为能够直接使用硬件寄存器的所谓寄存器变量。,定义一个变量时在变量名前而冠以存储种类符号“,register”,即将,该变量定义成为了寄存器变量。,寄存器变量可以被认为是自动变量的一种,它的有效作用范围也与自动变量相同。,C51,编译器能够识别程序中使用频率最高的变量,在可能的情况下,即使程序中并未将该变量定义为寄存器变量,编译器也会自动将其作为寄存器变量处理。,因此,用户无须专门声明寄存器变量。,4.4,数据的存储类型和存储模式,二、数据的存储类型,C51,是面向,8XX51,系列单片机及硬件控制系统的开发语言,它定义的任何变量必须以一定的存储类型的方式定位在,8XX51,的某一存储区中,否则便没有意义。因此在定义变量类型时,还必须定义它的存储类型,,C51,的变量有如下几种存储类型:,存储器类型,描 述,data,直接寻址内部数据存储区,访问变量速度最快,(128 Byte),bdata,可为寻址内部数据存储区,允许位与字节混合访问,(16 Byte),idata,间接寻址内部数据存储区,可访问全部内部地址空间,(256 Byte),pdata,分页,(256Byte),外部数据存储区,由操作码,MOVX Ri,访问,xdata,外部数据存储区,(64KB),由操作码,MOVX DPTR,访问,code,程序存储区,(64KB),由操作码,MOVC A+DPTR,访问,如果在变量定义时省略了存储器类型标识符,,C51,编译器会选择默认的存储器类型。默认的存储器类型由,SMALL,、,COMPACT,和,LARGE,存储模式指令决定。,1,),data,区,对,data,区的寻址是最快的,所以应该把使用频率高的变量放在,data,区,由于空间有限,必须注意使用,data,区,,data,区除了包含程序变量外,还包含了堆栈和寄存器组,data,区。,在,SMALL,存储模式下,未说明存储器类型时,变量默认被定位在,data,区。,2,),bdata,区,当在,DATA,区的位寻址区定义变量,这个变量就可进行位寻址,并且声明位变量。这对状态寄存器来说十分有用,因为它可以单独使用变量的每一位,而不一定要用位变量名引用位变量。,3,),idata,区,idata,区也可以存放使用比较频繁的变量,使用寄存器作为指针进行寻址。在寄存器中设置,8,位地址进行间接寻址,与外部存储器寻址比较,它的指令执行周期和代码长度都比较短。,4)pdata和xdata区,在这两个区声明变量和在其他区的语法是一样的,pdata区只有256B,而xdata区可达65536B,5,),code,区,code,区即,80C51,的程序代码区,所以代码区的数据是不可改变的,,80C51,的代码区不可重写。一般代码区中可存放数据表,跳转向量和状态表。,如果用户不对变量的存贮 类型定义,则编译器承认默认存贮类型,默认的存贮类型由编译控制命令的存贮的模式部分 决定。,三、数据的存储模式,在固定的存贮器地址进行变量参数传递是,C51,的一个标准特征,定义了变量、参数传递区的存贮器模式,也就是默认了变量和参数传递区存贮器类型、无需再对变量和参数传递区的存贮器类型进行说明。,存贮器模式决定了变量的默认存贮器类型、参数传递区和无明确存贮区类型的说明。,有三种存贮器模式:,SMALL,、,LARGE,和,COMPACT,存储器模式,描 述,SMALL,参数及局部变量放入可直接寻址的内部数据存储区(,128 Byte,默认存储器类型是,DATA,),COMPACT,参数及局部变量放入分页外部数据存储区(最大,256Byte,默认存储类型是,PDATA,),LARGE,参数及局部变量直接放入外部数据存储器(最大,64KB,,默认存储器类型为,XDATA,),1小(SMALL)模式,所有变量都默认在,8051,的内部数据存储器中。这和用,data,显式定义变量起到相同的作用。,2紧凑(COMPACT)模式,此模式中,所有变量都默认在8051的外部数据存储器的一页中。,3,大,(LARGE),模式,在大模式下,所有的变量都默认在外部存储器中,(xdata),。,为了能够直接访问这些特殊功能寄存器,,C51,编译器扩充了关,键字,sfr,和,sfrl6,,利用这种扩充关键字可以在,C,语言源程序中直,接对,805l,单片机的特殊功能寄存器进行定义。定义方法如下:,sfr,特殊功能寄存器名地址常数,;,例如:,sfr P0,0 x80,;*定义,I,O,口,P0,,其地址为,80H *,例如:,设,C,语言源程序为,PROR.C,,若使程序中的变量类型和参数传递区限定在外部数据存贮区,有两种方法:,方法,1,:在程序的第一句加预处理命令,#,pragma,compact,。,方法,2,:用,C51,对,PROR.C,进行编译时,使用编译控制命令,:,C51 PROR.C COMPACT,。,四、变量说明举例,data char var,;,/*,字符变量,var,定位在片内,RAM,区,char code MSG,=ENTER PARAMETER:,/*,字符数组定位在程序存贮区*,/,unsigned long xdata array,100,;,/*,无符号长,型数组定位在片外,RAM,区,每 元素占,4bytes*/,float idata x,y,z,;,/*,实型变量,x,y,z,,定位在片内用,间址访问的内部,RAM,区*,/,bit lock,;,/*,位变量,Lock,定位在片内,RAM,可位寻址区*,/,unsigned int pdata dimension,;,/*,无符号整型变量,dimension,定位在分页的外部,RAM,区*,/unsigned char xdata vector 1044,;,/*,无符号字符型三,维数组,定位在片外,RAM,区*,/,sfr P0=0 x80;/*,定义,P0,口,地址为,80H*/,char bdata flags,;,/*,字符变量,flags,定位在,可位寻址内部,RAM,区*,/,sbit flag0=flags0,;,/*,定义,flag0,为,flags.0,如果在变量说明时略去存贮器类型标志符,编译器会自动选择默认的存贮器类型。默认的存 贮器类型进一步由控制指令,SMALL,、,COMPACT,和,LARGE,限制。,例:如果声明,char var,,则默认 的存贮器模式为,SMALL,,,var,放在,data,存贮区;,如果使用,COMPACT,模式,,var,放入,idata,存贮区;,使用,LARGE,模式,,var,被放入外部存贮区,(xdata,存贮区,),。,一、指针与指针变量,指针,就是存储单元地址,存储这个地址的变量称为指针变量。,(,1,)指针变量,在汇编语言程序中,要取存贮单元,m,的内容可用,直接寻址方式,,也可用,寄存器间接寻址方式,,如果用,R1,寄存器指示,m,的地址,用,R1,就是取,m,单元的内容。,相对应的在,C,语言中可用,变量名,表示取变量的值,(,相当于直接寻址,),,也可用另一个变量,(,如,P),存放,m,的地址,,P,就相当于,R1,寄存器。用*,P,取得,m,单元的内容,(,相当于汇编的间接寻址方式,),这里,P,即为,指针型变量,。,4.5,指针,直接寻址,间接寻址,汇编语言,C,语言,汇编语言,C,语言,MOV n,m,传送语句,n=m,;,赋值语句,MOV R1,#m,;m,的地址送,R1,MOV n,R1,;m,的内容送,n,P=&m,;,;/*m,的地址,P*/,n=*P,;,;/*m,的内容,n*/,注:,汇编语言程序中对符号地址,n,和,m,需用,EQU,伪指令进行地址定义。,C,语言应对变量,n,、,m,和指针变量,P,需进行类型定义。,表中,&,为,取地址运算符,,*为,取内容运算符,。,下面表格表示两种语言将,m,单元的内容送,n,单元的对照语句。,(2),指针型变量的类型,51,单片机的不同存贮空间,有不同的地址范围,即使对于同一外部数据存贮器,又有用,Ri,分页寻址,(Ri,为八位,),和用,DPTR,寻址,(DPTR,为十六位,),两种寻址方式。,指针是指示变量的地址的,因此,在指针类型的定义中要说明被指的变量的数据类型和存贮类型。同时指针变量本身也是一个变量,有它存放的存贮区和数据长度。即,指针变量本身有它的存贮类型和数据长度,其数据长度是由被指的变量的存贮类型而定的,。,指针变量存储类型:,data,、,idata,、,pdata,以上均为八位地址指示,所以指针长度为,1Byte,。,code,、,xdata,这些均为十六位地址指示,所以指针长度为,2Byte,。,指针变量存储类型:,如果指针的存储类型缺省,指针定义为通用型指针,表示指针可指向任何存贮空间,,此时指针长度为,3,字节,。,通用型指针的存贮类型编码如下:,表中,v4.0,、,v5.0,表示,C51,的版本,第一字节,第二字节,第三字节,存贮类型编码,所指地址的高八位,所指地址的低八位,存贮器类型,idata,xdata,pdata,data,code,编 码,(v4.0),1,2,3,4,5,编 码,(v5.0),0,0,1,-2,-1,例如指针变量,px,值为,0 x021203(v4.0,版,),或为,0 x001 203(v5.0,版,),,即指针指向,xdata,区的,1203H,地址单元。如:,char*pd,;,/*pd,定义为通用型指针*,/,指针变量的数据类型:,同样有,char,、,int,、,long,等类型,表示指针指向的数据的长度是占,1,个单元、,2,个单元还是,4,个单元。,(,2,),被指数据类型,被指存贮类型,*,指针变量存贮类型,指针变量,例如,long code *xdata px,;,/*,和上面定义等同*,/,px,为指针型,变量,被指向的存贮器的数据类型为长型,px,指向程,存贮器,px,自身在外部,数据存贮器中,long,xdata,code,*,px,;,指针变量说明有两种格式:,(,1,),指针变量存贮类型,被指数据类型,被指存贮类型,*,指针变量名;,(,其中,为可选项),如:,(3),指针变量说明举例,例如,char xdata*data pd,;,/*,指针变量,pd,指向字符型,xdata,区,自,身在,data,区,长度,2,字节*,/,long xdata*px,;,/*,指针变量,px,指向,long,型,xdata,区,(,被指的数据在,xdata,区,每个数据占四个单元,指针自身在默认存贮器,(,如不指定编译模式在,data,区,),,指针长度为,2,个字节*,/,data char xdata*pd,;,/*,与上例等效*,/,说明,:,1.”*”,号不可少,它表示变量为指针变量。,2.,指针变量说明格式中的,为可选项,如,被指存贮类型,缺省,则指针定义为通用型,如,指针变量存贮类型,缺省、指针变量则存放在默认存贮区或者在,data,区。,(3),指针变量说明举例,二、指向数组的指针变量,如果用一个变量存放一个数组的地址,这个变量就称为指向数组的指针变量。,数组的起始地址称为,数组指针,,一个数组,a,的起始地址用,a,表示。,(,1,)指向数组的指针变量的定义和赋值,设定义了一个数组,a5,和一个指针变量,ap:,char data a5;,char data*ap;,仅此两句并不能说明变量,ap,是指向数组的,还必须将数组的起始地址赋给该变量:,ap=a;,/*,数组,a,的起始地址赋给指针变量,ap*/,或,ap=,/*,意义同上*,/,也可以使定义和赋值在一条语句完成:,char data*ap,a,;,或,char data*ap=,2),利用指向数组的指针变量引用数组元素,指向数组的指针变量引用数组元素有两种方法:,*,(ap+i),或,ap(i),,,它们等同于*,(a+i),或,a(i),例,main(),char a5=11,22,33,44,55;,char b,c,d;,char *ap;,ap=a;,/*ap,等于数组,a5,的起始地址*,/,b=a+2;,/*b,等于数组元素,a2,的地址*,/,c=ap+3;,/*c,等于数组元素,a3,的地址*,/,d=*(ap+3);,/*d,等于数组元素,a3,的值,,即,d=44,,等同于,d=a(3)*/,4.6 C51,对,SFR,、可寻址位、存储器和,I/O,口的定义,一、特殊功能寄存器,SFR,定义,C51,对特殊功能寄存器,SFR,有两种定义方法,(,1,)使用特定关键字,sfr,自主形式的定义方式,,sfr,寄存器名,=,寄存器地址,其中寄存器地址必须大写,如,sfr SCON=0 x98,;,/*,串行通信控制寄存器 地址,98H*/,sfr TMOD=0 x89,;,/*,定时器模式控制寄存器地址,89H*/,sfr ACC=0 xe0,;,/*A,累加器地址,E0H*/,sfr P1=0 x90,;,/*P1,端口地址,90H*/,定义了以后,程序中就可以直接引用寄存器。,(,2,)使用头文件,C51,建有头文件,reg51.h,、,reg52.h,,在该头文件中对,51,或,52,系列单片机所有的特殊功能寄存器的进行了,sfr,定义,对特殊功能寄存器的有位名称的可寻址位进行了,sbit,定义,因此,只要用包含语句,#include,就可以直接引用特殊功能寄存器名,或直接引用位名称。,要特别注意:在引用时特殊功能寄存器或者位名称必须大写。,二、对位变量的定义,C51,对位变量的定义方法有三种:,1.,将变量用,bit,类型的定义符定义为,bit,类型,如,bit mn,;,mn,为位变量,其值只能是“,0”,或“,1”,,其位地址,C51,自行安排在可位寻址区的,bdata,区。,2.,采用,字节寻址变量,.,位,的方法,如,bdata int ibase,;,/*ibase,定义为整型变量*,/,sbit mybit=ibase15,;,/*mybit,定义为,ibase,的,D15,位*,/,这里位是运算符“,”,相当于汇编中的“,”,,其后的最大取值依赖于该位所在的变量的类型,如定义为,char,最大值只能为,7,。,二、对位变量的定义,C51,对位变量的定义方法有三种:,3.,对特殊功能寄存器的位的定义,方法,1,:使用头文件及,sbit,定义符;多用于无位名的可寻址位。,如,#include ,sbit P1_1=P11,;,/*P1_1,为,P1,口的第,1,位*,/,sbit ac=ACC7,;,/*ac,定义为累加器,A,的第,7,位*,/,方法,2,:使用头文件,reg51.h,,再直接用位名称。,例如,#include,RS1=1,;,RS0=0,;,方法,3,:用字节地址位表示,如,sbit OV=0 xD02,;,方法,4,:用寄存器名,.,位定义,如,sfr PSW=0 xd0,;,/*,定义,PSW,地址为,d0H*/sbit CY=PSW7,;,/*CY,为,PSW7*/,三、对存贮器和外接,I/O,口的绝对地址访问,C51,对存贮器和外接,I/O,口的绝对地址访问可以通过指针访问,也可以通过函数访问。,1.,对存贮器的绝对地址访问 利用绝对地址访问的头文件,absacc.h,可对不同的存贮区进行访问。该头文件的函数有,:,CBYTE,(,访问,code,区字符型,),DBYTE,(,访问,data,区字符型,),PBYTE,(,访问,pdata,或,I/O),XBYTE,(,访问,xdata,或,I/O),还有,CWORD,、,DWORD,、,PWORD,和,XWORD,四个函数,它们的访问区域同上,只是访问的类型为,int,型例:,#include#define com XBYTE,0 x07ff,那么后面程序,com,变量出现的地方,就是对地址为,07ffH,外部,RAM,或,I/O,口进行访问。,例:,XWORD,0,=0 x9988,;,即将,9988H(int,类型,),送入外部,RAM,的,0,号和,1,号单元。,使用中要注意,:,absacc.h,一定要包含进程序。,CBYTE,、,DBYTE,、,XBYTE,等函数名必须大写。,2.,对外部,I/O,口的访问,由于单片机的,I/O,口和外部,RAM,统一编址,因此对,I/O,口地址的访问可用,XBYTE(MOVX DPTR),或,PBYTE(MOVX ,Ri,),进行。,4.7 C51,的运算符及表达式,一、赋值运算符,赋值运算符“,=”,,在,C51,中,它的功能是将一个数据的值赋给一个变量,如,x=10,。利用赋值运算符将一个变量与一个表达式连接起来的式子称为赋值表达式,在赋值表达式的后面加一个分号“;”就构成了赋值语句,一个赋值语句的格式如下:,变量,=,表达式;,执行时先计算出右边表达式的值,然后赋给左边的变量。例如:,x=8+9,;,/*,将,8+9,的值赋绐变量,x*/,x=y=5,;,/*,将常数,5,同时赋给变量,x,和,y*/,在,C51,中,允许在一个语句中同时给多个变量赋值,赋值顺序自右向左。,4.7 C51,的运算符及表达式,二、算术运算符,C51,中支持的算术运算符有:,+,加或取正值运算符,-,减或取负值运算符,*乘运算符,/,除运算符,%,取余运算符,加、减、乘运算相对比较简单,而对于除运算,如相除的两个数为浮点数,则运算的结果也为浮点数,如相除的两个数为整数,则运算的结果也为整数,即为整除。如,25.0/20.0,结果为,1.25,,而,25/20,结果为,1,。,对于取余运算,则要求参加运算的两个数必须为整数,运算结果为它们的余数。例如:,x=5%3,,结果,x,的值为,2,。,3,关系运算符,C51,中有,6,种关系运算符:,大于,=,大于等于,3,,结果为真(,1,),而,10=100,,结果为假(,0,)。,注意:关系运算符等于“,=”,是由两个“,=”,组成。,4,逻辑运算符,C51,有,3,种逻辑运算符:,|,逻辑或,&,逻辑与,!逻辑非,关系运算符用于反映两个表达式之间的大小关系,逻辑运算符则用于求条件式的逻辑值,用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。,逻辑与,格式:,条件式,1&,条件式,2,当条件式,1,与条件式,2,都为真时结果为真(非,0,值),否则为假(,0,值)。,逻辑或,格式:,条件式,1|,条件式,2,当条件式,1,与条件式,2,都为假时结果为假(,0,值),否则为真(非,0,值)。,逻辑非,格式:,!条件式,当条件式原来为真(非,0,值),逻辑非后结果为假(,0,值)。当条件式原来为假(,0,值),逻辑非后结果为真(非,0,值)。,例如:若,a=8,,,b=3,,,c=0,,则!,a,为假,,a&b,为真,,b&c,为假。,5,位运算符,C51,语言能对运算对象按位进行操作,它与汇编语言使用一样方便。位运算是按位对变量进行运算,但并不改变参与运算的变量的值。如果要求按位改变变量的值,则要利用相应的赋值运算。,C51,中位运算符只能对整数进行操作,不能对浮点数进行操作。,C51,中的位运算符有:,&,按位与,|,按位或,按位异或,按位取反,右移,【,例,4-10】,设,a=0 x45=01010100B,,,b=0 x3b=00111011B,,则,a&b,、,a|b,、,ab,、,a,、,a2,分别为多少?,a&b=00010000b=0 x10,。,a|b=01111111B=0 x7f,。,ab=01101111B=0 x6f,。,a=10101011B=0 xab,。,a2=0000
展开阅读全文

开通  VIP、SVIP  下载更划算
下载10份以上建议开通 VIP 会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 通信科技 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        关注我们

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服