已阅读5页,还剩124页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
山东科技大学 单片机设计C51程序设计目录第一章C与805121.1 8051的编程语言21.2 C51编译器31. 3 Keil/ Franklin C51编程实例41. 4 C51程序结构10第二章C51数据与运算112. 1数据与数据类型112. 2常量与变量122. 3 C51数据的存贮类型与8051存贮器结构152. 4 8051特殊功能寄存器(SFR)及其C51定义202.5 8051并行接口及其C5l定义222.6位变量(BIT)及其C51定义222.7 C51运算符、表达式及其规则23第三章Cx51流程控制语句333.1 C语言程序的基本结构及流程图333.2选择语句3733循环语句40第四章C5l构造数据类型464.1数组464.3结构634.4共用体(union)694.5枚举(enum)70第五章 函数725.1函数的分类725.2函数的定义735.3函数的参数和函数值755.4函数的调用76第六章 程序876.基本概念876.2模块化程序开发过程906.3汇编和编译926.4覆盖和共享966.5库和连接/定位器976.6混合编程1016-7程序优化105第七章 8051内部资源的C编程1067.1 中断1067-2定时器/计数器(T/C1127.3 串行口121第一章C与80511.1 8051的编程语言 对于8051单片机,现有四种语言支持,即汇编,PL/M,C和BASIC 。 BASK通常附在PC机上,是初学编程的第一种语言。一个新变量名定义后可在程序中做变量使用,非常易学,根据解释的行可以找到错误而不是当程序执行完才能显现出来。BASIC由于逐行解释自然很慢,每一行必须在执行时转换成机器代码,需要花费许多时间,不能做到实时性。BASIC为简化使用变量,所有变量都用浮点值。2+2这样简单的运算完全是浮点算术操作,因而程序复杂且执行时间长。即使是编译BASIC,也不能解决此浮点运算问题。 8052单片机片内固化有解释BASIC语言,BASIC适用于要求编程简单而对编程效率或运行速度要求不高的场合。 PL/M是Intel从8080微处理器开始为其系列产品开发的编程语言。它很像PASCAL ,是一种结构化语言,但它使用关键字去定义结构。FL/M编译器像好的汇编器一样可产生紧凑代码。PL/M总的来说是“高级汇编语言”,可详细控制着代码的生成。但对8051系列,PL/M不支持复杂的算术运算、浮点变量,也无丰富的库函数支持。学习PL/M无异于学习一种新语言。 C是一种源于编写UNIX操作系统的语言,它是一种结构化语言,可产生紧凑代码。C结构是以括号而不是字和特殊符号的语言。C可以进行许多机器级函数控制而不用汇编语言。与汇编相比,有如下优点: *对单片机的指令系统不要求了解,仅要求对8051的存贮器结构有初步了解;关寄存器分配、不同存贮器的寻址及数据类型等细节可由编译器管理; *程序有规范的结构,可分为不同的函数,这种方式可使程序结构化; *具有将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性; *关键字及运算函数可用近似人的思维过程方式使用; *编程及程序调试时间显著缩短,从而提高效率; *提供的库包含许多标准子程序,具有较强的数据处理能力; *己编好程序可容易地植入新程序,因为它具有方便的模块化编程技术。 C语言作为一种非常方便的语言而得到广泛的支持,C语言程序本身并不依赖于机器硬件系统,基本上不作修改就可根据单片机的不同较快地移植过来。 8051汇编语言非常像其它汇编语言,指令系统比第一代微处理器要强一些。8051的不同存贮器区域使得其复杂一些。尽管懂汇编语言不是你的目的,但看懂一些可帮助你了解影响任何语言效率的8051特殊限定。例如,懂得汇编语言指令就可使用在片RAM做变量的优势,因为片外变量需要几条指令才能设置累加器和数据指针进行存取。要求使用浮点和启用函数时只有具备汇编编程经验才能避免生成庞大的、效率低的程序,这需要考虑简单的算术运算或先算好的查表法。最好的单片机编程者应是由汇编转用C而不是原来用过标准C语言的人。 1.2 C51编译器 8051系列单片机作为工业标准地位,从1985年开始就有8051单片机的C,语言编译器,简称C51。并非所有的C51编译器都产生能发挥8051特点的有效代码,下面就各公司的编译器作简要介绍。 AMERICAN AUTOMATION 编译器通过#asm和endasm预处理选择支持汇编语言。此编译器编译速度慢,要求汇编的中间环节。 ARCHIMEDES 它的鼻祖是瑞典的IAR,是支持分组开关(Bank)的编译器。它和ANSI兼容。只是需要一个较复杂的连接程序控制文件支持后程序才能运行。 AVOCET 软件包包括编译器、汇编器、连接器、库MAKE工具和编辑器,集成环境类似Borland和Turbo。 C编译器产生一个汇编语言文件,然后再用汇编器,好在其编译较快口 BSO/TASKING 它是一家专业开发和销售嵌人式系统软件工具的公司,一直为INTEL, LSI,MOTOROLA , PHILIPS ,SIM ENS, TEX AS ,INSTRUMENTS编写嵌入式系统的配套软件工具。它生产基于W INDOWS下的集成开发环境软件(EDE ,调试器(DEBUGGERS )和交叉模拟器。SIMLTLATORS,支持鼠标器,界面友好。软件格式符合Intel OMF-51和Intel Hex标准,它的汇编器和Intel汇编器兼容。它的C编译器支持内置函数允许用8051指令,如测试并清除(JBC)和十进制调整(DAA )。 Intel 8051软件工具包括:ASM51, PL/M51、C51和CROSSView51调试器。 DUNFIELD SHAREWARE 它是非专业的软件包,不支持floats ,longs或结构等。它不生成重定位代码。 FRANKLIN 它的鼻祖是Keil,在代码生成方面领先,可产生最少的代码。它支持浮点和长整数、重人和递归。它不提供库源代码,不能生成能汇编的汇编代码,仅产生混合代码,只能修改后汇编口若使用汇编语言,必须分开汇编程序。然后手工连接。若使用单片模式,它是最好的选择。Keil/Franklin专业级开发I具PK51,支持DOS和Window环境。包括: 1. Pro View8051琴集成窗口开发环境,对熟悉“Turbo C”的C编程者并不陌生; 2. C51优化C编译器; 3. A51宏汇编器; 4. L51 8051连接器/定位器; 5. LIB51库管理器; 6. MON51目标监控; 7. dscope-51模拟调试器; 8 RTX51 Tiny小型实时多任务操作系统(RTOS) 9. RTX51完整的RTOS.包括CAN和BITBUS支持。 INTERMETRICS 它的编译器用起来较困难,它要由可执行的宏语句控制编译项、汇编和连接,且选项很多。 MICRO COMPUTER CONTROLS 它不支持浮点数、长整数、结构和多维数组。Define不允许有参数,称作C编译器很勉强。它生成的源文件必须用Intel或MCC的8051汇编器汇编。 性能比较表1-1 整体特性编译器的算术支持(float和long )很重要。生成代码的大小比编译速度重要若项目需要许多快速运算,8051不是合适的选择)。开发速度比代码的多少重要。是否有浮点库是编译器是否有价值的体现。表1-1中的测试结果是在12MHz 286上编译,单片机用12MHz晶振。 版本编译时间存贮模式编译堆栈浮点支持American AutomationArchimedesAvocetBso/taskingFranklinIntermetricsMCCDunfields16.02.074.05A1.31.103.013.321.72.1160320314722512825222SMLTSCMLBSMLSALSALSL3SMLSL3NOYESNOYESYESNONONO1YESYESYESYESYESNONO注:1仅大模式有浮点支持。 2 不能编译所有测试程序。 3支持几种动态分配方案。 4ROM和RAM必须映像到同一地址空间。Architnedes和Franklin领先。Franklin以它的紧凑代码和使用方便领先;Archimedes以它性能完善和资料完善领先。其次是Bso/ Tasking和Avocet。本书(.语言例子是针对特定的编译器,采用的是Franklin的第3版。1. 3 Keil/ Franklin C51编程实例 一、实例的技术要求 输人+5V TTL脉冲信号N,对N的获取及处理如下: 1.设有8个微动开关W1W8 (1) wl,w2组成四个状态决定采样时间To 状态00 01 10 11 T = 2 4 6 8 s (2) w3,w4,w5组成八个状态决定报警阈 S 状态000 001 010 011 l00 101 110 111 s=50 l00 150 200 250 300 350 400 C3) w6为报警方式选择SC, SC =0为上闭报警,SC=1为下阈报警。 2.开机后机器开始计数,按采样时间以设置的T值进行,计数完毕后求出单位时间的计数率N(计数/秒)。 3.选择SC =0为上阈报警,判断当NS时发出报警信号,一直报警直到NS+0.2s时才撤消报警信号。4.选择SC=1为下阈报警,判断当N时发出报替信号,一直报警直到NS0. 2s时才撤消报警信号。 二、软件流程和源程序 根据所述的技术要求,使用P1口输人8位微动开关值。采用P3.1为高时报警。软件流程图如图1-1。根据流程图编程的Framklin C51下的源程序为MZMFR. C如下:/*This program is a example*/ /*item1*/#include /*item2*/#define uint unsigned int#define uchar unsigned char uchar bdata FLAG;sbit FLAG1= FLAG1;sbit FLAG2= FLAG2;sbit P1_1=P11;uchar data time,Dtime,Btime;/*item3*/uint fetch_rate(void); /*item4*/main() /*item5*/char bdata JFLAG;uint data state,Astate,Bstate,rate; /*item3*/doP1=0xFF; /*item6*/FLAG=P1;TXD=0; /*P3.1*/JFLAG= FLAG6;JFLAG=JFLAG&0x03;Switch(J FLAG)cas 0: time=2;Dtime=20;break;cas 1: time=4;Dtime=40;break;cas 2: time=6;Dtime=60;break;cas 3: time=8;Dtime=80;break;Btime=Dtime;JFLAG= FLAG3;JFLAG=JFLAG&0x07;switch(JFLAG)case 0:state=50;break;/*item7*/case 1:state=100;break;case 2:state=150;break;case 3:state=200;break;case 4:state=250;break;case 5:state=300;break;case 6:state=350;break;case 7:state=400;break;FLAG1=0;TMOD=0x51;TH1=0;TL1=0;TH0=0x3C;TL0=0xB0;TR0=1;TR1=1;ET0=1;EA=1;rate=fetch_rate(); /*item8*/if(!FLAG2)Astate=state+2*state/10;if(rate=state)TXD=1;do rate=fetch_rate();while(rate=state)TXD=1;do rate=fetch_rate();while(rate=Bstat);TXD=0;while(1);unsigned int fetch_rate() /*item9*/ /*item10*/ uint count;dowhile(!FLAG1); FLAG1=0;count=TH1*256+TL1;TH1=0;TL1=0;Dtime=Btime;return(count/time); /*item11*/ /*item12*/timer0 () interrupt 1 using 1 TH0=0x3C;TL0=0xb0;Dtime=Dtime-1;if (Dtime= =0) FLAG =1; 其中reg51. h文件定义了所有8051的特殊功能寄存器及中断。使用6 MHz晶振,每100 ms中断一次,采样时间time秒,Btime为Dtime的保留值是采样时间内应发生中断的次数。中断服务程序判断采样时间到设置标志位FLAG1, fetch_rate( )在采样时间到后取采样的计数值。count,求计数率,返回值为rate .程序循环到取微动开关前,以便程序能判断开关设置值的变化,随时修改门限值及上下阈报警。 C51源程序是一个ASCII文件,可以用任何标准的ASCII文本编程来编写,例如:Edit ,wardstar, PE等。当程序比较短时,也可以用MS-DOS提供的行编辑EDLIN C源程序的书写格式自由度较高,灵活性很强,有较大的任意性。 要点: 1.一般情况下,每个语句占用一行。 2.不同结构层次的语句,从不同的起始位置开始,即在同一结构层次中的语句,缩进同样的字数。 3.表示结构层次的大括号,通常写在该结构语句第一字母的下方,与结构化语句对齐,并占用一行。 三、编译和连接 一般采用一个批文件进行程序的编译和连接,批文件文件名为MZMFR. BAT,如下;REM TRANSLATE WITH C51C51 MZMFR. CDEBUG CODE SMALL ROM(SMALL)REM LINK WITH L51L51 MEMFR. OBJ MAP BIT(0) DATA(30H) IXREF 具体编译和连接的控制命令参见附录B的上机指南。C51程序开发过程图示为图12:1. 4 C51程序结构 C51程序结构与一般C语言没有什么差别。一个C51程序大体上是一个函数定义的集合,在这个集合中有仅有一个名为main的函数(主函数)。主函数是程序的人口.主函数中的所有语句执行完毕,则程序执行结束。下面部分配合实例用item说明。 函数定义item9由类型、函数名、参数表和函数体四部分组合。函数名是一个标识符,标识符都是大小写可区别的,最长为255个字符。参数表是用圆括号括起来的若干参数,项与项之间用逗号隔开。函数体是用大括号iteml0iteml2括起来的若干C语句,语句与语句之间用分号隔开,最后一个语句一般是return在主函数中可以省略)iterm 11。每一个函数都返回一个值,该值由return语句中的表达式指定(省略时为零)。函数的类型就是返回值的类型,函数类型(除整型外)均需在函数名前加以指定。 C51的一般格式如下: 类型函数名(参数表)参数说明;数据说明部分;执行语句部分; 一个函数在程序中可以三种形态出现:函数定义、函数调用和函数说明。函数定义ite m9相当于汇编中的一般子程序。函数调用item8相当于调用子程序的CALL语句,在C中,更普遍地规定函数调用可以出现在表达式中。函数定义和函数调用不分先后,但若调用在定义之前.那末在调用前必须先进行函数说明。函数说明tem4是一个没有函数体的函数定义,而函数调用则要求有函数名和实参数表。 C51中函数分为两大类,一类是库函数,一类是用户定义函数。库函数是C51在库文件中已定义的函数,其函数说明在相关的头文件中。这类函数,用户在编程时只要用include预处理指令将头文件包含在用户文件中item2,直接调用即可。用户函数是用户自己定义、自己调用的一类函数。从某种意义上来看,C编程实际上是对一系列用户函数的定义。 C51程序的编程要点如下,配合实例用item说明; 1. C语言是由函数构成的。一个C源程序至少包含一个函数(main )item5,也可以包含一个main函数和若干其它函数。因此,函数是C程序的基本单位。被调用的函数可以是编译器提供的库函数,也可以是用户根据需要自己编制设计的函数. 2.一个函数由两部分组成: (1)函数说明部分item9。包括函数名、函数类型、函数属性、函数参数(形参)名、形式参数类型。一个函数名后面必须跟一个圆括号,函数参数可以没有,如main ( ) item5 (2)函数体,即函数说明部分下面的大括号内的部分。如果一个函数内有多个大括号,则最外层的一对为函数体的范围。iteml1iteml2, 函数体一般包括: 变量定义item3 . 执行部分。由若干语句组成。 当然,在某些情况下也可以没有变量定义部分。甚至可以既无变量定义也无执行部分。 3.一个C程序总是从main函数item5开始执行的,而不论main函数在整个程序中的位置如何。 4. C程序书写格式自由,一行内可以写几个语句item7,一个语句可以分写在多行上。C程序无行号。 5.每个语句和数据定义的最后必须有一个分号item6。分号是C语句的必要组成部分。分号不可少,即使是程序中最后一个语句也应包含分号。 6. C语言本身没有输人输出语句。输人和输出的操作是由库函数scanf和printf等函数来完成的。C对输人输出实行“函数化”。 7.可以用/*/iteml对C程序中的任何部分作注释.一个好的、有使用价值的源程序都应当加上必要的注释,以增加程序的可读性。第二章C51数据与运算2. 1数据与数据类型数据具有一定格式的数字或数值叫做数据。数据是计算机操作的对象。不管使用任何语言、何种算法进行程序设计,最终在计算机中运行的只有数据流。 数据类型数据的不同格式叫作数据类型。 数据结构数据按一定的数据类型进行的排列、组合、架构称为数据结构。C51提供的数据结构是以数据类型的形式出现的,C51的数据类型如下所示。 数据类型基本类型位型(bit )字符型(char)整型(int)长整型(long)浮点型(float)双精度浮点型(double)构造类型数组类型(array)结构体类型(struct)共用体(union)枚举(enum)指针类型空类型Franklin C51编译器具体支持的数据类型有:位型(bit)、无符号字符(unsigned char)、有符号字符(signed char)、无符号整型(unsigned int)、有符号整型(signed int)、无符号长型(unsigned long)、有符号长型(signed iang),浮点(float)和指针类型等。Franklin C51编译器支持的数据类型、长度和数域如表3-1所示。表 21 Franklin C51的数据类型数据类型长度(bit)长度(byte)值域范围bitunsigned charsigned charunsigned intsigned intunsigned longsigned longfloatdouble一般指针188161632323264241122444830,1025512812706553532768327670429495729521474836482147483647土1. 176E-38土3. 40E+38(6位数字)土1. 176E-38土3. 40E+38(10位数字)存贮空间 065535 编译的数据类型(如结构)包含表2-1所列的数据类型。由于8051系列是8位机,因而不存在字节校准问题。这意味着数据结构成员是顺序放置的。数据类型的转换:当计算结果隐含着另外一种数据类型时,数据类型可以自动进行转换,例如,将一个位变量赋给一个整型变量时,位型值自动转换为整值,有符号的变量的符号也能自动进行处理。这些转换也可以用C语言的标准指令进行人工转换。2. 2常量与变量C语言中的数据有常量变量之分。常量在程序运行的过程中,其值不能改变的量称为常量。与变量一样,常量可以有不同的数据类型。如0,1,2,3为整型常量;4. 6, 1.23等为实型常量; a,b为字符型常量。可以用一个标识符号代表一个常量,例如下面程序中的CONST变量在程序运行中,其值可以改变的量称为变量.一个变量主要由两部分构成:一个是变量名,一个是变量值。每个变量都有一个变量名,在内存中占据一定的存贮单元(地址),并在该内存单元中存放该变量的值.下面举例对符号常量和变量进行说明。例 # define CONST 50 main ( ) int variable,result variable=20; result=varia6lc * CONST; printf(result=%dn,result); 程序运行结果: result=1200在程序开头#define CONST 60这一行定义了一个符号常CONST其值为60。这样在后面的程序中,凡是出现CONST的地方,都代表常量60。在程序中variable和result就是变量,它们的数据类型为整型(int)。 注意:符号常童与变量的区别在于,符号常量的值在其作用域(本例中为主函数)中,不能改变,也不能用等号赋值。习惯上,总将符号常量名用大写,变量用小写,以示区别。与面向数学运算的计算机相比,8051系列单片机对变量类型或数据类型的选择更具有关键性的意义。在表3-1所列出的数据类型中,只有bit和unsigned char两种数据类型可以直接支持机器指令。对于C这样的高级语言,不管使用何种数据类型,虽然某一行程序从字面上看,其操作十分简单,然而,实际上C系统的编译器需要用一系列机器指令对其进行复杂的变量类型、数据类型的处理。特别是当使用浮点变量时,将明显地增加运算时间和程序的长度。当程序必须保证运算精度时,C编译器将调用相应的子程序库,把它们加到程序中去。然而许多不熟练的程序员,在编写C程序时往往会使用大量的、不必要的变t类型。这将导致C编译器相应地增加所调用的库函数的数量,以处理大量增加的变量类型。这最终会使程序变得过于庞大,运行速度减慢.甚至因此会在连接(link)时,出现因程序过大而装不进代码区的情况。所以必须待别慎重地进行变量和数据类型的选择。位变量(bit)变量的类型是位,位变量的值可以是1(true)或0(false)。与8051硬件特性操作有关的位变t必须定位在8051CPU片内存贮区(RAM)的可位寻址空间中。字符变量(char)字符变量的长度为1byte即8位.这很适合8051单片机,因为8051单片机每次可处理8位数据。除非指明是有符号变量(signed char),字符变量的值域范围是0255(无符号)。对于有符号的变量,最具有重要意义的位是最高位上的符号标志位(msb)。在此位上,1代表“负”,0代表“正”,有符号字符变量(signed, char )和无符号字符变量(unsignedchar)在表示0127的数值时,其含义是一样的都是00x7f。负数一般用补码表示,即用11111111表示1,用11111110表示2。有趣的是,这与二进制计算中,用0减1和用0减2所得的结果是一样的。当进行乘除法运算时,符号问题就变得十分复杂,而C编译器会自动地将相应的库函数调人程序中来解决这个问题。128地址+0+10x120x34 地址+00x12+10x34+20x56+30x78整型变量(int)整型变量的长度为16位。与8080和8086CPU系列不同,8051系列CPU将int型变量的msb存放在低地址字节。有符号整型变量(signed int)也使用。sb位作为标志位,并使用二进制的补码表示数值。可直接使用几种专用的机器指令来完成多字节的加、减、乘、除运算。 整型变量值0x1234以图2-1所示的方式保存在内存中。 长整型变量(long int )长整型变量的长度是32位占用4个字节(byte),其它方面与整型变量(int)相似.长整型变量(long int)值0x1.2345678以图2-2所示方式保存在内存中。 浮点型变量(float)浮点型变量为32位占4个字节(byte ) ,许多复杂的数学表达式都采用浮点变量数据类型。它用符号位表示数的符号,用阶码和尾数表示数的大小。用它们进行任何数学运算都需要使用由编译器决定的各种不同效率等级的库函数.FranklinC51的浮点变t数据类型的使用的格式与IEEE-754标准(32)有关,具有24位精度,尾数的高位始终为“1,因而不保存,位的分布如下: * 1位符号位; * 8位指数位; * 23位尾数. 符号位是最高位,尾数为最低的23位,内存中按字节存贮如下:地址内容+0+1+2+3MMMMMMMMMMMMMMMMEMMMMMMMSEEE EEEE其中,S:符号位,1表示负,0表示正; E:阶码(在两个字节中)偏移为127;M:23位尾数,最高位为“1”。浮点变量值- 2. 5的十六进制为:0xC1480000它按图3-3所示的方式保存于内存中。下面就有符号/无符号(signed/unsigned)问题作一些说明.在编写程序时,如果使用signed和unsigned两种数据类型,那么就得使用两种格式类型的库函数,这将使占用的存贮空间成倍增长。因此在编程时,如果只强调程序的运算速度而又不进行负数运算时,最好采用无符号(unsigned)格式。 无符号字符类型的使用:无论何时,应尽可能地使用无符号字符变量,因为它能直接被851所接受。基于同样的原因,也应尽量使用位变量。有符号字符变量(signed char)虽然也只占用一个字节.但需要进行额外的操作来测试代码的符号位。这无疑会降低代码效率。 最后要提到的是使用缩写形式定义数据类型。在编程时,为了书写方便,经常使用简化的缩写形式来定义变量的数据类型。其方法是在源程序开头使用#define语句。 0x000x000x480xC1地址+0+1+2+3 例如: #define uchar unsigned char #define uint unsigned int 这样,在以后的编程中,就可以用uchar代替unsigned char用uint代替unsigned int来定义变量。2. 3 C51数据的存贮类型与8051存贮器结构 在讨论Franklin C51的数据类型的时候,必须同时提及它的存贮类型以及它与8051单片存贮器结构的关系。因为Franklin C51是面向8051系列单片机及其硬件控制系统的开发工具。它定义的任何数据类型必须以一定的存贮类型的方式定位在8051的某一存贮区中。否则便没有任何的实际意义。 首先,我们讨论一下8051系列单片机存贮器结构的特点。 8051系列单片机将程序存贮器(ROM )和数据存贮器(RAM)分开,并有各自的寻址机构和寻址方式。8051系列单片机在物理上有四个存贮空间: * 片内程序存贮器空间; * 片外程序存贮器空间; * 片内数据存贮器空间; * 片外数据存贮器空间。其结构如图2-4所示。 图2-4中的RAM空间是单片机的程序存贮器空间,用于存放程序代码和表格常数数据。 8051/8751单片机有4K片内ROM /EPROM,其片内地址为0000H0FFFFH。8031单片机无片内ROM ,需要在片外扩展程序存贮器。对于8051/8751系列单片机.当片内4K程序存贮器(ROM)不够用时,也需扩展片外程序存贮器。 由于8051系列单片机的程序计数器PC和数据存贮器的地址指针DPTR都是16位字长的,因此8x51系列单片机存贮器的最大可寻址空间为64K,地址范围0000H0FFFFH。片外(ROM)片内(ROM)=1片外(ROM)=00000H0FFFH0000H0FFFH1000HFFFFH(a)程序存贮器(ROM)SFRRAM位寻址区工作寄存器03组片外(RAM)片外数据存贮器片内数据存贮器0000HFFFFH00H20H30H80HFFH (b)数据存贮器(RAM) 图2-4 80513单片机存贮器结构 对于8051和8751,其片内、片外的ROM空间的地址从0000H0FFFH是重叠的。在8051系列单片机芯片的EA管脚上提供了一个EA控制信号,用于选择地址重叠区中的片内地址或片外地址。对于片内有ROM/EPROM的8051/8751系列单片机,应将其EA管脚接高电平,运行时,CPU从片内ROM/EPROM的0000H地址处开始执行程序,当PC值超过0FF F时,自动转换到片外RDM/EPROM区的0000H0FFFFH地址空间去执行程序。而对于片内无ROM/EPROM的8031系列单片机,必须在片外扩展EPROM,则其EA端应接低电平,使CPU从外部EPROM的0000地址开始读取程序指令。 图2-4中的RAM空间是数据存贮空间,用于数据的暂存、缓冲以及运算结果的存放,也可用于设定标志位。 8051系列单片机的数据存贮器也分片内和片外两种,二者的地址空间彼此是独立的,各有不同的寻址指令。由于片外数据存贮器的地址指针DPTR是16位的,因此片外RAM扩展的最大地址空间为64K,地址从0000H0FFFFH。对于汇编语言这段地址空间用MOV X指令进行访问。 片内数据存贮器的地址范围是00H0FFH。对于汇编语言,这段地址空间用MOV指令来访问。 8051系列单片机内数据存贮器的具体结构划分如图2-5所示。 从图3-5中可以看到,8051片内数据存贮器可划分为两大区域:从00H7FH为片内低128字节RAM区;80H0FFH为特殊功能寄存器区(SFR)。 地址为00H7F的低128字节片内RAM区又可以划分为三个区域:通用寄存器区;可位寻址区;用户RAM区(堆栈也可以设在这里)。 1.通用寄存器区:地址00H1FH 通用寄存器区由4个寄存器组构成:0组(00H07H),1组(08H 0FH ) , 2组(10H17H),3组(18H1FH)。每个寄存器组含有8个通用寄存器:R0,R1,,R7,共有32个通用寄存器。每个寄存器可以用寄存器名寻址,也可以直接用字节地址寻址,地址为00H1FH.当用寄存器名寻址时,由程序状态字PSW中的RS (PSW.4)和RS (PSW.3)两位上的值来确定寄存器组,即通过改变RS1和RS0两位的值,来实现对寄存器组的切换.例如上电复位时PSW. 4 PSW.3=00,即RS1RS0=00,则选中0号寄存器组,此时若使用R2寄存器,则为0号寄存器组中的R2寄存器,其字节地址为02H。SFR可字节或位寻址字节寻址可位寻址区(也可字节寻址)位地址00H-7FH18H 3区10H 2区08H 1区00H 0区PSW.4 PSW.3111001000FFH80H7FH30H2FH20H1FH17H0FH07H4组工作寄存器R0R7(也可作为RAM单元使用)复位时堆栈指针初值是07H 图2-5 8051片内RAM区结构 当上电复位时,堆栈指针的初值指向07H。 当不使用通用寄存器时,00H 1FH区域可作为用户RAM区使用,用字节地址寻址。 2. 可位寻址区 8051系列单片机片内RAM的可位寻址区是字节地址为20H 2FH的16个字节单元,这些单元既可以按字节寻址操作,也可以按位地址操作,位地址为。OH7FH,共l6X8=128位。 3.用户RAM区 8051系列单片机片内RAM的用户RAM区地址为30H7FH。这个区域只能用字节地址寻址。堆栈区可以设在这里。前面提到,上电复位时,堆栈指针SP指向07H,即此时堆栈区占用1,2,3通用寄存器组的地址空间。当用户想重新设置堆栈区时,可将SP设置在30H 7FH空间。 总之,在8051系列单片机中,程序存贮器与数据存贮器严格分开,特殊功能寄存器与片内数据存贮器统一编址,这是单片机与一般微机的存贮器结构有所不同的两个特点。 Franklin C51编译器完全支持8051单片机的硬件结构,可完全访问8051硬件系统的所有部分。该编译器通过将变量、常量定义成不同的存贮类型(data,bdata , idata, pdata , xdata ,code)的方法,将它们定位在不同的存贮区中。 存贮类型与8051单片机实际存贮空间的对应关系如表2-2所示. 当使用存贮类型data , bdata。定义常量和变量时,C51编译器会将它们定位在片内数据存贮区中片内RAM ),这个存贮区根据8051单片机CPU的型号不同,其长度分别为64,128,256或512字节。以今天的标准来看,这个存贮区不很大,但它能快速收发各种数据。外部数据存贮器从物理上讲属于单片机的一个组成部分,但用这种存贮器存放数据,在使用前必须将它们移到片内数据存贮区中。片内数据存贮区是存放临时性传递变t或使用频率较高的变量的理想场所。表2-2 C5l存贮类型与8051存贮空间的对应关系存贮类型与存贮空间的对应关系databdateidatapdataxdatacode直接寻址片内数据存贮区,访问速度快(128字节)可位寻址片内数据存贮区,允许位与字节混合访问(16字节)间接寻址片内数据存贮区,可访问片内全部RAM地址空间(256字节)分页寻址片外数据存贮区(256字节)由MOVXR0访问片外数据存贮区(64K),由MOVXDPTR访问代码存贮区(64K),由MOVCDPTR访问 当使用code存贮类型定义数据时,C51编译器会将其定义在代码空间(ROM或EPROM ),这里存放着指令代码和其它非易变信息。调试完成的程序代码被写入8051单片机的片内RAM /EPROM或片外EPROM中。在程序执行过程中.不会有信息写入这个区域,因为程序代码是不能进行自我改变的。 当使用xdata存贮类型定义常童、变量时,C51编译器会将其定位在外部数据存贮空间(片外RAM)。该空间位于片外附加的8K , 1 6K , 32K或64K RAM芯片中(如一般常用的6264,62256等等)。其最大可寻址范围为64K。在使用外部数据区的信息之前,必须用指令将它们移动到内部数据区中,当数据处理完之后,将结果返回到片外数据存贮区。片外数据存贮区主要用于存放不常使用的变量,或收集等待处理的数据,或存放要被发往另一台计算机的数据。 还有两种存贮类型,idata和pdata。 pdata存贮类型属于 xdata类型,它的一字节地址(高8位)被妥善保存在P2口中,用于I/O操作。 idata存贮类型可以间接寻址内部数据存贮器(可以超过127个字节)。 访问片内数据存贮器(data,bdata,idata)比访问片外数据存贮器(xdata,pdata)相对要快一些,因此可将经常使用的变量置于片内数据存贮器,而将规模较大的,或不常使用的数据置于片外数据存贮器中。 C51存贮类型及其大小和值域如表2-3所示。 表2-3 C51存贮类型及其大小和值域存贮类型长度(bit)长度( byte )值域范围dataidatapdatacodexdata8881616111220255 8bit0255 8bit0255 8bit065535 16bit065535 16bit变量的存贮类型定义举例:char data wart1: /* item1 */bit bdata flags; /* item2 */float idata x,y,z; /* item3 */unsigned int pdata dimension; /* item4 */unsigned char xdata vector1044 /* item5 */ item 1;字符变量char varl被定义为data存贮类型,C51编译器将把该变量定位在8051片内数据存贮区中(地址:00H0FFH)。 item2:位变量flags被定义为bdata存贮类型,C51编译器将把该变量定位在8051片内数据存贮区(RAM)中的位寻址区(地址:20H2FH)。 itern3:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖南邵阳达标名校2026届中考四模物理试题含解析
- 山西省朔州市朔城区第四中学2026年中考押题物理预测卷含解析
- 2026届江苏省扬州市广陵区中考物理模拟预测题含解析
- 2026年海南省文昌市中考英语模拟试卷(二)含详细答案解析
- 湖南省怀化市新晃侗族自治县达标名校2026年中考适应性考试物理试题含解析
- 湖北省孝感市八校联谊重点名校2026届中考一模物理试题含解析
- 2026届山东省济南市天桥区重点中学中考物理模拟预测试卷含解析
- 2026年江苏省南昌市某中学中考一模物理试题含解析
- 2025年通州区社区工作者笔试真题附答案
- 2025年特种作业塔吊司机真题(附答案)
- 2026年高考英语新高考一卷真题卷附答案
- 2026年卫生健康知识培训
- 2026河南淅胜产业发展有限责任公司招聘工作人员10人笔试备考题库及答案详解
- 电梯意外事件与事故应急救援及演习制度培训
- 临床输血全流程清单式质量管理专家共识
- 2026年江苏省文化投资管理集团有限公司招聘笔试题库
- 高考英语近6年高频考察300个长难句型(带解析版)
- 国开《离散数学》大作业及答案
- JBT 9214-2010 无损检测 A型脉冲反射式超声检测系统工作性能测试方法
- 钢轨打磨设备及运用 课件 06 电气系统
- 15D503利用建筑物金属体做防雷及接地装置安装图集
评论
0/150
提交评论