您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第3章--C51语言程序设计基础
第3章C51语言程序设计基础本章主要介绍C51语言的数据类型、数据存储类型、数据运算、程序设计的基本结构、数组和指针,要求学习者初步掌握C51语言程序设计的基本方法。3.1C51语言概述C语言是美国国家标准协会(ANSI)制定的编程语言标准。1987年,ANSI公布了87ANSIC,即标准C语言。C51语言是在ANSIC的基础上针对51单片机的硬件特点进行了扩展,并向51单片机上移植。经过多年努力,C51语言已经成为公认的高效、简洁而又贴近51单片机硬件的实用高级编程语言。3.1.1使用C51语言的优点C51语言具有结构化和模块化的特点,便于阅读和维护。C51语言的可移植性好,很多微控制器都支持C51编译器。C51语言提供的库函数包含许多标准子程序,具有较强的数据处理能力。用C51语言编写的程序比用汇编语言编写的程序更符合人们的思考习惯。寄存器分配、不同存储器的寻址及数据类型等细节交由编译器管理,使开发者可以更专心地考虑算法,而不是考虑一些细节问题。C51语言和微控制器是相对独立的,开发者不必知道处理器的具体内部结构和处理过程。当用新型的微控制器开发程序时,可以很快上手,缩短学习时间和程序开发时间。3.1.2C51与ANSIC的主要区别1.头文件的区别51系列单片机的生产厂家有多个,它们的差异在于内部资源如定时器、中断、I/O等的数量以及功能的不同,而对使用者来说,只需要将相应的功能寄存器的头文件加载在程序内,就可实现其所具有的功能。因此,C51系列的头文件集中体现了各系列芯片的不同资源及功能。2.数据类型的区别计算机的CPU是32位或64位的,运算能力强,内存大,ANSIC可以大量使用float型与longint型变量;单片机的CPU一般为8位或16位的,运算能力较弱,因此C51变量类型以char型为主,int型为辅。3.数据存储类型的区别C语言最初是为通用计算机设计的,在通用计算机中只有一个程序和数据统一寻址的内存空间,而51系列单片机有片内、片外程序存储器,还有片内、片外数据存储器。标准C语言并没有提供这部分存储器的地址范围的定义。此外,标准C语言对于51系列单片机中大量的特殊功能寄存器也没有定义。4.中断方面的区别ANSIC语言没有处理单片机中断的定义。而C51中有专门的中断函数。5.库函数的区别由于ANSIC中的部分库函数不适于嵌入式处理器系统,因此被排除在C51之外,如字符屏幕和图形函数等。6.目标代码的区别ANSIC由计算机生成.exe文件,编译完成后直接在计算机上运行;C51由单片机编译生成.bin或.hex代码文件,需要烧写到单片机中并结合外围电路执行。7.仿真调试的区别C51程序在计算机上进行编译,然后需通过仿真器连接后进行仿真调试。近年来随着电路仿真软件的不断完善,也可通过Proteus等软件直接在计算机上进行仿真调试。但是从数据运算操作、程序控制语句以及函数的使用上来说,C51与ANSIC几乎没有什么明显的差别。如果程序设计者具备了有关标准C的编程基础,只要注意KeilC51与标准C的不同之处,并熟悉MCS-51单片机的硬件结构,就能够较快地掌握C51的编程。3.2C51数据类型3.2.1常量与变量常量:程序运行过程中值不能改变的量称为常量。常量存在于ROM中。变量:变量代表存储器中的一个或多个存储单元,用来存放数据。一般来讲,这些数据在程序运行过程中可以改变(只读变量除外)。变量名命名规则:变量名只能由半角的字母、数字、下划线组成,且第一个字符不能是数字。数据类型:变量存在的类型称为数据类型。C51的数据类型如表3-1所示。3.2.2变量定义与赋值1.定义一个变量变量必须先定义,后使用。例如:inta;charb;2.变量赋初值C语言允许在定义变量的同时给变量赋初值。例如:charc=‘a’;inta=7;inta,b,c=9;//定义a、b、c为整型变量,对c赋初值。inta=3,b=3,c=3;在存储空间够用的情况下,尽量选择8位即一个字节的char型,特别是unsignedchar。对于51系列单片机而言,浮点类型变量将明显增加运算时间和程序长度,如果可以的话,尽量使用灵活巧妙的算法来避免浮点变量的引入。3.2.3C51的扩展数据类型1.位变量bitbit的值可以是1(true),也可以是0(false)。例如:bitlock;//将lock定义为位变量bitdirention;//将direction定义为位变量位变量的使用说明:①位变量不能定义成一个指针,如不能定义:bit*pointer;②位变量不存在位数组,如不能定义:bitb_array[];③定义位变量时,存储类型只允许为data、bdata或者idata,如果将位变量的存储类型定义成其他类型都将导致编译出错。2.特殊功能寄存器sfrMCS-51单片机特殊功能寄存器在片内RAM区的80H~FFH之间。“sfr”数据类型占用一个内存单元,利用它可访问MCS-51单片机内部的所有特殊功能寄存器。例如:“sfrP1=0x90;”这一语句定义了P1口在片内的寄存器,在后面语句中可用“P1=0xff”(使P1的所有引脚输出为高电平)之类的语句来操作特殊功能寄存器。标准特殊功能寄存器在reg51.h、reg52.h等头文件中已经被定义,只要用文件包含做出申明即可使用。3.特殊功能寄存器sfr16“sfr16”数据类型占用两个内存单元。sfr16和sfr一样用于操作特殊功能寄存器。所不同的是它用于操作占两个字节的特殊功能寄存器。例如:“sfr16DPTR=0x82;”语句定义了片内16位数据指针寄存器DPTR,其低8位字节地址为82H。在后面的语句中可以对DPTR进行操作。4.特殊功能位sbitsbit是指MCS-51单片机片内特殊功能寄存器的可寻址位。例如:sfrPSW=0xd0;//定义PSW寄存器地址为0xd0sbitOV=PSW^2;//定义OV位为PSW.2符号“^”前面是特殊功能寄存器的名字,“^”后面的数字定义了特殊功能寄存器可寻址位在寄存器中的位置,取值必须是0~7。注意:不要把bit与sbit混淆。bit用来定义普通的位变量,值只能是二进制的0或1。而sbit定义的是特殊功能位。3.3C51数据的存储类型3.3.1数据存储类型MCS-51系列单片机采用了哈佛结构,即程序存储器和数据存储器是分离的。51系列单片提供了三种不同类型的存储区域(memoryareas):程序存储区(programmemory);内部数据存储区(internaldatamemory);外部数据存储区(externaldatamemory)。C51编译器完全支持MCS-51单片机及其系列的结构,可完全访问MCS-51硬件系统所有部分。每个变量可准确地赋予不同的存储器类型(data,idata,pdata,xdata,code)。访问内部数据存储器(idata)要比访问外部数据存储器(xdata)更快一些,因此,可将经常使用的变量置于内部数据存储器中,而将较大及很少使用的数据单元置于外部数据存储器中。例如:datacharcharvar;charcodemsg[]=“ENTERPARAMETER:”;unsignedlongxdataarray[100];floatidatax,y,z;unsignedcharxdatavector[10][4];sfrP0=0x80;sbitRI=0x98;charbdataflags;sbitflag0=flags^0;说明:声明变量时存储区修饰符和数据类型修饰符的位置可以互换,即“chardatax;”和“datacharx;”是完全等效的。不过从兼容性的角度考虑,建议使用前一种格式。3.3.2存储器模式如果在变量定义时略去存储类型标识符,编译器会自动选择默认存储类型。默认存储类型进一步由SMALL、COMPACT和LARGE存储模式指令限制。C51变量的存储器模式如表3-3所示。3.3.3C51语言的绝对地址访问1.绝对宏C51编译器提供一组宏定义来对code、data、pdata和xdata空间进行绝对寻址,包括CBYTE、CWORD、DBYTE、DWORD、XBYTE、XWORD、PBYTE、PWORD。这些宏包含在名为absacc.h的头文件中。在使用前,需要将头文件包含进来,即#includeabsacc.h。其中:CBYTE:以字节形式对code区寻址;CWORD:以字形式对code区寻址;DBYTE:以字节形式对data区寻址;DWORD:以字形式对data区寻址;XBYTE:以字节形式对xdata区寻址;XWORD:以字形式对xdata区寻址;PBYTE:以字节形式对pdata区寻址;PWORD:以字形式对pdata区寻址。(1)按字节访问存储器宏的形式宏名[地址]数组中的下标就是存储器的地址,因此使用起来非常方便。例如:DBYTE[0x30]=0x48;//给片内RAM送数据XBYTE[0x0002]=0x36;//给片外RAM送数据dis_buf[0]=CBYTE[TABLE+5];//从CODE区读取数据(2)按整型数访问存储器宏的形式宏名[下标]由于整型数占两个字节,所以下标与地址的关系为:地址=下标×2。由于数组中的下标与存储器的地址是倍数关系,使用时要注意。例如:DWORD[0x20]=0x1234;//给片内RAM的0x40、0x41单元送数XWORD[0x0002]=0x5678;//给片外RAM的0x0004、0x0005单元送数2._at_关键字格式如下:[存储器类型]数据类型说明符变量名_at_地址常数存储器类型和数据类型必须为C51能识别的。地址常数必须位于有效的存储器空间之内。使用_at_定义的变量必须为全局变量。例如:dataunsignedcharx1_at_0x40;//在data区定义字节变量x1,它的地址为40Hxdataunsignedintx2_at_0x2000;//在xdata区定义字变量x2,它的地址为2000Hdataunsignedcharbuffer[8]_at_0x50;//在data区定义数组buffer,它的起始地址为50H3.4C51的数据运算主要有:算术运算符、逻辑运算符、关系运算符、位运算符及赋值运算符等3.4.1算术运算算术运算操作符主要包括:+(加法运算符),-(减法运算符),*(乘法运算符),/(除法运算符),%(模运算或取余运算符),++(自增运算符),--(自减运算符)。注意:“/”的功能是取除运算结果的整数部分;“%”的功能是取除运算结果的余数部分。例如:“5/3”的结果为1(商),而“5%3”的结果为2(余数)。自增和自减运算符的功能是使变量自动加1或减1。自增和自减运算符放在变量之前和变量之后是不同的。++i,--i:在使用i之前,先使i值加(减)1。i++,i--:在使用i之后,再使i值加(减)1。例如:若i=4,则执行x=++i时,先使i加1,再引用结果,即x=5,运算结果为i=5,x=5。再如:若i=4,则执行x=i++时,先引用i值,即x=4,再使i加1,运算结果为i=5,x=4。3.4.2逻辑运算逻辑运算操作符主要包括:&&(逻辑与),||(逻辑或),!(逻辑非)。逻辑运算结果为真时取1,否则取0。3.4.3关系运算关系运算主要用于比较操作数的大小关系,包括:(小于),=(小于等于),(大于),=(大于等于),==(等于),!=(不等于)。若关系成立,结果为1;若关系不成立,结果为0。3.4.4位运算位运算是将两个操作数按二进制数展开,然后对应位进行逻辑运算。位运算操作符包括:&(按位与),|(按位或),^(按位异或),~(按位取反),(位左移),(位右移)。位运算的操作对象只能是整型和字符型数据。这些位运算和汇编语言中的位操作指令十分类似。1.左移运算符()该运算符用来将一个数的各二进制位全部左移若干位,左高位溢出,右低位补0。例如:b=a2;a
本文标题:第3章--C51语言程序设计基础
链接地址:https://www.777doc.com/doc-4809396 .html