第4章-单片机的C51编程语言课件.ppt

上传人(卖家):晟晟文业 文档编号:4315553 上传时间:2022-11-29 格式:PPT 页数:86 大小:504KB
下载 相关 举报
第4章-单片机的C51编程语言课件.ppt_第1页
第1页 / 共86页
第4章-单片机的C51编程语言课件.ppt_第2页
第2页 / 共86页
第4章-单片机的C51编程语言课件.ppt_第3页
第3页 / 共86页
第4章-单片机的C51编程语言课件.ppt_第4页
第4页 / 共86页
第4章-单片机的C51编程语言课件.ppt_第5页
第5页 / 共86页
点击查看更多>>
资源描述

1、11/29/2022第4章_单片机的C51编程语言1第第4章章 单片机的单片机的C51编程语言编程语言 第4章_单片机的C51编程语言211/29/2022第第4章章 单片机的单片机的C51编程语言编程语言 n4.1 C51编程语言概述n4.2 C51的标识符和关键字n4.3 C51的变量与数据类型n4.4 C51语言的数组、指针与结构n4.5 C51的运算符和表达式n4.6 C51语言的程序结构n4.7 C51语言的函数n4.8 中断服务程序n4.9 C51的预处理n4.10 C51的库函数n4.11 使用C5I编译器时的注意事项第4章_单片机的C51编程语言311/29/20224.1 C

2、51编程语言概述编程语言概述C语言是一种结构化语言,可产生紧凑代码C语言可以进行许多机器级函数控制而不用汇编语言。C语言目前已成为电子工程师进行单片机系统编程时的首选编程语言。用C语言来编写目标系统软件,会大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充。基于51系列单片机的C语言或C语言编译器简称为C51语言或C51。第4章_单片机的C51编程语言411/29/20221可读性好、编程调试灵活方便2生成的代码编译效率高3完全模块化4可移植性好5便于项目维护管理第4章_单片机的C51编程语言511/29/2022以Keil公司的Keil C5l(以下简称C5l)编译器为例lC5l系列

3、头文件集中体现了各系列芯片的不同功能 lC5l比ANSI C多一种“位”类型 l数据存储类型有很大的区别 l函数的使用上,由于单片机系统的资源有限,它的编译系统不允许太多的程序嵌套 lC5l与标准ANSI C库函数,由于部分库函数不适合单片机处理系统,因此被排除在外,如字符屏幕和图形函数。也有一些库函数继续使用,但这些库函数是厂家针对硬件特点相应开发的,它们与ANSI C的构成及用法都有很大的区别,如printf和scanf。在ANSI C中这两个函数通常用于屏幕打印和接收字符,而在C5l中,它们则主要用于串行通信口数据的发送和接收。第4章_单片机的C51编程语言611/29/2022例例4-

4、1 设图设图1-2系统要求是:当系统要求是:当S1闭合时,报警灯亮;而闭合时,报警灯亮;而S1打开时,报警灯灭打开时,报警灯灭。用。用C51语言编写实现该功能的程序,程序名为语言编写实现该功能的程序,程序名为ex4-1.c:#include /定义定义MCS-51的特殊功能寄存器的特殊功能寄存器SFR sbit P32 =P32;/定义定义 P3.2 为为 P32sbit P20 =P20;/定义定义 P2.0 为为 P20main()while(1)P32=1;if(P32=0)P20=1;elseP20=0;在C51中,使用“/*/”和“/”符号进行注释。注释不影响程序的功能,用于说明程序

5、的用途、功能,增加程序的可读性和可维护性。编译后注释不存在,不影响运行文件的大小。优秀的程序设计人员要养成良好的注释习惯,一般在程序的开始要写注释,表明程序的要求、功能,编写人员,编写日期,版本号等信息。第4章_单片机的C51编程语言711/29/2022使用任何文本编辑软件,或KEIL C集成的编辑系统书写C以上程序。使用KEIL C的C51编译器和连接软件(用KEIL C集成开发工具uVision中的Build target批处理),生成可以写入单片机的目标文件,通常为HEX文件(ex4-1.hex)用程序烧录器将该文件写入单片机,单片机上电即可运行。同时Build target还生成许多

