收藏 分销(赏)

单片机原理与应用-基于汇编、C51及混合编程单片机C51程序设计优秀PPT.ppt

上传人:精**** 文档编号:10306282 上传时间:2025-05-22 格式:PPT 页数:116 大小:1.92MB
下载 相关 举报
单片机原理与应用-基于汇编、C51及混合编程单片机C51程序设计优秀PPT.ppt_第1页
第1页 / 共116页
单片机原理与应用-基于汇编、C51及混合编程单片机C51程序设计优秀PPT.ppt_第2页
第2页 / 共116页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,1,第五章 单片机,C51,程序设计,5.1,、,C51,程序设计基础,5.2,、,C51,的数据类型及其在,51,单片机中的存储方式,5.3,、硬件资源访问,5.4,、,C51,的运算符,5.5,、,C51,的指针,5.6,、,C51,的函数,5.7,、,C51,的流程控制,5.8,、,C51,编程实例,1,2,5.1 C51,程序设计基础,汇编语言程序可以高效率利用计算机资源,目标程序占用内存少,执行速度快,适合于自动测控系统反应快速、结构紧凑的要求。,C,语言程序容易掌握,通用性好,但编译程序系统开销大,目标程序占用内存多,且执行时间比较长,多用于科学计算、工业设计、企业管理。,实际应用中,汇编语言常与,C,语言配合使用。,使用,C,语言来进行,51,内核单片机的程序设计,即,C51,程序,设计,。,2,3,5.1.1 C51,语言特点,用,C51,编程需要根据单片机存储器结构及内部资源,定义相应的数据类型和变量,按照,C51,所包含的数据类型、变量存储模式、输入,/,输出处理、函数等方面的格式来编写,C,语言应用程序。,其它的语法规定、程序结构及程序设计方法,都与,ANSI C,相同。,用,C51,语言编写的应用程序必须经单片机的,C,语言编译器,转换生成单片机可执行的代码程序。本章是针对德国,KEIL,公司的,C51,编译器介绍,C51,程序设计。,3,4,C51,与汇编语言相比,有如下优点:,C51,语言程序具有规范的结构,可由不同的函数组成,用这种方式编写的程序很容易被移植;,运算符和关键字用接近于自然语言的方式表示,改善了程序的可读性;,提供了包含很多数学函数及其他大量标准子程序的函数库,具有较强的数据处理能力,开发效率高;,C,语言程序基本上不作修改或者进行简单的修改,就可方便地移植到其他类型的单片机上;,总之,用,C,语言进行单片机程序设计是单片机开发和应用的必然趋势,在进行大型、复杂的单片机应用系统开发时都通过,C,语言来设计程序。,4,5,5.1.2 C51,程序结构,C51,源程序由一个或者多个源文件组成,每个源文件扩展名都命名为“*,.c”,。,每个,C51,程序都由一个或多个函数组成,其中有且只有一个,main,()函数。程序从,main,()函数开始执行,在,main,()函数中可以调用库函数和用户定义的函数。,C51,中还有中断函数,运行每一个函数都执行一个特定的任务来实现整个程序的功能。,C51,源程序中含有预处理命令、语句、说明等,说明和语句以分号(;)结尾,预处理命令后不加分号。,程序中可以用“,/*,注释,.*/”,或“,/,注释,”,的形式对,C,程序中的任何部分进行注释,用于说明程序段的功能,增加程序的可读性。,5,6,C51,程序的结构一般如下:,#include,int fun1(,形参,);/,函数声明,char fun2(,形参,);,unsigned char x,y,z;/,定义全局变量,void main()/,主函数定义,主函数体,int fun1,(形参),/,功能函数定义,函数体,char fun2,(形参),/,功能函数定义,函数体,6,7,5.1.3 C51,的字符集、标识符与关键字,1,C51,的字符集,C51,语言的字符集由,大小写英文字母,、,数字,、,下划线,和,空格,等特殊字符构成。,2,C51,标识符,标识符在源程序中用来标识某个对象的名字,由程序员定,义,用做变量名、函数名和类型名等。,标识符可以由字母、数字和下划线组成,但必须由字母或,者下划线开头。,标识符的定义不能与关键字及系统预先定义的标准标识符,(如标准函数)同名,最好“见名知意”。,C51,程序中标识符区分字母的大小写。,7,8,3,关键字,关键字是,C51,已定义的具有固定名称和特定含义的特殊标,识符,又称,保留字,。标准,C,语言中规定的关键字有,32,个。,C51,编译器除了支持,ANSI C,标准的关键字外,还扩展了适,应,51,内核单片机要求的关键字。,C51,扩展关键字如下:,bdata data idata pdata xdata code bit sbit sfr,sfr16 _at_ reentrant interrupt using volatile,8,9,5.2 C51,的数据类型及其在,51,单片机中的存储方式,数据类型是指数据的存储格式。,无论哪种数据都存放在存储单元中,每一个数据究竟要占用几个单元,在编译时都要提供给编译系统。,C51,的数据类型与标准,C,语言的数据类型基本相同,但其中,char,型与,short,型相同,,,float,型与,double,型相同,。,C51,中还有专门针对,51,内核单片机的,特殊功能寄存器型,和,位类型,。,5.2.1 C51,的数据类型,9,10,C51,具体支持的基本数据类型及其长度、值域如表所示:,变量名称,符号,类型,数据长度,值域,字符型,有符号,signed char,8,位,128,+127,无符号,unsigned char,8,位,0,255,整数型,有符号,signed int,16,位,32768,+32767,无符号,unsigned int,16,位,0,65535,长整型,有符号,signed long,32,位,2,31,2,31,1,无符号,unsigned long,32,位,0,2,32,1,浮点型,有符号,float,32,位,1.175494E,38,3.402823E+38,位类型,bit,1,位,0,或,1,特殊位类型,sbit,1,位,0,或,1,8,位特殊功能寄存器型,sfr,8,位,0,255,16,位特殊功能寄存器型,sfr16,16,位,0,65535,10,11,1,、字符型,char,长度为,1,个字节。,默认为,signed char,。,对于,signed char,,其字节的最高位为符号位,“,0”,表示正数,“,1”,表示负数,补码表示,所能表示的数值范围是,-128+127,。,对于,unsigned char,,其取值范围为,0255,。也可以存放西文字符,在计算机内部用,ASCII,码存放。,2,、整型,int,长度为,2,个字节,,默认为,signed int,。,对于,signed int,,用于存放,2,字节带符号数,补码表示,数的范畴为,-32768+32767,。,对于,unsigned int,,用于存放,2,字节无符号数,数的范围为,065535,。,11,12,3,、长整型,long,长度为,4,个字节,默认为,signed long;,对于,signed long,,用于存放,4,字节带符号数,补码表示,数的范畴为,-2147483648+2147483647,。,对于,unsigned long,,用于存放,4,字节无符号数,数的范围为,04294967295,。,长整型数据与整型数据的存储结构都是,高位字节数存,放在低地址单元中,,,低位字节数存放在高地址单元中,。,例如,,长整型变量的值为,0 x12345678,时,在内存中的存放形式如右图所示。,地址,0,+1,+2,+3,0 x12,0 x34,0 x78,0 x56,.,12,13,4,、浮点型,float,长度为,4,个字节。,用浮点型变量进行任何数学运算都需要使用由编译器决定的各种不同效率等级的库函数。,Keil C51,的浮点型变量数据类型是,IEEE,754,标准的单精度浮点型数据,转换成十进制数后最多具有,7,位有效数字。,4,个字节中,包含,指数和尾数,两部分,尾数的最高位始终为,1,,因而不保存。,具体分布为:,1,位符号位,,8,位阶码位,,23,位尾数,如下图所示。,字节地址,0,1,2,3,浮点数内容,S,EEEEEEE,E,MMMMMMM,MMMMMMMM,MMMMMMMM,符号和阶码,尾数高位,尾数低位,13,14,符号位,S,:,1,表示负数,,0,表示正数。,阶码,E,:,共,8,位,,是以,2,为底的指数再加上,127,,这样可以避免出现负的阶码值。,如,实际阶码,-,126,用,1,表示,实际阶码,0,用,127,表示,,即实际阶码数加上,127,得到阶码的值,。,阶码,E,的正常取值范围是,1254,,而对应的指数实际取值范围为,126+127,。,尾数,:,M,为其小数部分,共,23,位,其整数部分隐含为“,1”,。,一个浮点数的取值范围:,字节地址,0,1,2,3,浮点数内容,S,EEEEEEE,E,MMMMMMM,MMMMMMMM,MMMMMMMM,符号和阶码,尾数高位,尾数低位,14,15,例如,:,浮点数,123.25,其二进制数,01,111011.01,B=1.,11101101,2,+110,;,8,位阶码,E,为,6+127=133=,10000101,B,;,23,位尾数值为,11101101,000000000000000B,;,32,位浮点数表示形式为:,0,100,0010,1,111 0110,1,0000000,00000000,B,;,在内存中的存放格式如下表所示:,字节地址,0,1,2,3,浮点数内容,0,1000010,1,111 0110,1,0000000,00000000,15,16,5,位类型,位类型是,C51,中扩充的数据类型,用于访问,51,内核单片机中的可位寻址单元;,包括,bit,型,和,sbit,型,,它们在内存中只,占,1,个二进制位,,其值可以为“,0”,或者“,1”,。利用它们,可以定义一个位变量,,但不能定义位指针,也不能定义位数组。,两种位类型,变量的,区别,在于,用,bit,定义的位变量,其地址由,C51,编译器编译时予以安排,而用,sbit,定义位变量时必须同时定义其位地址,在,C51,编译器编译时,其位地址不可变化。,16,17,6,特殊功能寄存器型,也是,C51,中扩充的数据类型,用于访问,51,内核单片机中的特殊功能寄存器中的数据;,包括,sfr,和,sfr16,两种类型;,sfr,为字节型特殊功能寄存器类型,占用,1,字节单元,利用它可以访问,51,内核单片机中所有的特殊功能寄存器;,sfr16,为双字节型特殊功能寄存器类型,占用,2,字节单元,利用它可以访问单片机中,2,字节的特殊功能寄存器。,17,18,5.2.2,数据的存储器类型,C51,应用程序中使用的任何数据必须以一定的存储器类型,定位于单片机的相应存储区域中。,51,内核单片机中程序存储器与数据存储器严格分开。数据,存储器又分为片内、片外两个独立的寻址空间,特殊功能寄存,器与片内,RAM,统一编址。,使用汇编指令访问这些存储器时,通常使用不同的指令即,可。而在,C51,中访问这些存储器时,是通过定义不同存储类型,的变量,以说明该变量的存储器位置。,18,19,C51,编译器支持的存储器类型如下表所示:,存储器类型,与硬件存储器空间的对应关系,data,直接寻址的片内,RAM,低,128B,,访问速度最快,bdata,片内,RAM,可位寻址区(,20H,2FH,),允许字节和位混合访问,idata,用,Ri,间接寻址的片内,RAM,全部地址空间(,256B,),pdata,用,Ri,间接访问的片内扩展,RAM,或片外扩展,RAM,低,256B,xdata,用,DPTR,间接访问的片内扩展,RAM,或片外扩展,RAM,(,64KB,),code,程序存储器,ROM,空间(,64KB,),19,20,5.2.3,常量和变量,数据有常量和变量之分。,1,常量,常量就是在程序运行过程中其值不能被改变的量,可以为字符,字符串,转义字符,十进制数或十六进制数(用,0 x,打头表示)、浮点数等直接常量,也可以定义符号型常量,定义方式如下:,用宏定义语句定义常量,,例如:,#define PI 3.1415926 /,定义,PI,为常量,3.1415926,用,const,语句定义常量,,例如:,const unsigned char xx=0 x98,;,/,定义,xx,为无符号,char,型常量,0 x98,20,21,表,5,5,常用的转义字符,转义字符,含 义,ASCII,码,0,空字符,0 x00,n,换行符,0 x0a,r,回车符,0 x0d,t,水平制表,0 x09,b,退格符,0 x08,f,换页符,0 x0c,单引号,0 x27,”,双引号,0 x22,反斜杠,0 x5c,21,22,2.,变量,在程序运行过程中其数值可以改变的量叫变量;,变量由,变量名,和,变量值,构成;,变量名,是存储单元地址的符号表示;,变量的值,是该地址单元存放的内容;,一个变量一旦被定义,编译系统就会自动为它安排存储单元;,要在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储器类型,这样编译系统才能为变量分配相应的存储空间。,变量的定义格式如下:,存储种类,数据类型,存储器类型,变量名表,;,22,23,举例说明变量定义相关情况:,char data varl,;,/*,在片内,RAM,低,128B,范围内定义用直接寻址方式访问的字符型变量,var1*/,int idata var2,;,/,在片内,RAM256B,范围内定义用间接寻址方式访问的整型变量,var2,auto unsigned long data var3,;,/*,在片内,RAM128B,范围内定义用直接寻址方式访问的自动无符号长整型变量,var3*/,extern float xdata var4,;,/*,在扩展,RAM,空间范围内定义用间接寻址方式访问的外部实型变量,var4*/,int code var5,;,/,在,ROM,空间定义整型变量,var5,unsigned char bdata var6,;,/*,在片内,RAM,位寻址区,20H,2FH,单元范围内定义无符号字符型变量,var6*/,23,24,5.2.4,存储模式,存储模式决定变量的默认存储器类型和参数传递区,。,若定义变量时指定了存储器类型,编译程序按要求为其分配存储空间,这种情况可以不必再指定存储模式;若未指定存储器类型,编译程序按照存储模式为变量选择默认的存储器类型和参数传递区。,C51,有三种存储模式:,SMALL,、,COMPACT,和,LARGE,,以适应不同规模的程序。如果没有说明,编译程序,默认使用,SMALL,模式,。,C51,的数据存储模式见表,5,6,。,24,25,表,5,6 C51,的存储模式,存储模式,说 明,SMALL,参数和局部变量存于可直接寻址的片内,RAM,(最大,128B,,默认存储器类型为,data,),COMPACT,参数及局部变量存于片内扩展,RAM,或片外扩展,RAM,区低,256B,中(默认存储器类型为,pdata,),LARGE,参数和局部变量直接存于片内扩展,RAM,或片外扩展,RAM,中(最大,64KB,,默认存储器类型为,xdata,),25,26,1,C51,编译器,3,种存储模式的优缺点,SMALL,:,所有变量默认存放于片内,RAM,中,这时的变量访问速度最快、效率最高,但由于空间有限,只适用于小程序。,COMPACT,:,所有变量默认存放于片内扩展,RAM,或片外,RAM,区低,256B,中,对于片外,RAM,,具体哪一页可由,P2,口指定。优点是空间比,SMALL,大,但由于必须使用间接寻址方式访问变量,所以速度较,SMALL,慢,但比,LARGE,模式快。,LARGE,:,所有变量默认存放于片内扩展,RAM,或片外,RAM,中,最多可有,64KB,。空间最大,但用数据指针,DPTR,来寻址变量,速度较慢。产生的机器码比,SMALL,和,COMPACT,模式都多。,由于各种存储模式在访问效率、代码长度、变量总长度等方面各有优缺点,现在常用的,C51,编译程序通常支持混合模式。即不管存储模式如何,把经常使用的变量存放于片内,RAM,,大块数据则存放于扩展,RAM,而将其指针存放于片内,RAM,中。,26,27,2,数据存储模式设定,数据存储模式的设定有两种方式,即使用预处理命令或使用编译控制命令。,使用预处理命令设定数据存储模式,使用预处理命令设定数据存储模式时,只需要在程序的开头处加预处理命令即可。例如:,#pragma compact /,设定数据存储模式为紧凑编译模式,使用编译控制命令设定数据存储模式,使用编译控制命令设定数据存储模式,是在用,C51,编译程序对,C51,源程序进行编译时,使用编译控制命令。例如:,C51 file1.C LARGE /,设定源程序,file1.c,中的数据存储模式为大编译模式,函数的存储模式可通过在函数定义时后面带存储模式说明,。,27,28,#pragma small /,变量的存储模式为,SMALL,char x,,,y,;,/,两个变量,x,,,y,的存储器类型为,data,static char m,,,n,;,/,两个静态变量,m,,,n,的存储器类型为,data,#pragma compact /,变量的存储模式为,COMPACT,char k,;,/,变量,k,的存储器类型为,pdata,int xdata z,;,/,变量,z,的存储器类型为,xdata,int func1(int x1,,,int y1)large /,函数的存储模式为,LARGE,return(x1+y1),;,/,形参,x1,和,y1,的存储器类型为,xdata,型,int func2(int x2,int y2)/,函数的存储模式默认为,SMALL,return(x2,y2),;,/,形参,x2,和,y2,的存储器类型为,data,【,例,5,1】,变量和函数的存储模式设置。,28,29,5.3,硬件资源访问,51,内核单片机中,除了程序计数器,PC,和,8,个通用工作寄存器之外,其它所有的寄存器均为特殊功能寄存器(,SFR,)。它们分散在片内,RAM,区的高,128B,(,0 x80,0 xFF,),为了对它们进行直接访问,,C51,编译器利用扩展数据类型,sfr,和,sfr16,对这些特殊功能寄存器进行定义。,5.3.1 C51,对特殊功能寄存器的定义,29,30,例如:,sfrPSW=0 xd0,;,/,程序状态字寄存器地址,0D0H,sfrSCON=0 x98,;,/,串行口控制寄存器地址,98H,sfrTMOD=0 x89,;,/,定时,/,计数器模式寄存器地址,89H,sfrP1=0 x90,;,/P1,端口地址,90H,1,用,sfr,定义,8,位特殊功能寄存器,sfr,特殊功能寄存器名,=,特殊功能寄存器地址常数,定义之后,在程序中就可以直接引用寄存器名。,30,31,sfr PORT_ZERO=0X80,;,sfr ACC=0XE0,;,sfr NEW_CON=0XFF,;,sfr C_REG=0X22,;,【,例,5,2】,在基于,STC12C5A60S2,单片机的,C51,语言编程中,,使用了下面特殊功能寄存器定义的语句,指出哪些是合法的,,哪些是有效的,哪些是非法的。,/,合法有效,,PORT_ZERO,相当于,P0,口的别名,/,合法有效,,A,寄存器的定义,/,合法无效,该地址无实际,SFR,/,不合法,地址不在允许范围内,31,32,2,用,sfr16,定义,16,位特殊功能寄存器,当,16,位寄存器的,高,8,位地址紧排在低,8,位地址之后,时,就可以定义一个,16,位特殊功能寄存器变量。,定义格式为:,sfr16,特殊功能寄存器名,=16,位特殊功能寄存器中低,8,位的地址,例如,:,sfr16 DPTR=0 x82,;,/*,指定,DPTR,寄存器地址为,0 x82,,其中,DPL,的地址为,0 x82,,,DPH,的地址为,0 x83*/,注意,:这种定义适用于所有新的,16,位,SFR,,但不能用,于定时,/,计数器,T0,和定时,/,计数器,T1,的定义。,32,33,3,说明,定义特殊功能寄存器中的地址必须在,0 x80,0 xff,范围内;,定义特殊功能寄存器,必须放在函数外面作为全局变量;,用,sfr,或,sfr16,每次只能定义一个特殊功能寄存器;,用,sfr,或,sfr16,定义的变量必须是真实的特殊功能寄存器,其地址是固定的,不能像一般变量那样随便定义。,33,34,5.3.2 C51,对位变量的定义,1.,特殊功能寄存器中特定位的定义,如果特殊功能寄存器的字节地址能被,8,整除,则这样的特殊功能寄存器具有位寻址功能,可以用关键字,sbit,来定义特定位。定义方法有多种,分别如下:,用寄存器名位定义,sfr PSW=0 xd0;/,定义,PSW,地址为,D0H,sbit CY=PSW7;/CY,为,PSW.7,用字节地址位表示,sbit CY=0 xd07;/,定义,CY,为字节地址,0 xd0,单元的第,7,位,即,PSW.7,直接用位地址表示,sbit CY=0 xd7;/,定义,CY,位地址为,0 xd7,,即,PSW.7,34,35,使用头文件,再直接用位名称,#include,TR0=1,;,EA=1;TF0=0;/,在文件中已定义了,TR0,、,EA,、,TF0,等位,使用头文件及,sbit,定义符,用于无位名称的可位寻址位。,#include,sbit P1_0=P10;,sbit a_7=ACC7;,由于在,51,内核单片机产品中特殊功能寄存器的数量和类型,不尽相同,,C51,建立了一个头文件,reg51.h,(增强型为,reg52.h,),,STC,系列单片机的头文件有,STC90.h,、,STC10.h,、,STC11.h,、,STC12C5A.h,、,STC12C52.h,、,STC12C54.h,、,STC12C56.h,、,STC15.h,、,STC89.h,等。,35,36,在这些头文件中对相应系列的所有特殊功能寄存器进行,了,sfr,定义,对特殊功能寄存器中有位名称并且可位寻址位进行了,sbit,定义,,只要使用了,#include,或,#include,等包含语句,就可以直接引用该文件中已经定义过的特殊功能寄存器名及位名称,。,注意,:,在引用特殊功能寄存器名及位名称时必须大写。,我们也可以用自己喜欢的名字写定义文件,使用时只要用包含语句,#include“*.h”,就可以直接引用已定义的特殊功能寄存器名和位名称。,36,37,程序如下:,#include,sbit P1_0=P10;,void main(),P1_0=0;,while(1);,【,例,5,3】,利用,STC12C5A60S2,单片机,P1,口的,P1.0,引脚接一,只,LED,灯,如图,5,2,所示。要求一直点亮。,37,38,2,对一般位变量的定义,在,C51,中,经常用位变量标记某些事件的状态,如标记某电机的停与转等。,位变量的地址位于片内,RAM,的可位寻址区(,20H,2FH,单元),用户通过位类型符定义位变量。,格式如下,:,bit,位变量名,=,初值,;,/,其地址可由,C51,编译器编译时自动分配,sbit,位变量名,=,位地址;,/,定义时直接确定其地址,在格式中可以加上各种修饰,但,注意存储器类型只能是,bdata,、,data,、,idata,。只能是片内,RAM,的可位寻址区,严格来说只能是,bdata,。,38,39,bit data a1,;,bit bdata a2,;,bit xdata a4,;,【,例,5,4】,判断以下定义是否正确。,/,正确,,a1,的位地址由,C51,编译器自行安排在,bdata,区,/,正确,,a2,的位地址由,C51,编译器自行安排在,bdata,区,/,错误,【,例,5,5】,用,sbit,定义一般位变量。,char bdata temp;,/,在位寻址区定义一个字符型变量,temp,sbit bit7=temp7;,/bit7,定义为,temp,的第,7,位,bit7=0;,/,位寻址,将,temp,的第,7,位置,0,39,40,3,说明,bit,型位变量与其它变量一样,可以作为函数的形参,也可以作为函数的返回值;,位变量不能定义指针,不能定义数组。,用,sbit,定义的位变量,必须能够按位操作,而不能够对无位操作功能的位定义位变量。,用,sbit,定义位变量,必须放在函数外面作为全局位变量,而不能在函数内部定义。,用,sbit,每次只能定义一个位变量。,对其它模块定义的位变量(,bit,型或,sbit,型)的引用声明,都使用,bit,。,40,41,【,例,5,6】,指出下面程序中各语句的作用。,#include,unsigned char bdata data1;/,在位寻址区定义字节变量,data1,sbit lsb=data10;/,定义位变量,lsb,为,data1,的最低位,sbit msb=data17;/,定义位变量,msb,为,data1,的最高位,void main(void),bit flag=1;/,定义局部位变量,flag,,并赋初值为,1,data1=A;/,给字节变量,data1,赋值,while(1),flag=!flag;/,位变量,flag,取反,msb=flag;/,将,flag,的值赋给,msb,lsb=flag;/,将,flag,的值赋给,lsb,P1=data1;/,将,data1,变量通过,P1,口输出,41,42,5.3.3 C51,对存储器和外部,I/O,接口的绝对地址访问,在具有外部,I/O,接口电路的应用中,外部接口电路的地址是由硬件电路确定的,以变量形式对其访问时,必须事先指定变量在系统中的绝对地址;也有一些变量需要明确在存储器中的具体地址,而不是让编译程序自行分配。,对这些变量的访问就是对绝对地址访问。,下面介绍使用,宏定义,、,关键字,_at_,以及,指针,来访问绝对地址。,42,43,1,使用宏定义访问绝对地址,这些宏定义的函数原型所在头文件为,absacc.h,。,定义绝对地址变量的格式如下:,#,include,#define,变量名,CBYTE,绝对地址,#define,变量名,DBYTE,绝对地址,#define,变量名,PBYTE,绝对地址,#define,变量名,XBYTE,绝对地址,#define,变量名,CWORD,绝对地址,#define,变量名,DWORD,绝对地址,#define,变量名,PWORD,绝对地址,#define,变量名,XWORD,绝对地址,43,44,1,使用宏定义访问绝对地址,#define,变量名,CBYTE,绝对地址,CBYTE,指定绝对地址在单片机程序存储器中的字节变量;,44,45,1,使用宏定义访问绝对地址,#define,变量名,CBYTE,绝对地址,#define,变量名,DBYTE,绝对地址,DBYTE,指定绝对地址在单片机片内,RAM,中字节变量;,45,46,1,使用宏定义访问绝对地址,#define,变量名,CBYTE,绝对地址,#define,变量名,DBYTE,绝对地址,#define,变量名,PBYTE,绝对地址,PBYTE,指定绝对地址在单片机片内扩展,RAM,或片外,RAM,低,256B,中的字节变量;,46,47,1,使用宏定义访问绝对地址,#define,变量名,CBYTE,绝对地址,#define,变量名,DBYTE,绝对地址,#define,变量名,PBYTE,绝对地址,#define,变量名,XBYTE,绝对地址,XBYTE,指定绝对地址在单片机片内扩展,RAM,或片外,RAM,中的字节变量;,47,48,1,使用宏定义访问绝对地址,#define,变量名,CBYTE,绝对地址,#define,变量名,DBYTE,绝对地址,#define,变量名,PBYTE,绝对地址,#define,变量名,XBYTE,绝对地址,#define,变量名,CWORD,绝对地址,CWORD,指定绝对地址在单片机程序存储器中的字变量,该字变量的低地址为中括号中的数乘,2,;,48,49,1,使用宏定义访问绝对地址,#define,变量名,CBYTE,绝对地址,#define,变量名,DBYTE,绝对地址,#define,变量名,PBYTE,绝对地址,#define,变量名,XBYTE,绝对地址,#define,变量名,CWORD,绝对地址,#define,变量名,DWORD,绝对地址,DWORD,指定绝对地址在单片机片内,RAM,中的字变量,该字变量的低地址为中括号中的数乘,2,;,49,50,1,使用宏定义访问绝对地址,#define,变量名,CBYTE,绝对地址,#define,变量名,DBYTE,绝对地址,#define,变量名,PBYTE,绝对地址,#define,变量名,XBYTE,绝对地址,#define,变量名,CWORD,绝对地址,#define,变量名,DWORD,绝对地址,#define,变量名,PWORD,绝对地址,PWORD,指定绝对地址在单片机片内扩展,RAM,或片外,RAM,低,256B,中的字变量,该字变量的低地址为中括号中的数乘,2,;,50,51,1,使用宏定义访问绝对地址,#define,变量名,CBYTE,绝对地址,#define,变量名,DBYTE,绝对地址,#define,变量名,PBYTE,绝对地址,#define,变量名,XBYTE,绝对地址,#define,变量名,CWORD,绝对地址,#define,变量名,DWORD,绝对地址,#define,变量名,PWORD,绝对地址,#define,变量名,XWORD,绝对地址,XWORD,指定绝对地址在单片机片内扩展,RAM,或片外,RAM,中的字变量,该字变量的低地址为中括号中的数乘,2,;,51,52,CBYTE,、,DBYTE,、,PBYTE,、,XBYTE,、,CWORD,、,DWORD,、,PWORD,和,XWORD,为,8,个宏名,。,也可以不使用宏定义的方法,直接使用这些宏名进行绝对地址的访问,。,访问形式如下:,宏名,绝对地址,【,例,5,7】,使用宏定义的方法访问片外并行,I/O,口或存储单元。,#include,#define PA XBYTE0 xfffe/*PA,定义为地址为,0 xfffe,的字节变量*,/,void main,(),PA=0 xFF,;,/*,将数据,FFH,写入地址为,0 xfffe,的,I/O,端口或存储单元*,/,52,53,【,例,5,8】,使用宏名访问存储器。,#include /,将绝对地址头文件包含在文件中,#define uchar unsigned char,#define uint unsigned int,void main(void),uchar var1;,uint var2;,var1=XBYTE0 x0003;,var2=XWORD0 x0002;/,*读片内扩展,RAM,的,0004H,0005H,字单元的数据赋给变量,var2,*,/,XBYTE0 x0003=0 x7f;,XWORD0 x0002=0 x7fff;/,*将数据,0 x7fff,写入片内扩展,RAM,的,0004H,0005H,地址中*,/,while(1);,53,54,2,使用关键字,_at_,访问绝对地址,存储器类型,数据类型 变量名,_at_,地址常数,;,存储器类型为,data,、,bdata,、,idata,、,pdata,等;,地址常数用于指定变量的绝对地址,必须位于有效的存储器空间之内;这种变量定义时不能初始化。,54,55,说明:,不能对,code,型变量绝对定位;,绝对地址变量必须是全局变量,不能在函数中对变量绝对定位;,绝对地址变量多用于,I/O,端口,一般情况下不对变量作绝对定位;,函数和,bit,型变量不能使用,_at_,绝对定位。,【,例,5,9】,使用关键字,_at_,实现绝对地址的访问,。,#define uchar unsigned char,#define uint unsigned int,data uchar x1 _at_ 0 x40;,xdata uint x2 _at_ 0 x2000;,void main(void),x1=0 xff;,x2=0 x1234;,.,55,56,3,使用指针访问绝对地址,【,例,5,10】,通过指针实现绝对地址的访问。,#define uchar unsigned char,#define uint unsigned int,void func(),uchar data var1;,uchar pdata *dp1;,uint xdata *dp2;,uchar data *dp3;,dp1=0 x30;,dp2=0 x1000;,*,dp1=0 xff;,*,dp2=0 x1234;,dp3=,*,dp3=0 x20;,56,57,5.4 C51,的运算符,1,赋值运算符,赋值运算符的作用是将“,=”,右边的数据(常量或表达式)赋给左边的变量。,2,算术运算符,基本算术运算符有:,+,(加或正号)、(减或负号)、*(乘号)、,/,(除号)、,%,(求余)。,优先级为:先乘除,后加减,先括号内,再括号外。,3,关系运算符,关系运算符有:,(小于)、,(大于)、,=,(大于等于)、,=,(相等)、,!=,(不相等),优先级:前四个高,后两个低。,57,58,4,逻辑运算符,逻辑运算符共有三种:,!,(逻辑非)、,&,(逻辑与)、,|,(逻辑或),逻辑表达式和关系表达式都是以,0,代表假,以,1,代表真。,5,位操作运算符,C51,支持的位操作运算符有:,&,(按位与)、,|,(按位或)、,(按位异或)、,(按位取反)、,(位右移),需要说明的是,:,无符号数的右移运算是高端移入,0,,低端移出舍掉。有符号数的右移运算是高端移入操作数的符号位,低端移出位被舍掉。,例如:,signed char a=,2,,,b,;,b=a1;,执行结果为,b=0 xff,。因为,a,为负数,以其补码形式出现,即,a=0 xfe,,右移一位,各位依次右移一位,最高位移入符号位,1,,最低位移出舍掉,则,b,为,0 xff,。,58,59,6,自增、自减运算符,自增(,+,)、自减(,-,)运算符的作用是使变量值加,1,或减,1,。,包括前置和后置两种形式:,前置,+i,,,-i,(,先执行,i+1,或,i,1,,再使用,i,值),后置,i+,,,i-,(,先使用,i,值,再执行,i+1,或,i,1,),例如:,j=3;k=+j;/,执行后,k=4,,,j=4,j=3;k=j+;/,执行后,k=3,,,j=4,59,60,7,复合赋值运算符,复合赋值运算符有,+=,=*=/=%=&=|=,例如:,a+=3,相当于,a=a+3,,,a*=b,相当于,a=a*b;,8,条件运算符,一般形式:,表达式,1?,表达式,2:,表达式,3,功能:首先判断表达式,1,是否成立,如果表达式,1,成立,则整个表达式的值为表达式,2,的值,否则为表达式,3,的值。,例如:,(x%2=1)?1:0;/,首先判断,x%2=1,是否成立,即,x,如果是奇数则结果为,1,,否则结果为,0,9,逗号运算符,形式:,表达式,1,,表达式,2,,,表达式,n,逗号表达式的值等于表达式,n,的值,60,61,10,对指针操作的运算符,&,取地址运算符,,*,取内容运算符,例如:,unsigned char a,b,*p;,p=&b,;,/,取变量,b,的地址赋给指针变量,p,a=*p,;,/,取指针变量,p,所指向的地址中的内容(即变量,b,的内容)赋给变量,a,表,5,7,列出了,C,语言中运算符的优先级及结合规则。,61,62,优先级,运算符,名称或含义,使用形式,结合规则
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

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

关于我们      便捷服务       自信AI       AI导航        抽奖活动

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

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

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

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

客服