单片机原理及接口技术课件:C51高级语言程序设计_第1页
单片机原理及接口技术课件:C51高级语言程序设计_第2页
单片机原理及接口技术课件:C51高级语言程序设计_第3页
单片机原理及接口技术课件:C51高级语言程序设计_第4页
单片机原理及接口技术课件:C51高级语言程序设计_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C51高级语言程序设计单片机原理及接口技术单片机原理及接口技术目录4.1C语言高级编程4.2C51对标准C语言的扩展4.3C51的运算符及表达式4.4C51函数4.5C51构造数据类型4.6C51库函数4.7C51程序编写4.8C51语言与汇编语言接口单片机原理及接口技术概述汇编语言编写程序对硬件操作比较便利,编写的程序代码短,但使用起来很不方便,可读性和可移植性较差。同时,汇编语言程序的设计周期长,调试和排错也比较困难。为了提高编程速度和应用程序效率,改善程序的可读性和可移植性,最好是采用高级语言来进行系统程序设计。而C语言既有高级语言使用方便的特点,也具有汇编语言直接对硬件进行操作的特点,因此在现代计算机软件系统设计中,特别是在单片机应用系统的开发过程中,往往用C语言来进行程序编写和开发。本章主要介绍MCS-51单片机的C语言语法和程序设计,并讨论C语言程序的结构和编程方法。单片机原理及接口技术4.1.1C语言的特点

C语言于20世纪70年代初问世,早期的C语言主要是用于UNIX系统。由于C语言的强大功能和各方面的优点逐渐被人们认识,到了20世纪80年代,C语言开始进入其它操作系统,并很快在各类大、中、小和微型计算机上得到广泛的使用,并成为当代最优秀的程序设计语言之一。与其它高级语言相比,C语言具有以下一些特点:1.简洁性:C语言仅有32个关键字和9种控制语句,使得程序编写简洁、灵活。2.运算符丰富:C语言提供了34种运算符,包括括号、赋值、强制类型转换等,使得表达式多样化,能够实现复杂的运算。

4.1C语言高级编程单片机原理及接口技术3.数据结构多样:C语言支持整型、实型、字符型、数组类型、指针类型等多种数据类型,可以构建复杂的数据结构。4.结构化设计:C语言拥有多种控制语句,支持if-else、while、do-while、switch、for等结构化控制语句,程序以函数为模块,便于进行结构设计。5.硬件操作:C语言允许直接访问物理地址和进行位操作,具有汇编语言的大部分功能。6.高效性:C语言编写的程序生成的目标代码质量高,执行效率高,通常比汇编语言编写的程序效率低10%~30%。7.可移植性:C语言程序具有很好的可移植性,通常无需修改即可在不同机型和操作系统上运行。单片机原理及接口技术4.1.2C语言与MCS-51单片机

51系列单片机支持三种高级语言,即PL/M,C和BASIC。C语言是一种通用的程序设计语言,其代码率高,数据类型及运算符丰富,并具有良好的程序结构,适用于各种应用的程序设计,是目前使用较广的单片机编程语言。MCS-51系列单片机采用的C语言,简称C51。C51符合C语言的ANSI标准,并根据单片机的特性进行了扩展。C51所产生的目标代码短、运行速度高、所需存储空间小。注:1.在实际的系统设计中,当设计对象只是一个小的嵌入式系统时,汇编语言是一个很好的选择,因为代码一般都不超过8K,而且都比较简单;2.当一个系统对时钟要求很严格时,使用汇编语言成了唯一的方法。单片机原理及接口技术4.1.3C51编译器

目前支持MCS-51单片机的C语言编译器有很多种,然而并非所有的Cx51编译器都能产生具有8051特点的有效代码。下面就不同的编译器做简要介绍。表4-1各个编译器的整体特性编译器版本编译时间存储模式编译堆栈浮点支持AmericanAUTOMATION16.02.076min3sSMLNo仅大模式IAR4.05A2min3sTSCMLBYesYesAvocet1.31min47sSMLNoYesBso/Tasking1.102min25sSALYesYesIntermetrics3.322min52sSL(支持几种动态分配方案)NoYesMicroComputerControls1.7不能编译所有测试程序SMLNoNoDunfieldShareware2.11不能编译所有测试程序SL(ROM和RAM必须映像到同一地址空间)NoNoKeil3.011min28sSALYesYes单片机原理及接口技术

KeilC51标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效、快速的特点。C51编译器的功能不断增强,使得使用者可以更加贴近CPU本身及其它的衍生产品。C51已被完全集成到μVision4的集成开发环境中,这个集成开发环境包含:编译器、汇编器、实时操作系统、项目管理器和调试器。μVision4IDE可为它们提供单一而灵活的开发环境。C51V7版本是目前最高效、灵活的8051开发平台。它可以支持所有8051的衍生产品,也可以支持所有兼容的仿真器,同时支持其它第三方开发工具。因此,C51V7版本无疑是8051开发用户的最佳选择。具有以下主要功能:1.集成开发环境μVision42.集成功能3.C51V7版增强功能4.1.4Keil8051开发工具单片机原理及接口技术