6、中间文件,用于程序的调试,例如,从ex4-1.lst文件中可以看见C程序编译后生成的汇编程序,由此可以理解单片机硬件具体的执行过程,还可以对C程序编程的效率进行了解。第4章_单片机的C51编程语言811/29/2022ex4-1.lst文件 0000?C0001:0000 D2B2 SETB P320002 20B204 JB P32,?C00030005 D2A0 SETB P200007 80F7 SJMP?C00010009?C0003:0009 C2A0 CLR P20000B 80F3 SJMP?C0001可以看出,C编译器编译的结果与我们大多人用汇编语言的编程结果相同,但是C51语

7、言的可读性更好,特别是当程序更加复杂时,C51语言有明显的优势。第4章_单片机的C51编程语言911/29/2022 标识符用来标识源程序中某个对象的名字,这些对象可以是语句、数据类型、函数、变量、数组等。C语言是区分大小写的一种高级语言。标识符由字符串、数字和下划线等组成,第一个字符必须是字母或下划线 错误的标识符,编译时会有错误提示。C5l中有些库函数的标识符是以下划线开头的,所以一般不要以下划线开头命名标识符。第4章_单片机的C51编程语言1011/29/2022表4-1 ANSI C标准关键字关键字用途说明auto存储种类说明用于声明局部变量,为默认值break程序语句退出最内层循环体

8、case程序语句switch语句中的选择项char数据类型声明单字节整型数或字符型数据const存储种类说明在程序执行过程中不可修改的值continue程序语句转向下一次循环default程序语句switch语句中缺省选择项do程序语句构成dowhile 循环结构double数据类型声明双精度浮点数else程序语句构成ifelse 条件结构enum数据类型声明枚举类型数据extern存储种类说明在其他程序模块中声明了的全局变量float数据类型声明单精度浮点数for程序语句构成for循环结构goto程序语句构成goto循环结构if程序语句构成ifelse 条件结构int数据类型声明整型数第4章

9、_单片机的C51编程语言1111/29/2022long数据类型声明长整型数register存储种类说明使用CPU内部寄存器变量return程序语句函数返回short数据类型声明短整型signed数据类型声明有符号整型数sizeof运算符计算表达式或数据类型的字节数static存储种类说明静态变量struct数据类型声明结构体类型数据switch程序语句构成switch选择结构typedef数据类型声明重新进行数据类型定义union数据类型声明联合类型数据unsigned数据类型声明无符号数据void数据类型声明无类型数据或函数volatile数据类型声明声明该变量在程序执行中可被隐含地改变w

10、hile程序语句构成while和dowhile循环结构第4章_单片机的C51编程语言1211/29/2022表4-2 C51编译器扩充关键字关键字用途说明_at_地址定位为变量进行绝对地址定位_priority_多任务优先声明规定RTX51或RTX51 Tiny的任务优先级_task_任务声明定义实时多任务函数alien函数特性声明用于声明与PL/M51兼容的函数bdata存储器类型声明可位寻址的MCS-51内部数据存储器bit位变量声明声明一个位变量或位类型函数code存储器类型声明MCS-51的程序存储空间compact存储器模式按compact模式分配变量的存储空间data存储器类型声明

11、直接寻址MCS-51的内部数据寄存器第4章_单片机的C51编程语言1311/29/2022idata存储器类型声明间接寻址MCS-51的内部数据寄存器interrupt中断函数声明定义一个中断服务函数large存储器模式按large模式分配变量的存储空间pdata存储器类型声明分页寻址的MCS-5外部数据空间sbit位变量声明声明一个位变量sfr特殊功能寄存器声明声明一个8位特殊功能寄存器sfr16特殊功能寄存器声明声明一个16位特殊功能寄存器small存储器模式按small模式分配变量的存储空间using寄存器组定义定义MCS-5的工作寄存器组xdata存储器类型声明定义MCS-5外部数据空

