keilc教程以及程序例子Word格式文档下载.docx

上传人:b****4 文档编号:16731475 上传时间:2022-11-25 格式:DOCX 页数:35 大小:714.98KB
下载 相关 举报
keilc教程以及程序例子Word格式文档下载.docx_第1页
第1页 / 共35页
keilc教程以及程序例子Word格式文档下载.docx_第2页
第2页 / 共35页
keilc教程以及程序例子Word格式文档下载.docx_第3页
第3页 / 共35页
keilc教程以及程序例子Word格式文档下载.docx_第4页
第4页 / 共35页
keilc教程以及程序例子Word格式文档下载.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

keilc教程以及程序例子Word格式文档下载.docx

《keilc教程以及程序例子Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《keilc教程以及程序例子Word格式文档下载.docx(35页珍藏版)》请在冰豆网上搜索。

keilc教程以及程序例子Word格式文档下载.docx

C51\RTX51

实时操作系统Full文件,255个任务

C51\RTX_TINY

实时操作系统Tiny文件,16个任务

C51\INC

C语言中与8051有关的所有包含文件都在此处

C51\LIB

库、开始代码、输入/输出源程序

C51\MON51

监控目标硬件系统时所使用的HEX代码生成文件

UV2

编译器集成执行文件

KEIL编译器C51以ANSI(AmericanNationalStandardInstitute)规格为标准,所以使用C语言的开发人员用ANSI编写程序就可以(使用ClassicC语言也可以)。

第二章KeiluVision2快速入门

为了能让使用者快速入门,先简单介绍8051。

8051单片机就是一个具有40个引脚的长方形芯片,其中,有5V直流电源Vcc(因为内部有很多逻辑电路,应使用波纹系数小的直流电源)与电源地GND引脚。

还有至少保持2个机器周期(一个机器周期=12个振荡周期)为高电就复位的RESET引脚。

端口P0就是由开漏(用作I/O口时需要外部接上拉电阻)的驱动器构成的8位双向I/O口,用作A0~A7,D0~D7;

端口1就是有内部上拉电阻的准双向I/O口;

端口2就是有内部上拉电阻的准双向I/O口,用作A8~A15;

端口3就是有内部上拉电阻的准双向I/O口,兼有串行通讯、外部中断、定时器、读/写的特殊功能;

X1就是振荡放大器的反向输入引脚,X2就是反向输出引脚,因此,使用晶体时把晶振并联连接到X1与X2上,使用外部振荡器时只连接X1。

ALE/PROG(AddressLatchEnableOutput/ProgramPulseInput)引脚的ALE,在访问外部存储器时用来锁存低8位地址,而PROG在编程EPROM时用来进行脉冲输入。

PSEN(ProgramStrobeEnable)引脚信号作为访问外部程序存储器的读选通,每个机器周期PSEN被激活2次,在ALE的下降沿将端口0的地址锁存到外部锁存器。

EA/Vpp(ExteralAccessEnable)引脚连接到GND,则0~FFFFH地址都访问外部程序存储器;

连接到Vcc,则访问内部程序存储趋。

Vpp就是对8751编程电压输入端子,其电压为12、75~21V,具体值随不同型号芯片而有所不同。

双击KeiluVision2集成执行快捷按钮,将弹出如图2–1所示的窗口。

这就是一个初始开发集成窗口。

如果没有做过任何项目,则窗口上什么也没有。

窗口的上端有10个下拉菜单。

C51在管理程序时,采用所谓的项目(Project)文件来进行管理。

项目把程序的环境甚至与编

图2–1KeiluVision2的执行

辑有关的全部信息都保存着,因此使用者可以把多个程序以项目为单位使用C51就可以了。

由于C518051KEIL编译器变成集成环境,提供即使不知道汇编或不详细知道8051也能编写应用程序的环境。

这一章的内容可以使工程人员快速并正确地熟悉编译器环境。

执行集成环境C51,如图2–1所示,出现编辑、项目、输出等3个大窗口与,View,Project,Debug,Flash,Peripherals,Tools,SVCS,Window,Help等11个下拉菜单。

为了开始新的项目,选择“Project→NewProject”选项后,出现如图2–2所示,然后选择源程序所在路径键入项目的名字并单击“保存”按钮。

项目的名字会立即出现在集成环境的左上端。

这个项目的名字最后为HEX文件的名字。

