C51语言程序设计基础.ppt
《C51语言程序设计基础.ppt》由会员分享,可在线阅读,更多相关《C51语言程序设计基础.ppt(85页珍藏版)》请在三一办公上搜索。
1、第3章 C51语言程序设计基础,本章主要介绍C51语言的数据类型、数据存储类型、数据运算、程序设计的基本结构、数组和指针,要求学习者初步掌握C51语言程序设计的基本方法。,3.1 C51语言概述,C语言是美国国家标准协会(ANSI)制定的编程语言标准。1987年,ANSI公布了87 ANSI C,即标准C语言。C51语言是在ANSI C的基础上针对51单片机的硬件特点进行了扩展,并向51单片机上移植。经过多年努力,C51语言已经成为公认的高效、简洁而又贴近51单片机硬件的实用高级编程语言。,3.1.1 使用C51语言的优点,C51语言具有结构化和模块化的特点,便于阅读和维护。C51语言的可移植
2、性好,很多微控制器都支持C51编译器。C51语言提供的库函数包含许多标准子程序,具有较强的数据处理能力。用C51语言编写的程序比用汇编语言编写的程序更符合人们的思考习惯。寄存器分配、不同存储器的寻址及数据类型等细节交由编译器管理,使开发者可以更专心地考虑算法,而不是考虑一些细节问题。C51语言和微控制器是相对独立的,开发者不必知道处理器的具体内部结构和处理过程。当用新型的微控制器开发程序时,可以很快上手,缩短学习时间和程序开发时间。,3.1.2 C51与ANSI C的主要区别,1.头文件的区别 51系列单片机的生产厂家有多个,它们的差异在于内部资源如定时器、中断、I/O等的数量以及功能的不同,
3、而对使用者来说,只需要将相应的功能寄存器的头文件加载在程序内,就可实现其所具有的功能。因此,C51系列的头文件集中体现了各系列芯片的不同资源及功能。2.数据类型的区别 计算机的CPU是32位或64位的,运算能力强,内存大,ANSI C可以大量使用float型与long int型变量;单片机的CPU一般为8位或16位的,运算能力较弱,因此C51变量类型以char型为主,int型为辅。,3.数据存储类型的区别 C语言最初是为通用计算机设计的,在通用计算机中只有一个程序和数据统一寻址的内存空间,而51系列单片机有片内、片外程序存储器,还有片内、片外数据存储器。标准C语言并没有提供这部分存储器的地址范
4、围的定义。此外,标准C语言对于51系列单片机中大量的特殊功能寄存器也没有定义。4.中断方面的区别 ANSI C语言没有处理单片机中断的定义。而C51中有专门的中断函数。5.库函数的区别 由于ANSI C中的部分库函数不适于嵌入式处理器系统,因此被排除在C51之外,如字符屏幕和图形函数等。,6.目标代码的区别 ANSI C由计算机生成.exe文件,编译完成后直接在计算机上运行;C51由单片机编译生成.bin或.hex代码文件,需要烧写到单片机中并结合外围电路执行。7.仿真调试的区别 C51程序在计算机上进行编译,然后需通过仿真器连接后进行仿真调试。近年来随着电路仿真软件的不断完善,也可通过Pro
5、teus等软件直接在计算机上进行仿真调试。但是从数据运算操作、程序控制语句以及函数的使用上来说,C51与ANSI C几乎没有什么明显的差别。如果程序设计者具备了有关标准C的编程基础,只要注意Keil C51与标准C的不同之处,并熟悉MCS-51单片机的硬件结构,就能够较快地掌握 C51的编程。,3.2 C51数据类型,3.2.1 常量与变量常量:程序运行过程中值不能改变的量称为常量。常量存在于ROM中。变量:变量代表存储器中的一个或多个存储单元,用来存放数据。一般来讲,这些数据在程序运行过程中可以改变(只读变量除外)。变量名命名规则:变量名只能由半角的字母、数字、下划线组成,且第一个字符不能是
6、数字。数据类型:变量存在的类型称为数据类型。C51的数据类型如表3-1所示。,3.2.2 变量定义与赋值1.定义一个变量 变量必须先定义,后使用。例如:int a;char b;2.变量赋初值 C语言允许在定义变量的同时给变量赋初值。例如:char c=a;int a=7;int a,b,c=9;/定义a、b、c为整型变量,对c赋初值。int a=3,b=3,c=3;,在存储空间够用的情况下,尽量选择8位即一个字节的char型,特别是unsigned char。对于51系列单片机而言,浮点类型变量将明显增加运算时间和程序长度,如果可以的话,尽量使用灵活巧妙的算法来避免浮点变量的引入。,3.2.
7、3 C51的扩展数据类型1.位变量bitbit的值可以是1(true),也可以是0(false)。例如:bit lock;/将lock定义为位变量bit dirention;/将direction定义为位变量位变量的使用说明:位变量不能定义成一个指针,如不能定义:bit*pointer;位变量不存在位数组,如不能定义:bit b_array;定义位变量时,存储类型只允许为data、bdata或者idata,如果将位变量的存储类型定义成其他类型都将导致编译出错。,2.特殊功能寄存器sfr MCS-51单片机特殊功能寄存器在片内RAM区的80HFFH之间。“sfr”数据类型占用一个内存单元,利用它
8、可访问MCS-51单片机内部的所有特殊功能寄存器。例如:“sfr P1=0 x90;”这一语句定义了P1口在片内的寄存器,在后面语句中可用“P1=0 xff”(使P1的所有引脚输出为高电平)之类的语句来操作特殊功能寄存器。标准特殊功能寄存器在reg51.h、reg52.h等头文件中已经被定义,只要用文件包含做出申明即可使用。,3.特殊功能寄存器sfr16“sfr16”数据类型占用两个内存单元。sfr16和sfr一样用于操作特殊功能寄存器。所不同的是它用于操作占两个字节的特殊功能寄存器。例如:“sfr16 DPTR=0 x82;”语句定义了片内16位数据指针寄存器DPTR,其低8位字节地址为82
9、H。在后面的语句中可以对DPTR进行操作。,4.特殊功能位sbit sbit 是指MCS-51单片机片内特殊功能寄存器的可寻址位。例如:sfr PSW=0 xd0;/定义PSW寄存器地址为0 xd0 sbit OVPSW2;/定义OV位为PSW.2 符号“”前面是特殊功能寄存器的名字,“”后面的数字定义了特殊功能寄存器可寻址位在寄存器中的位置,取值必须是07。注意:不要把bit与sbit混淆。bit用来定义普通的位变量,值只能是二进制的0或1。而sbit定义的是特殊功能位。,3.3 C51数据的存储类型,3.3.1 数据存储类型 MCS-51系列单片机采用了哈佛结构,即程序存储器和数据存储器是
10、分离的。51系列单片提供了三种不同类型的存储区域(memory areas):程序存储区(program memory);内部数据存储区(internal data memory);外部数据存储区(external data memory)。C51编译器完全支持MCS-51单片机及其系列的结构,可完全访问MCS-51硬件系统所有部分。每个变量可准确地赋予不同的存储器类型(data,idata,pdata,xdata,code)。访问内部数据存储器(idata)要比访问外部数据存储器(xdata)更快一些,因此,可将经常使用的变量置于内部数据存储器中,而将较大及很少使用的数据单元置于外部数据存储
11、器中。,例如:data char charvar;char code msg=“ENTER PARAMETER:”;unsigned long xdata array100;float idata x,y,z;unsigned char xdata vector104;sfr P0=0 x80;sbit RI=0 x98;char bdata flags;sbit flag0=flags0;说明:声明变量时存储区修饰符和数据类型修饰符的位置可以互换,即“char data x;”和“data char x;”是完全等效的。不过从兼容性的角度考虑,建议使用前一种格式。,3.3.2 存储器模式 如
12、果在变量定义时略去存储类型标识符,编译器会自动选择默认存储类型。默认存储类型进一步由SMALL、COMPACT和LARGE存储模式指令限制。C51变量的存储器模式如表3-3所示。,3.3.3 C51语言的绝对地址访问,1.绝对宏 C51编译器提供一组宏定义来对code、data、pdata和xdata空间进行绝对寻址,包括CBYTE、CWORD、DBYTE、DWORD、XBYTE、XWORD、PBYTE、PWORD。这些宏包含在名为absacc.h的头文件中。在使用前,需要将头文件包含进来,即#include。其中:CBYTE:以字节形式对code区寻址;CWORD:以字形式对code区寻址;
13、DBYTE:以字节形式对data区寻址;DWORD:以字形式对data区寻址;XBYTE:以字节形式对xdata区寻址;XWORD:以字形式对xdata区寻址;PBYTE:以字节形式对pdata区寻址;PWORD:以字形式对pdata区寻址。,(1)按字节访问存储器宏的形式 宏名地址 数组中的下标就是存储器的地址,因此使用起来非常方便。例如:DBYTE0 x30=0 x48;/给片内RAM送数据 XBYTE0 x0002=0 x36;/给片外RAM送数据 dis_buf0=CBYTETABLE+5;/从CODE区读取数据,(2)按整型数访问存储器宏的形式 宏名下标 由于整型数占两个字节,所以下
14、标与地址的关系为:地址=下标2。由于数组中的下标与存储器的地址是倍数关系,使用时要注意。例如:DWORD0 x20=0 x1234;/给片内RAM的0 x40、0 x41单元送数 XWORD0 x0002=0 x5678;/给片外RAM的0 x0004、0 x0005单元送数,2._at_关键字 格式如下:存储器类型 数据类型说明符 变量名 _at_ 地址常数 存储器类型和数据类型必须为C51能识别的。地址常数必须位于有效的存储器空间之内。使用 _at_ 定义的变量必须为全局变量。例如:data unsigned char x1 _at_ 0 x40;/在data区定义字节变量x1,它的地址为
15、40H xdata unsigned int x2 _at_ 0 x2000;/在xdata区定义字变量x2,它的地址为2000H data unsigned char buffer8 _at_ 0 x50;/在data区定义数组buffer,它的起始地址为50H,3.4 C51的数据运算,主要有:算术运算符、逻辑运算符、关系运算符、位运算符及赋值运算符等3.4.1 算术运算算术运算操作符主要包括:+(加法运算符),(减法运算符),*(乘法运算符),/(除法运算符),%(模运算或取余运算符),+(自增运算符),-(自减运算符)。注意:“/”的功能是取除运算结果的整数部分;“%”的功能是取除运算
16、结果的余数部分。例如:“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 关系运
17、算 关系运算主要用于比较操作数的大小关系,包括:(大于),=(大于等于),=(等于),!=(不等于)。若关系成立,结果为1;若关系不成立,结果为0。,3.4.4 位运算 位运算是将两个操作数按二进制数展开,然后对应位进行逻辑运算。位运算操作符包括:&(按位与),|(按位或),(按位异或),(按位取反),(位右移)。位运算的操作对象只能是整型和字符型数据。这些位运算和汇编语言中的位操作指令十分类似。,1.左移运算符()该运算符用来将一个数的各二进制位全部左移若干位,左高位溢出,右低位补0。例如:b=a2;a=a2;a=2;高位左移后溢出,舍弃掉。在该数左移时被溢出舍弃的高位不为1时,左移1位相当
18、于该数乘以2。例如:152=60;又如,1432=60,原因是最高位为1,左移后被溢出,不能等同于乘以2。,2.右移运算符()该运算符用来将一个数的各二进制位全部右移若干位,左高位补0,右低位溢出。例如:b=a2;a=a2;a=2;低位右移后溢出,舍弃掉。在该数右移时被溢出舍弃的低位不为1时,右移1位相当于该数除以2。例如:162=4又如,632=15,原因是最后2位为1,右移后被溢出,不能等同于除以4。,3.按位异或运算符()异或运算的规则是:参加运算的两个二进制位相同时结果为0(假),相异时结果为1(真)。即 00=0;01=1;10=1;11=0;例如:0 x2D0 x0F=0 x22,
19、将十六进制数0 x2D与十六进制数0 x0F进行按位异或运算,则高四位保持不变,低四位全部翻转。通过按位异或运算可以实现对变量的某一位或某几位的取反操作。,4.按位取反运算符()按位取反运算符是一个单目运算符,用来对一个二进制数按位取反,即将0变为1,1变为0。取反运算符常与移位运算符及按位与、按位或、按位异或运算符结合使用,以实现对某一位或某几位清0、置1、取反的操作。5.按位与运算符(&)参加运算的两个数据,按二进制位进行与运算。6.按位或运算符(|)参加运算的两个数据,按二进制位进行或运算。,3.4.5 赋值运算1.格 式:变量名=表达式;例如:a=2;b=3;c=2*a+b;2.复合赋
20、值运算符赋值符号前加上其他运算符可构成复合运算符。C51语言10种复合运算符:+=,-=,*=,/=,=,=,=,=,=例如:a+=b;/等价于a=(a+b)x*=a+b;/等价于x=(x*(a+b)a&=b;/等价于a=(a&b)a=4;/等价于a=(a4),C51基本运算符,运算符的优先级从低到高依次为:赋值运算符、&和|、关系运算符、算术运算符、逻辑非(!)运算符。,3.5 C51程序设计的基本结构,3.5.1 C51语言中语句的分类控制语句:控制程序运行的语句。空语句:只有一个分号的语句,称为空语句。它不进行任何操作。表达式语句:表达式后面加上分号就构成一个表达式语句。函数调用语句也是
21、表达式语句,由函数调用加分号构成。复合语句:可以把多个语句用括起来,构成复合语句,多用于选择或循环结构中。注释语句:在C51中,由“/*”和“*/”符号对包含的内容以及双斜杠“/”后面的内容均表示注释语句。编程人员可使用注释语句来解释程序的功能,标注修改时间等。,3.5.2 C51语言程序结构,C51程序按结构可分为三类,即顺序、选择和循环结构。1.顺序结构 顺序结构的程序是从前往后依次执行语句。从整体上看,所有程序都是顺序结构,只不过中间某些部分是由选择结构或循环结构构成,选择结构或循环结构部分执行完成后,程序重新按顺序结构向下执行。,2.选择结构 选择结构的基本特点是程序由多路分支构成,在
22、程序的一次执行中根据指定的条件,选择执行其中的一条分支,而其他分支上的语句被直接跳过。通过选择结构,可以使计算机具有决策能力,从而使计算机能够按照我们的意志在某个特定条件下完成相应的操作,即能够“随机应变”。选择结构包括:if语句、switch语句。,图3-1 if语句流程图,(1)if语句 if语句用来判定所给定的条件是否满足,并根据判定结果决定执行给出的两种操作之一。C51语言提供3种形式的if语句:形式一:if(表达式)语句;括号中的表达式成立时,执行大括号内的语句,否则跳过大括号中的语句而直接执行下面的语句。例如:if(xy)max=x;min=y;,形式二:流程图如图3-2所示。if
23、(表达式)语句1;else 语句2;例如:if(xy)max=x;else max=y;,形式三:流程图如图3-3所示。if(表达式1)语句1;else if(表达式2)语句2;else if(表达式m)语句m;else 语句n;,图3-3 if-else if-else语句流程图,例如:if(x1000)key=1;else if(x500)key=2;else if(x300)key=3;else if(x100)key=4;else key=5;,(2)switch语句switch语句是多分支选择语句,一般形式如下:switch(表达式)case 常量表达式1:语句1;break;cas
24、e 常量表达式2:语句2;break;case 常量表达式3:语句3;break;case 常量表达式n:语句n;break;default:语句n+1;,3.循环结构 循环结构是根据某个或某些条件是否成立,来决定是否重复运行一段相同的程序。(1)采用if和goto构成的循环 采用if和goto语句可以构成“当型”循环,格式如下:Loop:if(表达式)语句;goto loop;采用if和goto语句也可以构成“直到型”循环程序,格式如下:Loop:语句;if(表达式)goto loop;采用goto语句可构成无条件转向语句,格式如下:goto 语句标号;,(2)for循环语句 其一般格式为:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C51 语言程序设计 基础
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5417039.html