12、间第4章_单片机的C51编程语言1411/29/20221常量常量常量又称为标量,它的值在程序执行过程中不能改变,常量的数据类型有整型、浮点型字符型和字符串型等。实际使用中用#define定义在程序中经常用到的常量,或者可能需要根据不同的情况进行更改的常量,例如译码地址。而不是在程序中直接使用常量值。这样一方面有助于提高程序的可读性,另一方面也便于程序的修改和维护,例如:#define PI 3.14/以后的编程中用PI代替浮点数常量3.14,便于阅读#define SYSCLK 12000000/长整型常量用SYSCLK代替12MHz时钟#define TRUE 1/用字符TRUE,在逻辑运

13、算中代替1#define STAR*/用STAR表示字符“*”#define uint unsigned int/用uint 代替unsigned int,简化编辑第4章_单片机的C51编程语言1511/29/2022例如语句:if(key=TRUE),与语句if(key=1)相同。C51语言(汇编语言也是同样)编辑时,除注释外,要使用英文符号,例如上述定义的字符“*”,在程序中是用英文的单引号,而不是中文符号单引号;第4章_单片机的C51编程语言1611/29/2022常量分为:常量分为:1)整型常量。整型常量值:可用十进制表示,如128,-35等;也可以用十六进制表示,如0 x1000。2

14、)浮点型常量。如0.12、-10.3等。3)字符型常量。字符型常量是用单引号括起来的一个字符,如A、0、=等,编译程序将把这些字符型常量转换为ASCII码,例如A等于0 x41。对于不可显示的控制字符,可直接写出字符的ASCII码,或者在字符前加上反斜杠“”组成转义符。转义符可以完成一些特殊功能和格式控制。4)字符串型常量。字符串型常量用一对双引号括起一串字符来表示,如“Hello”、“OK”等。字符串型常量由双引号作为界限符。当字符串中需要出现双引号时,需使用转义字符“”来表示。第4章_单片机的C51编程语言1711/29/2022表4-3 常用的转义符转义字符转义字符含义含义ASCII码码

15、 16进制(进制(10进制)进制)0空字符(NULL)0 x00n换行符(LF)0 x0Ar回车符(CR)0 x0Dt水平制表符(HT)0 x09单引号0 x27”双引号0 x22反斜杠0 x5C第4章_单片机的C51编程语言1811/29/2022变量是一种在程序执行过程中,其数值不断变化的量。C51规定变量必须先定义后使用。C51的变量主要有表4-4中的各种数据类型,而sfr、sfr16、sbit三种数据类型用于对MCS-51单片机的特殊功能寄存器(SFR)的操作,不是我们传统意义上的变量。C51对变量定义的格式如下:存储种类存储种类 数据类型数据类型 存储器类型存储器类型 变量名表变量名

16、表 第4章_单片机的C51编程语言1911/29/2022存储种类存储种类 数据类型数据类型 存储器类型存储器类型 变量名表变量名表变量的存储种类反映了变量的作用范围和寿命,将影响到编译器对变量在RAM中位置的安排。C51有四种存储种类:auto(自动)、extern(外部)、static(静态)、register(寄存器)。如果不声明变量的存储种类,则该变量将为auto变量。第4章_单片机的C51编程语言2011/29/2022与PC机的C编程相比,C51的存储类型复杂很多,这是由于MCS-51单片机存储器类型的多样性决定的。可以通过存储器类型的定义,将变量安排在不同的存储区域。存储种类和存

17、储器类型是可选项。如果没有定义变量的存储种类或存储器类型,C51编译器将根据变量定义的位置以及存储器模式,由C51编译器分配变量的在RAM中的位置(地址)。第4章_单片机的C51编程语言2111/29/2022数据类型数据类型存储种类存储种类 数据类型数据类型 存储器类型存储器类型 变量名表变量名表数据类型决定变量的类型以及在存储器中的长度,变量名表中各个变量用逗号隔开。例如:int i,j,k;/定义三个整型变量i,j,kunsigned int si,sk;/定义无符号整型变量si,skbit my_bit;/定义位变量my_bit第4章_单片机的C51编程语言2211/29/2022根据