因此,项目的名字最好不超过8个英文字母,并且尽量不采用中文为好。

在这里采用的项目名字为“First_Project”。

图2–2建立一个新工程

接着选择用8051开发的目标硬件系统的MPU选项,如图2–3所示。

这个选项的就是为了反映各个不同厂家生产的具有不同性能的8051而设计的,因此,只要正确选择自己要开发的目标硬件系统的MPU就可以了。

图2–3目标硬件系统的CPU的选择

接着要进行“OptionforTarget”的设定,以修改跟编译器有关的信息与跟目标系统有关的事项。

如图2–4中,第一个选项“Target”设定目标系统的存储器、输出文件以及与源程序文件有关的事项。

在菜单栏中,选择“Project/OpintionforTarget…”或者单击工具栏中的“OptionforTarget”快捷按钮就可以开始设定。

在这里,要输入系统的工作频率、ROM与RAM的开始地址与大小以及存储模式。

首先,正确输入目标系统的晶振的频率值后选择存储模式。

图2–4OptionforTarget

为了让8051的机器语言代码下载到ROM,需要产生HEX代码。

图2–5的Option选项用来设定HEN文件的名字与要存放的文件夹(SelectFolderforObject…)。

通常编译、调试到下载ROM需要进行多次编译才能完成。

如果不选择“CreatHEXFile”,编译后不将产生HEX代码(即使不发生错误)。

这样可以避免不必要地反复写硬盘以保护硬盘的磁道与扇区。

图2–5中右上端的“NameofExecutable”表示HEX代码文件的名字,通常与项目文件同名,也可以指定别的名字。

编译完成后生成HEX代码文件,并存放在项目所在路径中。

因为8051的知识产权就是Intel公司的,其命令语的处理也跟随Intel的结构,所以KEIL只支持IntelHEX文件的形式。

另外,为了在源代码层次上进行调试,最好选择“DebugInformation”。

为了便于编译程序,最好选择“BrowserInformation”。

图2–5OptionforTarget输出文件设定

在使用监控程序(Monitor)与目标硬件系统与KEIL编译器集成环境接口,能够监控变量的值与函数的执行。

监控程序把监控程序ROM移植到目标硬件系统后运行。

为了把监控程序与目标硬件系统接口,需要制作合适的硬件。

监控程序的监控原理就是,把监控程序装入ROM区,把应用程序代码装入RAM以后,执行监控程序,则监控程序,调用应用程序执行。

这样,在RAM区域里代码存储区与数据存储区共存。

所以在使用监控程序调试应用程序的时候,需要在KEIL软件中修改以下参数,如图2–6所示将原来的“CSEGAT0”修改成“CSEGAT08000h”(不包括双引号)。

如果使用烧写器直接调试程序,则使用默认的“CSEGAT0”即可。

图2–6Startup、A51文件修改

同时将OptionforTarget中BL51Locate中的Code代码段的设定修改成如图2–7所示

图2–7OptionforTarget代码段的设定

下面就是可以驱动用于调试的仿真器与监控器的环境设定选项卡“OptionforTarget/Debug”,如图2–8所示。

主要有2个单选项:

左侧有仅用软件来仿真8051的软件模拟仿真器单选项,右侧有与目标硬件系统边传送信息边进行调试的“KEILMonitor–51Driver”与“TriscendE5Driver”单选项。

由于KEIL8051集成开发环境综合了调试(Debug)与Scope功能,所以称之为dScope。

监控器的功能就是把监控器的ROM移植到目标硬件系统,用RS–232连接PC机与目标硬件系统,PC机的KEILdScope与目标硬件系统互相传送信息。

可以下载代码,也可以查瞧目标硬件系统的变量。

图2–8OptionforTarget/Debug

第三章应用程序的调试

经过上面的软件设置,下面将介绍一下,如何在KEIL软件中进行应用程序的调试、编译与连接。

首先单击“File”菜单,在下拉的菜单中单击“New”选项,屏幕图3–1所示,此时可以瞧到编辑窗口的标题栏就是空的,而光标在编辑窗口闪烁。

这个时候就可以键入应用程序了。

图3–1含有空白的编辑窗口的屏幕

单击菜单条上的“File”菜单,在下拉菜单中选中“SaveAs”选项单击,屏幕如图3–2所示。

