keil下C51启动代码详解
- 格式:doc
- 大小:29.50 KB
- 文档页数:3
Keil C51的开关语句目标代码分析∗侯济恭【摘要】Keil C5 1 is currently the most popular embedded programming language,this paper analyzes the compiling method and effect of its"switch" sentence.In general,the branches number of the"switch-case" sentence is less than 8,the object codes are divided into three layers,that are the head code,the transfer control code and the switch body.When the branches number of the more complex"switch-case"sentence is more than 8,the target codes are divided into four layers,which are the head code,the transfer control code,the transfer sheet and the switch body.Considering the code execution efficiency,the transfer control code of the system library function is different corresponding to different data types of the selected factor.%分析目前流行的Keil C51对switch 的编译方法及其编译效果。
Keil C51使用详解keilc51使用详解v1.0电子设计世界!版权所有,热烈欢迎贴文,切勿修正并标明原文。
留存一切权利。
第一章keilc51开发系统基本知识 (6)1第一节系统概述 (6)第二节keilc51单片机软件开发系统的整体结构...6第三节keilc51工具包的加装...71.c51fordos72.c51forwindows的安装及注意事项:...7第四节keilc51工具包各部分功能及使用简介...71.c51与a51.72.l51和bl51.83.dscope51,tscope51及monitor51.84.ishell及uvision.9第二章keilc51软件使用详解 (10)第一节keilc51编译器的控制指令...101.源文件掌控类 (10)2.目标文件(object)控制类:...103.列表文件(listing)控制类:...10第二节dscope51的使用...111.dscope51fordos112.dscopeforwindows12第三节monitor51及其使用...131.monitor51对硬件的要求...132.mon51的使用...133.mon51的配置...134.串口连接图:...135.mon51命令及使用...14第四节集成开发环境(ide)的使用...141.ishellfordos的使用 (14)22.uvisionforwindows的使用 (15)第三章keilc51vs标准c..15第一节keilc51扩展关键字...15第二节内存区域(memoryareas):...161.pragramarea:...162.internaldatamemory:163.externaldatam emory.162.可位串行区表明20h-2fh..18第七节keilc51指针...181.通常指针...182.存储器指针...183.指针切换...18第八节keilc51函数...191.中断函数声明:...192.通用型存储工作区 (19)3.选通用存储工作区由usingx声明,见上例。
Keil C51使用详解V1.0第一章KEIL C51开发系统基本知识 (6)第一节系统概述 (6)第二节KEIL C51单片机软件开发系统的整体结构 (6)第三节KEIL C51工具包的安装 (7)1. C51 for Dos (7)2. C51 for Windows的安装及注意事项: (7)第四节KEIL C51工具包各部分功能及使用简介 (7)1. C51与A51 (7)2. L51和BL51 (8)3. DScope51,Tscope51及Monitor51 (8)4. Ishell及uVision (9)第二章KEIL C51软件使用详解 (10)第一节KEIL C51编译器的控制指令 (10)1.源文件控制类 (10)2.目标文件(Object)控制类: (10)3.列表文件(listing)控制类: (10)第二节DSCOPE51的使用 (11)1. dScope51 for Dos (11)2. dScope for Windows (12)第三节MONITOR51及其使用 (13)1. Monitor51对硬件的要求 (13)2. Mon51的使用 (13)3. MON51的配置 (13)4.串口连接图: (13)5. MON51命令及使用 (14)第四节集成开发环境(IDE)的使用 (14)1. Ishell for Dos的使用 (14)2. uVision for windows的使用 (15)第三章KEIL C51 VS 标准C (15)第一节KEIL C51扩展关键字 (15)第二节内存区域(MEMORY AREAS): (16)1. Pragram Area: (16)2. Internal Data Memory: (16)3. External Data Memory (16)4. Speciac Function Register Memory (16)第三节存储模式 (16)1. Small模式 (16)2. Compact模式 (17)3. large模式 (17)第四节存储类型声明 (17)第五节变量或数据类型 (17)第六节位变量与声明 (17)1. bit型变量 (17)2.可位寻址区说明20H-2FH (18)第七节KEIL C51指针 (18)1.一般指针 (18)2.存储器指针 (18)3.指针转换 (18)第八节KEIL C51函数 (19)1.中断函数声明: (19)2.通用存储工作区 (19)3.选通用存储工作区由using x声明,见上例。
Keil 软件的使用一、软件启动在桌面上双击,或在开始→程序→。
二、界面图1、首先建立一个工程点击Project→New Project 如下图所示。
则会出现如下图。
注意工程保存在什么位置(要方便自己查找),输入文件,保存类开会自动生成,不用管,然后点保存,则会出如下图则会出现。
则出现可点是或否,影响不大。
则会出现:这样应建立了一个新的工程。
可在保存的位置找工程文件名。
2、建立一个汇编语言文件。
点击File→New,如下图所示则出现Text1为文件名,先要保存一下。
选为文件保存的位置,文件名要注意一下,用汇编语言编写则后缀(扩展名)为.ASM,如果用C 语言编写则为.C。
设置好后点击保存,则程序文件应建立好了。
在保存的位置可找到该文件。
3、程序录入编辑及编译(1)在程序编辑区录入程序(2)将程序文件添加到工程文件中右键单击Source Group1如下图则出现点击,Add Files to Group Source Group 1 则出现如下图选好文件类型为C Source file (*.C),再在保存位置中找到刚才编辑好的程序文件,然后点Add 即可。
(3)必要的参数设置点击Project→Option for Target则会出现如下图:在Target 选项卡中设置好晶振频率。
再选Output选项卡,如下图:设置好各项后点击确定,必要的参数应设置完毕。
(4) 程序编译检查点击Project→Build target files 如下图所示则在界面的最下面出现指示:如果有错误要改正程序的错误,再进行编译,一直到没有错误为止,要生成HEX文件,我们才能下载到单片机中。
程序下载到单片机的程序应用1、启动软件:在桌面找到图,双击将会出现如下图必须要选择正确的端口及单片机型号,然后调入从KEIL C51编译生成的HEX文件。
2、调入HEX文件:左键单击调入FLASH,如下图所示:将会出现HEX文件选择窗口:选择正确文件后,点打开,则出现如下图3、将HEX文件下载到单片机芯片选择正确后,检查单片机是否连接好,准备好后就点击自动,则会出现如下图,程序下载完成后,就会看到单片机板上LED灯在点亮了。
C51程序在Keil C51下的调试步骤此刻普遍利用的C51集成开发环境是Keil软件。
要利用Keil软件,第一要正确安装Keil软件,该软件的Eval版本能够直接去下载,其步骤与一样Windows程序安装类似,那个地址就再也不赘述了。
Keil软件的详细说明见相关资料,那个地址仅作简要说明,以便于读者在后面的章节中实际动手调试、仿真程序。
1.成立工作项目文件图1启动Keil μVison2启动Keil μVison2,若是打开后就有打开的文件,单击“Project->Close Project”菜单将其关闭。
单击“File->New... ",打开一个新的文件输入窗口,在那个窗口里输入上述源程序。
输入完毕以后,选择“File-->Save",给那个文件取名保留,取名字的时候必需要加上扩展名,一样C语言程序均以“.c”为扩展名(必然要加扩展名,不然后面添加文件就找不到该文件,这是初学者很容易忘记的),那个地址将其命名为。
图2 成立工程文件单击“Project->New Project...",显现对话框,要求给将要成立的工程起一个名字,那个地址起名为test,不需要输入扩展名。
单击“保留”按钮,显现第二个对话框,如图3所示:图3 CPU选择窗口那个对话框要求选择工程中所用的单片机型号,那个地址选择Atmel公司的89S52芯片。
单击ATMEL前面的“+”号,展开该层,单击其中的89S52,然后再单击“确信”按钮,会显现一个对话框,询问是不是要将标准的8052启动代码加入工程,单击“是”按钮。
现在,在工程窗口的文件页中显现了“Target 1”,前面有“+”号,单击“+”号展开,能够看到下一层的“Source Group 1 ",需要手动把适才编写好的源程序加入,方式如下:单击“Source Group 1 ",使其反白显示,然后单击鼠标右键,显现一个下拉菜单,如图4所示。
Keil C51使用详解1作者:未知文章来源:21ic 点击数:3489 更新时间:2005-3-15 第一章 Keil C51开发系统基本知识 (6)第一节系统概述 (6)第二节 Keil C51单片机软件开发系统的整体结构 (6)第三节 Keil C51工具包的安装 (7)1. C51 for Dos 72. C51 for Windows的安装及注意事项: (7)第四节 Keil C51工具包各部分功能及使用简介 (7)1. C51与A51. 72. L51和BL51. 83. DScope51,Tscope51及Monitor51. 84. Ishell及uVision. 9第二章 Keil C51软件使用详解 (10)第一节 Keil C51编译器的控制指令 (10)1. 源文件控制类 (10)2. 目标文件(Object)控制类: (10)3. 列表文件(listing)控制类: (10)第二节 dScope51的使用 (11)1. dScope51 for Dos 112. dScope for Windows 12第三节 Monitor51及其使用 (13)1. Monitor51对硬件的要求 (13)2. Mon51的使用 (13)3. MON51的配置 (13)4. 串口连接图: (13)5. MON51命令及使用 (14)第四节集成开发环境(IDE)的使用 (14)1. Ishell for Dos的使用 (14)2. uVision for windows的使用 (15)第三章 Keil C51 vs 标准C.. 15第一节 Keil C51扩展关键字 (15)第二节内存区域(Memory Areas): (16)1. Pragram Area: (16)2. Internal Data Memory: 163. External Data Memory. 164. Speciac Function Register Memory. 16第三节存储模式 (16)1. Small模式 (16)2. Compact模式 (17)3. large模式 (17)第四节存储类型声明 (17)第五节变量或数据类型 (17)第六节位变量与声明 (17)1. bit型变量 (17)2. 可位寻址区说明20H-2FH.. 18第七节 Keil C51指针 (18)1. 一般指针 (18)2. 存储器指针 (18)3. 指针转换 (18)第八节 Keil C51函数 (19)1. 中断函数声明: (19)2. 通用存储工作区 (19)3. 选通用存储工作区由using x声明,见上例。
Keil C语言程序设计示例教程(开发C8051F310)使用汇编语言或C语言要使用编译器,以便把写好的程序编译为机器码,才能把HEX可执行文件写入单片机内。
KEIL uVISION是众多单片机应用开发软件中最优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,甚至ARM,它集编辑,编译,仿真等于一体,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。
因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。
在这里以51单片机并结合C程序为例(汇编操作方法类似,唯一不同的是汇编源程序文件名后缀为“.ASM ”),图文描述工程项目的创建和使用方法。
1.首先我们要养成一个习惯:最好先建立一个空文件夹,把您的工程文件放到里面,以避免和其他文件混合,如下图, 创建了一个名为“PRJ_C8051”文件夹2.点击桌面上的Keil uVision4图标,出现启动画面:3.点击“project --- New uVision Project”新建一个工程:4.在对话框,选择放在刚才建立的“PRJ_C8051”文件夹下,给这个工程取个名为Test_C8051F310, 然后保存,工程的后缀为uvporj。
5.弹出一个框,在CPU类型下我们找到并选中“Silicon Laboratories. Inc.”下的C8051F3106.加入C8051起动码7.建立一个源程序文本8.在下面空白区别写入或复制一个完整的C程序:9.输入源程序文件名名称,示例输入“Test_C8051F310.c”,然后保存:10.把刚创建的源程序文件加入到工程项目文件中。
11.设置---目标(第1步~ 第4步)15.工程项目创建和设置全部完成!点击保持并编译16.在C8051F310中的C语言程序示例//-----------------------------------------------------------------------------// Includes// 在c8051f310.h在头文件中定义了C8051F310的寄存器、输入/输出的端口//-----------------------------------------------------------------------------#include <c8051f310.h> // SFR declarations//-----------------------------------------------------------------------------// 16-bit SFR Definitions for 'F30x//-----------------------------------------------------------------------------sfr16 TMR2RL = 0xca; // Timer2 reload valuesfr16 TMR2 = 0xcc; // Timer2 counter//-----------------------------------------------------------------------------// Global CONSTANTS//-----------------------------------------------------------------------------#define SYSCLK 24500000 / 8 // SYSCLK frequency in Hzsbit LED = P0^0; // LED='1' means ON//-----------------------------------------------------------------------------// Function PROTOTYPES//-----------------------------------------------------------------------------void SYSCLK_Init (void);void PORT_Init (void);void Timer2_Init (int counts);void Timer2_ISR (void);//-----------------------------------------------------------------------------// MAIN Routine//-----------------------------------------------------------------------------void main (void){// disable watchdog timerPCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer// enable)SYSCLK_Init (); // Initialize system clock to// 24.5MHzPORT_Init (); // Initialize crossbar and GPIOTimer2_Init (SYSCLK / 12 / 10); // Init Timer2 to generate// interrupts at a 10Hz rate.EA = 1; // enable global interruptswhile (1) // spin forever{}}//-----------------------------------------------------------------------------// SYSCLK_Init//-----------------------------------------------------------------------------//// This routine initializes the system clock to use the internal 24.5MHz / 8// oscillator as its clock source. Also enables missing clock detector reset.//void SYSCLK_Init (void){OSCICN = 0x80; // configure internal oscillator for// its lowest frequency RSTSRC = 0x04; // enable missing clock detector }//-----------------------------------------------------------------------------// PORT_Init//-----------------------------------------------------------------------------//// Configure the Crossbar and GPIO ports.// P3.3 - LED (push-pull)//void PORT_Init (void){// assignmentsXBR0 = 0x00; // no digital peripherals selectedXBR1 = 0x40; // Enable crossbar and weak pull-ups//P3MDOUT |= 0x08;P0MDOUT |= 0x03; // enable LED as a push-pull output}//-----------------------------------------------------------------------------// Timer2_Init//-----------------------------------------------------------------------------//// Configure Timer2 to 16-bit auto-reload and generate an interrupt at// interval specified by <counts> using SYSCLK/48 as its time base.//void Timer2_Init (int counts){TMR2CN = 0x00; // Stop Timer2; Clear TF2;// use SYSCLK/12 as timebase CKCON &= ~0x60; // Timer2 clocked based on T2XCLK;TMR2RL = -counts; // Init reload valuesTMR2 = 0xffff; // set to reload immediatelyET2 = 1; // enable Timer2 interruptsTR2 = 1; // start Timer2}//-----------------------------------------------------------------------------// Interrupt Service Routines//-----------------------------------------------------------------------------//-----------------------------------------------------------------------------// Timer2_ISR//-----------------------------------------------------------------------------// This routine changes the state of the LED whenever Timer2 overflows.//void Timer2_ISR (void) interrupt 5{TF2H = 0; // clear Timer2 interrupt flagLED = ~LED; // change state of LED}17.KEIL C语言与汇编语言的混合编程方法C语言中加入汇编语言模块的方法:例子:void func(){C语言代码……#pragma asmMOV R6,#23DELAY2: MOV R7,#191DELAY1: DJNZ R7,DELAY1DJNZ R6,DELAY2RET#pragma endasmC语言代码……}汇编部分需要用#pragma asm和#pragma endasm包起来18.KEIL C混合编程中的错误与解决方法1)Keil提示“asm/endasm”出错的解决方法如果只是像1中那样直接加入汇编代码的话,编译将会报错,错误如下:compiling sendata.c...sendata.c(81): error C272: 'asm/endasm' requires src-control to be active sendata.c(87): error C272: 'asm/endasm' requires src-control to be active Target not created解决方法如下:首先project workspace窗口右键单击包含有汇编部分的c语言文件名,然后在如上图所示的菜单中选择带有红色方框的选项在弹出的对话框中,将上图中红色方框选中的两项打上勾(默认的情况下,前面的勾是灰色的,要让这两项前的勾变为黑色的),点击确定。
2008-11-20 22:04图解使用Keil C51软件的九个步骤keil uvision2 C51软件是目前功能最强大的单片机c语言集成开发环境,下面我们通过图解的方式来Keil C51软件的使用教程,学习最简单的,如何输入源程序→ 新建工程→ 工程详细设置→ 源程序编译得到目标代码文件。
第一步:双击Keil uVision2的桌面快捷方式(图1),启动Keil集成开发开发软件。
软件启动后的界面如图2所示。
图1:启动Keil uVision2单片机集成开发环境图2:软件启动后的界面第二步:新建文本编辑窗。
点击工具栏上的新建文件快捷按键,即可在项目窗口的右侧打开一个新的文本编辑窗,见图3所示。
图3:新建文本编辑窗第三步:输入源程序。
在新的文本编辑窗中输入源程序,可以输入C语言程序,也可以输入汇编语言程序,见图4。
图4:输入源程序第四步:保存源程序。
保存文件时必须加上文件的扩展名,如果你使用汇编语言编程,那么保存时文件的扩展名为“.asm”,如果是C语言程序,文件的扩展名使用“*.C ”。
图5:保存源程序注:第3步和第4步之间的顺序可以互换,即可以先输入源程序后保存,也可以先保存后输入源程序。
第五步:新建立Keil工程。
如图6所示,点击 "工程" → "新建工程" 命令,将出现保存对话框(图7)。
图6:新建工程图7:保存工程对话框在保存工程对话框中输入你的工程的文件名,Keil工程默认扩展名为".uv2",工程名称不用输入扩展名(见图7),一般情况下使工程文件名称和源文件名称相同即可,输入名称后保存,将出现"选择设备"对话框(图8),在对话框中选择CPU的型号。
第六步:选择CPU型号。
如图8所示,为工程选择CPU型号,本新建工程选择了ATMEL公司的AT89C51单片机。
图8:选择CPU型号对话框第七步:加入源程序到工程中。
由于CPU和程序启动代码文件STARTUP.a51的重要性,一些8051派生的CPU产品要求初始化CPU来满足设计中的相应的硬件,因此,有时候用户需要对STARTUP.a51进行修改,所以进行注释一下:
;---------------------------------------------------
;startup.A51: 用户上电初始化程序
;----------------------------------------------------
;
;使用以下EQU命令可定义在CPU复位时需要用0进行初始化的内存空间
;
;IDA TA存储器的空间的绝对起始地址总是零
IDA TALEN EQU 80H ;需用0进行初始化的IDA TA存储器空间的字节数
;
XDA TASTART EQU 0H ;XDA TA存储器空间的绝对起始地址
XDA TALEN EQU 0H ;需用0进行初始化的XDA TA存储器的空间字节数
;
PDA TASTART EQU 0H ;PDA TA存储器的空间的绝对起始地址
PDA TALEN EQU 0H ;需用0进行初始化的PDA TA存储器的空间字节数
;注意:IDA TA存储器的空间在物理上包括了8051单片机的DA TA和BIT存储空间
;至少要保证与C51编译器运行库有关的存储器的空间进行0初始化
;
;再入函数模拟初始化
;-----------------------------------------------------------
;以下用EQU指令定义了再入函数模拟堆栈指针的初始化
;
;使用SMALL存储器模式时再入函数的堆栈空间
IBPSACK EQU 0 ;使用SMALL存储器模式再入函数时将其设置成1
IBPSTACKTOP EQU 0FFH+1 ;将堆栈顶设置为最高地址加1
;
;使用LARGE存储器模式时再入函数的堆栈空间
XBPSTACK EQU 0 ;使用LARGE存储器模式再入函数时将其设置成1
XBPSTACKTOP WQU 0FFFFH+1 ;将堆栈顶设置为最高地址加1
;
;使用COMPACT存储器模式时再入函数的堆栈空间
PBPSTACK EQU 0 ; 使用COMPACT存储器模式再入函数时将其设置成1
PBPSTACKTOP WQU 0FFFFH+1 ;将堆栈顶设置为最高地址加1
;;----------------------------------------------------
;使用COMPACT存储器模式时,64KB X DA TA存储器空间的分页定义
;
;以下用EQU指令定义PDA TA类型变量在XDA TA存储器空间的页地址
;使用EQU指令定义PFAGE时必须与L51连接定位器PDA TA指令的控制参数一致
;
PPAGEENABLE EQU 0 ;使用PDA TA类型变量时将其设置成1
PPAGE EQU 0 ;定义页号
;
;------------------------------------------------
NAME ? C_STARTUP ;模块名为? C_STARTUP
? C_51STARTUP SEGMENT CODE ;代码段
? STACK SEGMENT IDA TA;堆栈段
RSEG ? STACK ;堆栈
DS 1
EXTRN COE(? C_START) ;程序开始地址
PUBLIC ? C_STARTUP
CSEG A T 0x8000 ;定义用户程序的起始地址,用MON51仿真器时可能有用
? C_STARTUP: LFMP STARTUP1
RSEG ? C_51STARTUP
STARTUP1:
;
;初始化串口
MOV SCOM, #40H
MOV TMOD, #20H
MOV TH1, #0FDH
SETB TR1
CLR T1
;单片机上电IDA TA内存清零,如果不需要上电清零IDA TA,可以注销IF到IFEDN之间的
;语句,或者修改IDTALEN的长度,为了让CPU具有掉电保护功能,需要确定IDTALEN的长度IF IDA TALEN <> 0
MOV R0, # IDA TALEN-1
CLR A
IDA TALOOP: MOV @R0,A
DJNZ R0,IDA TALOOP
ENDIF
;
;单片机上电XDA TA内存清零,如果不需要上电清零XDA TA,可以注销IF到IFEDN之间的;语句,或者修改XDTALEN的长度
IF XDA TALEN <> 0
MOV DPTR, #XDA TASTART
MOV R7,#LOW (XDA TALEN)
IF (LOW(XDA TALEN)) <> 0
MOV R6, #(HIGH(XDA TALEN))+1
ELSE
MOV R6, #HIGH (XDA TALEN)
ENDIF
CLR A
XDA TALOOP: MOVX @DPTR, A
INC DPTR
DJNZ R7, XDA TALOOP
DJNZ R6, XDA TALOOP
END IF
;
;送PDA TA存储器页面高位地址
IF PPAGEENABLE <> 0
MOV P2, #PPAGE
ENDIF
;
;单片机上电PDA TA内存清零,如果不需要上电清零XDA TA,可注销IF到IFEDN之
;间的语句或者修改PDA TALEN的长度
IF PDA TALEN <> 0
MOV R0, #PDA TASTART
MOV R7, #LOW (PDA TALEN)
CLR A
PDA TALOOP: MOV @R0, A
INC R0
DJNZ R7,PDA TALOOP
ENDIF
;
;设置使用SMALL存储器模式时再入函数的堆栈空间
IF IBPSTACK <> 0
EXTRN DA TA(? C_IBP)
MOV ? C_IBP, #LOW IBPSTACKTOP
ENDIF
;
;设置使用LARGE存储器模式时再入函数的堆栈空间
IF XBPSTACK <> 0
EXTRN DA TA (? C_XBP)
MOV ? C_XBP, #HIGH XBPSTACKTOP
MOV ? C_XBP +1, #LOW XBPSTACKTOP
ENDIF
;
;设置使用COMPACT存储器模式时再入函数的堆栈空间IF PBPSTACK <> 0
EXTRN DA TA(? C_PBP)
MOV ? C_PBP, #LOW PBPSTACKTOP
END IF
;
;设置堆栈的起始地址
MOV SP, #? STACK-1 ;例如MOV SP, #4FH
;
;如果程序超过64K,则使用程序分组技术,启动下面的程序;EXTRN CODE(? B_SWITCH0)
;CALL ? B_SWITCH0
;程序从第一组bank 0 块开始执行
;跳转到用户程序MAIN函数
LJMP ? C_START
END。