18、变量作用域的不同,变量可分为。1)局部变量:局部变量也称为内部变量,是指在函数内部或以花括号“”括起来的功能模块内部定义的变量。局部变量只在定义它的函数或功能模块内有效,在该函数或功能模块以外不能使用。在C5l语言中局部变量必须定义在函数或功能模块的开头。2)全局变量。全局变量也称为外部变量,是指在程序开始处或各个功能函数的外面定义的变量。在程序开始处定义的全局变量对于整个程序都有效,可供程序中所有的函数共同使用;而在各功能函数外面定义的全局变量只对全局变量定义语句后定义的函数有效,在全局变量定义之前定义的函数不能使用该变量。一般在程序开始处定义全局变量。第4章_单片机的C51编程语言2311

19、/29/2022n(1)全局变量由C编译器在动态区外的固定存储区域中存储,它在整个程序执行期间均占用存储空间,这将增大程序执行时所占的内存。n(2)全局变量是外部定义的,这将破坏函数的模块化结构,不利于函数的移植。n(3)由于多个模块均可对全局变量进行修改,处理不当时可能导致程序错误,且难以调试。因此应避免使用不必要的全局变量。n有时函数需要引用一个在其后面定义的变量或在另一个程序文件中定义的变量,可使用exten关键字进行外部变量声明。外部变量声明不同于外部变量定义,外部变量只定义一次,而可以多次使用外部变量声明。第4章_单片机的C51编程语言2411/29/2022存储种类存储种类 数据类

20、型数据类型 存储器类型存储器类型 变量名表变量名表C51具有ANSI C的所有标准数据类型,包括:char、int、short、long、float和double,对Keil C的C51编译器来说,short类型和int类型相同,double类型和float类型相同。除此之外,为了更加有利地利用MCS-51的结构,C51还增加了一些特殊的数据类型,包括bit、sfr、sfr16、sbit。第4章_单片机的C51编程语言2511/29/2022表表4-4 C51变量的数据类型变量的数据类型数据类型数据类型长度长度/bit长度长度/Byte值域值域unsigned char810255signed

21、 char或或char81-128+127unsigned int162065535signed int162-32768+32768unsigned long32404294967295signed long324-2147483648+2147483647float324-1.175494E-38+3.402823E+38*指针指针13bit10或或1第4章_单片机的C51编程语言2611/29/20221char字符类型字符类型char类型的长度是8位,1字节(简称1B),通常用于定义处理字符数据的变量或常量。分无符号字符类型unsigned char和有符号字符类型signed cha

22、r,默认值为signed char类型。unsigned char类型用字节中所有的位表示数值,可以表达的数值范围是0255。signed char类型用字节中最高位表示数据的符号,0表示正数,1表示负数,负数用补码表示,能表示的数值范围是-128+127。unsigned char常用于处理ASCII字符或用于处理小于或等于255的整型数。第4章_单片机的C51编程语言2711/29/20222int整型整型int整型长度为16位,2字节(2B),用于存放一个双字节数据。分有符号int整型数signed int和无符号int整型数unsigned int,默认值为signed int类型。s

23、igned int表示的数值范围是-32768+32767,字节中最高位表示数据的符号,0表示正数,1表示负数。unsigned int表示的数值范围是065535。第4章_单片机的C51编程语言2811/29/20223long长整型长整型long长整型长度为32位,4字节(4B),用于存放一个4B数据。分有符号long长整型signed long和无符号long长整型unsigned long,默认值为signed long类型。signed int表示的数值范围是-2147483648+2147483647,字节中最高位表示数据的符号,0表示正数,1表示负数。unsigned long表

24、示的数值范围是04294967295。第4章_单片机的C51编程语言2911/29/20224float浮点型浮点型float浮点型在十进制中具有7位有效数字,是符合IEEE-754标准(32)的单精度浮点型数据,占用4B。具有24位精度。第4章_单片机的C51编程语言3011/29/20226bit类型类型bit类型存放逻辑变量,占用一个位地址,C51编译器将把bit类型的变量安排在单片机片内RAM的位寻址区。第4章_单片机的C51编程语言3111/29/2022变量的存储器类型变量的存储器类型存储种类存储种类 数据类型数据类型 存储器类型存储器类型 变量名表变量名表定义变量时,根据51单片