在“文件名”栏右侧的编辑框中,键入欲使用的文件名称,同时,必须键入正确的扩展名。

注意:

如果使用C语言编写程序,则扩展名为(*、C);

如果就是用汇编语言编写的程序,则扩展名为(*、asm)。

然后,单击“保存”按钮。

图3–2保存文件对话框

然后需要将您已经保存好的文件添加到该项目中,具体步骤为:

单击“SourceGroup1”然后在单击鼠标右键,屏幕如图3–3所示。

图3–3把源程序添加到工程中

接着单击“Add‘SourceGroup1’”,此时屏幕将出现图3–4所示的画面,然后选择您刚刚设定的函数文件名。

单击“Add”按钮后则可以编写C语言程序了;

图3–4选择所需要的源程序

现在编写程序:

#include<

reg52、h>

//包含文件

stdio、h>

voidmain(void)

{

SCON=0x52;

TMOD=0x20;

TH1=0xf3;

TR1=1;

printf(“HelloIamKEIL51、\n”);

//打印程序执行信息

printf(“Iwillbeyourfriend、\n”);

while

(1);

//等价于HALT指令

}

在输入上述程序时,KEIL51会自动识别关键字,并以不同颜色提示用户加以注意,这样可以减低错误率,有利于提高编程效率。

程序输入完毕后,屏幕如图3–5所示。

图3–5程序输入完成后的屏幕显示

编辑源程序之后,为了下载到目标硬件系统,要反复进行编译与连接操作。

这时使用的正就是“Project”下拉菜单中的编译命令。

“BuildTarget”(

)表示只编译与连接在项目窗口修改过的源程序,因此适合于多种源程序文件的情况。

“RebuildallTargetFile”(

)表示编译与连接项目里登陆的所有源程序文件。

相反,“Translate”(

)表示只编译被激活的窗口中的源程序。

另外,在编译与连接过程中,可以利用“BuildStop”(

)停止正在进行中的编译与连接,这个快捷按钮就是未被激活状态时的画面。

在窗口底部可以瞧见KEIL项目文件(*、UV)的历史记录,列出最近使用过的文件,最多10个。

除使用过的项目文件之外的历史记录,在“File”下拉菜单的下端可以到过去曾使用过的6个文件列表。

在设定“OptionforTarget”的存储器与“Settings”项后。

进行编译并执行dScope(

)。

则出现如图3–6所示画面。

当然,在执行前装如监控程序与目标硬件系统已接好电源,并且串行通信电缆也已连接到PC机的COM端口。

然后监控程序与连接都正常,则在左下端状态栏里显示蓝色的直方图表,以表示正在装入;

如果通信电缆没有连接到目标硬件系统,则显示如3–7所示的信息。

这时,要按目标硬件系统的复位按钮重新执行监控程序之后,单击“TryAgain”或者“Settings……”,重新确定设定值。

特别就是要重新确定通信速度就是否为设定为9600bps,目标硬件系统的时钟频率就是否设定为11、0592Mhz。

如果这样还就是连接不上,单击“StopDebugging”来退出bScope,重新进行上面的步骤。

若还没有任何进展,则只好从头开始检查一下目标硬件系统与软件的设置,在特殊情况下,有时往往就是ROM里的指令代码有问题,或者串行通信有问题。

如果一切连接都正常,则不出现错误窗口,在dScope环境中变成准备等待(Standby)状态。

图3–6正在运行的源程序

图3–7错误信息提示

根据上述编写的程序,若需要在电脑上显示编写的结果就是不就是满足自己的要求,可不设定就是KEILMonitor–51Driver仿真;

可以使用UseSimulator进行仿真。

在执行dScope(

)后,再单击(

)可以瞧见通过传口发出去的信息内容,如图3–8所示。

图3–8显示程序所实现的结果

3、1项目中含有多个文件

通常,一个项目就是由多个文件构成的,这就是结构化语言的特色之一。

对于一个大的项目,同时可以由多人编程、调试,最后再连接到总的项目中去,这就构成了工程项目。

下面介绍多文件项目使用方法。

为了便于说明,将C语言程序加上行号,列表如下:

1#include<

//包含文件

2#include<

3voidmain(void)//主程序

