微处理器C51-4C51简介_第1页
微处理器C51-4C51简介_第2页
微处理器C51-4C51简介_第3页
微处理器C51-4C51简介_第4页
微处理器C51-4C51简介_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

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

文档简介

C51知识C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。目前,使用C语言进行程序设计已经成为软件开发的一个主流。用C语言开发系统可以大大缩短开发周期,明显增强程序的可读性,便于改进、扩充和移植。而针对8051的C语言日趋成熟,成为了专业化的实用高级语言。C51的特点

C语言作为一种非常方便的语言而得到广泛的支持,很多硬件开发都用C语言编程,如:各种单片机、DSP、ARM等.C语言程序本身不依赖于机器硬件系统,基本上不作修改就可将程序从不同的单片机中移植过来。

C提供了很多数学函数并支持浮点运算,开发效率高,故可缩短开发时间,增加程序可读性和可维护性。C-51与ASM-51相比,有如下优点:对单片机的指令系统不要求了解,仅要求对8051的存贮器结构有初步了解;寄存器分配、不同存贮器的寻址及数据类型等细节可由编译器管理;程序有规范的结构,可分成不同的函数,这种方式可使程序结构化;提供的库包含许多标准子程序,具有较强的数据处理能力;由于具有方便的模块化编程技术,使已编好程序可移植;KeilC语言的基本结构一般C语言的程序可看做由一些函数(function,或视为子程序)所构成,其中的主程序是以“main()”开始的函数,而每个函数可视为独立个体,就像是模块(module)一样,所以C语言是一种非常模块化的程序语言。C语言的基本结构如下:#include<reg51.h>指定头文件delay(int);unsignedcharx,y;声明区……main()主程序{主程序起始符号inti,j;unsignedcharLED;声明区……LED=0xff;程序区…..}主程序结束符号

delay(intx)函数定义{函数起始符号inti,j;声明区……for(i=0;j<x;i++)程序区……}函数结束符号指定头文件“头文件”或称为包含文件(*.h),这是一种将预先定义好的基本数据存放在一个文件中。在8X51中,必要的头文件是定义8X51内部寄存器地址的数据,如下所示:/*REG51.HHeaderfileforgeneric80C51and80C31microcontroller.Copyright(c)1988-2002KeilElektronikGmbHandKeilSoftware,Inc.Allrightsreserved.*/#ifndef__REG51_H__#define__REG51_H__/*BYTERegister*/sfrP0=0x80;sfrP1=0x90;sfrP2=0xA0;sfrP3=0xB0;sfrPSW=0xD0;sfrACC=0xE0;sfrB=0xF0;sfrSP=0x81;sfrDPL=0x82;sfrDPH=0x83;sfrPCON=0x87;sfrTCON=0x88;sfrTMOD=0x89;sfrTL0=0x8A;sfrTL1=0x8B;sfrTH0=0x8C;sfrTH1=0x8D;sfrIE=0xA8;sfrIP=0xB8;sfrSCON=0x98;sfrSBUF=0x99;/*BITRegister*//*PSW*/sbitCY=0xD7;sbitAC=0xD6;sbitF0=0xD5;sbitRS1=0xD4;sbitRS0=0xD3;sbitOV=0xD2;sbitP=0xD0;/*TCON*/sbitTF1=0x8F;sbitTR1=0x8E;sbitTF0=0x8D;sbitTR0=0x8C;sbitIE1=0x8B;sbitIT1=0x8A;sbitIE0=0x89;sbitIT0=0x88;/*IE*/sbitEA=0xAF;sbitES=0xAC;sbitET1=0xAB;sbitEX1=0xAA;sbitET0=0xA9;sbitEX0=0xA8;/*IP*/sbitPS=0xBC;sbitPT1=0xBB;sbitPX1=0xBA;sbitPT0=0xB9;sbitPX0=0xB8;/*P3*/sbitRD=0xB7;sbitWR=0xB6;sbitT1=0xB5;;sbitT0=0xB4;指定头文件的方式有两种:sbitINT1=0xB3;1)以<>包含头文件名sbitINT0=0xB2;2)以“”包含头文件名sbitTXD=0xB1;sbitRXD=0xB0;/*SCON*/sbitSM0=0x9F;sbitSM1=0x9E;sbitSM2=0x9D;sbitREN=0x9C;sbitTB8=0x9B;sbitRB8=0x9A;sbitTI=0x99;sbitRI=0x98;#endif声明区

