版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
以单片机为核心的开发应用系统,主要工作包括两部分。一部分是针对系统的具体要求设计相关的硬件电路;另一部分就是在硬件设计好后,快速地进行软件设计和系统调试,MCS-51的编程语言常用的有两种,一种是汇编语言,一种是C语言。汇编语言的机器代码生成效率高,但可读性不强,复杂一点的程序就更难读懂,而C语言在大多数情况下其机器代码生成效率和汇编语言相当,但可读性和可移植性远远超过汇编语言,而且C语言还可以嵌人汇编语言来解决高时效性的代码编写问题。对于开发周期来说,中大型的软件编写用C语言的开发周期通常要小于汇编语言很多。早期人们大多使用MCS-51汇编语言进行软件设计,对于应用系统相对简单,程序量不大的系统,人们常使用MCS-51汇编语言进行软件设计。随着MCS-51系列单片机应用的普及,各开发公司相继推出了基于C语言模式的C51编程开发环境。返回第9章MCS-51单片机的C语言编程(关)
(1)对单片机的指令系统、硬件不要求了解,仅要求对MCS-51的存储器结构有初步了解,就能够编程。
(2)程序有规范的结构,易于结构化、模块化和移植,已编好的程序可以很容易地植入新程序。(3)寄存器分配、存储器的寻址及数据类型,中断服务程序的现场保护和恢复,中断向量表的填写都由C51编译器处理。
(4)提供丰富的库函数供用户直接调用,不同函数的数据实行覆盖,有效地荆用了片上有限的RAM空间。具有较强的数据处理能力。
(5)C51提供了复杂的数据类型(数组、结构、联合、枚举、指针等),极大地增强了程序处理能力和灵活性;返回下一页9.1C51简介
提供auto,extern,static,const等存储类型和专门针对MCS-51单片机的data,bdata,idata,pdata,xdata,code等存储类型,自动为变量合理地分配地址;提供small,compact,large等编译模式,以适应片上存储器的大小;完整的编译控制指令为程序调试提供必要的符号信息。
(6)头文件中允许定义宏、说明复杂数据类型和函数原型,有利于程序的移植和支持单片机的系列化产品的开发。
(7)可方便地接受多种实用程序的服务,有专门的实用程序自动生成;有实时多任务操作系统,可调度多道任务,简化用户编程,提高运行的安全性等。
返回下一页9.1C51简介
上一页2)单片机C51语言与C语言的异同单片机的C51是继承了标准C的绝大部分的特性,基本语法相同,但其本身在特定的硬件结构上又有所扩展(如专门针对MCS-51单片机的存储类型等),需要在C51的实际编程应用过程中逐步体会。9.1.2C51的基本语法
1)C51的程序结构
C51与一般C语言的结构相同,以main()函数为程序入口,程序体中包含若干语句,还可以包含若干函数。
2)C51的数据类型常用的数据类型有位型(bit,1位)、字符型(char,1字节)、整型(int,2字节)、长整型(longint,4字节)、浮点型(float,4字节)、数组型、指针型等。
返回下一页9.1C51简介
上一页3)C51数据的存储类型
C51数据的存储类型如表9.1-1所列。4)C51包含的头文件C51包含的头文件通常有reg51.h,math.h,ctype.h,stdio.h,stdlib.h,ab-sacc.h。其中,常用的有reg51.h(定义特殊功能寄存器和位寄存器)和math.h(定义常用数学运算)。
5)C51的运算符
C51的运算符与C语言基本相同。算术运算符:+(加)、一(减)、*(乘)、/(除)。关系运算符:>(大于),>=(大于或等于),<(小于),<=(小于或等于)、=(等于)、!=(不等于)、&&(逻辑与)、11(逻辑或)、!(逻辑非)。
返回下一页9.1C51简介
上一页位运算符:>>(位右移)、<<(位左移),&(按位与)、1(按位或)、^(按位异或)、~(按位取反)。6)C51的基本语句
C51的基本语句与标准C语言基本相同:if<选择语句)、switch/case(多分支选择语句)、while(循环语句),for(循环语句)、do-while(循环语句)等。9.1.3C51编译器
KeilC51交叉编译器是专为80C51系列单片机设计的一种高效的C语言编译器,使用它可以缩短开发周期,降低开发成本,而且开发出的系统易于维护,可靠性高,可移植性好,代码的使用效率高。返回下一页9.1C51简介
上一页1)C51语言程序设计的基本技巧
(1)采用结构化程序设计。
(2)采用模块化程序设计,可以指定功能模块相应的入口参数和出口参数,而经常使用的一些程序最好编成函数。
(3)充分利用C51语言的预处理命令。
(4)采用宏定义“#define"(或集中起来)将一些常用的常数、各种特殊功能寄存器或程序中一些重要的、依据外界条件可变的常量放在一个头文件中进行定义,然后采用文件包含命令“#include"将其加人到程序中去,便于修改,有利于文件的维护和更新。返回下一页9.1C51简介
上一页2)C51语言与汇编语言程序的混合编程有时为了编程直观或某些特殊地址的处理,C51程序中还须采用一些汇编语言编程。由于某种目的,汇编语言也可调用C语言。在这种混合编程中,关键是参数的传递和函数的返回值。它们必须有完整的约定,否则数据的交换就可能出错。
3)C51中断处理过程
C51编译器支持在C源程序中直接开发中断。中断服务函数的完整语法如下:void函数名(void)[模式][再入]interruptn[usingr]其中,n(0~31)代表中断号;r(0~3)代表第r组寄存器;[再入]一说明中断处理函数有无“再入”能力。返回9.1C51简介
上一页要使用KeilC51软件必须要安装它。KeilC51是一个商业的软件,对于我们这些普通爱好者可以到Keil中国代理周立功公司的网站上下载一份能编译2K的Demo版软件,基本可以满足一般的个人学习和小型应用的开发。安装好后,可以建立一个小程序项目,可以选择一块实验板进行调试,如果没有一块单片机实验板,可以通过Keil软件仿真看到程序运行的结果。9.2.1C51开发系统简介
1)系统概述
KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统。返回下一页9.2MCS-51C语言程序运行基本过程及程序基本结构其特点是提供丰富的库函数和功能强大的集成开发调试工具,全Win-doves界面;生成的目标代码效率非常高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。
2)KeilC51单片机软件开发系统的功能
KeilC51单片机软件开发系统可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用集成开发环境IDE本身或其他编辑器编辑C或汇编源文件。然后分别由C51及A51编译器编译生成目标文件(.OBJ)。目标文件可由L51创建生成库文件,也可以与库文件一起,经L51连接定位,生成绝对目标文件(.ABS)。
KeilC51工具包各部分功能如下。返回下一页9.2MCS-51C语言程序运行基本过程及程序基本结构上一页(1)C51是C语言编译器,其使用方法如下:C51sourcefile[编译控制指令]或者C51@commandfile其中,sourcefile--C源文件(.C)。大量的编译控制指令完成C51编译器的全部功能。包括C51输出文件C.LST,.OBJ,.I和.SRC文件及源文件(.C)的控制等。
Commandfile-一一个连接控制文件,其内容包括:.C源文件及各编译控制指令,它没有固定的名字,开发人员可根据自己的习惯指定,它适用于控制指令较多的场合。
(2)A51是汇编语言编译器,使用方法如下:
返回下一页9.2MCS-51C语言程序运行基本过程及程序基本结构上一页A51sourcefile[编译控制指令]或者A51@commandfile其中,sourcefile为汇编源文件(.asm或.a51),而编译控制指令的使用与其他汇编(如ASM)语言类似;commandfile为C51中的Commandfile类似,它使A51的使用和修改比较方便。(3)L51是KeilC51软件包提供的连接器/定位器,其功能是将编译生成的.OBJ文件与库文件连接定位,生成绝对目标文件(.ABS>,其使用方法如下:L51目标文件列表[库文件列表][tooutputfile][连接控制指令]或者L51@Commandfile
源程序的多个模块分别经C51与A51编译后生成多个.OBJ文件,连接时,这些文件全部列于目标文件列表中,作为输人文件,如果还需与库文件(.LIB)相连接,则库文件也必须列在其后。返回下一页9.2MCS-51C语言程序运行基本过程及程序基本结构上一页其中,outputfile为输出文件名,默认为第一模块名,后缀为.ABS。连接控制指令提供了连接定位时的所有控制功能;commandfile为连接控制文件,其具体内容包括了目标文件列表、库文件列表及输出文件、连接控制命令。第2种方法简单,在设计时较多见。
(4)BL51也是C51软件包的代码连接器/定位器,除具有L51的所有功能外,它还可以连接定位大于64KB的程序,具有代码域及域切换功能,可用于RTX51操作系统等功能。
(5)RTX51是一个实时多任务操作系统,可以不用main()函数,是单片机系统软件向RTOS发展是一种趋势。返回下一页9.2MCS-51C语言程序运行基本过程及程序基本结构上一页(6)dScope5l是一个源级调试器和模拟器,它可以调试由C51编译器、A51汇编器、PL/M-51编译器及ASM-51汇编器产生的程序。它不需目标板,只能进行软件模拟,但其功能强大,可模拟CPU及其外围器件,能对嵌人式软件功能进行有效测试。
(7)Initfile为一个初始化文件,它在启动dScope5l后,在debugfile之前装入,装有一些dScope的初始化参数及常用调试函数等。
(8)tScope5l也为一个初始化文件,与dScope5l不同的是,tScope5l必须带目标板,目前它可以通过两种方式访问目标板。①通过EMul51在线仿真器,tScope5l为该仿真器准备了一个动态连接文件EMUL51.IOT,但该方法必须配合该仿真器。返回下一页9.2MCS-51C语言程序运行基本过程及程序基本结构上一页②通过Monitor51监控程序。tScope51为访问Monitor51,专门带有MON51.IOT连接程序,使用时可通过串口及监控程序来调试目标板。
(9)Monitor51是一个监控程序,通过PC的串口与目标板进行通信,Monitor操作需要MON51或dScope5lforWindowso(10)IshellforDOS是一个DOS环境下的IDE,直接在命令行输人Ishell,则进人该环境。它使用简单方便,其命令行与ms命令行具有同样的功能。
(11)uVisionforWindows是一个标准的Windows应用程序,它是C51的一个集成软件开发平台,具有源代码编辑、Project管理、集成的Make等功能,它的人机界面友好,操作方便,是开发者的首选。返回下一页9.2MCS-51C语言程序运行基本过程及程序基本结构上一页3)KeilC51与标准C
对标准C的扩展是学习C51的关键之一。C51直接针对8051系列CPU对标准C的扩展包括8051存储类型及存储区域、存储模式、存储器类型声明、变量类型声明、位变量与位寻址、特殊功能寄存器(SFR),C51指针、函数属性等8类。
(1)KeilC51扩展关键字。
C51V4.0的扩展关键字如下(共19个):atidatasfr16alieninterruptsmallbdatalargetaskcodebitpdatausingreentrantxdatacompactshitdatasfr
返回下一页9.2MCS-51C语言程序运行基本过程及程序基本结构上一页(2)内存区域(MemoryAreas)。①由code说明可有多达64KB的程序存储器。②内部数据存储器可用以下关键字说明:data:直接寻址区,为内部RAM的低128字节OOH~7FH;idata:间接寻址区,包括整个内部RAM区OOH~FFH;bdata:可位寻址区,20H~2FHo③外部RAM视使用情况可由以下关键字标志:xdata:可指定多达64KB的外部直接寻址区,地址范围OOOOH~OFFFFH;pdata:能访问1页(256B)的外部RAM,主要用于紧凑模式(CompactModel)。
返回下一页9.2MCS-51C语言程序运行基本过程及程序基本结构上一页.8051提供128B的SFR寻址区,可由以下几种关键字说明:sfr:字节寻址,如sfrPO=0x80,指出PO口地址为80H,“=”后为OOH~FFH之间的常数。sfr16:字寻址,如sfr16T2=OxCC,指定T2口地址为TL2=OxCCH,TH2=OxCDH。shit:位寻址,如shitEA=OxAF,指定第。xAFH位为EA,即中断允许。还可以有如下定义方法:shitOV=PSW2(定义(}V为PSW的第2位)sbitOV=OxDo'2(同上)或bitOV=OxDo2(同上)。返回下一页9.2MCS-51C语言程序运行基本过程及程序基本结构上一页9.2.2C51程序开发过程及运行环境先是运行KeilC51软件。运行几秒后,出现如图9.2-1的屏幕。接着按下面的步骤建立第一个项目:(1)点击Project菜单,选择弹出的下拉式菜单中的NewProject,如图9.2-2所示。接着弹出一个标准Windows文件对话窗口,如图9.2-3所示。在“文件名”中输人您的第一个C程序项目名称,这里我们用“test",只要符合Windows文件规则的文件名都行。“保存”后的文件扩展名为uv2,这是KeiluVision2项目文件扩展名,以后可以直接点击此文件以打开先前做的项目。返回下一页9.2MCS-51C语言程序运行基本过程及程序基本结构上一页(2)选择所要的单片机,这里我们选择常用的Ateml公司的AT89C51。屏幕如图9.2-4所示。完成上面步骤后,就可以进行程序的编写了。(3)要在项目中创建新的程序文件或加人旧程序文件。如果没有现成的程序,就要新建一个程序文件。在KeilC51中有一些Demo程序,在这里介绍如何新建一个C程序。点击图9.2-5中1的新建文件的快捷按钮,在2中出现一个新的文字编辑窗口,这个操作也可以通过菜单File-New或快捷键Ctrl+N来实现。光标已出现在文本编辑窗口中,可以输人第一个简单的程序。下面是经典的一段程序。返回下一页9.2MCS-51C语言程序运行基本过程及程序基本结构上一页(4)点击图9.2-5中的工具按钮3保存新建的程序,也可以用菜单File-Save或快捷键Ctrl+S进行保存。因是新文件所以保存时会弹出类似图9.2-3的文件操作窗口,我们把第一个程序命名为testl.c,保存在项目所在的目录中,这时程序单词有了不同的颜色,说明KEIL的C语法检查生效了。如图9.2-6鼠标在屏幕左边的SourceGroupl文件夹图标上右击弹出菜单,在这里可以做在项目中增加减少文件等操作。在AddFiletoGroup`SourceGroup1’弹出文件窗口,选择刚刚保存的文件,按ADD按钮,关闭文件窗,程序文件已加到项目中了。在SourceGroupl文件夹图标左边出现了一个小“+”号说明,文件组中有了文件,点击它可以展开查看。返回下一页9.2MCS-51C语言程序运行基本过程及程序基本结构上一页(2)选择所要的单片机,这里我们选择常用的Ateml公司的AT89C51。屏幕如图9.2-4所示。完成上面步骤后,就可以进行程序的编写了。(3)要在项目中创建新的程序文件或加人旧程序文件。如果没有现成的程序,就要新建一个程序文件。在KeilC51中有一些Demo程序,在这里介绍如何新建一个C程序。点击图9.2-5中1的新建文件的快捷按钮,在2中出现一个新的文字编辑窗口,这个操作也可以通过菜单File-New或快捷键Ctrl+N来实现。光标已出现在文本编辑窗口中,可以输人第一个简单的程序。下面是经典的一段程序。返回下一页9.2MCS-51C语言程序运行基本过程及程序基本结构上一页(5)C程序文件已被加到了项目中了。这个项目只是用做学习新建程序项目和编译运行仿真的基本方法,所以使用软件默认的编译设置,它不会生成用于芯片烧写的HEX文件。图9.2-7中的按钮1,2,3都是编译按钮。其中:1是用于编译单个文件;2是编译当前项目,如果先前编译过一次之后文件没有做过编辑改动,这时再点击是不会再次重新编译的;3是重新编译,每点击一次均会再次编译链接一次。在3右边的是停止编译按钮,只有点击了前三个中的任一个,停止按钮才会生效。5是菜单是用选择上述功能。这个项目只有一个文件,按1,2,3中的任一个按钮都可以编译。在4的位置可以看到编译的错误信息和使用的系统资源情况等。6是一个小放大镜的按钮,这就是开启\关闭调试模式的按钮,它也存在于菜单Debug-Start\StopDebugSession,快捷键为Ctrl+F5。返回下一页9.2MCS-51C语言程序运行基本过程及程序基本结构上一页(6)进人调试模式,软件窗口样式如图9.2-8所示。图中1为运行,当程序处于停止状态时才有效;2为停止,程序处于运行状态时才有效;3是复位,模拟芯片的复位,程序回到最开头处执行;按4可以打开5中的串行调试窗口,这个窗口可以看到从MCS-51芯片的串行口输人和输出的字符,这栏的第一个项目也正是在这里看运行结果。按4打开串行调试窗口,再按运行键,可以看到串行调试窗口中不断地打出“HelloWorldl"。这样就完成了您的第一个C项目。最后要停止程序运行回到文件编辑模式中,就要先按停止按钮再按开启\关闭调试模式按钮。然后就可以进行关闭KeilC51等相关操作了。返回9.2MCS-51C语言程序运行基本过程及程序基本结构上一页9.3.1数据类型
C语言的标识符:标识符是用来标识源程序中某个对象的名字的,这些对象可以是语句、数据类型、函数一变量一数组等。C语言是大小字符敏感的一种高级语言,如定义一个定时器1,可以写作“Timerl",如果程序中有“TIMERl",是两个完全不同定义的标识符。标识符由字符串、数字和下划线等组成,第一个字符必须是字母或下划线,如果,"1Timer”是错误的,编译时便会有错误提示。有些编译系统专用的标识符是以下画线开头,一般不以下画线开头命名标识符。标识符在命名时应当简单,含义清晰,这样有助于阅读理解程序。在C51编译器中,只支持标识符的前32位为有效标识。返回下一页9.3MCS-51C语言数据类型及定义关键字:关键字则是编程语言保留的特殊标识符,它们具有固定名称和含义,在程序编写中不允许标识符与关键相同。在KeiluVision2中的关键字除了有ANSIC标准的32个关键字外还根据MCS-51单片机的特点扩展了相关的关键字。其实在KeiluVision2的文本编辑器中编写C程序,系统可以把保留字以不同颜色显示,缺省颜色为天蓝色。数据类型:表9.3-1列出了KeiluVision2C51编译器所支持的数据类型。在标准C语言中基本的数据类型为char,int,short,long,float和double,而在C51编译器中int和short相同,float和double相同。返回下一页9.3MCS-51C语言数据类型及定义上一页1)char字符类型
char类型的长度是一个字节,通常用于定义处理字符数据的变量或常量。分无符号字符类型unsignedchar和有符号字符类型signedchar,默认值为signedchar类型。unsignedchar类型用字节中所有的位来表示数值,所能表达的数值范围是0~255osignedchar类型用字节中最高位字节表示数据的符号,“0’’表示正数,+1;表示负数,负数用补码表示。所能表示的数值范围是-128~+127。un-signedchar常用于处理ASCII字符或处理小于或等于255的整型数。*正数的补码与原码相同,负二进制数的补码等于它的绝对值按位取反后加1。
2)int整型
int整型长度为两个字节,用于存放一个双字节数据。返回下一页9.3MCS-51C语言数据类型及定义上一页分有符号int整型数signedint和无符号整型数unsignedint,默认值为signedint类型。signedint表示的数值范围是-32768~+32767,字节中最高位表示数据的符号,”0”;表示正数,+1;表示负数。unsignedint表示的数值范围是0~6553503)long长整型
long长整型长度为四个字节,用于存放一个4字节数据。分有符号long长整型signedlong和无符号长整型unsignedlong,默认值为signedlong类型。signedint表示的数值范围是-2147483648~+2147483647,字节中最高位表示数据的符号,”0”;表示正数,+1;表示负数。unsignedlong表示的数值范围是0~4294967295。
返回下一页9.3MCS-51C语言数据类型及定义上一页4)float浮点型
float浮点型在十进制中具有7位有效数字,是符合IEEE-754标准的单精度浮点型数据,占用四个字节。5)*指针型指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量要占据一定的内存单元,对不同的处理器长度也不尽相同,在C51中它的长度一般为1~3个字节。指针变量也具有类型。
6)bit位变量
bit位变量是C51编译器的一种扩充数据类型,利用它可定义一个位变量,但不能定义位指针,也不能定义位数组。返回下一页9.3MCS-51C语言数据类型及定义上一页它的值是一个二进制位,取值0或1,类似一些高级语言中的Boolean类型中的True和False。7)sfr特殊功能寄存器
sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255。利用它可以访问51单片机内部的所有特殊功能寄存器。如用sfrP1=0x90这一句定义P1为P1端口在片内的寄存器,在后面的语句中可以用P1=255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。
8)sfr1616位特殊功能寄存器
sfr16占用两个内存单元,值域为0~65535。sfr16和sfr一样用于操作特殊功能寄存器,所不同的是它用于操作占两个字节的寄存器,如定时器T0和T1。返回下一页9.3MCS-51C语言数据类型及定义上一页9)sbit可寻址位
shit同样是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。如先前定义了
sfrPl=0x90;
因P1端口的寄存器是可位寻址的,所以可以定义
shitP1_1=P1^1;P1_1为P1中的P1.1引脚同样可以用Pl.1的地址去写,如shitPl_1=0x91
这样在以后的程序语句中就可以用P1_1来对P1.1引脚进行读写操作了。通常这些可以直接使用系统提供的预处理文件,里面已定义好各特殊功能寄存器的简单名字,也可以自己写自己的定义文件,用认为好记的名字。返回下一页9.3MCS-51C语言数据类型及定义上一页9.3.2常量常量是在程序运行过程中不能改变值的量,常量的数据类型只有整型、浮点型、字符型、字符串型和位标量。
(1)整型常量可以表示为十进制如123,0,-89等。十六进制则以Ox开头如0x34,-0x3B等。长整型就在数字后面加字母L,如104L,034L,OxF340等。
(2)浮点型常量可分为十进制和指数表示形式。十进制由数字和小数点组成,如0.888,3345.345,0.0等,整数或小数部分为0,可以省略但必须有小数点。指数表示形式为[±]数字[.数字]e[±]数字,[]中的内容为可选项,其中内容根据具体情况可有可无,但其余部分必须有,如125e3,7e9,-3.0e-3。
返回下一页9.3MCS-51C语言数据类型及定义上一页(3)字符型常量是单引号内的字符,如‘a’,`d‘等,不可以显示的控制字符,可以在该字符前面加一个反斜杠“\’’组成专用转义字符。常用转义字符表如表9.3-2所示。(4)字符串型常量由双引号内的字符组成,如“test","OK”等。当引号内没有字符时,为空字符串。在使用特殊字符时同样要使用转义字符如双引号。在C语言中字符串常量是作为字符类型数组来处理的,在存储字符串时系统会在字符串尾部加上‘\o’转义字符以作为该字符串的结束符。字符串常量“A”和字符常量‘A’是不同的,前者在存储时多占用一个字节的字间。(5)位常量,它的值是一个二进制数。
返回下一页9.3MCS-51C语言数据类型及定义上一页常量可用在不必改变值的场合,如固定的数据表、字库等。常量的定义方式有几种,下面来加以说明。
#difineFalse0x0;//用预定义语句可以定义常量
#difineTrue0x1;//这里定义False为O,True为1//在程序中用到False编译时自动用0替换,同理True替换为1unsignedintcodea=100;//这一句用code把a定义在程序存储器中并赋值
constunsignedintc=100;//用const定义c为无符号int常量并赋值以上两句它们的值都保存在程序存储器中,而程序存储器在运行中是不允许被修改的,所以如果在这两句后面用了类似a=110,a++这样的赋值语句,编译时将会出错。返回下一页9.3MCS-51C语言数据类型及定义上一页编译运行上面的程序,然后按外部设备菜单Peripherals一I/OPorts-Portl就打开Portl的调试窗口了,如图9.3-4中的2。这时程序运行了,但并不能在Portl调试窗口上看到有会什么效果,可以用鼠标左击图9.3-4中1旁边绿色的方条,点一下就有一个小红方格,再点一下又没有了,哪一句语句前有小方格,程序运行到那一句时就停止了,就是设置调试断点,同样图9.3-3中的1也是同样功能,分别是增加/去除断点、去除所有断点、允许/禁止断点、禁止所有断点,菜单也有一样的功能,另外菜单中还有Breakpoints可打开断点设置窗口它的功能更强大。对P1=design[b];这一句设置一个断点,程序运行到这里就停住了,再留意一下Portl调试窗口,再按图9.3-3中的2的运行键,程序又运行到设置断点的地方停住了,这时Portl调试窗口的状态又不同了。返回下一页9.3MCS-51C语言数据类型及定义上一页也就是说Portl调试窗口模拟了P1口的电平状态,打勾为高电平,不打勾则为低电平,窗口中P1为P1寄存器的状态,Pins为引脚的状态,注意的是如果是读引脚值必须把引脚对应的寄存器置1才能正确读取。图9.3-3中2旁边的{}样的按钮分别为单步入,步越,步出和执行到当前行。图中3为显示下一句将要执行的语句。图9.3-4中的3是Watches窗口可查看各变量的当前值,数组和字串是显示其头一个地址,如本例中的design数组是保存在code存储区的首地址为D:0x08,可以在图中4Memory存储器查看窗口中的Address地址中打人D:0x08,就可以查看到design各数据和存放地址了。如果uVision2没有显示这些窗口,可以在View菜单中打开图9.3-3中3后面一栏的查看窗口快捷栏。返回下一页9.3MCS-51C语言数据类型及定义上一页9.3.3变量变量就是一种在程序执行过程中其值能不断变化的量。要在程序中使用变量必须先用标识符作为变量名定义变量,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。定义一个变量的格式如下:[存储种类]数据类型[存储器类型]变量名表在定义格式中除了数据类型和变量名表是必要的,其他都是可选项。存储种类有四种:自动(auto)、外部(extern)、静态(static)和寄存器(register),缺省类型为自动(auto).
返回下一页9.3MCS-51C语言数据类型及定义上一页说明了一个变量的数据类型后,还可选择说明该变量的存储器类型。存储器类型的说明就是指定该变量在C51硬件系统中所使用的存储区域,并在编译时准确的定位。表9.3-3中是KeiluVision2所能识别的存储器类型。在AT89C51芯片中RAM只有低128位,位于80H~FFH的高128位则在52芯片中才有用,并和特殊寄存器地址重叠。如果省略存储器类型,系统则会按编译模式SMALL,COMPACT或LARGE所规定的默认存储器类型去指定变量的存储区域。无论什么存储模式都可以声明变量在任何的8051存储区范围,一般把最常用的命令如循环计数器和队列索引放在内部数据区可以显著地提高系统性能。变量的存储种类与存储器类型是完全无关的。返回下一页9.3MCS-51C语言数据类型及定义上一页SMALL存储模式把所有函数变量和局部数据段放在8051系统的内部数据存储区,这使访问数据非常快,但SMALL存储模式的地址空间受限。在写小型的应用程序时,变量和数据放在data内部数据存储器中访问速度快,但在较大的应用程序中data区最好只存放小的变量、数据或常用的变量(如循环计数、数据索引),而大的数据则放置在别的存储区域。
COMPACT存储模式中所有的函数和程序变量和局部数据段定位在8051系统的外部数据存储区。外部数据存储区可有最多256B(一页),在本模式中外部数据存储区的短地址用@R0/R1。
LARGE存储模式所有函数反过程的变量和局部数据段都定位在8051系统的外部数据区,外部数据区最多可有64KB,这要求用DPTR数据指针访问数据。返回下一页9.3MCS-51C语言数据类型及定义上一页sfr和sfr16可以直接对51单片机的特殊寄存器进行定义,定义方法如下:sfr特殊功能寄存器名=特殊功能寄存器地址常数
sfr16特殊功能寄存器名=特殊功能寄存器地址常数可以这样定义AT89C51的P1口
sfrP1=0x90;//定义PlI/O口,其地址90Hsfr关键字后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,名字最好有一定的含义,如P1口可以用P1为名,为便于程序阅读,等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(<80H~FFH).sfr是定义8位的特殊功能寄存器,返回下一页9.3MCS-51C语言数据类型及定义上一页而sfr16则是用来定义16位特殊功能寄存器,如8052的T2定时器,可以定义为:sfr16T2=OxCC;刀这里定义8052定时器2,地址为T2L=CCH,T2H=CDH用sfr16定义16位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上。注意的是不能用于定时器0和1的定义。
shit可定义可位寻址对象,如访问特殊功能寄存器中的某位。其实这样应用是经常要使用的,如要访问P1口中的第2个引脚P1.1。可以照以下的方法定义。
1)shit位变量名=位地址
shitPl_1=0x91;
返回下一页9.3MCS-51C语言数据类型及定义上一页这样是把位的绝对地址赋给位变量。同sfr一样shit的位地址必须位于80H~FFH。2)sbit位变量名=特殊功能寄存器名位位置sftPl=0x90;shitPl_1=Pl^1;//先定义一个特殊功能寄存器名再指定位变量名所在的位置,当可寻址位位于特殊功能寄存器中时可采用这种方法
3)sbit位变量名=字节地址位位置
shitPl_1=0x90^1;
这种方法其实和2是一样的,只是把特殊功能寄存器的位址直接用常数表示。
返回下一页9.3MCS-51C语言数据类型及定义上一页在C51存储器类型中提供有一个bdata的存储器类型,是指可位寻址的数据存储器,位于单片机的可位寻址区中,可以将要求可位寻址的数据定义为bdata,unsignedcharbdataib;//在可位寻址区定义ucsignedchar类型的变量ibintbdataab[2};//在可位寻址区定义数组ab[2},这些也称为可寻址位对象
sbitib7=ib^7//用关键字sbit定义位变量来独立访问可寻址位对象的其中一位
sbitab12=ab[1]^12;
操作符“^”后面的位位置的最大值取决于指定的基址类型,char0-7,int0-15long0-31。返回下一页9.3MCS-51C语言数据类型及定义上一页9.3.4运算符和表达式运算符是完成某种特定运算的符号。运算符按其表达式中与运算符的关系可分为单目运算符、双目运算符和三目运算符。单目就是指需要有一个运算对象,双目就要求有两个运算对象,三目则要三个运算对象。表达式则是由运算及运算对象所组成的具有特定含义的式子。C是一种表达式语言,表达式后面加“;’’号就构成了一个表达式语句。赋值运算符用“一”给变量赋值,称之为赋值运算符,如X=10;由此可见利用赋值运算符将一个变量与一个表达式连接起来的式子称为赋值表达式,在表达式后面加“;”便构成了赋值语句。使用“=”的赋值语句格式如下:
变量=表达式;
示例如下:返回下一页9.3MCS-51C语言数据类型及定义上一页a=OXFF;//将常数十六进制数FF赋予变量ab=c=33;//同时赋值给变量b,cd=e;//将变量e的值赋予变量df=a+b;//将变量a+b的值赋予变量f
由上面的例子可以知道赋值语句的意义就是先计算出“一”右边的表达式的值,然后将得到的值赋给左边的变量。而且右边的表达式可以是一个赋值表达式。算术,增减量运算符
C51中的算术运算符有如下几个,其中只有取++和一一运算符是单目运算符,其他则都是双目运算符:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《接受学理论的来源》课件
- 《理论物理导论复习》课件
- 《拉手网IPO路》课件
- 河南省漯河市临颍县2025年数学四年级下学期期末模拟试题含答案解析
- 河南省洛阳市老城区2025年数学三年级下学期期中学业水平测试试题(含答案)
- 《星星索歌唱活动》课件
- 河南省洛阳市涧西区天津路小学2025届数学四年级下学期期末学业质量监测模拟试题(含解析)
- 人力资源试题面试题及答案
- 儿童心理辅导能力测试试题
- 中药炮制基础知识练习试题
- 广东深圳市龙岗区实验学校2026-2027学年度第一学期 七年级9月阶段性反馈英语试卷(含答案)
- 2026年鞍山市台安县事业单位面向应届毕业生公开招聘高层次急需紧缺人才15人笔试模拟试题及答案详解
- 2026年静疗专科护士考核考试题库(含答案)
- 2026中控证考试题库及答案解析
- 2026年版概论测试题及答案
- (2026年版)糖尿病患者合并心血管疾病诊治专家共识
- 无产权车位使用权转让协议书2026年模板
- ATA银行考试试题
- 自动驾驶车辆创投项目计划书
- 2026年国土空间规划中心下属事业单位选聘考试试题(附答案)
- 格力销售内部控制制度
评论
0/150
提交评论