25、机存储器的特点,必须指明该变量所处的单片机的内存空间。C5l编译器支持MCS-51单片机的硬件结构,可完全访问MCS-51硬件系统的所有部分。编译器通过将变量或者常量定义成不同的存储类型(data,bdata,idata,pdata,xdata,code)的方法,将它们定位在不同的存储区中。第4章_单片机的C51编程语言3211/29/2022表表4-5 存储类型与存储空间的对应关系存储类型与存储空间的对应关系存储类型存储类型与存储空间的对应关系与存储空间的对应关系DATA直接寻址片内数据存储区,访问速度快(直接寻址片内数据存储区,访问速度快(128字节)字节)BDATA可位寻址片内数据存储区

26、,允许位与字节混合访问(可位寻址片内数据存储区,允许位与字节混合访问(16字节)字节)IDATA间接寻址片内数据存储区,可访问片内全部间接寻址片内数据存储区,可访问片内全部RAM地址空间(地址空间(256字字节)节)PDATA分页寻址片外数据存储区(分页寻址片外数据存储区(256字节),由字节),由MOVX R0访问访问XDATA片外数据存储区(片外数据存储区(64KB),由),由MOVX DPTR访问访问CODE代码存储区(代码存储区(64KB),由),由MOVC DPTR访问访问第4章_单片机的C51编程语言3311/29/20221DATA区区当使用存储类型data,bdata定义变量时

27、,C5l编译器会将它们定位在片内数据存储区中(片内RAM)。这个存储区的长度为128字节。能快速存取各种数据。片内数据存储区是存放临时性传递变量或使用频率较高的变量的理想场所,所以应该把使用频率高的变量放在DATA区,由于空间有限,必须注意使用DATA区,DATA区除了包含程序变量外,还包含了堆栈和寄存器组DATA区。下面是在DATA区中声明变量的例子。unsigned char data system_status=0;unsigned int data unit_id2;char data inp_string16;float data outp_value;mytype data new

28、_var;在SMALL存储模式下,未说明存储器类型时,变量默认被定位在DATA区。第4章_单片机的C51编程语言3411/29/20222BDATA区区当在DATA区的位寻址BDATA区定义变量,这个变量就可进行位寻址,并且声明位变量。例如:char bdata var8bit;/在位寻址区,定义字符型的变量声明的变量var8bit可以进行位操作运算,可以用sbit在bdata定义变量的基础上声明新的变量,例如:sbit my_bit2=var8bit2;/位变量my_bit2位于变量var8bit的第2位;下面是一些在BDATA区中声明变量和使用位变量的例子。unsigned char bd

29、ata status_byte;编译器不允许在BDATA区中定义float和double类型的变量。第4章_单片机的C51编程语言3511/29/20223IDATA区区IDATA区也可以存放使用比较频繁的变量,使用寄存器作为指针进行寻址。在寄存器中设置8位地址进行间接寻址,与外部存储器寻址比较,它的指令执行周期和代码长度都比较短。对于AT89C52单片机中定义的IDATA变量,如果低128B的RAM容量不够时,C51编译器会自动安排到高128B的区域。下面是一些在IDATA区中声明变量的例子。unsigned char idata system_status=0;unsigned int i

30、data unit_id2;char idata inp_string16;float idata outp_value;第4章_单片机的C51编程语言3611/29/20224PDATA和和XDATA区区PDATA和XDATA用于单片机的片外RAM区,在这两个区声明变量和在其他区的语法是一样的,PDATA区只有256B,而XDATA区可达65536B,举例如下。unsigned char xdata system_status=0;unsigned int pdata unit_id2;char xdata inp_string16;float pdata outp_value;对PDATA

31、和XDATA的操作是相似的,对PDATA和XDATA的寻址要使用MOVX指令,需要2个处理周期。对PDATA区寻址需要装入8位地址,使用Ri的间接寻址方式;而对XDATA区寻址则需要装入16位地址,使用DPTR的间接寻址方式;第4章_单片机的C51编程语言3711/29/20225CODE区区CODE区即MCS-51单片机的程序代码区,所以代码区的数据是不可改变的,读取CODE区存放的数据相当于用汇编语言的MOVC寻址。一般代码区中可存放数据表,跳转向量和状态表,对CODE区的访问和对XDATA区的访问的时间是一样的,代码区中的对象在编译时初始化。下面是代码区的声明例子。unsigned in

