整理Keil软件使用手册.docx
《整理Keil软件使用手册.docx》由会员分享,可在线阅读,更多相关《整理Keil软件使用手册.docx(63页珍藏版)》请在冰点文库上搜索。
整理Keil软件使用手册
Keil软件使用手册(推荐完整)
编辑整理:
尊敬的读者朋友们:
这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(Keil软件使用手册(推荐完整))的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为Keil软件使用手册(推荐完整)的全部内容。
Keil软件使用手册(推荐完整)
编辑整理:
张嬗雒老师
尊敬的读者朋友们:
这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布到文库,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是我们任然希望Keil软件使用手册(推荐完整)这篇文档能够给您的工作和学习带来便利。
同时我们也真诚的希望收到您的建议和反馈到下面的留言区,这将是我们进步的源泉,前进的动力.
本文可编辑可修改,如果觉得对您有帮助请下载收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为〈Keil软件使用手册(推荐完整)>这篇文档的全部内容。
Keil软件使用手册
(本手册参考keil4版本)
一安装
到网上下载一个安装包,里面必须包含以下内容:
1:
(安装包文件,圈选的文件为安装说明,请务必仔细阅读)
2:
(打开安装文件)
3:
(点击下一步)
4:
(勾选同意,并点击下一步)
5:
(浏览选择到你想安装的地方,然后选择下一步)
6:
(两个空可以随便打,不重要,填完后点击下一步)
7:
(正在安装中)
8:
(点击完成)
9:
(进入安装的文件夹,点击UV4)
10:
(打开Keil4的执行文件)
11:
(点击File,再选择LicenseManagement)
Pic12:
(复制右上角的ID号)
12:
(打开注册机文件)
13:
(将复制的ID号粘贴在此处)
14:
(点击Generate,在上方会生成一组ID,复制下来)
15:
(将复制好的ID粘贴在圈选出,并点击AddLIC)
16:
(当你看见这两组单词,那么恭喜你,注册成功,准备开始你的奇妙程序之旅吧!
)
二新建工程
1.单击Project,选择NewProject
2.选择保存位置,输入工程的名字
3.选择CPU。
紧接着,KeilC51提示您选择CPU器件.8051内核片机最早是由Intel公司发明的,后来其他厂商如Philips、Atmel、Winbond等先后推出其兼容产品,并在8051的基础上扩展了许多增强功能,根据芯片的实际情况,选择相应的器件(本例程选择Atmel公司下的AT89C52),如图:
注:
选择8051也可以,8051与8052有一点的差别,可以说8052是8051的升级版,主要有以下不同:
1.内部RAM,8051单片机为128Byte(00H-7FH),8052单片机为56
Byte(00H-0FFH)
2.内部ROM,8051单片机为4KB,8052单片机为8KB
3。
8051有两个Timer:
T0和T1.8052除了有T0和T1以外,还有一个Timer2
4.8051有5个中断源8052有6个。
关于单片机的知识我们将在后面做详细介绍.
4。
选择C语言启动代码
•如果使用汇编来编程,请选择“否”。
•如果使用C51来编程,请选择“是”。
如果不出现本提示,请检查是否将安装是否出错。
5。
源程序文件
•选择File菜单,选择New,然后单击
保存按钮
本例程保存为test.c,如果是用汇编写的程序保存的后缀名应该写成。
asm
右键工程项目
,选择AddFlilesto…
将刚才保存的test。
c添加到工程里面去
以上就是工程的搭建,剩下的就是写程序
程序写完编译通过后,设置生成HEX文件
右键单击Target1,选择Optionfor‘Target1’
或者直接点击工具栏上面的
按钮
弹出的窗口选择Output, 选上CreateHEX
编译生成HEX文件
单击工具栏的“Rebuildalltargetfiles”按钮
果程序有错,则会显示错误所在的文件及行号。
如下图,表示test.c文件的第35行有错误,双击则可定位到该位
如果程序没有错误则会生成HEX文件.Data后面的数据表示使用片内RAM的大小,xdata表示使用外部数据大小,code表示程序的大小
三软件调试
调试一般都是在发生错误与意外的情况下使用的。
如果程序能正常执行,调试很多时候都是用不上的。
所以,最高效率的程序开发还是程序员自己做好规范,而不是指望调试来解决问题.
单片机的程序调试分为两种,一种是使用软件模拟调试,第二种是硬件调试。
使用软件模拟调试,就是用计算机去模拟单片机的指令执行,并虚拟单片机片内资源,从而实现调试的目的.但是软件调试存在一些问题,不可能像真正的单片机运行环境那样执行的指令能在同一个时间完成(往往比单片机慢)。
软件调试只能是一种初步的,小型工程的调试,比如一个只有几百上千行的代码的程序,软件调试能很好的完成。
硬件调试其实也需要计算机软件的配合,大致过程是这样的:
计算机软件把编译好的程序通过串行口、并行口或者USB口传输到仿真器,然后与单片机一样执行。
仿真器仿真全部的单片机资源(所有的单片机接口,并且有真实的引脚输出)。
仿真器会将单片机内部内存与时序等情况返回给计算机,这样就可以在计算机里看到单片机程序真实的执行情况。
不仅如此,还可以通过计算机的软件实现单步、全速、运行到光标的常规调试手段.仿真器可以接入实际的电路中
仿真器
以下介绍软件模拟调试
调试的重要性
前面我们学习了如何建立工程,编写C源文件,连接工程,并获取生成的目标代码,但是坐到这些仅仅代表你的源程序没有语法错误,至于程序中存在其它错误必须通过调试才能解决。
事实上,除了一小部分极其简单的程序绝大部分程序都要通过多次调试才能得到正确结果,调试是单片机开发过程中一个非常重要的环节.
常用调试命令
在对工程成功地进行汇编、连接以后,按Ctrl+F5或者使用菜单Debug-〉Start/StopDebugSession即可进入调试状态,Keil内建了一个仿真CPU用来模拟执行程序,该仿真CPU功能强大,可以在没有硬件和仿真机的情况下进行程序的调试
工具栏上
从左到右依次为:
查找(findout),第二个几乎不用,开始停止调试,后面几个带圈的都和断点相关具体可将鼠标移到图标上查看,和工程窗口相关的几个小帮助
最后一个是配置,可以修改各个窗口的字体,shortcutkey等等。
单击中的调试按钮
可以进入或者退出调试,单击进入
进入调试状态后,界面与编缉状态相比有明显的变化,Debug菜单项中原来不能用的命令现在已可以使用了,工具栏会多出一个用于运行和调试的工具条,如图所示,Debug菜单上的大部份命令可以在此找到对应的快捷按钮,从左到右依次是:
复位、运行、暂停、单步、过程单步、执行完当前子程序、运行到当前行、命令窗口(commandwindow)、汇编窗口(disassemblywindow)、控制特殊功能寄存器显示窗口(Symblewindow)、寄存器窗口(工程窗口那块)(registerwindow)、堆栈调用窗口(Callstack)、监视窗口(watchwindow)、子窗口是localswatch1watc2、存储器窗口(memorywindow)、
串行口调试窗口(serialwindow)、分析窗口(包含逻辑分析仪,性能分析仪),工具按钮等命令.
全速执行
,复位重新开始执行
逐语句执行
跟踪进函数内部
,先设置一个断点,
全速运行程序如下:
出现几个工作区间,以下介绍这几个区域:
1左侧是单片机内寄存器的状态区域,给出了常用的寄存器r0~r7以及a,b,sp,dptr,pc,psw等特殊功能寄存器的值,这些值会随着
程序的执行发生相应的变化.(涉及单片机内存,若未学过汇编语言,建议了解);
其中Regs是片内内存的相关情况值;Sys是系统一些累加器、计数器等。
。
具体介绍一下Sys:
a累加器ACC,往往在运算前暂存一个操作数(如被加数),而运算后又保存其结果(如代数和)。
b寄存器B,主要用于乘法和除法操作。
sp
sp_max
dptr数据指针DPTR。
PC$
states执行指令的数量。
sec执行指令的时间累计(单位:
秒).
psw程序状态标志寄存器PSW,八位寄存器,用来存放运算结果的一些特征量,如有无进位、借位等。
p奇偶标志P。
反映累加器ACC内容的奇偶性,如果ACC中的运算结果有偶数个1(如11001100B,其中有4个1),则P为0,否则,P=1。
f1
ov溢出标志位OV。
MCS-51反映带符号数的运算结果是否有溢出,有溢出时,此位为1,否则为0。
rs
f0
ac辅助进位标志AC。
又称半进位标志,它反映了两个八位数运算低四位是否有半进位,即低四位相加(或减)有否进位(或借位),如有则AC为1状态,否则为0。
cy进位标志CY(PSW7)。
它表示运算是否有进位(或借位).如果操作结果在最高位有进位(加法)或者借位(减法),则该位为1,否则为0。
由于PSW存放程序执行中的状态,故又叫程序状态字。
运算器中还有一个按位(bit)进行逻辑运算的逻辑处理机(又称布尔处理机)。
根据指令执行的不同,上述值会有相应的变化,程序员可以监测这些在单片机中看不到的值而达到调试的目的
2C语言源代码区域
3反汇编指令区域
这个是DisassemblyWindows,按下后可以把C51Disassembly转化为相应的汇编语言,如果有汇编语言知识的话,就可以对比C51程序与汇编程序了.由于汇编语言的效率高很多,这也可以作为查看C51执行效率的一个方法。
可以看出,C51代码是如何被解释为汇编的。
4查看变量的值
5查看存储器的值
选择View- MemoryWindow
存储器窗口的地址栏处输入0000H后回车,则可以查看单片机内程序存储器的内容,单元地址前有”C:
”表示程序存储器。
如果在存储器窗口的地址栏处输入D:
00H后回车,则可以查看单片机内数据存储器的内容,单元地址前有“D:
"表示数据存储器,单元地址前有”X:
"表示片外数据区,冒号后面表示要查看的数据地址。
6虽然软件调试无法实现硬件调试那样的信号输出,但是软件调试也可以在软件窗口监测输出信号的高低电平,以及单片机相关端口的变化,实现模拟监测输出信号的目的。
在主菜单栏:
peripherals可以查看定时器,和IO口的数值,中断,串行通信
上图所示,Port0,Port1,Port2,Port3就对应于51单片机的四个P0,P1,P2,P3口,共32个针脚
查看输出波形单击
,然后选setup可以输入想要观察的引脚。
全速运行并单击图中的all,可以看到以下效果,单击图中的out或者in可以对单位时间进行修改。
选择合适的时间可以清楚得观察高低电平变化及占空比
下面我们来看一个实例:
KeilC51程序调试过程
用KeilC51编写程序时,经常需要调试,如果不是经常用这个软件的话,很容易忘记这些调试步骤,现在举一个例子“验证延迟函数delay()使其延迟的时间为500ms”说明。
源程序写完后,就可以调试了,按照图1所示,先进行第一步和第二步操作,使界面切换到图2的状态,可以看到在文本编辑窗口中,有一个黄色箭头指向13行的位置,说明程序从这个位置开始执行.左上角有一些跟调试相关的按钮,如“全速执行”、“单步进入”……。
对于这个例子,目的是验证delay()函数的延迟时间,使其大约为500ms.按照下列方法可以达到这个目的:
图1编译界面
图2 调试界面
点击“单步跳出"按钮(或功能键F10),黄色箭头从第13行往下移一行(14),再单击“单步跳出”,则箭头移到15行那边,表示程序从第13行执行到第15行(注:
这种方式是一步一步执行程序。
如果要同时执行几行,比如从第13行一下子执行到15行,可以作如下操作:
先用鼠标在第15行的位置处点击两下会出现一个图2所示的红色图标;然后点击“全速执行”按钮,则黄色的箭头会从第13行快速移到15行。
即:
这两行同时被执行)。
此时左边寄存器窗口中的sec有一个数值,表示程序执行的时间,即delay()函数的延迟时间。
如果延迟时间不是500ms,可改变delay()函数中x,y的数值,再点击图1的第二步所对应的按钮切换到图1所示的编译界面,点击“重新构造所有对象文件”编译程序,然后再切换到图2的界面上来进行调试.
重复上面的步骤,直到左边寄存器窗口中的sec(单位秒)数值大约为0。
50s,即可说明delay()延迟时间为500ms。
(注:
这种方法比较麻烦,而且延迟时间不会很精确,如果要精确延迟的话可采用定时器的方式。
)
KeilC调试案例—-优化导致的问题
如下是一个简单的KeilC中的小程序:
#includeh〉
voidmain()
{
unsignedchari,j;
i=0xf0;
j=0x0f;
P0=i;
P1=j;
while
(1);
}
编译OK后,进入Debugsession,按F11单步执行,发现"i=0xf0”和"j=0x0f"这两句没有执行。
如下图:
很多初学者百思不得其解,其实,这是由于KeilC本身的8级优化导致的。
解决的方法有两种:
1、降底优化级别,如下图,可降至级别2.
2、在局部变量i,j定义前加上Volatile,禁止KeilC优化这两个变量。
如下:
volatileunsignedchari,j;
调试OK!
KEIL—C调试点滴
问:
用KEIL写C代码,做完以后的调试工作应该如何开展?
只有PC机,没有任何的硬件设备。
用自带的编译功能然后查错误。
写完代码后,F7编译,Alt+F5调试,F10单步运行。
可以查看寄存器的值以及RAM的内容。
还可以改变P0~P3口的输入。
KEIL就是一个开发仿真一体的。
Keil C本身就是编译与仿真一体的。
当不要外部数据时很方便,可以使用Keil C自带的软件调试器(软件仿真器),有单步运行,设置断点等功能.当要外部输入时(比如用定时器作计数器用),有两种处理方法:
(1)做产品时最好是用硬件仿真器调试。
(2)学习时可用以下方法:
Keil C提供了几个调试输入用的窗口,可用它们来模拟输入;调试函数由自己根据需要按特定的格式来编辑,再按KEILC的要求调入即可。
下面给出用定时器作外部事件计数时模拟外部输入的调试函数,并写出Keil C调用的步骤如下:
步骤一:
编写如下信号函数:
single voidt0_singal(void)
{
while
(1)
{
PORT3|=0x10;//pullINT0(P3。
4)highagain
PORT3&=~0x10;//pull INT0(P3.4) low and generate interrupt
PORT3|=0x10;//pull INT0(P3.4) high again
twatch(CLOCK);//waitfor1 second
}
}
步骤二:
在DEBUG状态下选择:
DEBUG》“Function Editor(OpenIniFile)”,这时,将弹出两个新屏幕,将其中的“打开”窗口关闭;保留“Function Editor窗口;
步骤三:
在Function Editor窗口中输入上面的函数:
single voidt0_singal(void)
步骤四:
保存(注意:
扩展名为.ini),编译该程序,成功后关闭Function Editor窗口;
步骤五:
执行用户程序(必须连续执行);
步骤六:
在屏幕左下脚的命令窗口中,键入t0_singl()后(必须回车),Keil C便可向P3.4源源不断地提供脉冲信号.
四基于8051+Proteus仿真案例
Protues简介
Protues软件是英国Labcenterelectronics公司出版的EDA工具软件.它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。
它是目前最好的仿真单片机及外围器件的工具。
虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。
Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。
在编译方面,它也支持IAR、Keil和MPLAB等多种编译。
这里请读者自行安装好Proteus,双击已安装好的Proteus
,我们将简单的介绍该软件,要深入学习请查阅其它资料.
Protues软件界面
左侧的工具栏提供丰富的硬件资源
用Protues搭建单片机系统
第一步,新建设计。
单击“File”→“NewDesign…”命令(或单击图标命令),在Protues中打开了一个空白的新电路图纸。
第二步,添加所需器件。
单击“Library”→“PickDevice/Symbol…"命令(或单击图标命令),单击左侧的
然后点击
打开器件选择对话框,如图3-1所示,在对话框左上角有个关键字“Keyword"搜索文字框,如果我们知道器件型号可输入其中,Protues将自动帮我们找到所需器件首先,输入“AT89C51”
点击Ok选中器件,在电路绘制区中央单击鼠标,AT89C51单片机就被放置到了电路图中。
参考单片机的放置方法把其它器件如晶振、电容、电阻、发光二极管等也放置到电路图中的适当位置。
这几个器件在器件选择对话框中的关键词分别为:
res(电阻)、crystal(晶体振荡器)、cap(电容)、led-red、7seg(数码管)(关键字不唯一)。
其它器件添加进去后,连接各器件构成原理图。
所有元器件都放置到电路图后的效果如图
接下来就是将写好的程序下载到CPU里面去,双击CPU会弹出下面的窗口
点击
将生成的Hex文件烧录到CPU即可开始仿真
依次是,运行、单步运行、暂停、停止
开始仿真按钮
,退出仿真
在仿真中,红色代表高电平,蓝色代表低电平,灰色代表不确定。
下面介绍几个简单案例:
1闪烁的LED
/*名称:
闪烁的LED
说明:
LED按设定的时间间隔闪烁
*/
#includeh>
#defineucharunsignedchar
#defineuintunsignedint
sbitLED=P1^0;
//延时
voidDelayMS(uintx)
{
uchari;
while(x--)
{
for(i=0;i<120;i++);
}
}
//主程序
voidmain()
{
LED=0;
while
(1)
{
LED=~LED;
DelayMS(150);
}
}
2单只数码管循环显示0~9
/*名称:
单只数码管循环显示0~9
说明:
主程序中的循环语句反复将0~9的段码送至P0口,使数字0~9循环显示
*/
#include〈reg51.h〉
#includeh>
#defineucharunsignedchar
#defineuintunsignedint
ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//延时
voidDelayMS(uintx)
{
uchart;
while(x--)for(t=0;t〈120;t++);
}
//主程序
voidmain()
{
uchari=0;
P0=0x00;
while
(1)
{
P0=~DSY_CODE[i];
i=(i+1)%10;
DelayMS(300);
}
}
3数码管显示4X4矩阵键盘按键号
/*名称:
数码管显示4X4矩阵键盘按键号
说明:
按下任意键时,数码管都会显示其键的序号,扫描程序首先判断按键发生在哪一列,然后根据所发生的行附加不同的值,从而得到按键的序号。
*/
#include#defineucharunsignedchar
#defineuintunsignedint
//段码
ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};
sbitBEEP=P3^7;
//上次按键和当前按键的序号,该矩阵中序号范围0~15,16表示无按键
ucharPre_KeyNo=16,KeyNo=16;
//延时
voidDelayMS(uintx)
{
uchari;
while(x——)for(i=0;i〈120;i++);
}
//矩阵键盘扫描
voidKeys_Scan()
{
ucharTmp;
P1=0x0f;//高4位置0,放入4行
DelayMS
(1);
Tmp=P1^0x0f;//按键后0f变成0000XXXX,X中一个为0,3个仍为1,通过异或把3个1变为0,唯一的0变为1
switch(Tmp)//判断按键发生于0~3列的哪一列
{
case1:
KeyNo=0;break;
case2:
KeyNo=1;break;
case4:
KeyNo=2;break;
case8:
KeyNo=3;break;
default:
KeyNo=16;//无键按下
}
P1=0xf0;//低4位置0,放入4列
DelayMS
(1);
Tmp=P1>〉4^0x0f;//按键后f0变成XXXX0000,X中有1个为0,三个仍为1;高4位转移到低4位并异或得到改变的值
switch(Tmp)//对0~3行分别附加起始值0,4,8,12
{
case1:
KeyNo+=0;break;
case2:
KeyNo+=4;break;
case4:
KeyNo+=8;break;
case8:
KeyNo+=12;
}
}
//蜂鸣器
voidBeep()