Keil软件使用手册

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Keil软件使用手册
(本手册参考keil 4版本)
一安装
到网上下载一个安装包,里面必须包含以下内容:
1:
(安装包文件,圈选的文件为安装说明,请务必仔细阅读) 2:
(打开安装文件)
3:
(点击下一步)
4:
(勾选同意,并点击下一步) 5:
(浏览选择到你想安装的地方,然后选择下一步)6:
(两个空可以随便打,不重要,填完后点击下一步)7:
(正在安装中)
8:
(点击完成)
9:
(进入安装的文件夹,点击UV4) 10:
(打开Keil4的执行文件)11:
(点击File,再选择License Management) Pic 12:
(复制右上角的ID号)12:
(打开注册机文件)13:
(将复制的ID号粘贴在此处)
14:
(点击Generate,在上方会生成一组ID,复制下来)
15:
(将复制好的ID粘贴在圈选出,并点击Add LIC)16:
(当你看见这两组单词,那么恭喜你,注册成功,准备开始你的奇妙程序之旅吧!)
二新建工程
1.单击Project,选择New Project
2.选择保存位置,输入工程的名字
3.选择CPU。

紧接着,Keil C51提示您选择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
右键工程项目,选择Add Fliles to …
将刚才保存的test.c 添加到工程里面去
以上就是工程的搭建,剩下的就是写程序
程序写完编译通过后,设置生成HEX文件右键单击Target 1,选择Option for ‘Target 1’
或者直接点击工具栏上面的按钮
弹出的窗口选择Output,选上Create HEX
编译生成HEX文件
单击工具栏的“Rebuild all target files”按钮
果程序有错,则会显示错误所在的文件及行号。

如下图,表示test.c 文件的第35行有错误,双击则可定位到该位
如果程序没有错误则会生成HEX文件。

Data后面的数据表示使用片内RAM的大小,xdata表示使用外部数据大小,code表示程序的大小
三软件调试
调试一般都是在发生错误与意外的情况下使用的。

如果程序能正常执行,调试很多时候都是用不上的。

所以,最高效率的程序开发还是程序员自己做好规范,而不是指望调试来解决问题。

单片机的程序调试分为两种,一种是使用软件模拟调试,第二种是硬件调试。

使用软件模拟调试,就是用计算机去模拟单片机的指令执行,并虚拟单片机片内资源,从而实现调试的目的。

但是软件调试存在一些问题,不可能像真正的单片机运行环境那样执行的指令能在同一个时间完成(往往比单片机慢)。

软件调试只能是一种初步的,小型工程的调试,比如一个只有几百上千行的代码的程序,软件调试能很好的完成。

硬件调试其实也需要计算机软件的配合,大致过程是这样的:计算机软件把编译好的程序通过串行口、并行口或者USB口传输到仿真器,然后与单片机一样执行。

仿真器仿真全部的单
片机资源(所有的单片机接口,并且有真实的引脚输出)。

仿真器会将单片机内部内存与时序等情况返回给计算机,这样就可以在计算机里看到单片机程序真实的执行情况。

不仅如此,还可以通过计算机的软件实现单步、全速、运行到光标的常规调试手段。

仿真器可以接入实际的电路中
仿真器
以下介绍软件模拟调试
调试的重要性
前面我们学习了如何建立工程,编写C源文件,连接工程,并获取生成的目标代码,但是坐到这些仅仅代表你的源程序没有语法错误,至于程序中存在其它错误必须通过调试才能解决。

事实上,除了一小部分极其简单的程序绝大部分程序都要通过多次调试才能得到正确结果,调试是单片机开发过程中一个非常重要的环节。

常用调试命令
在对工程成功地进行汇编、连接以后,按Ctrl+F5或者使用菜单Debug->Start/Stop Debug Session即可进入调试状态,Keil内建了一个仿真CPU用来模拟执行程序,该仿真CPU功能强大,可以在没有硬件和仿真机的情况下进行程序的调试
工具栏上从左到右依次为:
查找(find out),第二个几乎不用,开始停止调试,后面几个带圈的都和断点相关具体可将鼠标移到图标上查看,和工程窗口相关的几个小帮助
最后一个是配置,可以修改各个窗口的字体,short cut key等等。