声明程序中所使用的常数、变量、函数等,其作用域将扩展到整个程序,包括主程序与所有函数。

在此建议,若程序中有使用到的函数,则可在此声明所有使用到的函数,这样,函数放置的先后顺序不受影响。即函数放置在引用该函数之前或之后都可以。若没有在此声明,则在使用函数之前必须先定义该函数。主程序

主程序是以main()为开头,整个内容放置在一对大括号里,其中分为声明区与程序区,在声明区内所声明的常数、变量等仅适用于主程序之中,而不影响其他函数。若在主程序之中使用了某变量,但在之前声明区中没有声明,也可在主程序的声明区中声明。

程序区是以语句构成的程序内容。函数定义

函数是一种独立功能的程序,其结构与主程序类似。函数可将所要处理的数据传入该函数里,称为形式参数(arguments);也可将函数处理完成后的结果返回调用它的程序,称为返回值。不管是形式参数还是返回值,在定义函数的第一行里应该交代清楚。其格式如下:

返回值数据类型函数名称(数据类型形式参数)

例如,要将一个无符号字符实参传递给函数,函数执行完成时要返回一个整型,此函数名称为My_func,则函数定义为:

intMy_func(unsignedcharx)

若不要传入参数,则可在小括号内指定为void。同样,若不返回值,则可在函数名左边指定为void或不指定。注释

就是说明,属于编译器不处理的部分。以“/*”开始,“*/”结束。也可用“//”注释一行。变量、常数与数据类型在C语言里,常数(constant)与变量(variables)都是为某个数据指定存储器空间,其中常数是固定不变的,而变量是可变的。声明常数或变量的格式如下:

数据类型常数/变量名称[=默认值];

例如,intX=50;

intX;

int

x,y,z;数据类型

既然常数或变量的声明是让编译器为该常数或变量保留存储器空间,就要说明保留多大的空间,这就与常数或变量的数据类型有关。在声明常数或变量的格式中,开始就要指出它们的数据类型。KeilC所提供的数据类型分为下列几类:

基本数据类型

可用于一般C语言,包括字符(char)、整型(int)、浮点数(float)和无(void),其中字符与整型又分为有符号(signed)与无符号(unsigned)两类。

此外还有enum(枚举),8/16位类型符号关键字数的表示范围所占位数整型字符型实型有无(signed)int16-32768~32767(signed)short16-32768~32767(signed)long32-2147483648~214748364716unsignedint0~65535320~4294967295unsignedlongintunsignedshortint160~65535有float323.4e-38~3.4e38有double641.7e-308~1.7e308有char8-128~127无unsignedchar80~255C-51的数据类型扩充定义专为8X51硬件设置的数据类型有:bit、sbit、sfr及sfr16共4种。bit定义一个位变量,将会被指定到0x20-0x2f之间的地址。sbit用于存取内部可位寻址的数据寄存器,即0x20-0x2f之间的存储器,或存取可位寻址的特殊功能寄存器(SFR),即0x80-0xff之间的存储器,若要用sbit,则其声明方式有以下几种:a.先声明一个bdata存储器形式的变量,再声明属于该变量的sbit变量,如:charbdatascan;//声明scan为bdata存储器类型的字符sbitinput_0=scan^0;//声明input_0为scan变量的bit0

当要指明某个变量的第n位,则可在该变量名称右加上“^n”即可。b.先声明一个sfr变量,再声明属于该变量的sbit变量,如:sfrp0=0x80;//声明p0为0x80存储器位置即P0sbitp0_0=p0^0;//声明p0_0为p0变量的bit0

这种用法最方便,因为8051内部特殊功能寄存器的声明在reg51.h里,而程序开头都已将这个文件包含进来了。c.直接指定存储器位置,例如要声明P0的bit0,则sbitp0_0=0x80^0;

此时,需要熟记每个地址。通常sfr数据类型是用于8051内部特殊功能寄存器(寄存器名称大写),即0X80到0xff地址,与内部存储器的地址相同。但特殊功能寄存器与内部存储器是两个独立的区域,必须以不同的存取方式来区分。特殊功能寄存器采用直接寻址方式存取,而内部存储器采用间接寻址方式存取。

在KeilC里,所谓直接寻址,就是直接指定其地址,以P0为例,示例如下:sfrP0=0x80;

所谓间接寻址,就是声明为idata存储器形式的变量,例如:charidataBCD;//声明BCD变量为间接寻址的存储器位置