32、t code unit_id2=0 x1234,0 x89ab;unsigned char code uchar_data16=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;第4章_单片机的C51编程语言3811/29/2022CODE区共64K00000FFFFFFF片内ROM4KXDATA区共64K00000FFFFFFFIDATA区128BSFR通用RAM位寻址区寄存器区001F2F7F80FFDATA区128B程序存储器ROM内部数据存储区R

33、AM外部数据存储区RAM第4章_单片机的C51编程语言3911/29/2022如果在变量定义时省略了存储器类型标识符,C51编译器会选择默认的存储器类型。默认的存储器类型由SMALL、COMPACT和LARGE存储模式(memory models)指令决定。存储模式是编译器的编译选项。在KEIL C编译器中存储模式的选择参见附录三。1小模式小模式(small model)。在小模式下,所有未声明存储器类型的变量,都默认驻留在内部数据区,即这种方式和用DATA进行显示说明一样。2紧凑模式紧凑模式(compact model)。在紧凑模式下,所有未声明存储器类型的变量,都默认驻留在外部数据区的一个

34、页上。即这种方式和用PDATA进行变量存储器类型的说明是一样的。该模式利用R0和R1寄存器来进行间接寻址(R0和Rl)。3大模式大模式(large model)。在大模式下,所有未声明存储器类型的变量,都默认驻留在外部数据存储区,即和用XDATA进行显示说明一样。此时最大可寻址64KB的存储区域,使用数据指针寄存器(DPTR)来进行间接寻址。第4章_单片机的C51编程语言4011/29/2022在不同存储器类型下等价于下面的变量声明:unsigned char data var1;/*SMALL模式,var1被定位在DATA区*/*即片内直接寻址RAM*/unsigned char pdata

35、 var1;/*COMPACT模式,var1被定位在PDATA区,即片外按页面间接寻址RAM*/unsigned char xdata var1;/*LARGE模式,var1被定位在XDATA区*/*即片外间接寻址RAM*/为了提高系统运行速度,建议在编写源程序时,把存储模式设定为SMALL,必要时在程序中把XDATA、PDATA和IDATA等类型变量进行专门声明。第4章_单片机的C51编程语言4111/29/2022由于单片机特殊的结构,为编程的需要,C51语言扩展了ANSI C的数据类型。这些数据类型与单片机的结构以及存储区域相关。第4章_单片机的C51编程语言4211/29/2022C5

36、1使用sfr对MCS-51中的特殊功能寄存器进行定义,这种定义方法与标准C语言不兼容,只适用于对MCS-51系列单片机进行C编程。可以把sfr认为是一种扩充数据类型,占用一个内存单元,值域为0 x800 xFF。定义方法是引人关键字sfr,语法如下:sfr 变量名变量名=SFR中的地址中的地址注意:sfr后面必须跟一个特殊寄存器名,“=”后面的地址必须是常数,不允许带有运算符的表达式。sfr P0=0 x80sfr P1=0 x90第4章_单片机的C51编程语言4311/29/2022sfr16用于定义存在于MCS-51单片机内部RAM的16位特殊功能寄存器。当SFR的高端地址直接位于其低端地

37、址之后时,对SFRl6位值可以进行直接访问。例如AT89C52的定时器2就是这种情况。为了有效地访问这类SFR,可使用关键宇“sfrl6”。16位SFR定义的语法与8位SFR相同,16位SFR的低端地址必须作为“sfrl6”的定义地址。例如:sfr16 T2=0 xcc /定义定时器定义定时器2为为T2:TL2为为0CCH,TH2为为0CDH等价于,对等价于,对TL2和和TH2分别定义。分别定义。sfr TL2 =0 xCC;sfr TH2 =0 xCD;第4章_单片机的C51编程语言4411/29/2022位变量可以用来定义变量、函数返回值的类型,用bit关键字来定义。位变量是C51编译器的