单击中的调试按钮可以进入或者退出调试,单击进入
进入调试状态后,界面与编缉状态相比有明显的变化,Debug菜单项中原来不能用的命令现在已可以使用了,工具栏会多出一个用于运行和调试的工具条,如图所示,Debug菜单上的大部份命令可以在此找到对应的快捷按钮,从左到右依次是:
复位、运行、暂停、单步、过程单步、执行完当前子程序、运
行到当前行、命令窗口(command window)、汇编窗口
(disassembly window)、控制特殊功能寄存器显示窗口
(Symble window)、寄存器窗口(工程窗口那块)(register
window)、堆栈调用窗口(Call stack)、监视窗口(watch window)、子窗口是locals watch1 watc2、存储器窗口(memory window)、
串行口调试窗口(serial window)、分析窗口(包含逻辑分析仪,
性能分析仪),工具按钮等命令。

全速执行,复位重新开始执行,逐语句执行,跟踪进函数内部,先设置一个断点,
全速运行程序如下:
出现几个工作区间,以下介绍这几个区域:
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(PSW 7)。

它表示运算是否有进位(或借位)。

如果操作结果在最高位有进位(加法)或者借位(减法),则该位为1,否则为0。

由于PSW存放程序执行中的状态,故又叫程序状态字。

运算器中还有一个按位(bit)进行逻辑运算的逻辑处理机(又称布尔处理机)。

根据指令执行的不同,上述值会有相应的变化,程序员可以监测这些在单片机中看不到的值而达到调试的目的
2 C语言源代码区域
3 反汇编指令区域
这个是Disassembly Windows,按下后可以把C51 Disassembly 转化为相应的汇编语言,如果有汇编语言知识的话,就可以对比C51程序与汇编程序了。

由于汇编语言的效率高很多,这也可以作为查看C51执行效率的一个方法。

可以看出,C51 代码是如何被解释为汇编的。

4 查看变量的值
5 查看存储器的值
选择View -Memory Window
存储器窗口的地址栏处输入0000H后回车,则可以查看单片机内程序存储器的内容,单元地址前有”C:”表示程序存储器。

如果在存储器窗
口的地址栏处输入D:00H后回车,则可以查看单片机内数据存储器的内容,单元地址前有“D:”表示数据存储器,单元地址前有”X:”表示片外数据区,冒号后面表示要查看的数据地址。

6 虽然软件调试无法实现硬件调试那样的信号输出,但是软件调试也可以在软件窗口监测输出信号的高低电平,以及单片机相关端口的变化,实现模拟监测输出信号的目的。

在主菜单栏:peripherals可以查看定时器,和IO口的数值,中断,串行通信
上图所示,Port0,Port1,Port2,Port3就对应于51单片机的四个P0,P1,P2,P3 口,共32个针脚
查看输出波形单击,然后选setup可以输入想要观察的引脚。

全速运行并单击图中的all,可以看到以下效果,单击图中的out或者in可以对单位时间进行修改。

选择合适的时间可以清楚得观察高低电平变化及占空比
下面我们来看一个实例:
Keil C51程序调试过程
用Keil C51编写程序时,经常需要调试,如果不是经常用这个软件的话,很容易忘记这些调试步骤,现在举一个例子“验证延迟函数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。