同ANSIC一样,C51的程序由一个个函数组成,这里的函数和其他语言的“子程序”或“过程”具有相同的意义。

必须有一个主函数main(),程序的执行从main()函数开始,调用其他函数后返回主函数main(),最后在主函数中结束整个程序而不管函数的排列顺序如何。

功能函数可以是C51语言提供的库函数,也可以是用户自定义的函数。4.1.5C51程序结构单片机原理及接口技术组成结构:预处理命令#include<reg51.h>函数说明longfun1();floatfun2();变量定义intx,y;floatz;主函数main(){…fun1();/*调用功能函数1*/…fun2();/*调用功能函数2*/…}功能函数1fun1(){…}功能函数2fun2(){…}单片机原理及接口技术C语言的语句规则:

1.每个变量必须先说明后引用,变量名英文大小写是有差别的。2.C语言程序一行可以书写多条语句,但每个语句必须以“;”结尾,一个语句也可以多行书写。3.C语言的注释用/*……*/或//表示。4.“{”花括号必须成对,位置随意,可在紧挨函数名后,也可另起一行,多个花括号可以同行书写,也可逐行书写,为层次分明,增加可读性,同一层的“{”花括号对齐,采用逐层缩进方式书写。单片机原理及接口技术4.2.1存储区域

51系列单片机的内存区域被分为两大类。一类是程序存储区,即ROM;另一类是数据存储区,包括内部数据存储区和外部数据存储区。内部数据存储区中又包含了51单片机的特殊功能寄存器。1数据存储区

1)内部数据存储区

data

idata

bdata

2)外部数据存储区

xdata

pdata2程序存储器

code4.2C51对标准C语言的扩展单片机原理及接口技术51系列单片机的存储区类型单片机原理及接口技术4.2.2

数据类型C51提供的数据结构是以数据类型的形式出现的,可分为基本数据类型和组合。C51编译器具体支持的数据类型有无符号字符型(unsignedchar)、有符号字符型(signedchar)、无符号整型(unsignedint)、有符号整型(signedint)、无符号长整型(unsignedlong)、有符号长整型(signedlong)、浮点型(float)、双精度型(double)和指针型等。这些数据类型的长度和值域会因处理器的类型和C语言编译程序的实现而有所不同,对于KeilC51产生的目标文件。单片机原理及接口技术表4-2KeilC51的数据类型类型长度/bit值域unsignedchar80~255signedchar8-128~+127unsignedint160~65535signedint16-32768~+32767unsignedlong320~4294967295signedlong32-2147483648~+2147483647float32±1.175494E-38~±3.402823E+38(6位数字)double64±1.175494E-38~±3.402823E+38(10位数字)一般指针24存储空间0~65535单片机原理及接口技术C51中还有专门针对于MCS-51单片机的位类型和特殊功能寄存器型。1.位类型位类型是C51中扩充的数据类型,该类型的变量可以用于变量的定义和声明、函数的参数传递和函数的返回值中。2.特殊功能寄存器型

特殊功能寄存器区SFR。SFR在程序中被用来控制定时/计数器、串口、I/O端口以及各种外设。SFR在MCS-51单片机中处于地址0x80~0xFF的位置,并可以被按照位、字节或者字的形式被访问。C51编译器除了能支持以上这些基本数据类型以外,还能支持一些复杂的组合型数据类型,如数组类型、指针类型、结构类型和联合类型等。单片机原理及接口技术4.2.3

常量和变量

C51支持的数据有常量、变量、指针。存储时遵循“先高后低”原则;常量位置与定义说明有关,一般放在程序存储区code。1)常量整型常量、实型常量、字符常量、字符串常量、符号常量。符号常量在使用前必须先定义,格式为:#define标识符常量//是C51的预处理指令2)变量

定义变量的一般格式:

[存储模式]数据类型[存储器类型]变量名;单片机原理及接口技术变量说明举例charvar;/*字符变量var,存储类型由编译模式确定*/charcodeMSG[]=″PARAMETER:″;/*字符数组MSG[]定位在程序存贮区*/unsignedlongxdataarray[100];/*无符号长型数组定位在片外RAM区,每元素占4bytes*/floatidatax,y,z;/*实型变量x,y,z,定位在片内用间址访问的内部RAM区*/bitlock;/*位变量Lock,由编译器定位*/unsignedintpdatasion;/*无符号整型变量sion定位在外部RAM*/unsignedcharxdatavector[10][4][4];/*无符号字符型三维数组,定位在片外RAM区*/sfrP0=0x80;/*定义P0口,地址为80H*/charbdataflags;/*字符变量flags定位在可位寻址内部RAM区*/sbitflag0=flags^0;/*定义flag0为flags.0*/单片机原理及接口技术说明:1.字符型(char)、整型(int)和长整型(long)均有符号型(signed)和无符号型(unsigned)两种,如果不是必须,尽可能选择unsigned型,这将会使编译器省却符号位的检测,使生成的程序代码比signed类型短得多。2.程序编译时,C51编译器会自动进行类型转换,当运算符两边为不同类型的数据时,编译器先将低级的数据类型转换为较高级的数据类型,运算后,运算结果为高级数据类型。3.bit和sbit都是C51扩展的变量类型。bit用来定义一个普通位变量(0或1),编译器在编译过程中分配地址,除非指定否则这个地址随机分布在整个可寻址空间中。所有的可位寻址的位都可由sbit指定,这包括可位寻址区和SFR中的位。4.如果在变量说明时略去存贮器类型标志符,编译器会自动选择默认的存贮器类型。单片机原理及接口技术4.2.4存储器模式C51编译器编译时为了适应不同规模的程序而选用3种存储模式:1.SMALL模式SMALL模式称为小编译模式,在SMALL模式下编译时,函数参数和变量放入可直接寻址的片内存储器(最大128字节),默认存储器类型为data,访问十分方便。2.COMPACT模式COMPACT模式称为紧凑编译模式,在COMPACT模式下编译时,函数参数和变量放入分页片外存储区(最大256字节),默认存储器类型为pdata。3.LARGE模式LARGE模式称为大编译模式,在LARGE模式下,编译时函数参数和变量直接放入片外数据存储器(最大64K字节),默认存储器类型为xdata,使用数据指针DPTR进行寻址。单片机原理及接口技术举例说明变量的存储模式#pragmasmall/*变量的存储模式为SMALL*/chara1;intxdatab1;#pragmaCompact/*变量的存储模式为COMPACT*/chara2;intxdatab2;intfunc1(intx1,inty1)large/*函数的存储模式为LARGE*/{return(x1-y1);}intfunc2(intx2,inty2)/*函数的存储模式隐含为SMALL*/{return(x2+y2);}单片机原理及接口技术4.2.5

绝对地址的访问1.对存贮器的绝对地址访问利用绝对地址访问的头文件absacc.h可对不同的存贮区进行访问。该头文件的函数有:

CBYTE(访问code区字符型)DBYTE(访问data区字符型)PBYTE(访问pdata或I/O区字符型)XBYTE(访问xdata或I/O区字符型)

还有CWORD、DWORD、PWORD和XWORD四个函数,它们的访问区域同上,只是访问的类型为int型。例:#include<absacc.h>#definecomXBYTE[0x07ff]那么后面程序com变量出现的地方,就是对地址为07ffH的外部RAM或I/O口进行访问。单片机原理及接口技术2.通过指针访问采用指针的方法,可以在C51程序中对任意指定的存储器单元进行访问。例4-8通过指针实现绝对地址的访问。#defineucharunsignedchar/*定义符号uchar为数据类型符unsignedchar*/#defineuintunsignedint/*定义符号uint为数据类型符unsignedint*/voidfunc(void){uchardatavar1;/*变量var1为unsignedchar*/ucharpdata*p1;/*指针p1指向pdata区*/ucharxdata*p2;/*指针p2指向xdata区*/uintxdata*p3;/*指针p3指向xdata区*/单片机原理及接口技术

p1=0x40;/*p1指针赋值,指向pdata区的40H单元*/*p1=0x4f;/*将数据0x4f送到片外RAM的40H单元*/p2=&var1;/*p2指针指向data区的var1变量*/*p2=0x50;/*给变量var1赋值0x50*/p3=0x2000;/*p3指针赋值,指向xdata区的2000H单元*/*p3=0x1122;/*将数据0x1122送到片外RAM的2000H单元*/}单片机原理及接口技术3.使用C51扩展关键字_at_定义变量时,使用_at_关键词指定变量的绝对地址,格式为:

[存储类型]数据类型变量名_at_绝对地址;例:dataunsignedcharx1_at_0x40;//在data区定义字节变量x1,它的地址为40Hxdataunsignedintx2_at_0x2000;//在xdata区定义字变量x2,它的地址为2000Hvoidmain(void){x1=0xff;x2=0x1234;}单片机原理及接口技术4.3C51的运算符及表达式

C51有很强的数据处理能力,具有十分丰富的运算符,利用这些运算符可以组成各种表达式及语句。在C51中有3大运算符:算术运算符、关系与逻辑运算符、以及位操作运算符。另外还有一些特殊的运算符。单片机原理及接口技术4.3.1算术运算符表4-5C51中支持的算术运算符运算符作用+加或取正值-减或取负值*乘/除%取余数++自增--自减单片机原理及接口技术4.3.2关系和逻辑运算符表4-6关系和逻辑运算符运算符作用>

大于>=大于等于<

小于<=小于等于==等于!=不等于&&与||或!非单片机原理及接口技术4.3.3位运算符