38、一种扩充数据类型,它的值是一个二进制位,不是0,就是1,类似一些高级语言中布尔(Boolean)变量的True和False。利用bit可定义一个位变量,但不能定义位指针,也不能定义位数组。所有的位变量都存储在内部RAM的位寻址区中(10H1FH),在一个作用域中最大可声明128个位变量。bit变量的声明与其他变量相同,例如:bit done_flag=0/定义位变量done_flag,初值为0bit func(bit bvar1)/bit 类型的函数bit bvar2;return(bvar2);/返回值是bit类型第4章_单片机的C51编程语言4511/29/2022用关键字sbit定义位寻

39、址的特殊功能寄存器的位寻址对象。定义方法有如下三种:(1)sbit 位变量名位变量名=位地址位地址 位地址必须位于0 x80H0 xFF之间。(2)sbit 位变量名位变量名=特殊功能寄存器名特殊功能寄存器名位位置位位置 位位置是一个07之间的常数。(3)sbit 位变量名位变量名=字节地址字节地址位位置位位置字节地址作为基地址,在0 x80H0 xFF之间。位位置是一个07之间的常数。第4章_单片机的C51编程语言4611/29/2022例如可用下面三种方法定义PSW中的第7位CY,结果相同:sbit CY=0 xD7/用绝对位地址表示PSW中的第7位,参见表2-4sbit CY=PSW7/

40、必须事先已经定义了PSWsbit CY=0 xD07/PSW的字节地址为0 xD0,参见表2-4MCS-51单片机中的特殊功能寄存器和特殊功能寄存器可寻址位,已被预先定义放在文件reg51.h中,在程序的开头只需加上#include或#include即可。sbit和bit的区别:sbit定义特殊功能寄存器中的可寻址位;而bit则定义了一个普通的位变量,一个函数中可包含bit类型的参数,函数返回值也可为bit类型。另外,sbit还可访问MCS-51单片机片内20H2FH范围内的位对象。C51编译器提供了一个bdata存储器类型,允许将具有bdata类型的对象放入MCS-51单片机片内可位寻址区。

41、第4章_单片机的C51编程语言4711/29/20224.4 C51语言的数组、指针与结构语言的数组、指针与结构4.4.1 数组与指针数组与指针4.4.2 对绝对地址进行访问对绝对地址进行访问第4章_单片机的C51编程语言4811/29/2022数组是一个由同种类型的变量组成的集合,它保存在连续的存储区域中,第一个元素保存在最低地址中,最末一个元素保存在最高地址中。数组的定义方式如下:数据类型数据类型 存储器类型存储器类型 数组名数组名常量常量1常量常量2常量常量n例如在程序存储器中用一维数组定义7段共阴LED数码显示的字形表,数组值分别对应09的显示数字。unsigned char code

42、 LEDvalue10=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6fchar array=”Hello World”第4章_单片机的C51编程语言4911/29/20222指针指针指针是指某个变量所占用存储单元的首地址。用来存放指针值的变量称为指针变量。指针变量的定义格式为:类型说明符类型说明符*指针变量名指针变量名其中:“*”表示定义的是指针变量;类型说明符表示该指针变量指向的变量的类型。C5l语言的指针和标准C语言中的指针功能相同。char*s;/指向字符类型的指针char*str4;/定义字符类型的指针数组int*

43、numptr;/指向整型类型的指针第4章_单片机的C51编程语言5011/29/2022由于MCS-51存储器结构的特殊性,C51语言还提供指定存储器类型的指针,在声明时定义指针指向的存储器类型,也称为基于存储器类型的指针,例如:char data*str;/指针指向data区的字符int xdata*numtab;/指针指向xdata区的整型变量unsigned char code*powtab/指针指向code区的无符号字符这种基于存储器类型的指针,因为存储器类型在编译时就已经指定了,所以指针可以保存在一个字节(idata、data、bdata等)或两个字节(code和xdata类型指针)

