




免费预览已结束,剩余155页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3,C51语言编程基础,2,内容概要,本章在读者已掌握标准C语言前提下,初步介绍如何使用C51来编写AT89C51单片机的应用程序。C51是在标准C的基础上,根据单片机存储器硬件结构及内部资源,扩展了相应的数据类型和变量,而C51在语法规定、程序结构与设计方法上,都与标准C相同。本章重点介绍C51对标准C所扩展的部分,并通过一些例程来介绍C51的程序设计思想。,3,单片机入门主要掌握以下知识和应用,最小系统能够运行起来的必要条件。1.电源2.晶振3.复位电路对单片机任意IO口的随意操作1.输出控制电平高低2.输入检测电平高低。定时器:重点掌握最常用的方式2中断:外部中断、定时器中断、串口中断串口通信:单片机之间、单片机与计算机间,4,目前51系列单片机编程的C语言都采用KeilC51(简称C51),KeilC51是在标准C语言基础上发展起来的。C语言是美国国家标准协会(ANSI)制定的编程语言标准,1987年ANSI公布87ANSIC,即标准C语言。KeilC51语言是在ANSIC的基础上针对51单片机的硬件特点进行的扩展,并向51单片机上移植,经过多年努力,C51语言已经成为公认的高效、简洁而又贴近51单片机硬件的实用高级编程语言。,3.1编程语言KeilC51简介,5,C语言具有结构化和模块化特点,便于阅读和维护。C语言可移植性好,很多微控制器都支持C编译器。功能化的代码能够很方便的从一个工程移植到另一个工程,从而减少了开发时间。提供的库函数包含许多标准子程序,具有较强的数据处理能力。,使用C语言的优点,6,使用C语言的优点,C语言编写的程序比汇编语言编写的程序更符合人们的思考习惯,寄存器分配,不同存储器的寻址及数据类型等细节交由编译器管理,开发者可以更专心的考虑算法,而不是考虑一些细节问题。这样可以减少编程出错的机率,从而提高开发效率,减少调试的时间。C语言和微控制器是相对独立的,开发者不必知道处理器的具体内部结构和处理过程。当用新型的微控制器开发程序时,可以很快上手,减少学习时间和程序开发时间。,7,C51与标准C的主要区别,(1)头文件的差异。51系列单片机厂家有多个,它们的差异在于内部资源如定时器、中断、I/O等数量以及功能的不同,而对使用者来说,只需要将相应的功能寄存器的头文件加载在程序内,就可实现所具有的功能。因此,KeilC51系列的头文件集中体现了各系列芯片的不同资源及功能。(2)数据类型的不同。51系列单片机包含位操作空间和丰富的位操作指令,因此KeilC51与ANSIC相比又扩展了4种类型,以便能够灵活地进行操作。电脑CPU是32位或64位,运算能力强,内存大,大量使用float型与longint型变量,单片机一般为8位或16位,运算能力较弱,以char型为主,int型为辅,8,(3)数据存储类型的不同。C语言最初是为通用计算机设计的,在通用计算机中只有一个程序和数据统一寻址的内存空间,而51系列单片机有片内、外程序存储器,还有片内、外数据存储器。标准C并没有提供这部分存储器的地址范围的定义。此外,对于AT89S51单片机中大量的特殊功能寄存器也没有定义。(4)标准C语言没有处理单片机中断的定义。(5)KeilC51与标准C的库函数有较大的不同。由于标准C的中的部分库函数不适于嵌入式处理器系统,因此被排除在KeilC51之外,如字符屏幕和图形函数。,9,(6)目标代码电脑生成.exe格式,编译完成后直接在电脑上运行,单片机编译生成.bin代码文件,需要烧写到单片机中并结合外围电路执行。(7)仿真调试单片机的C程序在电脑上进行编译,然后需通过仿真器连接后进行仿真调试,近年来随着电路仿真软件的不断完善,也可通过proteus等软件直接在电脑上进行仿真调试。,10,但是从数据运算操作、程序控制语句以及函数的使用上来说,KeilC51与标准C几乎没有什么明显的差别。如果程序设计者具备了有关标准C的编程基础,只要注意KeilC51与标准C的不同之处,并熟悉AT89S51单片机的硬件结构,就能够较快地掌握KeilC51的编程。,11,(1)编译器:由源代码文件生成目标文件,(2)开发套件:包含了编译器、链接器等开发工具的组合包,(3)IDE(IntegratedDevelopmentEnvironment集成开发环境)将项目管理、源代码编辑和程序编译、链接、调试等各种工具组合在一个功能强大的环境中,具有良好人机界面。,8051单片机所使用的C语言编译器简称为Cx51,例如包含Cx51、Ax51、BL51、LIB51、OH51、RTX51等,KeilVision3IDE,3.2KeilC51的开发工具,12,KeilVision3IDE,Cx51.exe,KeilC51开发套件v7.50,13,C语言结构特点,一个C程序由一个或多个函数组成,其中必须有一个用main命名的主函数。每个函数由头部和函数体两部分组成。每个C语句以“;”结尾。C程序的书写格式比较自由。可以在程序的任何位置用/*.*/对C程序中的任何部分作注释。可以在行末用/追加注释。,14,C51的程序结构,#includevoiddelay();voidmain()delay();P0=0 x33;,例:文件led.c内的代码如下:,程序的入口函数名固定,且与书写的位置无关有且仅有一个,库函数或用户自定义的函数可以有若干个,C51程序大体上是若干函数的集合,15,单片机控制LED(电路图),16,我的第一个程序(单片机控制LED点亮),#includesbitLED=P10;voidmain()/主程序LED=0;/点亮LEDwhile(1);,17,单片机控制LED闪烁(程序),#include#defineucharunsignedchar#defineuintunsignedintsbitLED=P10;voiddelay(uintx)/延时程序uchari;while(x-)for(i=0;i120;i+);,voidmain()/主程序while(1)LED=LED;/LED灯闪烁delay(400);,18,KEIL与PROTEUS快速入门,KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。,KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。,19,1、建立一个新工程单击Project菜单,在弹出的下拉菜单中选中NewProject选项,如图3所示。,图3新建工程文件,KEILC51快速入门,20,2、然后选择你要保存的路径,输入工程文件的名字,如图4所示,然后点击保存。,图4新建工程文件的保存路径,KEILC51快速入门,21,3、这时会弹出一个对话框,要求你选择单片机的型号,你可以根据你使用的单片机来选择,keilc51几乎支持所有的51内核的单片机,如图所示,选择89C51之后,右边栏是对这个单片机的基本的说明,然后点击确定。,图5选择单片机的型号,KEILC51快速入门,22,4、完成上一步骤后,屏幕如图6所示。,图6完成新建工程文件,KEILC51快速入门,23,下面可以编写程序。5、在图2-7中,单击“File”菜单,再在下拉菜单中单击“New”选项。,新建文件后屏幕如图8所示。,图7新建文档,图8完成新建文档,KEILC51快速入门,24,此时光标在编辑窗口里闪烁,这时可以键入应用程序了,建议首先保存该空白的文件,单击菜单上的“File”,在下拉菜单中选中“SaveAs”选项单击,屏幕如下图所示,在“文件名”栏右侧的编辑框中,键入欲使用的文件名,用C语言编写扩展名为(.c)如果用汇编语言编写扩展名必须为(.asm)。然后,单击“保存”按钮。如图8所示。,图8保存新建文档,KEILC51快速入门,25,6、回到编辑界面后,单击“Target1”前面的“”号,然后在“SourceGroup1”上单击右键,弹出菜单9。,图9打开添加文档界面,KEILC51快速入门,26,然后单击“AddFiletoGroupSourceGroup1”,屏幕如图10所示。,图10添加文档,KEILC51快速入门,27,选中main.c,然后单击“Add”屏幕如下图所示。,注意到“SourceGroup1”文件夹中多了一个子项“main.c”子项的多少与所增加的源程序的多少相同。7、现在便可输入程序了,输入完毕进行调试便可运行。,图10完成添加文档,KEILC51快速入门,28,Proteus快速入门,Proteus软件和我们手头的其他电路设计仿真软件最大的不同即它的功能不是单一的。它的强大的元件库可以和任何电路设计软件相媲美;它的电路仿真功能可以和Multisim相媲美,且独特的单片机仿真功能是Multisim及其他任何仿真软件都不具备的;它的PCB电路制版功能可以和Protel相媲美。它的功能不但强大,而且每种功能都毫不逊于Protel,是学习电子设计难得的一个工具软件。,29,ISIS智能原理图输入系统,系统设计与仿真的基本平台。ARES高级PCB布线编辑软件。在Proteus中,从原理图设计、单片机编程、系统仿真到PCB设计一气呵成,真正实现了从概念到产品的完整设计。Proteus从原理图设计到PCB设计,再到电路板完成的流程如图所示。,30,数据数据类型、数据结构、存储类型运算算术运算、关系运算、逻辑运算、位操作控制顺序结构、选择结构、循环结构、函数,3.3C51语言程序设计基础,C51语言程序设计的三大要素,31,3.3.1C51数据类型与存储类型,常量与变量常量:程序运行中值不能改变的量称为常量,常量存在于ROM中。变量:变量代表存贮器中的一个或多个存储单元,用来存放数据,一般来讲这些值在程序运行中可以改变(只读变量除外)变量名命名规则:变量名只能由半角的字母、数字、下划线组成,且第一个字符不能是数字。变量存在的类型称为数据类型。,32,C51数据类型与标准C数据类型的最大不同之处:位型。,数据类型,33,C51数据类型,34,C51数据类型,35,char数据类型,单片机应用中ASCII字符和字符串的使用比较少(因为很少需要大量的文本信息),因此在单片机应用中定义为unsignedchar和char的变量常用来表示数值。,数据类型的使用,单片机系统总存储空间往往比较有限,因此在实际使用中应注意节约存储空间;对于8位单片机,8位的数据类型是运算最快的;而对于16位单片机,8位的数据和16位的数据可能运算速度是一样的。,36,C语言的变量定义与赋值,定义一个变量先定义,后使用。例如:Inta;charb;变量赋初值,C允许在定义变量的同时给变量赋初值。例如:charc=a;inta=7;inta,b,c=9;/定义a、b、c为整型变量,对c赋初值。inta=3,b=3,c=3;错误:inta=b=c=3;,37,定义变量类型应考虑如下问题:程序运行时该变量可能的取值范围,是否有负值,绝对值有多大,以及相应需要的存储空间大小。在够用的情况下,尽量选择8位即一个字节的char型,特别是unsigedchar。对于51系列这样的定点机而言,浮点类型变量将明显增加运算时间和程序长度,如果可以的话,尽量使用灵活巧妙的算法来避免浮点变量的引入。,38,C51的扩展数据类型,(1)位变量bitbit的值可以是1(true),也可以是0(false)。使用关键字bit例如:bitlock;/*将lock定义为位变量*/bitdirention;/*将direction定义为位变量*/,39,位变量的使用不能定义成一个指针,如不能定义:bit*pointer;不存在位数组如不能定义:bitb_array位变量定义时,存储类型只允许为data、bdata或者idata,如果将位变量的存储类型定义成其它类型都将导致编译出错。,40,C51的扩展数据类型,(2)特殊功能寄存器sfrAT89S51特殊功能寄存器在片内RAM区的80HFFH之间,“sfr”数据类型占用一个内存单元。利用它可访问AT89S51内部的所有特殊功能寄存器。例如:sfrP1=0 x90这一语句定义P1口在片内的寄存器,在后面语句中可用“P1=0 xff”(使P1的所有引脚输出为高电平)之类的语句来操作特殊功能寄存器。标准SFR在reg51.h、reg52.h等头文件中已经被定义,只要用文件包含做出申明即可使用。,41,(3)特殊功能寄存器sfr16“sfr16”数据类型占用两个内存单元。sfr16和sfr一样用于操作特殊功能寄存器。所不同的是它用于操作占两个字节的特殊功能寄存器。例如:sfr16DPTR=0 x82语句定义了片内16位数据指针寄存器DPTR,其低8位字节地址为82H。在后面的语句中可以对DPTR进行操作。,42,(4)特殊功能位sbitsbit是指AT89C51片内特殊功能寄存器的可寻址位。例如:sfrPSW=0 xd0;/*定义PSW寄存器地址为0 xd0*/sbitPSW2=0 xd2;/*定义OV位为PSW.2*/符号“”前面是特殊功能寄存器的名字,“”的后面数字定义特殊功能寄存器可寻址位在寄存器中的位置,取值必须是07。注意,不要把bit与sbit混淆。bit用来定义普通的位变量,值只能是二进制的0或1。而sbit定义的是特殊功能,43,#includesbitD3=P22;voidmain()D3=0;/点亮LEDwhile(1)/循环,挂起;,_,_,_,引用含有SFR符号定义的头文件定义符号D3为P2口的第2位D3可以换为其他自定义符号,作用相同,如:sbitP2_2=P22;点亮发光二极管的功能语句while(1)无限循环,用于程序的反复执行或者程序挂起,很重要!使用tab或者空格,使程序结构清晰,便于阅读适当加入注释,使编程思路清晰,便于阅读和后期的修改,sbit的使用,44,89S51单片机的数据存储类型,8051系列微处理器采用了哈佛结构,即程序存储器和数据存储器是分离的。8051系列微处理器提供了三种不同类型的存储区域(memoryareas):程序存储区(programmemory)内部数据存储区(internaldatamemory)外部数据存储区(externaldatamemory)这三种存储区域均从地址0开始编址,通过采用不同的寻址指令来解决地址重叠的问题。,45,C51数据的存储类型,在讨论C51的数据类型的时候,必须理解数据的存储类型和它与8051单片机存储器结构的关系.,46,C51存储类型,47,存储区域的划分,48,(1)内部数据存储区(internaldatamemory),内部数据存储区(internaldatamemory),共256个字节。这部分主要是作为程序的数据段。前128字节,称为DATA区。该区可采用直接寻址方式来访问。DATA区也以用R0和R1间接寻址访问。后128个字节,即从地址80H开始的内部数据存储区,用做特殊功能寄存器区(specialfunctionregistermemory),简称SFR。这些特殊功能寄存器用来控制计时器,计数器,串行I/O,I/O端口和外设的工作。只能直接寻址注意:特殊功能寄存器并未占用特殊功能寄存器区的所有地址单元,即特殊功能寄存器是离散分布。,49,内部数据存储区的DATA区又可以细分为三个子段:四个工作寄存器组,每个寄存器组包含8个寄存器,四个寄存器组共32个字节。由PSW的RS1和RS0选择四组寄存器的任意一组作为当前工作寄存器组。位寻址段BDATA,包括16个字节,共128位,每一位都可单独寻址。也可以按字节进行寻址。一般数据存储器,仅能按字节寻址,共80个字节。,内部数据存储区(internaldatamemory),50,(2)外部数据存储区(externaldatamemory),也称为XDATA区。XDATA区和CODE区一样也采用16位地址寻址,即寻址空间可达64KB。该区通常包括一些通用数据存储器或者一些需要通过总线接口访问的外围器件。访问外部数据区比访问内部数据区要慢,因为访问外部数据区时,必须先将要访问单元的16位地址装载到数据指针寄存器DPTR中,然后才能通过DPTR采用间接访问方式来访问该单元。,51,C51使用两种修饰符来表示外部数据区:xdata,pdataxdata:说明外部数据空间的所有64KB的地址空间。pdata:指向外部数据空间中的大小为一页(256字节)的数据存储空间。注意:某些新型的51芯片有更大的XRAM(如16M的XRAM),一般用far类型来描述这些区域。可以分别用far和constfar来访问位于扩充RAM空间中的变量和扩充ROM空间中的常量。某些单片机芯片提供了片内的XRAM空间,这种空间也使用和传统的外部数据空间相同的指令来访问,外部数据存储区(externaldatamemory),52,说明:某些系列的单片机(如8052)有额外的128字节的内部RAM,同样位于从80H开始的内部数据存储地址空间中,称为IDATA区。IDATA区的地址和SFR的地址是重叠的,必须使用不同的寻址方式的指令来解决地址重叠问题。SFR区只能通过直接寻址来访问,IDATA区只能通过间接寻址来访问。,内部数据存储区(internaldatamemory),53,(3)程序存储区(CODE),程序存储区,也称为CODE区,常用来存放可执行代码。代码区的地址位数为16位,即寻址空间可达64K。一般情况,程序存储区是只读的,除了保存可执行代码,还可用于保存各种常量值,查找表等固定的数据结构。如:unsignedcharcodetest=“hello!”;,54,存储器类型的变量声明举例,chardatavar1;charcodetext=ENTERPARAMETER:;unsignedlongxdataarray100;floatidatax,y,z;unsignedintpdatadimension;unsignedcharxdatavector1044;,说明:声明变量时存储区修饰符和数据类型修饰符的位置可以互换,即chardatax;和datacharx;是完全等效的。不过从兼容性考虑,建议使用前一种格式。,55,变量类型修饰符总结,data:速度最快,可以读或写操作,只有128字节,可以省略,89C51单片机默认的变量存储位置就是128字节的片内数据存储区。idata:速度较快,可以读或写操作,只有128字节,注意只存在于尾缀为52以上的单片机中,当data数据不够可用idata。xdata:速度较慢,可以读或写操作,最多有64k字节(取决于外接的SRAM芯片容量),一般用于解决内部SRAM不够用同时对变量访问不需要非常快的应用场合。code:速度最慢,只读,最多有64K字节(取决于内部ROM与外部ROM容量之和)。一般用于存储大量的只读数据(如图形液晶的数据,文本数据等),56,定义数据的存储类型通常遵循如下原则:只要条件满足,尽量选择内部直接寻址的存储类型data,然后选择idata即内部间接寻址。对于那些经常使用的变量要使用内部寻址。在内部数据存储器数量有限或不能满足要求的情况下才使用外部数据存储器。选择外部数据存储器可先选择pdata类型,最后选用xdata类型。需指出,扩展片外存储器,原理上虽很简单,但在实际开发中,很多时候,会带来不必要的麻烦,如可能降低系统稳定性、增加成本、拉长开发和调试周期等,推荐充分利用片内存储空间。,57,另外,通常的单片机应用都是面对小型的控制,代码比较短,对于程序存储区的大小要求很低,常常是片内RAM很紧张而片内FlashROM很富裕,因此如果实时性要求不高,可考虑使用宏,以及将一些子函数的常量数据做成数据表,放置在程序存储区,当程序运行时,进入子函数动态调用下载至RAM即可,退出子函数后立即释放该内存空间。,58,定义变量时如果省略“存储器类型”选项,则按编译时使用的存储器模式SMALL、COMPACT、或LARGE来使用默认的存储器类型。,SMALL:默认存储类型为data,访问速度最快,容量小COMPACT:默认存储类型为pdataLARGE:默认存储类型为xdata,访问效率最低,代码长,容量大,一般使用SMALL模式,对部分容量大的变量,手动指定存储器类型(如定义为xdata类型)。,数据存储模式,59,存储模式(memorymodels),如果在变量声明时未声明变量的存储器类型,则该变量的存储器类型,由程序的存储模式来决定。小模式(smallmodel):默认data区紧凑模式(compactmodel):默认pdata区大模式(largemodel):默认xdata区注意:除非应用在特殊的场合,否则SMALL存储模式可以提供最快和最有效的代码。,60,3.3.2C51语言的特殊功能寄存器及位变量定义,特殊功能器的定义(1)使用关键字定义sfrsfrIE=0 xA8;(2)通过头文件访问SFR#include#include(3)特殊功能寄存器中的位定义sbitCY=PSW7;sbitCY=0 xD07;sbitCY=0 xD7;,61,位变量的C51定义(1)位变量的C51定义(2)函数可以包含类型为bit的参数,也可将其作为返回值。(3)位变量不能定义指针和数组。,62,如何对单片机片内RAM、片外RAM及I/O进行访问,C51提供了两种比较常用的访问绝对地址的方法。,绝对宏,C51编译器提供一组宏定义来对code、data、pdata和xdata空间进行绝对寻址。在absacc.h的头文件中在使用前,需要将头文件包含进来:#include,3.3.3C51语言的绝对地址访问,63,绝对宏,CBYTE:以字节形式对code区寻址;CWORD:以字形式对code区寻址;DBYTE:以字节形式对data区寻址;DWORD:以字形式对data区寻址;XBYTE:以字节形式对xdata区寻址;XWORD:以字形式对xdata区寻址;PBYTE:以字节形式对pdata区寻址;PWORD:以字形式对pdata区寻址。,64,_at_关键字,使用关键字_at_可以对指定的存储器空间的绝对地址进行访问,格式如下存储器类型数据类型说明符变量名_at_地址常数,说明:存储器类型和数据类型C51能识别的地址常数必须位于有效的存储器空间之内使用_at_定义的变量必须为全局变量,65,C51的基本运算与标准C类似,主要包括:算数运算;关系运算;逻辑运算;位运算;赋值运算及其表达式。,3.3.4C51的数据运算,66,算术运算符及其说明,算数运算符,67,对于“/”和“%”往往会有疑问。这两个符号都涉及除法运算,但“/”运算是取商,而“%”运算为取余数。例如“5/3”的结果(商)为1,而“5%3”的结果为2(余数)。自增和自减运算符是使变量自动加1或减1,自增和自减运算符放在变量前和变量之后是不同的。+i,-i:在使用i之前,先使i值加(减)1。i+,i-:在使用i之后,再使i值加(减)1。,68,例如:若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。,69,逻辑运算符,70,关系运算符,71,位运算是指进行二进制位的运算,在单片机编程中,常需要处理二进制位的问题。例如:将寄存器的某一位或某几位置1、清0与取反;将一个存储单元中各二进制位左移或右移N位,两个数按位相加等等。C语言中提供位运算的功能,更加贴近单片机硬件,与其他高级语言相比,具有很大的优越性。,位运算符,72,位运算符,73,左移运算符()用来将一个数的各二进位全部左移若干位,左高位溢出,右低位补0。如b=a2;a=a2;a=2;a=15,左移2位等于多少?高位左移后溢出,舍弃掉。在该数左移时被溢出舍弃的高位不包含1时,左移1位相当于该数乘以2.152=60143)用来将一个数的各二进位全部右移若干位,左高位补0,右低位溢出。如b=a2;a=a2;a=2;a=15,左移2位等于多少?低位右移后溢出,舍弃掉。152=3142=3,75,按位异或运算符()异或运算符的规则是参加运算的两个二进制位相同为0(假),相异为1(真)。即00=0;01=1;10=1;11=0;例如:0 x2D0 x0F=0 x22,将十六进制数0 x2D与十六进制数0 x0F进行按位异或运算,高四位保持不变,低四位全部翻转。通过按位运算可以实现对变量的某一位或某几位取反操作。,76,取反运算符()是一个单目运算符,用来对一个二进制数按位取反,即将0变1,1变0。例如48。取反运算符常与移位运算符及按为与、按位或、按位异或运算符结合使用以实现对某一位或某几位清0、置1、取反的操作。,77,按位与运算符(功能:将c向左循环移位b位函数原型unsignedchar_cror_(unsignedcharc,unsignedcharb);功能:将c向右循环移位b位,用库函数实现上述流水灯,例如:P0=_cror_(P0,3);/将P0带位循环右移3位,80,例:unsignedcharx=0 x55;unsignedchary=0 x37;unsignedcharz;z=x则z=0 x2A,位运算符举例,81,位运算编程小窍门(将某一位置1、置0、取反),将某一位置1(相应位与1进行按位或运算)例:P0|=(1n);/将P0的第n位置1,其它位不变将某一位置0(相应位与0按位进行与运算)例:P0/将P0的第n位置0,其它位不变将某一位取反(相应位与1进行按位异或运算)例:P0=(1n),82,按位与的用途,某一位或某几位清零而其它位保持原值如原有数在P0寄存器中,为01011010,现要将其第一位清0,其它位保持不变。则可与11111101进行按位与。即P0=P0/将P0的第n位置0,其它位不变,83,按位与的用途,取一个数中的某些指定位例:取单片机P0口的P0.2位状态(1或0)可这样操作:if(P0,84,按位异或的用途,将某一位或某几位取反(相应位与1进行按位异或运算)例:P0=(1n)编程实现8位LED灯1357位和2468位依次交替闪烁,85,按位或的用途,将某一位或某几位置1(相应位与1进行按位或运算),例:P0|=(10;i-)for(j=34;j0;j-);,128,voidmain(void)while(1)while(KEY_BIT=1);delay10ms(1);/延时消抖if(KEY_BIT=0)while(KEY_BIT=0);/等待按键释放P0=smgk;k+=1;if(k=16)k=0;,129,3.3.7C51的指针,C51指针的定义由于MCS-51单片机有三种不同类型的存储空间,并且还有不同的存储区域,因此C51指针的内容更丰富。指针除了具有像变量的四种属性(存储类型、数据类型、存储区、变量名)外,按存储区,将指针分为通用指针和不同存储区域的专用指针。,130,通用指针,所谓通用指针,就是通过该类指针可以访问所有的存储空间。在C51库函数中通常使用这种指针来访问。通用指针用3个字节来表示:第一个字节:表示指针所指向的存储空间第二个字节:为指针地址的高字节第三个字节:为指针地址的低字节,131,通用指针的定义与一般C语言指针的定义相同,其格式为:存储类型数据类型*指针名1,*指针名2,例如:unsignedchar*cpt;int*dpt;long*lpt;staticchar*ccpt;,通用指针的特点:定义简单访问所有空间访问速度慢,132,所谓存储器专用指针,就是通过该类指针,只能够访问规定的存储空间区域。指针本身占用1个字节(data*,idata*,bdata*,pdata*)或2个字节(xdata*,code*)。存储器专用指针的一般定义格式为:存储类型数据类型指向存储区*指针存储区指针名1,*指针存储区指针名2,专用指针,133,指向存储区:是指针变量所指向的数据存储空间区域。不能够缺省。指针存储区:是指针变量本身所存储的空间区域。缺省时认为指针存储区在默认的存储区域,其默认存储区域决定于所设定的编译模式。指向和指针存储区,两者可以是同一个区域,但多数情况下不会是同一个区域。,134,存储器专用指针例子:unsignedchardata*cpt1,*cpt2;signedintidata*dpt1,*dpt2;unsignedcharpdata*ppt;signedlongxdata*lpt1,*lpt2;unsignedcharcode*ccpt;上面所定义的指针虽然所指向的空间不同,但指针变量本身都存储在默认的存储区域。,135,又如:1)unsignedchardata*idatacpt1,*idatacpt2;2)signedintidata*datadpt1,*datadpt2;3)unsignedcharpdata*xdatappt;4)signedlongxdata*lpt1,*xdatalpt2;5)unsignedcharcode*dataccpt;绿色关键字为指针所指向的存储区蓝色关键字为指针本身所存储的区域,136,注意:(1)要区分指针变量指向的空间区域和指针变量本身所存储的区域;(2)定义时,前者不能缺省,而后者可以缺省;(3)指针变量的长度:指向不同的区域,占用的字节数不同。说明:指针变量本身所存储的区域,在定义指针时一般都省略了,指针变量本身保存在缺省存储的区域中。定义时,缺省指针存储的区域,显得简单,并且对初学者更容易理解。,137,例编写程序,将单片机片外数据存储器中地址从0 x1000开始16个字节数据,传送到片内数据存储器地址从0 x30开始的区域。程序段如下:unsignedchardatai,*dcpt;unsignedcharxdata*xcpt;dcpt=0 x30;/给指针赋地址xcpt=0 x1000;for(i=0;i16;i+)*(dcpt+i)=*(xcpt+i);,138,例在数字滤波中有一种叫做“中值滤波”技术,就是对采集的数据按照从大到小或者从小到大进行排序,然后取中间位置的数作为采样值。试编写一函数,对存放在片内数据存储器中,从0 x50开始的21个单元的采样数据,用冒泡法排序进行中值滤波,并把得到的中值数据返回。中值滤波函数如下:unsignedcharmedian_filter()unsignedchardata*point,i,j,n,d;,139,for(i=0;i20;i+)/外层循环20次point=0 x50;/point指向0 x50处n=20i;/n为内层循环次数for(j=0;j0;j-);,143,函数举例带参数返回函数,ucharBusy_Check()ucharstate;Lcd_RS=0;Lcd_RW=1;Lcd_EN=1;DelayMS(1);state=P0;Lcd_EN=0;DelayMS(1);returnstate;,144,3.6C51中的库函数,本征库函数本征库函数是指编译时直接将固定的代码插入到当前行,而不是用汇编语言中的“ACALL”和“LCALL”指令来实现调用,从而大大提高函数的访问效率。非本征库函数则必须由“ACALL”和“LCALL”指令来实现调用。KeilC51的本征库函数只有9个,数量虽少,但非常有用。本征库函数在头文件intrins.h中定义。,145,_crol_,_cror_:将char型变量循环向左(右)移动指定位数后返回_iror_,_irol_:将int型变量循环向左(右)移动指定位数后返回_lrol_,_lror_:将long型变量循环向左(右)移动指定位数后返回_nop_:相当于插入NOP_testbit_:相当于JBCbitvar测试该位变量并跳转同时清除。_chkfloat_:测试并返回源点数状态。,146,几类常用的库函数,专用寄存器include文件例如8031、8051均为reg51.h其中包括了所有8051的SFR及其位定义,一般系统都必须包括本文件。绝对地址include文件absacc.h该文件中实际只定义了几个宏,以确定各存储空间的绝对地址。动态内存分配函数,位于stdlib.h中,147,输入输出流函数,位于“stdio.h”中流函数通8051的串口或用户定义的I/O口读写数据,缺省为8051串口,如要修改,比如改为LCD显示,可修改lib目录中的getkey.c及putchar.c源文件,然后在库中替换它们即可。缓冲区处理函数位于“string.h”中其中包括拷贝比较移动等函数如:memccpymemchrmemcmpmemcpymemmovememset这样很方便地对缓冲区进行处理。,148,数学计算库函数数学计算库函数的原型声明包含在头文件MATH.H中。字符串处理库函数字符串处理库函数的原型声明包含在头文件STRING.H中,字符串函数通常接收指针串作为输入值。一个字符串应包括2个或多个字符,字符串的结尾以空字符表示。在函数memcmp、memcpy、memchr、memccpy、memset和memmove中,字
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年安全员考试高频难点题库
- 2025年政府会计准则医院考题预测
- 吉安县2025届中考猜题数学试卷含解析
- 迎新年春节致辞模板
- 2025年电力行业高级专家认证考试模拟题电力电缆方向及答案解析
- 2025年本科院校保卫处面试模拟题与参考答案
- 2025年事业单位地震招考高频题解
- 2025年品牌营销经理专业能力测评试题及答案解析
- 2025年建筑智能楼宇设计师资格考试试题及答案解析
- 2025年计算机信息安全专员职业水平考察试卷及答案解析
- 2025海南省老干部服务管理中心招聘事业编制人员6人(第1号)考试备考题库及答案解析
- 2025年内江市总工会公开招聘工会社会工作者(14人)笔试模拟试题及答案解析
- 2025云南辅警笔试题目及答案
- 2025四川内江市总工会招聘工会社会工作者14人笔试备考试题及答案解析
- 2025-2026学年湘教版(2024)初中数学八年级上册教学计划及进度表
- GB/T 45763-2025精细陶瓷陶瓷薄板室温弯曲强度试验方法三点弯曲或四点弯曲法
- 全过程工程咨询投标方案(技术方案)
- (高清版)DZT 0388-2021 矿区地下水监测规范
- 双高专业群电子商务专业群申报书
- 有害物质污染源识别与评价表
- 餐具洗消保洁制度管理办法
评论
0/150
提交评论