位运算是对字节或字中的位(bit)进行测试或移位处理,但并不改变参与运算的变量的值。如果要求按位改变变量的值,则要利用相应的赋值运算。C51中位运算符只能对整数进行操作,不能对float、double、longdouble、void或其它复杂数据类型进行操作。C51中的位运算符如表4-7所示。表4-7位运算符单片机原理及接口技术4.3.4逗号运算符

在C51语言中,逗号“,”是一个特殊的运算符,可以用它将两个或两个以上的表达式连接起来,称为逗号表达式。

逗号运算符的左侧总是作为void(无值),这意味着其右边表达式的值变为以逗号分开的整个表达式的值。例如:y=(x=2,5x)的运算结果是y的值为10。1.赋值运算符:=

将“=”的右边的值赋值给左边的变量。2.复合运算符:

4.3.5赋值运算符单片机原理及接口技术表4-8复合赋值运算符运算符作用+=加法赋值-=减法赋值*=乘法赋值/=除法赋值%=取模赋值&=逻辑与赋值︱=逻辑或赋值^=逻辑异或赋值~=逻辑非赋值>>=右移位赋值<<=左移位赋值单片机原理及接口技术4.3.6条件运算符C51语言提供了一个代替某些“if…else”语句的条件运算符(?

,该运算符是唯一的一个三目运算符。其功能是先计算关系表达式关系表达式?表达式1:表达式2的值,当关系表达式的值为True(非0值)时,计算表达式1的值,并将结果作为整个表达式的值;当逻辑表达式的值为Flase(0值)时,计算表达式2的值,并将结果作为整个表达式的值。

例如:max=(a>b)?a:b;

表达式中若a>b,max=a;若a<b,max=b。即max是a和b中较大的数。如果用if…else语句改写,则有:if(a>b)max=a;elsemax=b;单片机原理及接口技术4.4C51函数

在程序设计过程中,对于较大的程序一般采用模块化结构。通常将一个较大的程序分成若干个程序模块,每个模块包括子程序,实现一个特定的功能。在C51语言中,子程序模块是由函数来实现的。C51语言的程序是由一个主函数和若干个子函数组成的,每个子函数完成一定的功能,由主函数(main())根据需要来调用。子函数可以被主函数调用,也可以被其它子函数或其本身调用形成子程序嵌套,但主函数不能被调用。当被调用函数执行完毕后,就发出返回(return)指令,恢复原来程序流的执行。程序执行时从主函数开始,到主函数最后一条语句结束。单片机原理及接口技术1.函数的分类从用户使用角度划分,函数分为库函数和用户自定义函数

库函数是编译系统为用户设计的一系列标准函数,用户只需调用,而无需自己去编写这些复杂的函数,如前面所用到的头文件reg51.h等,有的头文件中包括一系列函数,要使用其中的函数必须先使用#include包含语句,然后才能调用。用户自定义函数是用户根据任务编写的函数。从参数形式上函数分为无参函数和有参函数。

有参函数即是在调用时,调用函数用实际参数代替形式参数,调用完返回结果给调用函数。

4.4C51函数单片机原理及接口技术2.函数的定义用C51进行程序设计的过程中,既可以用系统提供的标准库函数,也可以使用用户自己定义的函数。对于系统提供的标准库函数,用户使用时通过预处理器命令#include可将对应的标准函数库包含到程序中;而对于用户自定义的函数,在使用之前必须对其进行定义,只有定义之后才能被调用。函数定义的一般格式如下:[存储类说明符]函数类型函数标识符(形式参数表)[reentrant][interruptm][usingn][存储模式]形式参数说明{

函数体;}其中函数体是能够完成一定功能的语句,由用户自己编写。单片机原理及接口技术(1)存储类说明符:存储类说明符有两类:extern和static。(2)函数类型函数类型是用来说明函数返回值的类型。有简单类型(char、unsignedchar、int、unsignedint、long、unsignedlong、float和bit)、复合类型(struct和union)和无类型(void)。(3)函数标识符函数标识符即函数名,是用户为自定义函数所取的名字,以便调用函数时使用。(4)形式参数表形式参数表用于列举在主调函数与被调函数之间进行数据传递的形式参数。(5)reentrant修饰符在C51语言中,利用这个修饰符把函数定义为可重入函数。单片机原理及接口技术(6)interruptm修饰符为了在C51源程序中直接编写中断服务程序,C51编译器对函数的定义进行了扩展,增加了一个扩展关键字interrupt。关键字interrupt是函数定义时的一个选项,加上这个选项才可以将一个函数定义为中断服务函数。51单片机的中断源编号单片机原理及接口技术中断函数的定义格式:void

函数名(void)