4{

5SCON=0x52;

6TMOD=0x20;

7TH1=0xf3;

8TR1=1;

9printf("

HelloIamKEIL51、\n"

);

//打印程序执行信息

10printf("

Iwillbeyourfriend、\n"

11while

(1);

现在把5—8行程序改写成如下函数:

#include<

voidserial_initial(void)

SCON=0x52;

TMOD=0x20;

TH1=0xf3;

TR1=1;

将上述函数保存为serial_initial、c。

将剩余部分添加必要的两行,保存为my_second、c,程序清单如下:

externserial_initial();

voidmain(void)//主程序

serial_initial();

printf("

while

(1);

}

现在创建第二个工程项目,步骤如下:

(1)创建项目,工程名为my_second;

(2)选择所用单片机,Ateml公司的AT89s52;

(3)添加文件,将已经编写好的my_second、c与serial_initial、c添加到项目中去,完成后,(4)屏幕如图3–1–1所示;

(5)编译项目,生成机器代码;

(6)执行当前项目,实现软件仿真;

(7)查瞧程序的执行结果,观察屏幕的输出结果(与图3–8完全相同)。

图3–1–1my_second屏幕显示图

由于Monitor-51开发系统比较简单,占用了一些系统资源,有时给使用者带来了不便。

实际编程中常要解决一下两个问题:

(1)串行接口功能:

串行通信就是MCS-51单片机经常要用到的功能,而这里选用的MCS-51系列单片机AT89S52只有一个串行通信口,在与PC机相连接的仿真状态时,串行口用于与PC机通信。

若在应用程序中也用到串行口,就会发生冲突。

解决方法一就是用户程序装载完毕后,运行用户程序,再断开仿真板与PC机的串行通信线,这样串口就可以归用户程序使用了,当然这时PC机就不能在线调试了;

另外,还可以选用其它的带两个串行口的MCS-51系列芯片。

(2)外部存储空间:

用户程序越长,占用的外部数据存储空间将越大。

解决的方法就是对较长的程序进行分段调试。

第四章实验程序

4、1键盘显示程序

硬件环境:

单片机最小系统、8279键盘显示电路

实现功能:

通过按键输入,在数码管上显示相应的数字

C源程序:

//**********************************************

//C按键为清屏幕

//D按键为一位一位清除

//B按键为小数点

reg52、H>

ABSACC、H>

#defineCOMXBYTE[0x7001]

#defineDATXBYTE[0x7000]

#defineucharunsignedchar

ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

ucharidatadiss[8]={0,1,2,3,4,5,6,7};

ucharkeyin();

uchardeky();

//*************************************

unsignedintii;

uchari,k,n,m,j,s;

for(ii=0;

ii<

20000;

ii++);

COM=0xD1;

//清楚总命令清除RAM

COM=0x00;

//键盘、显示方式、分频

COM=0x38;

while

(1)

{

k=keyin();

switch(k)

{

case0x0c:

//清楚屏幕

i=0;

continue;

break;

case0x0d:

i--;

//按位清除可以一位一位的清除数码管

COM=0x90;

COM=i+0x80;

DAT=0;

case0x0b:

//小数点

COM=i+0x80;

j=diss[i];

s=table[j];

DAT=s|0x80;

i++;

default:

break;

if(i<

8)

diss[i]=k;

DAT=table[k];

}

else

}

//***************取键值函数************

ucharkeyin(void)

uchari,j,k;

while(deky()==0);

COM=0x40;

j=DAT;

i=j&

0x07;

i=i<

<

3;

k=j&

0x38;

k=k>

>

i=i+k;

return(i);

uchardeky(void)

uchark;

k=COM;

return(k&

0x0f);

4、28255扩展I/O口实验

通过按键输入数字量,则在8255的三个输出口分别输出相应的数字量

/*---------------------------------------------*/

/*函数名称:

8255A程序调试

/*

/*版本:

V1、0

/*完成时间:

2005年8月9日

//文件名:

main、c

#include"

EXAMPLE、h"

unsignedchark,i,j;

Init_8279();

while

(1)

{

k=Keyin();

switch(k)

{

case0x0a:

//确定发送

j=buffer[0]<

4;

j=buffer[1]|j;

Init_8255_mode0(j);

continue;

break;

case0x0c:

//清除屏幕

Clear_LED();

i=0;

continue;

default:

break;

}

COM=0x90;

COM=i+0x80;

buffer[i]=k;

DAT=table[k];

i++;

i=0;

Init_8279

#in

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1