由于reg51.h里已声明了8051内部特殊功能寄存器,不需要再声明。通常sfr16数据类型是用于8051内部16为的特殊功能寄存器,如timer2的捕捉寄存器(RCAP2L、RCAP2H)、timer2的计数器(TL2、TH2)、数据指针寄存器(DPL、DPH)等,以数据指针为例,示例如下:sfr16DPTR=0x82;在数据类型之后就是变量名称,而变量名称的指定除了容易判读外,还要遵守以下规则:可使用大/小写字母、数字或下划线第一个字符不能为数字不可使用变保留字

“保留字”是指编译程序将该字符串保留为其他特殊用途,ANSI的保留字(小写)如下:变量名称与保留字whilesognedbpodvolatile

doifstaticwhileasmauto

double

int

struct

break

else

long

switch

casedoextern

register

typedef

char

float

return

union

continue

for

short

unsigned

const

default

goto

sizeof

entryenumfortransignedstaticunionvoidvolatilewhileKeilC的保留字:

_at__priority__task_alienbdatabitcodecompactdatafaridatainterruptlargepdatareentrantsbitsfrsfr16smallusingxdata变量的作用范围变量的适用范围或有效范围与该变量的声明位置有关,可分为两种:全局变量

若在程序开头的声明区或者没有大括号限制的声明区所声明的变量,其适用范围为整个程序,称为全局变量。如下面的LED、SPEAKER就是全局变量。局部变量

若在大括号内声明区所声明的变量,其适用范围将受限于大括号,称为局部变量。下面的i、j就是局部变量。若在主程序与各函数之中都有声明相同名称的变量,则脱离主程序或函数时,该变量自动无效。#include<reg51.h>unsignedcharLED,SPEAKER;……main(){intI,j;……LED=0XFF;……}#include<reg51.h>main(){intI,j;……}delay(intx){inti,j;……}8X51的程序设计属于硬件的驱动程序,所以与8X51内部结构息息相关,特别是存储器。1存储器的形式KeilC对存储器的管理是将存储器分成六种形式:

存储器形式说明适用范围code程序存储器0x0000-0xffffdata直接寻址的内部数据存储器0x00-0x7fidata间接寻址的内部数据存储器0x80-0xffbdata位寻址的内部数据存储器0x20-0x2fxdata以DPTR寻址的外部数据存储器64KBpdata以R0、R1寻址的外部数据存储器256Bfar扩展的ROM或RAM外部存储器,仅最大可达16MB

适用于少数的芯片,如Philips80C51MX、Dallas390等存储器的形式与模式程序存储器

标准的8X51内部的4KB程序存储器可扩展至64KB;8X52内部的8KB可扩展至64KB。而新版或兼容的51芯片,其内部程序存储器容量达16KB、32KB,甚至64KB。

程序存储器也可存放固定数据,如七段数码显示器的驱动信号、LED点阵的显示信号、音乐的驱动信号、LCM的显示字符串等,如下所示就是以数组的方式存储表格:

charcodeSEG[10={0x30,0x9f,0x25,0x0d,0x99,

0x49,0xc1,0x1f,0x01,0x19};内部数据存储器

标准的8X51内部的128B数据存储器可扩展至64KB;8X52内部256B可扩展至64KB。而新版或兼容的51芯片,其内部数据存储器容量为512B、768B等。由于8051内部的SFR与数据存储器的地址相同,必须使用不同的寻址方式才能区分出来。对于汇编语言,可以用不同的指令来区分直接寻址和间接寻址。

KeilC可以以不同的存储器形式来区分操作对象,其中有data、idata和bdata三种存储器形式。chardatax;//data存储器形式可以直接存取0x00-0x7f数据存储器

charidatax;//idata可间接存取0x80-0xff数据存储器

bitbdatax;//bdata可为寻址存取0x20-0x2f数据存储器外部数据存储器

对外部数据存储器的存取,汇编语言通过MOVX指令,KeilC没有专门的指令,必须以存储器的形式来区分,若要声明存取64KB范围的外部数据存储器的字符变量,声明方式如下:

charxdatax;

而声明存取256B范围的外部数据存储器的字符变量,声明如下:

charpdatax;2存储器的模式KeilC提供SMALL、COMPACT和LARGE三种存储器模式,用以决定未标明存储器形式的函数的形参(arguments)、自动变量及变量声明等预设存储器形式。小型模式SMALL将所有变量预设为8X51的内部存储器,其效果就像在声明区里明确地声明data存储器形式一样。精简模式COMPACT将所有变量预设为外部存储器的一页(page)即256B。其寻址高8位经由P2,必须在STARTUP代码中设置。就像在声明区里声明pdata存储器形式一样。大型模式LARGE将所有变量预设为外部存储器,其效果就像在声明区里声明xdata存储器形式一样。

在μVision里,若要设置存储器模式,可单击“”按钮打开选项对话框,如图,在MemoryModel中选择存储器模式。KeilC的运算符

运算符(Operator)就是程序语句中的操作符号,分以下几种;算术运算符

+加–减*乘/除%取余数程序范例:

main(){intA,B,C,D,E,x,y;x=7;y=2;A=x+y;B=x-y;C=x*y;D=x/y;E=x%y;

}

关系运算符就是处理两变量间的大小关系。==相等!=不等>大于<小于>=大于等于<=小于等于程序范例:

main(){unsignedcharA,B,C,D,E,F,x,y;x=7;y=2;A=(x==y);B=(x!=y);C=(x>y);

D=(x<y);E=(x>=y);F=(x<=y);}逻辑运算符包括AND与、OR或、NOT非运算。

&&与||或!非程序范例:

main(){unsignedcharA,B,C,x,y,z;x=7;y=2;z=5;A=(x>y)&&(y<z);B=(x==y)||(y<=z);C=!(x>z);}布尔运算符与逻辑运算非常相似,差异在于布尔运算符针对变量中的每一个位,逻辑运算符则是对整个变量的操作。

&与|或^异或~取反<<左移>>右移程序范例:

main(){charA,B,C,D,E,F,x,y;chara1,a2,a3,a4,a5,a6;x=0x25;y=0x73;A=x&y;B=x|y;C=x^y;D=~x;E=x<<3;F=x>>4;a1=A;a2=B;a3=C;a4=D;a5=E;a6=F;//辅助观察运算状态}赋值运算符=赋值+=相加赋值-=相减赋值*=相乘赋值/=相除赋值%=取余赋值&=相与赋值|=相或赋值^=异或赋值<<=左移赋值>>=右移赋值程序范例:main(){ungignedcharA=0x52,B=0x3a,C=0x01,D=0x01,E=0xaa,F=0x11,G=0xf0,H=0x1f,I=0x55,J=0x68,K=0x75,x=0x96;unsignedchara1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11;A=x;B+=x;C-=x;D=*x;E/=x;F%=x;G&=x;H|=x;I^=x;J<<=2;K>>=3;a1=A;a2=B;a3=C;a4=D;a5=E;a6=F;…;a11=K;//辅助观察运算状态}自增/自减运算符

++加1--减1程序范例:

main(){charx=5,y=10;x++;y--;}运算符优先级1(、)2~、!3++、--4*、/、%5+、-6<<、>>7<、>、<=、>=、==、!=

8&9^10|11&&||=、*=、/=、%=、+=、-=、<<=、>>=&=、^=、|=KeilC的流程控制基本上,程序的结构是由上而下逐行执行。也可用流程控制的指令与语句改变程序的流程,KeilC提供的流程控制指令与语句分为3种:循环、选择和跳转。循环指令

将程序流程控制在指定的循环里,直到负荷指定的条件才脱离循环继续向下执行。KeilC的循环指令有for语句、while语句、do-while语句。

1、计数循环

for语句是一个很实用的计数循环,其格式如下:

for(表达式1;表达式2;表达式3)

{

语句;

[break;]

……

}表达式1为初始值,例如i=0,表示从0开始。表达式2为判断条件,以此为执行循环的条件,如i<20,表示只要i<20就继续循环。如此表达式空白,如for(i=0;;i++)或for(;;)则会无限制循环。表达式3为条件运算方式,最常见的是自增或自减。表达式之间的“;”不能缺少。范例1:for(i=0;i<8;i++);//循环执行八次范例2:for(x=100;x>0;x--);//循环执行100次范例3:for(;;)//无限循环范例4:for(num=0;num=99;num+=5)//循环执行20次

在for语句下面利用一对大括号将所要执行的循环体内的指令逐行写入。若循环体内只有一条语句,可以不用大括号。for(i=0;i<10;i++)P2=table[i];//将table数组中的数据循序输出到P2

如果循环未达到跳出条件,因其他判断因素成立,而要强制跳出循环,则可在循环内添加判断条件与break语句,例如:for(i=0;i<100,i++){……if(sw1==0)break;……}

2、while循环

在while语句中将判断条件放在语句之前,称为前条件循环,格式如下:while(表达式){

语句;[break];……}

当其中表达式成立时才执行其大括号内的程序,若表达式为1,则形成无限循环。若大括号内只有一条语句,可以省略大括号。若要强制跳出循环,则可在循环内添加判断添加与break语句。3、do-while循环

这个循环中,先执行再判断,故称为后条件循环,其格式如下:

do{

语句;[break;]……}while(表达式);

这个循环先执行一次循环体在判断条件,所以循环体至少被执行一次;如果循环体内只有一条语句,可以省略大括号;若表达式为1,则为死循环;若要强制跳出循环,则可在循环体内添加判断语句和break语句。选择语句

选择语句是按条件决定程序流程。KeilC提供的选择指令有if-else语句及switch-case语句。1、if-else语句

格式:if(表达式){

语句1;}

else{

语句2;}

其中else部分也可省略;也可利用elseif串接为多重条件判断,其格式如下:if(表达式1){语句1;}elseif(表达式2){语句2;}……else{语句n;}2、switch-case语句

提供多重选择,称开关式选择,这种选择不会有优先级的问题,格式如下:switch(表达式){case(常数1):{语句1;}break;……case(常数n-1):{语句n-1;}break;defult:{语句n;}break;}

若没有一个常数与表达式的值相同,将执行default下的语句。

注意:每个case语句块结束时必须有一个break语句。3、跳转语句goto是KeilC提供的无条件跳转语句,格式如下:goto标号;

它与汇编语言的jmp指令一样,其右边是一个标号(label)。例如:gotoloop;……Loop:语句;……

数组(array)是一种将同类型数据集合管理的数据结构;指针(Pointer)是存放存储器地址的变量。1、数组

数组也是一种变量,将一组相同数据形态的变量以一个相同变量名来表示,使用前必须声明,其格式如下:

数据类型数组名“数组大小:;

例如:charLCM[9];//拥有9个字符的数组,包括LCM[0]-LCM[8]KeilC没有字符串数据类型,以字符数组来代替字符串。

声明变量是为该变量指定存储器位置,对于不同的数据类型,系统预留的存储器空间各不相同,例如声明一个字符变量,则预留一个字节的存储器,声明一个整型变量,则预留2个字节的存储器。

声明数组的时候,也可以给它赋初值,如:charLCM[9]=“testing.”;

对以“”定义的字符串,以“\0”为结束,故需要9个字符。若不知道数组的大小,可以不指定数组的长度,如:charstring[]=“welcom!”;KeilC的数组与指针

若声明整型、浮点数组时也要指定其默认值,则可使用大括号,如:intNum[6]={30,21,1,45,26,37};

对多维数组的声明,格式如下:

数据类型数组名[数组大小1][数组大小2]……[数组大小n];3x2整型数组:intNum[3][2]={{10,11},{12,13},{14,15}};2、指针

指针用来存放存储器地址,声明格式:

数据类型*变量名称;

通常指针都采用整型数据类型,例如:int*ptr;

也可以把同类型的变量与指针放在一起声明,如:int*ptr1,*ptr2,a,b;

与指针相关的运算符是“&”,其功能是取得变量的地址,例如:ptr1=&a;//a变量的地址被放入ptr1指针变量

当然,这些操作主要是针对数组的,,通常会先取得数组中第一个元素的地址,如:ptr1=&Num[0][0];//Num数组的第一个地址放入指针变量ptr1

若要将Num[0][0]的内容输出到P2,则:P2=Num[0][0];

或使用指针变量的形式,则:P2=*ptr1;

同理,若要将Num[1][1]输出到P2,则:P2=Num[1][1];

或:P2=*(ptr1+3);

KeilC的函数与中断子程序

一般说来,函数(Function)、中断子程序都属于子程序。1、函数

函数的结构与主程序的结构类似,函数能传递参数、返回值。函数是一种独立功能的程序,可将要处理的数据传递给该函数,称为形式参数;也可将函数处理完成后的结果返回调用它的程序,称为返回值。

2、中断子程序

中断子程序与函数结构类似,不过它不能传递参数、返回值,且使用中断子程序之前不需要声明,但要在主程序中进行相关设置。具体格式如下:

void中断子程序名(void)interrupt中断编号using寄存器组

其中各项说明:由于中断子程序不传递参数,不返回值,所以在其左边标识“void”,在中断子程序名称右边括号里也标识“void”。KeilC提供0-31个中断编号,8051只使用0-4,8052使用0-5,如声明INT0,标识为“interrupt0”;声明T0则标识为“interrupt1”。

寄存器组表示中断子程序要采用哪个寄存器组,通常主程序使用RB0,在子程序里使用其他寄存器组,若不想指定寄存器组,也可省略该项。

例如,定义INT0的中断子程序,名称为“INT”,使用RB1寄存器组,则声明为:

voidINT(void)interrupt0using1

然后在其下的大括号内编写中断子程序的内容。KeilC的预处理

预处理命令是指先经过预处理器处理过后才进行编译的命令。通常,预处理命令放置在整个程序的开头,除非是条件式编译命令。KeilC提供下列三项预处理命令。定义命令

#define命令用来指定常数、字符串或宏函数的代名词,与汇编语言的“equ”、“reg”命令一样。格式如下:

#define代名词常数(字符串或宏函数)

例如:#defineoutputsP2

则在程序中就可以用outputs代替P2,即outputs=0xff;

进行编译时,预处理处理器会将程序里所有的“outputs”替换为“P2”。这样做便于程序的修改,比如程序中要将P2输出改为P0输出,只需要修改define语句里的定义,而不需要修改程序中出现P2的地方。包含命令

#include命令的功能是将指定的定义或声明等文件放入程序之中。条件式编译命令

C语言是一种高度可移植性程序语言,源程序可在不同版本的C语言编译器下进行编译,当然,不同的C语言编译器提供不同的资源与指令语法,这时候就可应用条件式编译命令以区分不同的编译器。在8051的程序设计里也可以应用条件式编译命令,以适应不同的外围与控制方式。

格式如下:#if表达式

程序1#else

程序2

#endifμVision的使用1、认识μVision环境KeilμVision提供了C语言与汇编语言的编辑、编译与连接、调试与仿真等功能,还能产生在线仿真或刻录到芯片所需的HEX等。

运行μVision4产生如图的界面,界面中包括菜单栏、文件工具栏、生成工具栏、项目窗口、输出窗口和状态栏。菜单栏

File菜单提供文件操作命令:New、Open、Close、Save、Saveas等命令。

Edit菜单提供编辑命令,如Windows都有的剪贴功能(Copy、Cut、Paste、Undo、Redo),还有文本处理程序的缩进/撤销缩进功能、书签功能、查找与替换功能等。

View菜单提供窗口组件的显示开关:statusBar、FileToolbar、BiuldToolbar、DebugToolbar、ProjectWindow、OutputWindow、SourceBrowser。

Project菜单提供项目管理功能:NewProject、ImportProject、OpenProject和CloseProject。

Debug菜单提供调试/仿真的操作命令,可直接操作调试/仿真工具栏上的按钮。

Flash菜单提供芯片下载与清除的功能。

Peripherals菜单用于设置是否显示CPU内部各外设的显示窗口。

Tools菜单提供PC-Lint程序语法检查工具。

SVCS菜单提供版本管理功能。

Window菜单提供工作区的窗口排列功能。

Help菜单提供辅助说明功能。

文件工具栏

将常用的功能放置在该工具栏里,包括文件操作、剪贴功能、撤销与恢复等与一般Windows软件类似的功能。生成工具栏8051程序的开发分两个阶段,第一阶段是程序编辑与生成(build),所谓生成是指程序的编译/连接及产生可执行文件。第二阶段是调试/仿真,以确定程序的正确性。可利用“”按钮设置,利用“”进行生成;单击“”进行重新生成;若工具栏消失,可执行View菜单下的BuildToolbar重新打开。项目窗口

在项目窗口下方有5个标签,如图:

在项目窗口下方有5个标签,如图:

File标签可切换到文件管理窗口。

Regs标签可切换到寄存器窗口,其中将列出CPU里所有寄存器的内容。Books标签切换到辅助说明窗口,其中将列出所有说明的项目。

Functions标签切换到函数窗口,其中将列出所有函数。

Templates标签切换到模板窗口,其中列出所有模板。输出窗口

包括三个子窗口,在Build窗口里将记录生成的过程与状态。在Command窗口里将记录所有操作的命令。在FindinFiles窗口里将记录指定文件查找的结果。状态栏

包括7栏:调试通道栏、执行时间栏、光标位置栏、CAP、NUM、SCRL、OVR、R/W或R/O工作区

所编辑的文件将以窗口的形式出现在此区域之中。

2、项目的管理与选项

KeilμVision采用项目(Project)管理,所有设计的开始都源自于项目的建立或打开既有的项目。

若要建立新项目,运行Project菜单下的NewProject命令。

若打开指定的项目,运行Project菜单下的OpenProject命令。

新建项目时,除性能窗口里多出一个Target1项外,工作区里仍然是空白的,还得进行几个操作。添加源程序文件

若要将源程序文件添加到当前项目,可在项目窗口左侧单击Target1节点下的SourceGroup1项,单击鼠标右键,弹出菜单,再选择其中的AddFilestoGroup’SourceGroup1’选项。即可出现添加文件对话框。项目选项设置

单击“”按钮可打开设置选项对话框。

其中可以设置程序存储器、时钟频率,其默认的为该芯片的最高时钟频率,但在实际电路里不一定使用,而是有助于程序设计与电路控制的频率,通常是12MHz。若使用内部程序存储器,则选中UseOn-ChipROM选项。若要改变使用其他芯片,可单击Device标签,这时可以在其列表框中选择采用的芯片。

Output标签:若要产生刻录或在线仿真所需的HEX文件,则在Output选项卡里选中CreateExecutable选项,再选中CreateHEXFile选项。

其他各选项卡的选项只要采用程序默认值即可,具体功能简述如下:

Listing:产生列表文件的相关设置。

C51:设置c51编译器。

A51:设置A51汇编器。

BL51Locate:设置BL51连接器的定位选项。

Bl51Misc:设置BL51连接器的其他选项。

Debug:设置调试器。

Utility:设置通用工具。3、认识调试/仿真环境

完成生成后,单击“”按钮进入调试/仿真状态。可以看到调试/仿真工具栏:

复位CPU,让程序从头开始执行。全速执行程序。停止程序的执行。

单步执行,若遇到函数,则跳入该函数。

单步执行,若遇到函数,则直接完成该函数。

完成当时所执行的函数,跳出该函数,返回主程序。

执行到文字插入点(文字光标)所在的那一行语句。

打开STARTUP.A51窗口,以展示程序相对于汇编语言的执行状态。

4、外设操作

在调试/仿真状态下,Peripherals菜单利于观察外设端口的状态。ResetCPU命令

与单击“”功能一样。Interrupt命令

用于设置是否显示中断系统对话框。

其中列出了该芯片中所有中断源,如果直接选择所要操作的中断源,则该中断源的所有相关选择项将呈现在对话框下方,以P3.2/INT0选项为例,对话框将出现下列选项:

EA:打开中断源总开关

IT0:中断触发方式

IE0:该中断触发

EX0:该中断的中断状态

Pri:该中断的优先级I/O-Ports命令用于设置是否显示输入/输出端口对话框,选择该命令后,将弹出输入/输出端口菜单。以Port0为例,选择后将打开其对话框其中分为P0与Pins两行。P0对应为端口的输出状态Pins对应为端口的输入状态。可以在此行中输入信号,打钩为1。Serial命令

用于设置是否显示串行端口对话框。其中各项:

Mode:串行端口方式;

SCON:Scon寄存器内容;

SBUF:串行口缓冲器的内容;

SM2:

REN:

TB8:

RB8:SMOD:Baudrate:

TI:

RI:Timer命令

该命令用于设置是否显示定时器/计数器对话框。

Mode:包括两栏,上面用于设置定时器/计数器方式,下面用于设置内部定时和外部计数。

TCON:程序中所置TCON寄存器内容。

TMOD:程序中所置TMOD寄存器内容。

TH0:程序中所置TH0中的内容。

TL0:程序中所置TL0中的内容。

T0Pin:为T0引脚的状态,若选择,则T0引脚为高电平。

TF0:为定时器/计数器的中断标志。

Status:表示当前是否启用定时器/计数器。

TR0:软件运行定时器/计数器。

GATE:控制开关状态。GATE=1,外部控制定时器/计数器运行。INT0#:外部运行定时器/计数器的引脚,当设置为外部控制定时器/计数器运行的情况下,单击此项可启动定时

温馨提示

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

评论

0/150

提交评论