interruptn[usingm]1)interruptn:说明函数是中断类型n的中断服务子程序C51编译器支持32个中断函数,中断类型号为0~31。函数定义为中断函数后,编译器会在对应的中断服务程序入口处,生成LJMP指令,直接跳到中断函数。中断函数不能带参数,不能定义函数返回值,且程序不能直接调用中断函数。编译器会自动为中断函数添加保护现场的代码,进入函数后,压栈保护函数中使用了的ACC、B、DPTR、PSW寄存器的值,返回前出栈恢复。单片机原理及接口技术2)usingm:指定函数使用第m个寄存器组,m可以为0、1、2、3,代表4个不同的工作寄存器组。定义函数时可省略usingm选项,此时编译器自动选择一个寄存器组作绝对寄存器组访问;如定义则小心使用,要保证任何寄存器组的切换都只在控制的区域内发生,否则产生不正确的函数结果。在函数的入口处将当前工作寄存器组保护到堆栈中;函数退出之前将被保护的工作寄存器组从堆栈中恢复。(8)存储模式为了提高程序的效率和灵活性,C51允许采用混合存储模式。若指定固定的存储模式后,它将不再随编译模式而变。单片机原理及接口技术3.函数的调用函数调用的形式为:函数名(实际参数表);实参和形参必须在数目、类型及顺序上严格保持一致,对于无参函数不存在实际参数表。函数的调用方式有三种:

①函数调用语句:即把被调函数名作为调用函数的一个语句,如fun1();。②被调函数作为表达式的运算对象,如result=2*get(a,b);此时get函数中的a,b应为实参,其以返回值参与式中的运算。③被调函数作为另一个函数的实际参数如m=max(a,get(a,b));函数get(a,b)作为函数max()的一个实际参数。单片机原理及接口技术3.函数的调用注:1)如果被调函数出现在主调函数之后,在主调函数前应对被调函数进行说明,形式为:

返回值类型被调函数名(形式参数表);

2)如果被调函数出现在主调函数之前,可以不对被调函数说明。下面以一个简单例子来说明:intfun1(a,b)inta,b;

intc;c=a+b;return(c);

}main(){intd,u=3,v=2;d=2*fun1(u,v);}

上例被调函数在主调函数前,不用说明。单片机原理及接口技术intfun1(a,b);main(){

intd,u=3,v=2;d=2*fun1(u,v);}

intfun1(a,b);

inta,b;{intc;

c=a+b;return(c);}上例中被调函数在主调函数后,在前面对被调函数进行说明。单片机原理及接口技术4.函数的嵌套与递归(1)函数的嵌套在C51语言中,函数的定义是相互平行、独立的。即在函数定义时,一个函数体内不能包含另一个函数。但是在一个函数的调用过程中可以调用另一个函数,即可以嵌套调用函数。C51编译器通常依靠堆栈来进行参数传递,但由于C51的堆栈设在片内RAM中,而片内RAM的空间有限,因而嵌套的深度一般在5-10层以内。(2)函数的递归调用如果在调用一个函数过程中出现了直接或间接调用该函数本身,则称为函数的递归调用。递归调用是嵌套调用的一个特殊情况。在函数的递归调用中要避免出现无终止的自身调用,应通过控制条件,使得递归的次数有限。单片机原理及接口技术例4-19函数的嵌套调用。#include<reg51.h>/*包含特殊功能寄存器库函数*/#include<stdio.h>/*包含I/O函数库函数*/externserial_ini();intmin(inta,intb){intc;c=a<b?a:b;/*求最小值*/return(c);}intadd(intj,intk,intm,intn){intres;res=min(j,k)+min(m,n);/*调用函数min()*/return(res);}main(){intfinal;serial_ini();final=add(2,15,5,7);/*调用函数add()*/printf("%d",final);}单片机原理及接口技术

4.5.1数组和指针1.数组数组是一个由若干同类型变量组成的集合,数组中的各个元素可以用数组名和下标来唯一确定。数组在使用之前必须先对其进行定义。根据数组中存放的数据可分为整型数组、字符数组等。不同的数组在定义、使用上基本相同,根据下标维数的不同可以分为一维数组、二维数组和多维数组。2.指针指针是C语言中的精华。指针类型数据在C语言程序中使用非常广泛,正确使用指针类型数据,可以方便有效地表示复杂的数据结构,动态地分配存储器空间,直接处理内存地址。4.5C51构造数据类型

单片机原理及接口技术1.数组(1)一维数组一维数组只有一个下标,定义的一般形式如下:

数据类型说明符数组名[常量表达式]1)“数据类型说明符”是任一种基本数据类型或构造数据类型。2)“数组名”是用户定义的数组标识符,它的取名方法与变量的取名方法相同。3)“常量表达式”用于说明该数组的长度,即该数组元素的个数。要求取值为整型常量,必须用方括号“[]”括起来。单片机原理及接口技术(2)二维数组二维数组有两个下标,定义的一般形式如下:

数据类型说明符数组名[常量表达式][常量表达式]如:unsignedinta[3][4];定义了一个三行4列的数组,数组名为a,该数组的下标共有3×4个,即:a[0][0];a[0][1];a[0][2];a[0][3];a[1][0];a[1][1];a[1][2];a[1][3];a[2][0];a[2][1];a[2][2];a[2][3];单片机原理及接口技术(3)数组的赋值1)数组元素逐个赋值如:x[0]=0;x[1]=x;…;x[9]=9;2)数组初始化赋值数组初始化赋值是指在数组说明时给数组元素赋予初值。数组初始化是在编译阶段进行的,从而减少运行时间,提高效率。例如:intx[10]={0,1,2,3,4,5,6,7,8,9};3)动态赋值动态赋值是在程序执行过程中对数组赋值。如例4-20中是用循环语句配合scanf函数逐个对数组元素赋值。4)二维数组可按行分段赋值,也可按行连续赋值。单片机原理及接口技术

2.指针(1)指针变量的定义指针变量使用之前必须对它进行定义,定义格式与一般变量的定义类似,一般形式为

数据类型说明符[存储器类型]*指针变量名;数据类型说明符说明了该指针变量所指向的变量类型。(2)指针变量的引用指针变量是存放另一变量地址的特殊变量,指针变量只能存放地址。指针变量在使用时应注意两个运算符:“&”和“*”。其中,“&”是取地址运算符,“*”是指针运算符或称“间接访问”运算符。单片机原理及接口技术汇编语言和C语言的对照表注:上表省略了汇编语言程序中对符号地址n和m用EQU伪指令进行具体地址定义的语句以及C语言对变量n、m和指针变量P进行类型定义的语句,实际程序设计中,此步是不可缺少的。表中&为取地址运算符,*为取内容运算符。单片机原理及接口技术说明:1)在C语言中,为了能够实现直接对内存单元进行操作,引入了指针类型的数据。一个变量的地址就称为该变量的指针。2)如果有一个变量专门用来存放另一个变量的地址,则称之为指针变量。一个指针变量存放的内容是另一个变量在内存中的地址,每一个变量都有它自己的指针(地址)。3)C语言中用“*”表示“指向”。如:整型变量i的地址存放在指针变量ip中,则

i=0x50;*ip=0x50;都是给同一个变量赋值。4)区分“&”和“*”运算符。单片机原理及接口技术2.指针型数据的类型由于C51是结合51单片机硬件的,51单片机的不同存贮空间,有不同的地址范围,即使对于同一外部数据存贮器,又有用@Ri寻址(Ri为八位)和用@DPTR寻址(DPTR为十六位)两种寻址方式,而指针本身也是一个变量,有它存放的存贮区和数据长度。因此,在指针类型的定义中要说明:被指的变量的数据类型和存贮类型;指针变量本身的数据类型(占几个字节)和存贮类型(即指针本身存放在什么存贮区)。指针类型的数据定义形式如下:数据类型[存储器类型1]*[存储器类型2]标识符;单片机原理及接口技术

C51各类指针类型和其占用字节大小指针类型(存储器类型1)大小通用指针3BytesXDATA指针2BytesCODE指针2BytesIDATA指针1ByteDATA指针1BytePDATA指针1Byte单片机原理及接口技术指向不同存储区变量的通用指针指针能适用于指向任何存贮空间,此时指针长度为3字节,第一字节表示存贮器类型编码,第二、三字节分别表示所指地址的高位和低位。unsignedchar*ptr;//通用指针ptr,指针存放在默认存储区unsignedchar*idataiptr;//通用指针iptr,指针存放在idata存储区指向固定存储区变量的指针定义为data或idata,表示指针指向内部数据存贮器;定义为pdata,表示指针指向外部数据存贮器,用@Ri间址。以上均为八位地址;定义为类型code/xdata,表示指针指向外部程序存贮器或外部数据存贮器指针,本身(即被指示地址)应为十六位长度。

intcode*ptr;//指向code存储区的指针ptr,指针存放在默认存储区intidata*pdataiptr;//指向idata存储区的指针ptr,指针存放在pdata存储区单片机原理及接口技术指针变量说明:longxdata*px;/*指针px指向xdata区的long型(每个数据占四个单元)变量,

指针自身在编译模式默认的存贮区,指针长度为2个字节*/charxdata*datapd;/*指针pd指向xdata区的字符型变量,自身在data区,指针

长度为2个字节*/datacharxdata*pd;/*与上例等效*/dataint*pn;(和int*datapn及int*pn等效)/*定义一个类型为int型的通用型

指针,指针自身在data区,长度为3字节*/单片机原理及接口技术在上例的指针声明中包含如下几个内容:1)指针变量名(如px)前面冠以“*”,表示px为指针型变量,此处*不带取内容之意。2)指针指向的存贮类型,即指向哪个存贮区,它决定了指针本身的长度(见数据类型表)。存贮类型声明的位置在数据类型和指针名(如*px)之间,如无此项声明,则此指针型变量为通用型。3)指针指向的存贮区的数据类型,即被指向的存贮区以多少个单元作一个数据单位,当程序通过指针对该区操作时,将按此规定的单元个数的内容作为一个数据操作。4)指针变量自身的存贮类型,即指针处于什么区与自身的长度无关,该声明可位于声明语句的开头,也可在“*”和变量名之间。此项由编译模式放在默认区,如无规定编译模式,通常在data区。单片机原理及接口技术4.5.2结构、共同体和枚举1.结构(1)结构与结构变量1)先定义结构类型再定义结构变量。定义一个结构类型的一般形式为struct结构名{结构元素表};定义一个结构变量的一般形式为:

struct结构名变量名1,变量名2,…;其中,“结构元素表”为结构中的结构成员,它可以由不同的数据类型组成。定义时需指明各个成员的数据类型。单片机原理及接口技术例定义一个结构名为data结构类型:structdata{intyear;intmonth;intday;};它由year、month和day3个成员组成,这三个结构成员的数据类型都是整型(int),当然也可以根据实际需要选用各种不同类型的变量作为结构成员,将month和day的数据类型定义为字符型(char)。若结构变量为data1和data2,定义如下:structdatadata1,data2;单片机原理及接口技术2)定义结构类型的同时定义结构变量。一般形式为struct结构名{结构元素表}变量名1,变量名2,……变量名n;3)使用typedef别名来定义结构类型变量先用typedef为结构起一个别名,然后用别名定义该结构类型变量。一般形式为typedefstruct结构名{结构元素表}类型别名类型别名变量名1,变量名2,……变量名n;/*定义结构变量名*/其中类型别名习惯于用大写。单片机原理及接口技术(2)结构变量的引用一般情况下,结构变量的引用是通过对其结构元素的引用来实现的,结构元素引用的一般格式如下:

结构变量名.结构元素名或结构变量名->结构元素名其中,“.”和“->”是结构的成员运算符。例如:data1.year表示结构变量data1中的元素year,data2.month表示结构变量data2中的元素month。单片机原理及接口技术2.结构数组C51允许将具有相同结构类型的变量定义为结构数组,结构数组与一般变量数组的不同在于结构数组的每一个元素都具有同一个结构类型的变量,它们具有同一个结构类型,含有相同的成员项。例4-26结构数组的定义和引用structdocument{unsignedintnumber;unsignedintage;bitsex;};/*定义document的结构类型*/structdocumentstudent[20];/*定义20个数组元素的结构数组student,每个数组元素都是document结构

类型*/student[5].age=18;/*对结构数组成员进行赋值*/单片机原理及接口技术3.共同体

结构能够把不同类型的数据组合在一起使用。结构中定义的各个变量在内存中占用不同的内存单元,在位置上是分开的,彼此不互相重叠。在C51语言中,还提供一种数据类型,使不同类型的数据共同使用一块内存空间,空间的大小以最长的类型为主,这就是共同体数据类型,也称作联合类型(union)。4.枚举枚举数据类型是一个有名字的某些整型常量的集合。这些整型常量是该类型变量可取的所有合法值。枚举定义时应当列出该类型变量的所有可取值。枚举定义的格式与结构和共同体基本类似,只是关键字变为enum。单片机原理及接口技术4.6C51库函数库函数是编译系统为用户设计的一系列标准函数,用户只需调用,而无需自己去编写这些复杂的函数,如前面所用到的头文件reg51.h、absacc.h等,有的头文件中包括一系列函数,要使用其中的函数必须先使用#include包含语句,然后才能调用。内部库函数

#include<intrins.h>_crol_,_cror_:将char型变量循环向左(右)移动指定位数后返回

_iror_,_irol_:将int型变量循环向左(右)移动指定位数后返回_lrol_,_lror_:将long型变量循环向左(右)移动指定位数后返回

_nop_:相当于插入NOP_testbit_:相当于JBCbitvar测试该位变量并跳转同时清除单片机原理及接口技术2.直接访问存储区的头文件#include<absacc.h>”

可以直接访问指定地址的存储区单元CBYTE、CWORD:直接访问程序存储区;DBYTE、DWORD:访问内部数据区;PBYTE、PWORD:访问外部数据区当前页;XBYTE、XWORD:访问外部数据区。例:rval=CBYTE[0x0002];//指向程序存贮器的0002H地址rval=XWORD[0x0002];//指向外RAM的0004H地址单片机原理及接口技术3.数学函数#include<math.h>包含常用的算术运算函数sin:sin函数cos:cos函数abs:求绝对值exp、log、sqrt、tan、pow:xy4.缓冲区处理函数#include<string.h>包括搜索、比较、拷贝、移动等函数memchr;memcmp;memcpy;memmove;strcat;strchr;strcmp;strcpy5.字符转换与字符分类#include<ctype.h>isxdigit:判断字符是否是16进制数字字符

islower:是否是小写isupper:是否是大写

tolower:字符转换成小写字符toupper:字符转换成大写字符单片机原理及接口技术4.7C51程序编写1.顺序结构顺序结构是最基本、最简单的程序结构。在这种结构中,程序由低地址到高地址依次执行。2.选择结构选择结构可使程序根据不同的情况,选择执行不同的分支。3.循环结构在程序处理过程中,有时需要某一段程序重复执行多次,这时就需要循环结构来实现。

4.7.1