(注:这种方法比较麻烦,而且延迟时间不会很精确,如果要精确延迟的话可采用定时器的方式。


Keil C调试案例--优化导致的问题
如下是一个简单的Keil C中的小程序:
#include <reg52.h>
void main()
{
unsigned char i,j;
i = 0xf0;
j = 0x0f;
P0 = i;
P1 = j;
while (1);
}
编译OK后,进入Debug session,按F11单步执行,发现"i = 0xf0"和"j = 0x0f"这两句没有执行。

如下图:
很多初学者百思不得其解,其实,这是由于Keil C本身的8级优化导致的。

解决的方法有两种:
1、降底优化级别,如下图,可降至级别2。

2、在局部变量i,j定义前加上Volatile,禁止Keil C优化这两个变量。

如下:
volatile unsigned char i,j;
调试OK!
KEIL-C调试点滴
问:
用KEIL写C代码,做完以后的调试工作应该如何开展?只有PC机,没有任何的硬件设备。

用自带的编译功能然后查错误。

写完代码后,F7编译,Alt+F5调试,F10单步运行。

可以查看寄存器的值以及RAM的内容。

还可以改变P0~P3口的输入。

KEIL 就是一个开发仿真一体的。

Keil C本身就是编译与仿真一体的。

当不要外部数据时很方便,可以使用Keil C自带的软件调试器(软件仿真器),有单步运行,设置断点等功能。

当要外部输入时(比如用定时器作计数器用),有两种处理方法:
(1)做产品时最好是用硬件仿真器调试。

(2)学习时可用以下方法:Keil C提供了几个调试输入用的窗口,可用它们来模拟输入;调试函数由自己根据需要按特定的格式来编辑,再按KEIL C的要求调入即可。

下面给出用定时器作外部事件计数时模拟外部输入的调试函数,并写出Keil C调用的步骤如下:
步骤一:编写如下信号函数:
single void t0_singal(void)
{
while(1)
{
PORT3|=0x10; //pull INT0(P3.4) high again
PORT3&=~0x10; //pull INT0(P3.4) low and generate interrupt
PORT3|=0x10; //pull INT0(P3.4) high again
twatch(CLOCK); //wait for 1 second
}
}
步骤二:在DEBUG状态下选择:
DEBUG》“Function Editor(Open Ini File)",这时,将弹出两个新屏幕,将其中的“打开”窗口关闭;保留“Function Editor窗口;
步骤三:在Function Editor窗口中输入上面的函数:
single void t0_singal(void)
步骤四:保存(注意:扩展名为.ini),编译该程序,成功后关闭Function Editor 窗口;
步骤五:执行用户程序(必须连续执行);
步骤六:在屏幕左下脚的命令窗口中,键入t0_singl()后(必须回车),Keil C 便可向P3.4源源不断地提供脉冲信号。

四基于8051+Proteus仿真案例
Protues简介
Protues软件是英国Labcenter electronics公司出版的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”→“New Design…”命令(或单击图标命令),在Protues中打开了一个空白的新电路图纸。

第二步,添加所需器件。

单击“Library”→“Pick Device/Symbol…”命令(或单击图标命令),单击左侧的,然后点击打开器件选择对话框,如图3-1所示,在对话框左上角有个关键字“Keyword”搜索文字框,如果我们知道器件型号可输入其中,Protues将自动帮我们找到所需器件首先,输入“AT89C51”
点击Ok选中器件,在电路绘制区中央单击鼠标,AT89C51单片机就被放置到了电路图中。

参考单片机的放置方法把其它器件如晶振、电容、电阻、发光二极管等也放置到电路图中的适当位置。

这几个器件在器件
选择对话框中的关键词分别为:res(电阻)、crystal(晶体振荡器)、cap(电容)、led-red、7seg(数码管)(关键字不唯一)。

其它器件添加进去后,连接各器件构成原理图。

所有元器件都放置到电路图后的效果如图
接下来就是将写好的程序下载到CPU里面去,双击CPU会弹出下面的窗口
点击将生成的Hex文件烧录到CPU即可开始仿真
依次是,运行、单步运行、暂停、停止
开始仿真按钮,退出仿真
在仿真中,红色代表高电平,蓝色代表低电平,灰色代表不确定。

下面介绍几个简单案例:
1 闪烁的LED
/* 名称:闪烁的LED
说明:LED按设定的时间间隔闪烁
*/
#include<reg51.h>
#define uchar unsigned
char
#define uint unsigned int
sbit LED=P1^0;
//延时
void DelayMS(uint x)
{
uchar i;
while(x--)
{
for(i=0;i<120;i++);
}
}
//主程序
void main()
{
LED=0;
while(1)
{
LED=~LED;
DelayMS(150);
}
}
2 单只数码管循环显示0~9
/* 名称:单只数码管循环显示0~9
说明:主程序中的循环语句反复将0~9的段码送至P0口,使数字0~9循环显示*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//延时
void DelayMS(uint x)
{
uchar t;
while(x--)
for(t=0;t<120;t++);
}
//主程序
void main()
{
uchar i=0;
P0=0x00;
while(1)
{
P0=~DSY_CODE[i];
i=(i+1)%10;
DelayMS(300);
}
}
3数码管显示4X4矩阵键盘按键号
/* 名称:数码管显示4X4矩阵键盘按键号
说明:按下任意键时,数码管都会显示其键的序号,扫描程序首先判断按键发生在哪一列,然后根据所发生的行附加不同的值,从而得到按键的序号。

*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//段码
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};
sbit BEEP=P3^7;
//上次按键和当前按键的序号,该矩阵中序号范围0~15,16表示无按键
uchar Pre_KeyNo=16,KeyNo=16;
//延时
void DelayMS(uint x)
{
uchar i;
while(x--) for(i=0;i<120;i++);
}
//矩阵键盘扫描
void Keys_Scan()
{
uchar Tmp;
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列的哪一列
{
case 1: KeyNo=0;break;
case 2: KeyNo=1;break;
case 4: KeyNo=2;break;
case 8: 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
{
case 1: KeyNo+=0;break;
case 2: KeyNo+=4;break;
case 4: KeyNo+=8;break;
case 8: KeyNo+=12;
}
}
//蜂鸣器
void Beep()
{
uchar i;
for(i=0;i<100;i++)
{
DelayMS(1);
BEEP=~BEEP;
}
BEEP=0;
}
//主程序
void main()
{
P0=0x00;
BEEP=0;
while(1)
{
P1=0xf0;
if(P1!=0xf0) Keys_Scan(); //获取键序号
if(Pre_KeyNo!=KeyNo)
{
P0=~DSY_CODE[KeyNo];
Beep();
Pre_KeyNo=KeyNo;
}
DelayMS(100);
}
}
4 100 000s以内的计时程序
/* 名称:100 000s以内的计时程序
说明:在6只数码管上完成0~99 999.9s。

*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//段码
uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//6只数码管上显示的数字
uchar Digits_of_6DSY[]={0,0,0,0,0,0};
uchar Count;
sbit Dot=P0^7;
//延时
void DelayMS(uint ms)
{
uchar t;
while(ms--) for(t=0;t<120;t++);
}
//主程序
void main()
{
uchar i,j;
P0=0x00;
P3=0xff;
Count=0;
TMOD=0x01; //计数器T0方式1
TH0=(65536-50000)/256; //50ms定时
TL0=(65536-50000)%256;
IE=0x82;
TR0=1; //启动T0
while(1)
{
j=0x7f;
//显示Digits_of_6DSY[5]~Digits_of_6DSY[0]的内容
//前面高位,后面低位,循环中i!=-1亦可写成i!=0xff
for(i=5;i!=-1;i--)
{
j=_crol_(j,1);
P3=j;
P0=DSY_CODE[Digits_of_6DSY[i]];
if(i==1) Dot=1; //加小数点
DelayMS(2);
}
}
}
//T0中断函数
void Timer0() interrupt 1
{
uchar i;
TH0=(65536-50000)/256; //恢复初值
TL0=(65536-50000)%256;
if(++Count!=2) return;
Count=0;
Digits_of_6DSY[0]++; //0.1s位累加
for(i=0;i<=5;i++) //进位处理
{
if(Digits_of_6DSY[i]==10)
{
Digits_of_6DSY[i]=0;
if(i!=5) Digits_of_6DSY[i+1]++; //如果0~4位则分别向高一位进位}
else break; //若某低位没有进位,怎循环提前结束
}
}
5 单片机之间双向通信
/* 名称:甲机串口程序
说明:甲机向乙机发送控制命令字符,甲机同时接收乙机发送的数字,并显示在数码管上。

*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1=P1^0;
sbit LED2=P1^3;
sbit K1=P1^7;
uchar Operation_No=0; //操作代码
//数码管代码
uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //延时
void DelayMS(uint ms)
{
uchar i;
while(ms--) for(i=0;i<120;i++);
}
//向串口发送字符
void Putc_to_SerialPort(uchar c)
{
SBUF=c;
while(TI==0);
TI=0;
}
//主程序
void main()
{
LED1=LED2=1;
P0=0x00;
SCON=0x50; //串口模式1,允许接收
TMOD=0x20; //T1工作模式2
PCON=0x00; //波特率不倍增
TH1=0xfd;
TL1=0xfd;
TI=RI=0;
TR1=1;
IE=0x90; //允许串口中断
while(1)
{
DelayMS(100);
if(K1==0) //按下K1时选择操作代码0,1,2,3
{
while(K1==0);
Operation_No=(Operation_No+1)%4;
switch(Operation_No) //根据操作代码发送A/B/C或停止发送
{
case 0: Putc_to_SerialPort('X');
LED1=LED2=1;
break;
case 1: Putc_to_SerialPort('A');
LED1=~LED1;LED2=1;
break;
case 2: Putc_to_SerialPort('B');
LED2=~LED2;LED1=1;
break;
case 3: Putc_to_SerialPort('C');
LED1=~LED1;LED2=LED1;
break;
}
}
}
}
//甲机串口接收中断函数
void Serial_INT() interrupt 4
{
if(RI)
{
RI=0;
if(SBUF>=0&&SBUF<=9) P0=DSY_CODE[SBUF];
else P0=0x00;
}
}
/* 名称:乙机程序接收甲机发送字符并完成相应动作
说明:乙机接收到甲机发送的信号后,根据相应信号控制LED完成不同闪烁动作。

*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1=P1^0;
sbit LED2=P1^3;
sbit K2=P1^7;
uchar NumX=-1;
//延时
void DelayMS(uint ms)
{
uchar i;
while(ms--) for(i=0;i<120;i++);
}
void main()
{
LED1=LED2=1;
SCON=0x50; //串口模式1,允许接收
TMOD=0x20; //T1工作模式2
TH1=0xfd; //波特率9600
TL1=0xfd;
PCON=0x00; //波特率不倍增
RI=TI=0;
TR1=1;
IE=0x90;
while(1)
{
DelayMS(100);
if(K2==0)
{
while(K2==0);
NumX=++NumX%11; //产生0~10范围内的数字,其中10表示关闭
SBUF=NumX;
while(TI==0);
TI=0;
}
}
}
void Serial_INT() interrupt 4
{
if(RI) //如收到则LED则动作
{
RI=0;
switch(SBUF) //根据所收到的不同命令字符完成不同动作
{
case 'X': LED1=LED2=1;break; //全灭
case 'A': LED1=0;LED2=1;break; //LED1亮
case 'B': LED2=0;LED1=1;break; //LED2亮
case 'C': LED1=LED2=0; //全亮
}
五拓展keil for
arm
J-LINK 驱动安装
安装驱动很简单,只要将下载的ZIP 包解压,然后直接安装即可,
默认安装,一路点击“NEXT”即可:
安装完成后,请插入JLINK 硬件,然后系统提示发现新硬件,一般情况下
会自动安装驱动,如果没有自动安装,请选择手动指定驱动程序位置(安装目录),
然后将驱动程序位置指向到JLINK 驱动软件的安装目录下的Driver 文件夹,驱
动程序就在该文件夹下。

安装完成可以桌面出现两个快捷图标,如下图,J-Link可以用来进行设置和测试
连接好J-Link后,双击图标,可以显示J-Link连接是否正常,如下图为正常显示。

三、在RealViewMDK4.01 中新建一个工程
1. 创建工程
(1) 新建一个文件夹用于存放工程文件,此处文件名为“LED”,放在F 盘(可自行选择);
(2) 单击Project – New μVision Project…. 菜单项。

μVision 4 打开一个标准对话框,输入新建工程的名字“LED ” ,新工程保存在文件夹” LED”下,μVision 将会创建以LED.UV为名字的
新工程文件
STMicroelectronics菜单下的STM32F103VE
μVision 自动添加启动代码,选择“是”,工程新建完毕
新工程包含了一个缺省的目标(target)和文件组名。

这些内容Project 4 Workspace 窗口中可以看到:。

相关文档
最新文档