收藏 分销(赏)

C51编程基础.ppt

上传人:pc****0 文档编号:13755595 上传时间:2026-04-10 格式:PPT 页数:128 大小:795KB 下载积分:10 金币
下载 相关 举报
C51编程基础.ppt_第1页
第1页 / 共128页
C51编程基础.ppt_第2页
第2页 / 共128页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,4,单片机,C,语言及程序设计,4.1 C51,概述,4.2 C51,数据类型及存储,4.3 C51,变量的定义及数据存储区域,4.4 C51,位变量的定义,4.5 C51,特殊功能寄存器的定义,4.6 C51,指令的定义,4.7 C51,的输入,/,输出,4.8 C51,函数的定义,4.9 C51,与汇编语言混合编程,目 录,第,4,章 单片机,C,语言及程序设计,本章内容的安排,认为读者已经学习过,C,语言,具有,C,语言的基本知识,因此,本章内容完全是结合单片机来讲解,也就是补充,C,语言在单片机方面的概念、数据定义和函数定义等。,通过本章学习,使读者能够比较顺利地编写,C51,程序。,4.1 C51,概述,主要内容,4.1.1 C,语言编程的优势,4.1.2 C51,与,ANSI C,的区别,4.1.3 C51,扩展的关键字,4.1 C,51,概述,学习单片机,C,语言的必要性,随着单片机性能的不断提高,,C,语言编译调试工具的不断完善,以及现在对单片机产品辅助功能的要求、对开发周期不断缩短的要求,使得,越来越多的单片机编程人员转向使用,C,语言,,因此有必要在单片机课程中讲授“单片机,C,语言”。,“,C51”,概念:,为了与,ANSI C,区别,,把“单片机,C,语言”称为“,C51”,,也称为“,Keil,C”,。,4.1.1 C,语言编程的优势,在编程方面,使用,C51,较汇编语言有诸多优势:,1,)编程容易,2,)容易实现复杂的数值计算,3,)容易阅读与交流,4,)容易调试与维护程序,5,)容易实现模块化开发,6,)程序可移植性好,4.1.2 C,语言与,ANSI,的区别,用汇编语言编写单片机程序时,必须要考虑其存储器的结构,,尤其要考虑其片内数据存储器、特殊功能寄存器是否正确合理的使用,以及按照实际地址端口数据的处理。,用,C51,编写程序,虽然不像汇编语言那样需要具体地组织、分配存储器资源,但是,C51,对数据类型和变量的定义,必须要与单片机的存储结构相关联,,否则编译器不能正确地映射定位。,4.1.2 C,语言与,ANSI,的区别,用,C51,编写单片机程序,与用,ANSI C,编写程序的,不同之处是,,,需要根据单片机存储器结构及内部资源,定义相应的数据类型和变量,。,其它的语法规定、程序结构及程序设计方法,都与,ANSI C,相同。所以,本章主要介绍,C51,各种变量的定义、指针定义、函数定义和混合编程,。,4.1.3 C,51,扩展的关键字,由于单片机在结构及编程上的特殊要求,,C51,有自己的特殊关键字,称之为,C51,扩展的关键字,,下面给出常用的,C51,扩展的关键字。,_at_,bdata,bit code,data,idata,interrupt,pdata,reentrant,sbit,sfr,sfr16usingvolatile,xdata,这些关键字在后面会陆续接触到,此处先不给出它们的含义。,4.2 C51,数据类型及存储,主要内容,4.2.1 C51,的数据类型,4.2.2 C51,数据的存储,4.2.1 C51,的数据类型,表,4-1 C51,数据类型、长度和数值范围,数据类型,表示方法,长 度,数 值 范 围,无符号字符型,unsigned char,1,字节,0,255,有符号字符型,signed char,1,字节,-,128,127,无符号整型,unsigned,int,2,字节,0,65535,有符号整型,signed,int,2,字节,-,32768,32767,无符号长整型,unsigned long,4,字节,0,4294967295,有符号长整型,signed long,4,字节,-,2147483648,2147483647,浮点型,float,4,字节,1.1755E-38,3.40E+38,特殊功能寄存器型,sfr,sfr16,1,字节,2,字节,0,255,0,65535,位类型,bit,、,sbit,1,位,0,或,1,4.2.1 C51,的数据类型,数据类型转换,1,)自动转换,转换规则是向高精度数据类型转换、向有符号数据类型转换,。如字符型变量与整型变量相加时,则位变量先转换字符型或整型数据,然后相加。,2,)强制转换,像,ANSI C,一样,,通过强制类型转换的方式进行转换,。如:,unsigned,int,b;,floatc;b=(,int)c,;,4.2.2 C51,数据的存储,MCS-51,单片机只有,bit,和,unsigned char,两种数据类型支持机器指令,,而其它类型的数据都需要转换成,bit,或,unsigned char,型进行存储。,为了减少单片机的存储空间和提高运行速度,要尽可能地使用,unsigned char,型数据。,一、位变量的存储,bit,和,sbit,型位变量,直接存于,RAM,的位寻址空间,包括低,128,位和特殊功能寄存器位。,4.2.2 C51,数据的存储,二、字符变量的存储,字符变量,(,char,),:,无论是,unsigned char,数据还是,signed char,数据,均为,1,个字节,能够被直接存储在,RAM,中,可以存储在,0,0 x7f,区域,也可以存储在,0 x80,0 xff,区域,与变量的定义有关。,unsigned char,数:,可直接被,MSC-51,接受,signed char,数据:,用补码表示。,需要额外的操作,来测试、处理符号位,使用的是两种库函数,代码量大,运算速度降低。,4.2.2 C51,数据的存储,三、整型变量的存储,整型变量,(,int,),:,不管是,unsigned,int,数据还是,signed,int,数据,均为,2,个字节,其,存储方法是高位字节保存在低地址,(在前面),,低位字节保存在高地址,(在后面)。,例如,,整型变量的值为,0 x1234,,在内存中的存放如右图所示。,signed,int,数据用补码表示。,地址,低,高,:,:,12,34,:,:,4.2.2 C51,数据的存储,四、长,整型变量的存储,长整型变量(,long,)为,4,个字节,其存储方法与整型数据一样,是,最高位字节保存的地址最低,(在最前面),,最低位字节保存的地址最高,(在最后面)。,如长整型变量的值为,0 x12345678,,在内存中的存放方法如右图所示。不管是,unsigned long,数据还是,signed long,数据。,地址,低,高,:,:,12,34,56,78,:,:,4.2.2 C51,数据的存储,五、浮点,型变量的存储,浮点型变量,(,fload,)占,4,个字节,,用指数方式表示,,其具体格式与编译器有关。,对于,Keil,C,,采用的是,IEEE-754,标准,,具有,24,位精度,尾数的最高位始终为,1,,因而不保存。,具体分布为:,1,位符号位,,8,位阶码位,,23,位尾数,如下图所示。,字节地址,0,1,2,3,浮点数,内容,S,EEE,EEEE,E,MMM,MMMM,MMMM,MMMM,MMMM,MMMM,符号和阶码,尾数高位,尾数低位,4.2.2 C51,数据的存储,符号位,S,:,1,表示负数,,0,表示正数。,阶码:,用移码表示。如,实际阶码,-,126,用,1,表示,实际阶码,0,用,127,表示,,即实际阶码数加上,127,得到阶码的表达数,。,阶码数值范围:,-,126,+128,。,4.2.2 C51,数据的存储,例如浮点数,-,12.5,符号位为,1,,,12.5,的二进制数为,1100.1=1.1001E+0011,,,阶码数值为,3+127=130=10000010B,,,尾数为,1001,。,因此,其十六进制数为,0 xC1480000,,则存储结构如右图所示。,地址,低,高,:,:,C1,48,00,00,:,:,说明:,教材中存储结构是错的。,4.3 C51,变量的定义及数据存储区域,主要内容,4.3.1 C51,变量的定义,4.3.2 C51,变量的存储类型,4.3.3 C51,变量的存储区域,4.3.4 C51,变量定义举例,4.3.5 C51,变量的存储模式,4.3.6 C51,变量的绝对定位,4.3.1 C51,变量的定义,C51,变量定义的一般格式为:,存储类型,数据类型,存储区,变量名,1=,初值,变量名,2=,初值,或,存储类型,存储区,数据类型,变量名,1=,初值,变量名,2=,初值,可见变量,(非位变量),的定义由,4,部分组成,,即在变量定义时,指定变量,4,种属性。,数据类型:,在前面的,4.2,中已经叙述过,对于变量名也无须多说,,下面主要解释“存储类型”和“存储区”等概念,。,4.3.2 C51,变量的存储类型,存储类型这个属性我们仍沿用,ANSI C,的说法,,尽量不改变原来的含义。,按照,ANSI C,,,C,语言的变量有,4,种存储类型,:,动态存储(,auto,),静态存储(,static,),全局存储(,extern,),寄存器存储(,register,),4.3.2 C51,变量的存储类型,一、动态存储,动态(存储)变量:,用,auto,定义的为动态变量,也叫自动变量,。,作用范围:,在定义它的函数内或复合语句内部。当定义它的函数或复合语句执行时,,C51,才为变量分配存储空间,结束时所占用的存储空间释放。,定义变量时,,auto,可以省略,,或者说如果省略了存储类型项,则认为是动态变量。,动态变量一般分配使用寄存器或堆栈,。,4.3.2 C51,变量的存储类型,二、静态存储,静态(存储)变量:,用,static,定义的为静态变量,。分为内部静态和外部静态变量。,内部静态变量:,在函数体内定义的为内部静态变量,。在函数内可以任意使用和修改,函数运行结束后会一直存在,但在函数外不可见,即在函数体外得到保护。,外部静态变量:,在函数体外部定义的为外部静态变量,。在定义的文件内可以任意使用和修改,外部静态变量会一直存在,但在文件外不可见,即在文件外得到保护。,4.3.2 C51,变量的存储类型,三、外部存储,外部(存储)变量:,用,extern,声明,的变量为外部变量,,是在其它文件定义过的全局变量。,用,extern,声明后,便可以在所声明的文件中使用。,需要注意的是:,在定义变量时,即便是全局变量,也不能使用,extern,定义,。,4.3.2 C51,变量的存储类型,四、寄存器存储,寄存器(存储)变量:,用,register,定义的变量为寄存器变量,。,寄存器变量存放在,CPU,的寄存器中,,这种变量处理速度快,但数目少。,C51,中的寄存器变量:,C51,的编译器在编译时,能够自动识别程序中使用,频率高的变量,,并将其,安排为寄存器变量,,用户不用专门声明。,4.3.3 C51,变量的存储区域,变量的存储区属性是单片机扩展的概念,,非常重要,,它涉及到,7,个新的关键字,。,MCS-51,单片机有四个存储空间,,分成三类,它们是片内数据存储空间、片外数据存储空间和程序存储空间。,MCS-51,单片机有更多的存储区域:,由于片内数据存储器和片外数据存储器又分成不同的区域,所以,单片机的变量有更多的存储区域,。,在定义变量时,必须明确指出是存放在哪个区域,。,4.3.3 C51,变量的存储区域,表,4-2 C51,存储区与存储空间的对应关系,关键字,对应的存储空间及范围,code,ROM,空间,,64KB,全空间,data,片内,RAM,,直接寻址,低,128,字节,bdata,片内,RAM,,位寻址区,0 x20,0 x2f,,可字节访问,idata,片内,RAM,,间接寻址,,256,字节,与,Ri,对应,pdata,片外,RAM,,分页寻址的,256,字节,(P2,不变,),,,P2,改变可寻址,64KB,全空间,与,MOVX,Ri,对应,xdata,片外,RAM,,,64KB,全空间,bit,片内,RAM,位寻找区,,,位地址,0 x00,0 x7f,,,128,位,4.3.4 C51,变量定义举例,1,)定义存储在,data,区域,的,动态,unsigned char,变量:,unsigned char,data,sec=0,min=0,hou=0;,2,)定义存储在,data,区域,的,静态,unsigned char,变量:,static,unsigned char,data,scan_code=0 xfe;,3,)定义存储在,data,区域,的,静态,unsigned int,变量:,static,unsigned int,data,dd;,4.3.4 C51,变量定义举例,4,)定义存储在,bdata,区域,的,动态,unsigned char,变量:,unsigned char,bdata,operate,operate1;,/,定义指示操作的可位寻址的变量,5,)定义存储在,idata,区域,的,动态,unsigned char,数组:,unsigned char,idata,temp20;,6,)定义在,pdata,区域,的,动态,有符号,int,数组:,int,pdata,send_data30;,/,定义存放发送数据的数组,4.3.4 C51,变量定义举例,7,)定义存储在,xdata,区域,的,动态,unsigned int,数组:,unsigned int,xdata,receiv_buf50;,/,定义存放接受数据的数组,8,)定义存储在,code,区域,的,unsigned char,数组:,unsigned char,code,dis_code10=,0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;,/,定义共阴极数码管段码数组,4.3.5 C51,变量的存储模式,存储模式:,如果在定义变量时缺省了存储区属性,则编译器会自动选择默认的存储区域,,也就是存储模式,。,变量的存储模式也就是程序(或函数)的编译模式,。,编译模式分为三种:,小模式(,small,)、紧凑模式(,compact,)和大模式(,large,)。编译模式由编译控制命令决定。,存储模式(编译模式)决定了变量的默认存储区域和参数的传递方法,。,4.3.5 C51,变量的存储模式,一、,small,模式,在,small,模式下,变量的默认存储区域是“,data”,、“,idata,”,,即未指出存储区域的变量保存到片内数据存储器中,并且,堆栈也安排在该区域中,。,small,模式的特点:,存储容量小,但速度快。,在,small,模式下参数的传递:,通过寄存器、堆栈或片内数据存储区完成的。,4.3.5 C51,变量的存储模式,二、,compact,模式,在,compact,模式下,变量的默认存储区域是“,pdata,”,,即未指出存储区域的变量保存到片外数据存储器的一页中,最大变量数为,256,字节,并且,堆栈也安排在该区域中,。,compact,模式的其特点:,是存储容量较,small,模式大,速度较,small,模式稍慢,但比,large,模式要快。,在,compact,模式下参数的传递:,通过片外数据区的一个固定页完成的。,4.3.5 C51,变量的存储模式,三、,large,模式,在,large,模式下,变量的默认存储区域是“,xdata,”,,即未指出存储区域的变量保存到片外数据存储器,最大变量数可达,64KB,,并且,堆栈也安排在该区域中,。,large,模式的特点:,存储容量大,速度慢,large,模式下参数的传递方式:,参数的传递也是通过片外数据存储器完成的。,4.3.5 C51,变量的存储模式,C51,支持混合模式:,即可以对函数设置编译模式,所以在,large,模式下,可以对某些函数设置为,compact,模式或,small,模式,从而提高运行速度。,默认编译模式:,如果文件或函数未指明编译模式,则编译器按,small,模式处理,。,编译模式控制命令:,“,#,pragma,small(,或,compact,、,large)”,应放在文件的开始。,4.3.6 C51,变量的绝对定位,C51,有三种方式可以对变量,(,I/O,端口),绝对定位:,绝对定位关键字,_at_,、指针、库函数的绝对定位宏。对于后两种方式,在后面指针一节介绍。,C51,扩展的关键字,_at_,专门用于对变量作绝对定位,,,_at_,使用在变量的定义中,其格式为:,存储类型,数据类型,存储区,变量名,1,_at_,地址常数,,变量名,2,4.3.6 C51,变量的绝对定位,举例说明,_at_,的使用方法,1,)对,data,区域,中的,unsigned char,变量,aa,作绝对定位:,unsignedchar,data,aa,_at_,0 x30;,2,)对,pdata,区域,中的,unsigned,int,数组,cc,作绝对定位:,unsigned,int,pdata,cc10,_at_,0 x34;,3,)对,xdata,区域,中的,unsigned char,变量,printer_port,作绝对定位:,unsignedchar,xdata,printer_port,_at_,0 x7fff;,4.3.6 C51,变量的绝对定位,对变量绝对定位的几点说明:,1,)绝对地址变量,在定义时不能初始化,,因此不能对,code,型变量绝对定位;,2,)绝对地址变量,只能够是全局变量,,不能在函数中对变量绝对定位;,3,)绝对地址变量,多用于,I/O,端口,,一般情况下不对变量作绝对定位;,3,)位变量不能使用,_at_,绝对定位。,4.4 C51,位变量的定义,主要内容,4.4.1 bit,型位变量的定义,4.4.2,sbit,型位变量的定义,4.4.1 bit,型位变量的定义,常说的位变量指的就是,bit,型位变量,。,C51,的,bit,型位变量定义的一般格式为:,存储类型,bit,位变量名,1=,初值,,位变量名,2=,初值,,,bit,位变量被保存在,RAM,中的位寻址区域,(字节地址为,0 x20,0 x2f,,,16,字节)。,例如:,bitflag_run,,,receiv_bit=0,;,static bit,send_bit,;,4.4.1 bit,型位变量的定义,两点说明:,1,),bit,型位变量与其它变量一样,,可以作为函数的形参,,也可以作为,函数的返回值,,即函数的类型可以是位型的;,2,)位变量,不能定义指针,,,不能定义数组,。,4.4.2,sbit,型位变量的定义,对于能够按位寻址的特殊功能寄存器、定义在位寻址区域的变量(字节型、整型、长整型),可以对其各位用,sbit,定义位变量。,为了方便起见,分开讨论,按位寻址的特殊功能寄存器中位变量的定义、按位寻址的变量中位变量的定义。,4.4.2,sbit,型位变量的定义,一、特殊功能寄存器中位变量定义,能够按位寻址的,特殊功能寄存器中位变量定义的一般格式为:,sbit,位变量名 位地址表达式,这里的位地址表达式有三种形式:,直接位地址,特殊功能寄存器名带位号,字节地址带位号,4.4.2,sbit,型位变量的定义,1,、用直接位地址定义位变量,这种情况下位变量的定义格式为:,sbit,位变量名 位地址常数,这里的位地址常数范围为,0 x80,0 xff,,实际是定义特殊功能寄存器的位,。例如:,sbit,P0_0=0 x80;,sbit,P1_1=0 x91;,sbit,RS0=0 xd3;/,定义,PSW,的第,3,位,sbit,ET0=0 xa9;/,定义,IE,的第,1,位,4.4.2,sbit,型位变量的定义,2,、特殊功能寄存器名带位号定义,这时位变量的定义格式为:,sbit,位变量名 特殊功能寄存器名,位号常数,这里的位号常数为,0,7,。例如:,sbit,P0_3=P0,3;,sbit,P1_4=P1,4;,sbit,OV=PSW,2;/,定义,PSW,的第,2,位,sbit,ES=IE,4;/,定义,IE,的第,4,位,4.4.2,sbit,型位变量的定义,3,、寄存器地址带位号定义位变量,在这种情况下位变量的定义格式为:,sbit,位变量名 特殊功能寄存器地址,位号常数,这里的位号常数同上,为,0,7,。例如:,sbit,P0_6=0 x80,6;,sbit,P1_7=0 x90,7;,sbit,AC=0 xd0,6;/,定义,PSW,的第,6,位,sbit,EA=0 xa8,7;/,定义,IE,的第,7,位,4.4.2,sbit,型位变量的定义,4,、几点说明,1,)用,sbit,定义的位变量,必须能够按位操作,而不能够对无位操作功能的位定义位变量。,2,)用,sbit,定义位变量,必须放在函数外面作为全局位变量,而不能在函数内部定义。,3,)用,sbit,每次只能定义一个位变量。,4,)对其它模块定义的位变量(,bit,型或,sbit,型)的引用声明,都使用,bit,。,5,)用,sbit,定义的是一种绝对定位的位变量(因为名字是与确定位地址对应的),具有特定的意义,在应用时不能像,bit,型位变量那样随便使用。,4.4.2,sbit,型位变量的定义,二、,位寻址区变量的,位定义,对,bdata,型变量(字节型、整型、长整型),被保存在,RAM,中的位寻址区,因此,可以对,bdata,型变量各位作位变量定义,。,这样,既可以对,bdata,型变量作字节(或整型、长整型)操作,也可以作位操作。,bdata,型变量的位定义格式:,sbit,位变量名,bdata,型变量名,位号常数,4.4.2,sbit,型位变量的定义,bdata,型变量为在此之前应该是定义过的,,位号常数可以是,0,7,(,8,位字节变量),或,0,15,(,16,位整型变量),或,0,31,(,32,位字长整型变量)。例如:,unsignedchar,bdata,operate;,对,operate,的低,4,位作位变量定义:,sbit,flag_key,=operate,0;/,键盘标志位,sbit,flag_dis,=operate,1;/,显示标志位,sbit,flag_mus,=operate,2;/,音乐标志位,sbit,flag_run,=operate,3;/,运行标志位,4.5 C51,特殊功能寄存器的定义,主要内容,4.5.1 8,位特殊功能寄存器的定义,4.5.2 16,位特殊功能寄存器的定义,4.5.1 8,位特殊功能寄存器的定义,定义的一般格式为:,sfr,特殊功能寄存器名 地址常数,地址常数范围:,0 x80,0 xff,。,特殊功能寄存器定义例子(见,reg51.h,、,reg52.h,等文件):,sfr,P0=0 x80;/,定义,P0,寄存器,sfr,P1=0 x90;/,定义,P1,口寄存器,sfr,PSW=0 xd0;/,定义,PSW,sfr,IE=0 xa8;/,定义,IE,4.5.2 16,位特殊功能寄存器的定义,定义的一般格式为:,sfr16,特殊功能寄存器名 地址常数,地址常数范围:,0 x80,0 xff,。,例如(见,reg51.h,、,reg52.h,等文件):,sfr16 DPTR=0 x82;,sfr16 T2=0 xcc;/,含,TL2,和,TH2,sfr16 RCAP2=0 xca;,/,含,RCAP2L/,和,RCAP2H,0 xca,为,RCAP2L,的地址,4.5.2 16,位特殊功能寄存器的定义,几点说明:,1,)定义特殊功能寄存器中的地址必须在,0 x80,0 xff,范围内。,2,)定义特殊功能寄存器,必须放在函数外面作为全局变量。,3,)用,sfr,或,sfr16,每次只能定义一个特殊功能寄存器。,4,)像,sbit,一样,用,sfr,或,sfr16,定义的是绝对定位的变量(因为名字是与确定地址对应的),具有特定的意义,在应用时不能像一般变量那样随便使用。,4.6 C51,指针的定义,主要内容,4.6.1,通用指针,4.6.2,存储器专用指针,4.6.3,指针变换,4.6.4 C51,指针应用,4.6 C51,指针的定义,由于,MCS-51,单片机有三种不同类型的存储空间,并且还有不同的存储区域,,因此,C51,指针的内容更丰富。,指针除了具有像变量的四种属性(存储类型、数据类型、存储区、变量名)外,,按存储区,将指针分为通用指针和不同存储区域的专用指针。,4.6.1,通用指针,所谓通用指针,就是通过该类指针可以访问所有的存储空间,。,在,C51,库函数中通常使用这种指针来访问。,通用指针用,3,个字节来表示:,第一个字节:表示指针,所指向的存储空间,第二个字节:为指针,地址的高字节,第三个字节:为指针,地址的低字节,4.6.1,通用指针,通用指针的定义与一般,C,语言指针的定义相同,其格式为:,存储类型,数据类型 *指针名,1,,*指针名,2,,,例如:,unsigned char *,cpt,;,int,*,dpt,;,long *,lpt,;,static char *,ccpt,;,通用指针的特点:,定义简单,访问所有空间,访问速度慢,4.6.2,存储器专用指针,所谓存储器专用指针,就是通过该类指针,只能够访问规定的存储空间区域,。,指针本身占用,1,个字节(,data*,,,idata,*,,,bdata,*,,,pdata,*,)或,2,个字节(,xdata,*,,,code*,)。,存储器专用指针的一般定义格式为:,存储类型,数据类型,指向存储区,*,指针存储区,指针名,1,*,指针存储区,指针名,2,4.6.2,存储器专用指针,指向存储区:,是指针变量所指向的数据存储空间区域。不能够缺省,。,指针存储区:,是指针变量本身所存储的空间区域。,缺省时认为指针存储区在默认的存储区域,其默认存储区域决定于所设定的编译模式。,指向和指针存储区,,两者可以是同一个区域,但多数情况下不会是同一个区域。,4.6.2,存储器专用指针,存储器专用指针例子:,unsigned char,data,*cpt1,*cpt2;,signed,int,idata,*dpt1,*dpt2;,unsigned char,pdata,*,ppt,;,signed long,xdata,*lpt1,*lpt2;,unsigned char,code,*,ccpt,;,上面所定义的指针虽然所指向的空间不同,但,指针变量本身都存储在默认的存储区域,。,4.6.2,存储器专用指针,又如,:,1)unsigned char,data,*,idata,cpt1,*,idata,cpt2;,2)signed,int,idata,*,data,dpt1,*,data,dpt2;,3)unsigned char,pdata,*,xdata,ppt,;,4)signed long,xdata,*lpt1,*,xdata,lpt2;,5)unsigned char,code,*,data,ccpt,;,绿色关键字,为指针所指向的存储区,蓝色关键字,为指针本身所存储的区域,4.6.2,存储器专用指针,注意:,(,1,)要区分指针变量,指向的空间区域,和指针变量,本身所存储的区域,;(,2,)定义时,,前者不能缺省,,而后者可以缺省;(,3,),指针变量的长度,:指向不同的区域,占用的字节数不同。,说明:,指针变量本身所存储的区域,在定义指针时一般都省略了,,指针变量本身保存在缺省存储的区域中。,定义时,缺省指针存储的区域,显得简单,并且对初学者更容易理解。,4.6.3,指针变换,一、通用指针格式,由前面的讨论知,通用指针由,3,个字节组成,,第一个字节为数据的存储区域,后两个字节为指针地址,,,第一个字节的存储区域编码如表,4-6,所示,。,表,4-6,通用指针存储区域编码,存储区,idata,xdata,pdata,data,code,编 码,1,2,3,4,5,4.6.3,指针变换,一、指针转换,指针转换有两种途径,一种是显式的编程转换,另一种是隐式的自动转换,。,指针的编程转换:,(,1,)通用指针的第一字节,与专用指针的指向数据区属性,二者相互转换;(,2,)通用指针后两个字节的地址,与专用指针值的转换。,指针的隐式自动转换:,由编译器在进行编译时自动完成。,4.6.4 C51,指针应用,指针在,PC,机上的,C,语言中应用很广泛。,在单片机中,由于不使用操作系统,指针的应用可以独立于变量,独立地指向所需要访问的存储空间位置。,本节通过例子来学习和认识,C51,指针的这种独立应用性。,下面介绍两种利用指针访问存储区的方法。也可以访问函数。,4.6.4 C51,指针应用,二、通过指针定义的宏访问存储器,1,、访问存储器宏的定义,用指针定义的、访问存储器宏的格式:,#define,宏名,(,数据类型,volatile,存储区*,)0),格式中的,数据类型,主要为无符号的字符型数、整型;格式中的,存储区域,主要使用,data,、,idata,、,pdata,、,xdata,和,code,类型,不使用,bdata,存储区类型。,4.6.4 C51,指针应用,格式中的关键字“,volatile”,:,“,volatile”,是单片机中定义的,其含义为:,这种变量在程序执行中可被隐含地改变而编译器无法检测到,告知编译器不要做优化处理,使应用者能够得到正确的变量值。,volatile,的应用:,volatile,常用于定义寄存器,特别是状态寄存器,因为状态寄存器的值不是程序员设置,而是单片机在运行中,CPU,设置的。,特别说明:,“,volatile”,的含义与教材上表述不太一致,此处表述直观更容易理解。,4.6.4 C51,指针应用,2,、库函数中访问存储器宏的原型,C51,编译器提供了两组用指针定义的绝对存储器访问的宏,其原型如下。,1,)按字节访问存储器的宏:,#define,CBYTE,(unsigned char volatile,code,*)0),#define,DBYTE,(unsigned char volatile,data,*)0),#define,PBYTE,(unsigned char volatile,pdata,*)0),#define,XBYTE,(unsigned char volatile,xdata,*)0),4.6.4 C51,指针应用,2,)按整型双字节访问存储器的宏:,#define,CWORD,(unsigned,int,volatile,code,*)0),#define,DWORD,(unsigned,int,volatile,data,*)0),#define,PWORD,(unsigned,int,volatile,pdata,*)0),#define,XWORD,(unsigned,int,volatile,xdata,*)0),无,idata,型,,不能访问片内,RAM,高,128,字节区域(,0 x80,0 xff,),需要时可以自己定义。,这些宏定义原型放在,absacc.h,文件中,,使用时需要用预处理命令把该头文件包含到文件中,形式为:,#include,。,4.6.4 C51,指针应用,3,、绝对访问存储器宏的应用,使用宏定义访问存储器的形式类似于数组,。,1,)按字节访问存储器宏的形式,宏名,地址,即数组中的下标就是存储器的地址,,因此使用起来非常方便。例如:,DBYTE0 x30=48;/,给片内,RAM,送数据,XBYTE0 x0002=0 x36;/,给片外,RAM,送数据,dis_buf0=CBYTETABLE+5;,/,从,CODE,区读取数据,4.6.4 C51,指针应用,2,)按整型数访问存储器宏的形式,宏名,下标,由于整型数占两个字节,所以,下标与地址的关系为:地址,=,下标,2,。,由于数组中的下标与存储器的地址是倍数关系,使用时要注意。例如:,DWORD0 x20=0 x1234;/,给,0 x40,、,0 x41,送数,XWORD0 x0002=0 x5678;/,给,4,、,5,单元送数,通过指针定义的宏访问存储器这种方法,特别适用于访问,I/O,口。,4.6.4 C51,指针应用,一、通过专用指针直接访问存储器,使用指针直接访问存储器对,PC,机是禁止的,但对于单片机来说使用时注意是可以的。,使用指针直接访问存储器方法是先定义所需要的指针,给指针赋地址值,然后使用指针访问存储器,。例如:,unsigned char,xdata,*,xcpt,;,xcpt,=0 x2000;,*,xcpt,=123;/,给,0 x2000,送数,xcpt,+;*,xcpt,=234;,/,给,0 x2001,送数,4.6.4 C51,指针应用,例,4-1,编写程序,将单片机片外数据存储器中地址从,0 x1000,开始,20,个字节数据,传送到片内数据存储器地址从,0 x30,开始的区域。,程序段如下:,unsigned char,data,i,*,dcpt,;,unsigned char,xdata,*,xcpt,;,dcpt,=0 x30;/,给指针赋地址,xcpt,=0 x1000;,for(i,=0;i20;i+),*(,dcpt+i,)=*(,xcpt+i,);,dcpt,和,xcpt,两个指针,变量存储在什么地方?,4.6.4 C51,指针应用,例,4-2,在数字滤波中有一种叫做“中值滤波”技术,就是对采集的数据按照从大到小或者从小到大进行排序,然后取中间位置的数作为采样值。,试编写一函数,对存放在片内数据存储器中,从,0 x50,开始的,21,个单元的采样数据,用冒泡法排序进行中值滤波,并把得到的中值数据返回。,中值滤波函数如下:,unsigned char,median_filter,(),unsigned char data *point,,,i,,,j,,,n,,,d,;,4.6.4 C51,指针应用,for(i,=0,;,i20,;,i+)/,外层循环,20,次,point=0 x50,;,/point,指向,0 x50,处,n=20,i,;,/n,为内层循环次数,for(j,=0,;,jn,;,j+)/,内层循环,if(*point2),dis_buf0=t20/10;dis_buf1=t20%10;,dis_buf2=t21/10;dis_buf3=t21%10;,dis_buf4=t22/10;dis_buf5=t22%10;,i=0;sec0=t12;/,更新秒备份,display();/,调用数码管扫描显示函数,4.8 C51,函数的定义,主要内容,4.8.1 C51,函数的定义,4.8.2 C51,中断函数的定义,C51,函数的定义与,ANSI C,相似,,,但有更多的属性要求。本节先讨论函数的一般定义,然后专门给出中断函数的定义,因为中断函数有其特殊性。,4.8.1,C51,函数的定义,在,C51,中,函数的定义与,ANSI C,中是相同的。唯一不同的就是在函数的后面需要带上若干个,C51,的专用关键字。,C51,函数定义的一般格式如下:,返回类型 函数名(形参表),函数模式,reentrant interrupt m using n,局部变量定义,执行语句,4.8.1,C51,函数的定义,各属性含义如下:,函数模式:,也就是编译模式、存储模式,可以为,small,、,compact,和,large,。缺省时则使用文件的编译模式。,reentrant,:,表示重入函数,。所谓可重入函数,就是允许被递归调用的函数。,是,C51,定义的关键字,。,在编译时会为重入函数生成一个堆栈,通过这个堆栈来完成参数的传递和存放局部变量。,重入函数不能使用,bit,型参数;函数返回值也不能是,bit,型。,4.8.1,C51,
展开阅读全文

开通  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 

客服