44、中。第4章_单片机的C51编程语言5111/29/20223指针的应用例4-3 指针的应用/*ex4-3.c,将外部RAM地址1000H开始的10个字节读入到内部RAM中*/#include /定义MCS-51的特殊功能寄存器SFR#define XRAMaddr(unsigned char xdata*)0 x1000/外部RAM的开始地址unsigned char xdata*ptr;main()char i;unsigned char data array10;ptr=XRAMaddr;for(i=0;i10;i+)arrayi=ptri;while(1);第4章_单片机的C51编程语言

45、5211/29/2022结构变量是将互相关联的、多个不同类型的变量结合在一起形成的一个组合形变量,简称结构。构成结构的各个不同类型的变量称为结构元素(或成员),其定义规则与变量的定义相同。一般先声明结构类型,再定义结构变量。定义一个结构类型的格式为:struct结构名结构名 结构成员说明结构成员说明结构成员还可以是其他已定义的结果,结构成员说明的格式为:类型标识符类型标识符 成员名;成员名;C51结构定义的格式为:Struct 结构名结构名 变量表;变量表;第4章_单片机的C51编程语言5311/29/2022例4-4 结构与结构变量的定义struct date/定义名称为date的结构类型u

46、nsigned char month;unsigned char day;unsigned char year;struct date date1,date2/定义结构变量date1和date2对结构变量中成员的访问使用“.”运算符,例如:date1.year=07date1.month=1date1.day=25第4章_单片机的C51编程语言5411/29/20221使用指针指针是C语言中十分重要的概念,MCS-51的总线工作方式下对绝对地址的操作,在使用C51编程时常用指针操作。C51语言中提供的两个专门用于指针和地址的运算符:*取内容取内容&取地址取地址取内容和取地址运算的一般形式分别为

47、:变量变量=*指针变量指针变量指针变量指针变量=&目标变量目标变量第4章_单片机的C51编程语言5511/29/2022例4-5 使用指针对指定地址进行访问#define uchar unsigned char#define uint unsigned intvoid test_memory(void)uchar idata ivar1;uchar xdata*xdp;/*定义一个指向XDATA存储器空间的指针*/char data*dp;/*定义一个指向DATA存储器空间的指针*/uchar idata*idp;/*定义一个指向IDATA存储器空间的指针*/xdp=0 x1000;/*XDA

48、TA指针赋值,指向XDATA存储器地址1000H处*/*xdp=0 x5A;/*将数据5AH送到XDATA的1000H单元*/dp=0 x61;/*DATA指针赋值,指向DATA存储器地址61H处*/*dp=0 x23;/*将数据23H送到DATA的61H单元*/idp=&ivar1;/*idp指向IDATA区变量ivar1*/*idp=0 x16;/*等价于ivar1=0 x16*/第4章_单片机的C51编程语言5611/29/20222使用使用C51扩展关键字扩展关键字 _at_ 对确定地址进行访问对确定地址进行访问使用_at_对指定的存储器空间的绝对地址进行定位。格式如下:存储器类型存储

49、器类型 数据类型数据类型 标识符标识符 _at_ 常数常数当对外部接口的地址进行读写时,存储器类型为xdata数据类型;数据类型通常为uchar的1字节类型;使用_at_定义的变量必须为全局变量。例4-6 用关键字 _at_ 访问指定地址/*将地址为1000H的内容读入。*/#include /定义MCS-51的特殊功能寄存器SFR unsigned char xdata y1 _at_ 0 x1000;main()unsigned char x1;x1=y1;while(1);第4章_单片机的C51编程语言5711/29/20223使用C51运行库中预定义宏C51编译器提供了一组宏定义用来对

50、MCS-51系列单片机的CODE、DATA、PDATA和XDATA空间进行绝对地址访问。函数原型如下:#define CBYTE(unsigned char volatile code*)0)#define DBYTE(unsigned char volatile idata*)0)#define PBYTE(unsigned char volatile*pdata)0)#define XBYTE(unsigned char volatile*xdata)0)这些函数原型放在absacc.h文件中。例如 uchar uc_var1;uc_var1=XBYTE 0 x0002;/*访问外部 RA

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(第4章-单片机的C51编程语言课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|