C51程序的基本结构单片机原理及接口技术(1)if语句if语句是C51语言中一个基本的条件选择语句,它是根据判定结果来决定执行给出的两个操作之一。通常有3种格式:1)if(表达式){语句;}2)if(表达式){语句1;}else{语句2;}3)if(表达式1){语句1;}esleif(表达式2){语句2;}elseif(表达式3){语句3;}……elseif(表达式n-1){语句n-1;}else{语句n;}

单片机原理及接口技术(2)switch/case语句

if语句通过嵌套可以实现多分支结构,但如果分支过多,则嵌套的if语句层数就多,结构就更加复杂,程序可读性降低。为此C51语言中提供了专门处理多分支结构的switch/case语句。一般格式为switch(表达式){case常量表达式1:{语句1;}break;case常量表达式2:{语句2;}break;...case常量表达式n:{语句n;}break;default:{语句n+1;}}单片机原理及接口技术(3)while语句while语句在C51语言中用于实现当型循环结构,一般格式为while(表达式){语句;}/*循环体*/表达式是while语句能否循环的条件,后面的语句是循环体。当表达式的结果为非0(“真”)时,就重复执行循环体内的语句;当表达式的结果为0(“假”)时,则终止while循环,程序将执行循环结构之外的语句。它的特点是:先判断条件,后执行循环体。如条件成立,则再执行循环体;如条件不成立,则退出循环。该方法常用来测试硬件上的某些信号变化。单片机原理及接口技术例4-35利用while语句编程实现1~100的累加和,并输出结果。#include<reg51.h>/*包含特殊功能寄存器库*/#include<stdio.h>/*包含I/O函数库*/voidmain(void)/*主函数*/{inti,j=0;/*定义整型变量i和j*/i=1;SCON=0x52;/*串口初始化*/TMOD=0x20;TH1=0xF3;TR1=1;while(i<=100)/*累加1~100之和在中*/{j=j+i;i++;}printf("1~100的累加和为%d。\n",j);while(1);}程序运行结果:1~100的累加和为5050单片机原理及接口技术(4)do-while语句

do-while语句在C51语言中用于实现直到型循环结构,一般格式为do{语句;}/*循环体*/while(表达式);特点是:先执行语句,后判断表达式。若表达式的结果为非0(“真”),则再执行循环体,然后又判断,直到有表达式的结果为0(“假”)时,退出循环,执行do-while结构的下一条语句。do-while语句在执行时,循环体内的语句至少会被执行一次。单片机原理及接口技术例4-36利用do-while语句编程实现1~100的累加和,并输出结果。#include<reg51.h>/*包含特殊功能寄存器库*/#include<stdio.h>/*包含I/O函数库*/voidmain(void)/*主函数*/{inti,j=0;/*定义整型变量i和j*/i=1;SCON=0x52;/*串口初始化*/TMOD=0x20;TH1=0xF3;TR1=1;do/*累加1~100之和在j中*/{

j=j+i;i++;}while(i<=100);printf("1~100的累加和为%d。\n",j);while(1);}程序运行结果:1~100的累加和为5050。单片机原理及接口技术(5)for语句

在C51语言中,for语句是使用最灵活、最方便,应用最多的循环控制语句,同时也是最复杂的。它可以用于循环次数已经确定的情况,也可以用于循环次数不确定的情况。一般格式为for(表达式1;表达2;表达式3){语句;}/*循环体*/在for循环中,一般表达式1为初始化表达式,用于给循环变量赋初值;表达式2为循环测试表达式,对循环变量进行判断;表达式3为增量尺度表达式,用于对循环变量的值进行更新,使循环变量不满足条件而退出循环。它的执行过程如下:1)先求解表达式1的值。2)再求解表达式2的值。若表达式2的值为真,则执行循环体中的语句,并求解表达式3,然后重复执行步骤(2)的操作;若表达式2的值为假,则结束for循环,执行后面的语句。单片机原理及接口技术例4-37

利用for语句编程实现1~100的累加和,并输出结果。#include<reg51.h>/*包含特殊功能寄存器库*/#include<stdio.h>/*包含I/O函数库*/voidmain(void)/*主函数*/{inti,j=0;/*定义整型变量i和j*/i=1;SCON=0x52;/*串口初始化*/TMOD=0x20;TH1=0xF3;TR1=1;for(i=1;i<=100;i++)j=j+i;/*累加1~100之和在j中*/printf("1~100的累加和为%d。\n",j);while(1);}程序运行结果:1~100的累加和为5050。单片机原理及接口技术(6)循环的嵌套若在一个循环结构的循环体中又包含一个完整的循环结构,这种结构称为循环的嵌套。外面的循环结构称为外循环,里面的循环结构称为内循环,如果在内循环的循环体内又包含循环结构,就构成了多重循环结构。在C51语言中,允许三种循环结构相互嵌套。例4-38用嵌套结构构造一个延时程序。

voiddelay(unsignedintx){unsignedcharj;while(x--)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论