单片机的C语言程序设计与应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 用µVision2建立与调试工程

μVision2集成开发环境有一个工程管理器,使得8051系列单片机应用系统的程序设计更为简单方便。利用μVision2建立的应用项目是多文件模式,所有的文件包括源程序(包括C语言程序、汇编语言程序)、头文件及说明性的技术文档,都可以放在工程项目文件里统一管理。

源程序编译通过并不意味着程序执行后就能实现用户的既定目标,可能还隐含着很多看不见的错误,这就需要对源程序进行调试。调试相关的命令在Debug菜单下。

2.2.1 工程创建、设置、编译与链接

1.工程创建

μVision2是一个标准的Windows应用程序,直接单击程序图标就可以启动它。μVision2启动后,程序窗口的左边为一个工程管理窗口。该窗口中有3个标签,即Files、Rges和Books,分别显示当前项目的文件结构、CPU的工作寄存器和部分特殊功能寄存器,以及所选CPU的附加说明文件,当首次启动μVisions2时,3个标签全是空的。

从μVision2的Project菜单中选择New Project,将打开如图2-2所示的标准的Windows对话框,给将要建立的工程文件起一个名字,并选择合适的存储位置,然后单击“保存”按钮,出现下一个对话框。

图2-2 创建新工程对话框

这个对话框要求用户选择目标CPU型号,从图中可以看出,Keil支持的CPU种类繁多,几乎所有目前流行的芯片厂家的CPU型号都包含在内。用户可根据实际情况选用CPU,方法是在器件厂商列表中单击所用器件厂商名字前的“+”,展开之后选择对应型号即可。

选择好CPU型号后,会弹出如图2-3所示的对话框,询问用户是否添加标准的8051启动代码(STARTUP.A51),单击“是”按钮,启动代码自动添加到工程文件组中。

图2-3 启动代码添加对话框

文件STARTUP.A51是8051系列CPU的启动代码,启动代码主要用来对CPU数据存储器进行清零,并初始化硬件和重入函数堆栈指针等。用户也根据自己所用目标硬件来修改启动文件,以适应实际需要。

使用菜单File/New或单击工具栏上的新建文件按钮,即可在项目窗口的右侧打开一个新的文本编辑窗口,在该窗口中输入源程序代码,然后保存文件。注意保存时必须加上扩展名。源文件的编写也可以使用另外的文本编辑器。

虽然源文件已创建并保存好了,但此时与工程项目并无任何关系,还需要采用下述方式把其添加至项目中。右击Project窗口Files选项卡中的Source Group 1,弹出快捷菜单,单击菜单中的Add Files to Group 'Group 1'选项,可打开一个如图2-4所示的对话框,从对话框中选择用户创建的源文件,单击Add按钮即可把其加入项目中。

图2-4 添加文件对话框

2.工程设置

工程建立好之后,还要对工程进行进一步的设置,以满足实际需要。μVision2允许为目标硬件及其相关元件设置必要的参数。μVision2还可以设置C51语言编译器、A51汇编器、链接及定位和转换等软件开发工具选项。使用鼠标或键盘可以选择相应的项目或更改选项设置。

在选择Project/Options for Target命令后弹出的对话框中,可以通过各个选项卡定义目标硬件及所选的所有相关参数。各目标硬件选项卡的说明如表2-10所示。

表2-10 目标硬件选项卡说明

(1)Target选项卡

软件默认的选项卡为Target(目标)选项卡,在该选项卡中可设置的主要参数及其描述如下。

① Xtal(MHz)

Xtal(MHz)用来设置单片机的工作频率,默认值是所选CPU的最高可用频率值,如果单片机所用晶振是11.0592 MHz,那么在文本框中输入11.0592即可。

② Use On–chip ROM(0x0–0xFFF)

Use On–chip ROM(0x0–0xFFF)表示使用片上的Flash ROM。例如,At89c52有8 KB的Flash ROM,就要用到这个选项。如果单片机的EA引脚接高电平,那么要选这个选项;如果单片机的EA接低电平,表示使用外部ROM,那么不要选中该选项。

③ Off–chip Code memory

Off–chip Code memory是在片外所接ROM的开始地址和大小,如果没有外接程序存储器,那么不要输入任何数据。假如使用一个片外的ROM,地址从0x8000开始,Size则为外接ROM的大小。

④ Off–chip Xdata memory

Off–chip Xdata memory可以输入外接的Xdata。例如,接一个片外62256,则可以指定Xdata的起始地址为0x4000,大小为0x8000。

⑤ Code Banking

Code Banking表示使用Code Banking技术,Keil C51可以支持程序代码超过64 KB的情况,最大可以有2 MB的程序代码。如果代码超过64 KB,那么就要使用Code Banking技术来支持更多的程序空间。Code Banking支持自动的Bank的切换,它建立一个大型的系统需求,例如,在单片机中实现汉字字库及汉字输入法,都要用到该技术。

⑥ Memory Model

单击Memory Model下的三角按钮,共有3个选项。

● Small表示变量存储在内部RAM中。

● Compact表示变量存储在外部RAM中,使用8位间接寻址。

● Large表示变量存储在外部RAM中,使用16位间接寻址。

一般使用Small方式来存储变量,单片机优先把变量存储在内部RAM中,如果内部RAM不够,才会存到外部RAM中。Compact方式要自己通过程序来指定页的高位地址,编程比较复杂。Compact方式适用于比较少的外部RAM的情况。Large方式是指变量会优先分配到外部RAM中。要注意3种存储方式都支持内部256字节和外部64 KB的RAM,区别是变量优先存储在哪里。除非不想把变量存储在内部RAM中,才使用后面的Compact和Large方式。因为变量存储在内部RAM中,运算速度比存储在外部RAM中要快得多,大部分的应用都选择Small方式。

⑦ Code Rom Size

单击Code Rom Size下的三角按钮,共有3个选项。

● Small。Program 2K or less选项适用于程序存储空间只有2 KB的单片机,所有跳转地址只有2 KB,如果代码跳转超过2 KB,就会出错。

● Compact。2 K functions,64K program选项表示每个子函数的程序大小不超过2 KB,整个工程可以有64 KB的代码。

● Large。64 K program选项表示程序或子函数大小都可以大到64 KB。使用code bank程序大小还可以更大。Code Rom Size选择Large方式,速度不会比Small慢很多,所以一般没有必要选择Compact或Small方式,通常情况下一般选择此选项即可。

⑧ Operating

单击Operating下的三角按钮,共有3个选项:

● None选项表示不使用操作系统;

● RTX–51 Tiny选项表示使用Tiny操作系统;

● RTX–51 Full选项表示使用Full操作系统。

Keil C51提供了Tiny系统,Tiny是一个多任务操作系统,使用定时器0作为任务切换。一般用11.0592 MHz时,切换任务的速度为30 ms。如果有10个任务同时运行,那么切换时间为300 ms,同时不支持中断系统的任务切换,也没有优先级。因为切换的时间太长,实时性大打折扣,对内部RAM的占用也过多。多任务操作系统一般适合于16位、32位这样的速度更快的CPU。

Keil C51 Full是比Tiny要好一些的系统,但需要用户使用外部RAM,支持中断方式的多任务和任务优先级,但Keil C51中不提供该运行库。

一般情况下不使用操作系统,即该项的默认值为None。

(2)Output选项卡

Output选项卡中可设置的主要参数及其描述如下。

① Select Folder for Object

单击该按钮可选择编译后目标文件的存储目录,如果不设置,就存储在项目文件的目录中。

② Name of Executable

设置生成目标文件的名字,默认情况下和项目文件名字一致。目标文件可以生成库或OBJ、HEX等文件格式。

③ Create Executable

如果要生成OMF和HEX文件,一般选中Debug Information和Browse Information。选中这两项,才有调试所需要的详细信息,比如要调试C语言程序,如果不选中,调试时无法看到高级语言编写的程序。

④ Create HEX File

选中该项,编译之后即可生成HEX文件。默认情况下该项未选中。如果要把程序写入硬件,则必须选中该项,这一点容易被初学者忽视。

⑤ Create Library

选中该项时将生成lib库文件。一般的应用是不生成库文件的。默认情况下该项未选中。

⑥ After Make

After Make栏中有以下几个选项:

Beep when complete:编译完成后发出蜂鸣声。

Start Debugging:编译完成后即启动调试,一般不选。

Run User Program #1,Run User Program #2:设置编译完成后所要运行的其他应用程序。

(3)Listing选项卡

Listing选项卡用于调整生成的列表文件选项。

① Select Folder for Listing

该按钮用来选择列表文件存放目录,默认情况下为项目文件所在目录。

在汇编或编译完成后将生成(*.lst)的列表文件,在链接完成后也可产生(*.m51)的列表文件,该页用于对列表文件的内容和形式进行细致的调节。这两个文件可以告诉用户程序中所使用的idata、idata、bit、xdata、code、RAM、ROM等相关信息,以及程序所需要的代码空间。

实际使用中,一般选中C Compile Listing下的Assemble Code项,选中该项可以在列表文件中生成C语言源程序所对应的汇编代码。

② C51语言选项卡的设置选项

用于对Keil的C编译器的编译过程进行控制,其中比较常用的是Code Optimization组。

该选项中的Level是优化等级,C51语言在对源程序进行编译时,可以对代码进行9级优化,默认为第8级,一般无须修改,如果在编译中出现问题,可以尝试降低优化级别。

Emphasis表示选择编译优先方式,第1项是代码量优化(最终生成的代码量最小),第2项是速度优化(最终生成的代码速度最快),第3项是默认值。默认情况下是速度优先,可根据需要更改。

(4)Debug选项卡

Debug选项卡用来设置μVision2调试器,其选项如图2-5所示。

图2-5 Debug选项卡

从图2-5中可以看出,仿真有两种方式:Use Simulato(r软件模拟)和Use:Keil Monitor-51 Driver(硬件仿真)。软件模拟是纯粹的软件仿真,此模式下,不需要实际的目标硬件就可以模拟80C51单片机系列的很多功能,在硬件做好之前,就可以测试和调试嵌入式应用程序。μVision2可以模拟很多外围部件,包括串行口、外部I/O和定时器。外围部件设置是在从器件数据库选择CPU时选定的。

硬件仿真选项有高级GDI驱动和Keil Monitor-51驱动,运用此功能用户可以把Keil C51嵌入到自己的系统中,从而实现在目标硬件上调试程序。若要使用硬件仿真,则应选择Use选项,并在该栏后的驱动方式选择框内选择这时的驱动程序库。

Load Application at Start:选择此选项,Keil会自动装载程序代码。

Go till main:调试C语言程序时可选择此项,PC会自动运行到main程序处。

3.编译与链接

工程建立并设置好后,需要对工程进行编译。编译命令位于如图2-6所示的Project菜单下,也可单击如图2-7所示的工具栏中的相应按钮。

图2-6 Project菜单中的编译命令

图2-7 工具栏中的编译命令按钮

如果一个项目包含多个源程序文件,而仅对某一个文件进行了修改,则不用对所有文件编译,仅对修改过的文件进行编译即可,方法是选择Project→Build target()。如果要对所有的源程序进行编译,选择Project→Rebuild all target files()即可。

编译之后,如果没有错误,开发环境的下方会显示编译成功的信息,如图2-8所示。

图2-8 编译成功信息

2.2.2 用μVision2调试工程

源程序编译通过并不意味着程序执行后就能实现用户的既定目标,可能还隐含着很多看不见的错误,这就需要对源程序进行调试。调试相关的命令在Debug菜单下。

1.程序执行与断点设置

单击Debug菜单下的Start/Stop Debug()命令,μVision2会载入应用程序进入调试启动模式。如图2-9所示,μVision2保持编辑器窗口的布局,并恢复最后一次调试时窗口显示的CPU指令,下一条可以执行的语句用黄色箭头标出。

图2-9 调试模式

调试时,编辑器的很多功能仍然可以使用。例如,使用查找命令或纠正程序的错误。程序的源文件在同一窗口显示。μVision2调试模式和编辑模式有以下的不同点:

① 提供Debug菜单和Debug命令;

② 不能修改项目结构或工具参数,所有Build命令禁止。

程序调试必须明确两个重要的概念,即单步执行和全速执行。全速执行是指一行程序执行完后接着执行下一行程序,中间没有间断,程序执行速度很快,只能看到程序执行的总体结果,如果程序中存在错误,则难以判断错误的具体位置。选择菜单命令Debug→Go()或按快捷键F5,程序全速执行。

单步执行是指每一次执行一行程序,执行完该行程序即停止,等待命令执行下一行程序。在这种执行方式下,可以方便地观察每条程序语句的执行结果,可以依次判断程序错误的具体位置。

选择菜单命令Debug→Step()或按快捷键F11,可以单步执行程序。选择菜单命令Debug→Step Over()或按快捷键F10,可以以过程单步形式执行命令。所谓过程单步,是指将汇编程语言中的子程序或C语言中的函数作为一条语句来执行。

另外,单击Debug菜单下的Step out of Current Function(),单步执行跳出当前函数。单击Debug菜单下的Run to Cursor Line(),全速运行程序至光标所在行。单击Debug菜单下的Stop Running(),程序停止运行。

程序调试时,一些程序必须满足一定的条件才能被执行,如程序中某一变量达到一定的值、按键被按下、有中断产生等事件发生,这些条件发生往往是异步发生或难以预先设定的,这类问题使用单步执行的方法是很难调试的,这时就需要使用程序调试中的另一种重要方法:断点设置。

μVision2可以用几种不同的方法定义断点。在程序代码翻译以前,也可以在编辑源文件时,设置断点。断点可以用以下的方法定义和修改。

① 用工具栏按钮。在Editor(编辑器)或Disassembly(反汇编)窗口选中代码行,然后单击断点按钮()。

② 用快捷菜单的断点命令。在Editor(编辑器)或Disassembly(反汇编)窗口选中代码行,单击鼠标右键,打开快捷菜单。

③ Debug菜单下的Breakpoints对话框可以查看、定义和修改断点设置。这个对话框可以定义不同访问属性的断点。

另外,菜单命令Debug→Enable→Disable Breakpoint()用来开启或暂停光标所在行的断点功能,Debug→Disable All Breakpoint()用来暂停所有的断点,Kill All Breakpoint()用来清除所有的断点设置。

设置好断点后可以全速运行程序,一旦执行到设置断点的程序行即停止运行,可以在此观察相关变量或特殊寄存器的值,以判断确定程序中存在的问题。

2.调试窗口

μVsion2提供了友好的人机交互界面,如图2-10所示,其编译环境包括多个窗口,主要有观察窗口(Watch & Call Stack Window)、存储器窗口(Memory Window)、反汇编窗口(Disassembly Window)、输出窗口(Output Window)和串行窗口(Serial Window)等。启动调试模式后,可以通过菜单View下的命令打开或关闭这些窗口。

图2-10 调试窗口

(1)观察窗口

如图2-11所示,观察窗口可以查看和修改程序变量,并列出当前函数的嵌套调用。观察窗口的内容会在程序停止运行后自动更新。也可以使用View→Periodic Window Update选项,在目标程序运行时自动更新变量的值。如果要在程序运行中或运行后观察某一变量的值,可以在观察窗口中按F2键,然后在文本框中输入相应的变量名字。

图2-11 观察窗口

(2)存储器窗口

存储器窗口能显示各种存储区的内容,如图2-12所示。最多可以通过4个不同的页观察4个不同的存储区。用上下文菜单可以选择输出格式。

图2-12 存储器窗口

在存储器窗口Address后的文本框内输入“字母:数字”,即可显示相应存储单元的值,其中字母可以是C、D、I和X,分别代表程序存储空间、直接寻址的片内存储空间、间接寻址的片内存储空间和扩展的片外RAM空间;数字表示要显示区域的起始地址。例如,输入“D:50”,即可观察到首址为0x50的片内RAM单元的值。使用View→Periodic Update选项,可以在程序运行时自动更新存储器窗口。该窗口的显示值可以用不同形式显示,如十进制、十六进制、无符号字符型、有符号字符型等。另外,可以改变存储单元的值,改变显示方式和存储单元值的方法是把鼠标置于数值上,单击鼠标右键,在弹出的菜单中选择即可。

(3)反汇编窗口

如图2-13所示,反汇编窗口用源程序和汇编程序的混合代码或汇编代码显示目标应用程序,可以在该窗口进行在线汇编,利用该窗口跟踪已经执行的代码,并在该窗口按汇编代码的方式单步执行。

图2-13 反汇编窗口

如果选择反汇编窗口作为活动窗口,则所有程序的单步执行命令会工作在CPU的指令级,而不是源程序的行。可以用工具栏按钮或上下文菜单命令在选中的文本行上设置或修改断点。

可以使用Debug菜单打开In Line Assembly对话框来修改CPU指令,同时允许在调试时纠正错误或在目标程序上进行暂时的改动。

(4)串行窗口

μVision2有两个串行窗口,可以用于串行口输入和输出。从仿真CPU输出的串行口数据在这个窗口中显示,而在串行窗口键入的字符将被输入到仿真CPU中,用该窗口可以在没有硬件的情况下用键盘模拟串行口通信。

            SCON=0x50;          //串行口模式1,8位
            TMOD=0x20;          //定时器器1为模式2,8位自动装载
            TH1=0xf4;           //T1为1200bit/s的装载值,16MHz
            TL1=0xf4;
            EA=1;
            TI=1;
            TR1=1;

(5)工程窗口的寄存器页面

在进入调试模式前,工程窗口的寄存器(Regs)页面是空白的,进入调试后,此页面就会显示当前仿真状态下寄存器的值,如图2-14所示。

图2-14 工程窗口的寄存器页面

寄存器页面包括了当前的工作寄存器组和一些特殊的寄存器(如累加器A、乘法器B、堆栈寄存器SP、状态寄存器PSW等)。当程序运行改变某一寄存器的值时,该寄存器则以反色显示,用鼠标单击后按下F2键,可修改该寄存器的值。

2.2.3 C51程序调试举例说明——HELLO.C

HELLO.C是一个样例程序,位于目录C:\KEIL\C51\EXAMPLES\HELLO\中。这个程序只是将Hello World输出到串行口。整个程序只包含一个源文件HELLO.C。

HELLO的硬件是基于标准的8051 CPU的。使用的唯一片内功能围器件是串行口。不需要实际的目标CPU,因为μVision2可以模拟程序所需要的硬件。

1.HELLO项目文件

在µVision2中,应用都位于项目文件中,已经有HELLO的项目文件了。选择Project菜单中的Open Project,从文件夹C:\KEIL\C51\EXAMPLES\HELLO\中打开HELLO.UV2,来载入项目。

2.编辑HELLO.C

双击Project Window Files页中的HELLO.C,即可编辑HELLO.C。µVision2在编辑窗口载入并显示HELLO.C的内容。

            /*------------------------------------------------------------
            HELLO.C
            Copyright 1995-1999 Keil Software, Inc.
            --------------------------------------------------------------*/
            #include <REG52.H>      /* special function register declarations*/
            /* for the intended 8051 derivative*/
            #include <stdio.h>      /* prototype declarations for I/O functions */
            #ifdef MONITOR51        /* Debugging with Monitor-51 needs*/
            char code reserve [3] _at_ 0x23;   /* space for serial interrupt if*/
            #endif                          /* Stop Exection with Serial Intr. */
                                          /* is enabled                     */
            /*------------------------------------------------
            The main C function.  Program execution starts
            here after stack initialization.
            ------------------------------------------------*/
            void main (void) {
            /*------------------------------------------------
            Setup the serial port for 1200 baud at 16MHz.
            ------------------------------------------------*/
            #ifndef MONITOR51
              SCON  = 0x50;        /* SCON: mode 1, 8-bit UART, enable rcvr     */
              TMOD |= 0x20;       /* TMOD: timer 1, mode 2, 8-bit reload       */
              TH1   = 221;         /* TH1:  reload value for 1200 baud @ 16MHz   */
              TR1   = 1;           /* TR1:  timer 1 run                      */
              TI   = 1;           /* TI:   set TI to send first char of UART   */
            #endif
            /*------------------------------------------------
            Note that an embedded program never exits (because
            there is no operating system to return to).  It
            must loop and execute forever.
            ------------------------------------------------*/
                while (1)
                {   P1 ^= 0x01;                 /* Toggle P1.0 each time we print */
                    printf ("Hello World\n");   /* Print "Hello World" */
                }
            }

3.编译和链接HELLO

用Project菜单或Build工具栏的Build Target命令编译和链接项目。µVision2开始编译和链接源文件,并生成一个可以载入µVision2调试器进行调试的绝对目标文件。Build过程的状态信息出现在输出窗口的Build页上。

使用µVision2提供的样例程序不会出现错误。

4.调试HELLO

HELLO程序被编译和链接后,可以用µVision2调试器对它进行调试。在µVision2中使用Debug菜单或工具栏上的Start/Stop Debug Session命令可以开始调试。µVision2初始化调试器并启动程序运行,且运行到main函数。

① 用View菜单或Debug工具栏上的Serial Window #1命令打开Serial Window #1,此窗口显示应用程序的串行输出。

② 用Debug菜单或工具栏上的Go命令运行HELLO程序。在HELLO程序执行后,在Serial窗口显示文字Hello World。在HELLO程序输出Hello World后,开始执行一个无限循环程序。

③ 用Debug菜单或工具栏上的Halt命令停止HELLO程序,也可以在Output窗口的命令页上按下Esc键来停止HELLO程序。

④ 单步和断点如下:

● 用工具栏或鼠标右键打开的快捷编辑菜单的Insert/Remove Breakpoints命令,在main函数的开始处设置一个断点。

● 用Debug菜单或工具栏上的Reset CPU命令。如果HELLO已停止运行,则Run命令可以启动程序执行,µVision2会在断点处停止程序。

● 用Debug工具栏上的Step按钮可以单步执行HELLO程序。当前的指令用黄色箭头标出,每执行一步箭头都会移动,将鼠标移到一个变量上可以看到它们的值。

● 任何时间都可以用Start/Stop Debug Session命令停止调试。

2.2.4 Keil C51的调试技巧及举例

1.Keil C51的调试技巧

在用Keil C51调试程序的过程中,有很多的调试技巧,主要总结如下。

(1)如何设置和删除断点

设置/删除断点最简单的方法是双击待设置断点的源程序行或反汇编程序行,或用断点设置命令Insert→Remove Breakpoint。

(2)如何查看和修改寄存器的内容

仿真式寄存器的内容显示在寄存器的窗口,用户除了可以观察以外,还可以自行修改。单击选中一个单元,例如单元DPTR,然后再单击DPTR的数值位置,出现文本框后输入相应的数值并按回车键即可。另外,可以使用命令窗口进行修改,例如输入A=0X34将把A的数值修改为0X34。

(3)如何观察和修改变量

变量的观察和修改如下:单击View→Watch&Call stack Window,出现相应的窗口,选择Watch中的任一窗口,按F2键,在Name栏中填入用户变量名,如Temp1、Counter等,但必须是存在的变量。如果想修改数值,可单击Value栏,出现文本框后输入相应的数值。用户可以连续修改多个不同的变量。

另外,Keil µVision2 IDE提供了观察变量更简单的方法。在用户程序停止运行时,移动光标到要观察的变量上停大约1秒,就弹出一个“变量提示”对话框。

(4)如何观察存储区域

在Keil µVision2 IDE中可以区域性观察和修改所有的存储器区域,这些数据从Keil µVision2 IDE中获取。

Keil µVision2 IDE把MCS-51内核的存储器资源分成4个区域:

● 内部可直接寻址RAM区data,IDE表示为D:**;

● 内部间接寻址RAM区data,IDE表示为I:**;

● 外部RAM区xdata,IDE表示为X:****;

● 程序存储器ROM区code,IDE表示为C:****。

这4个区域都可以在Keil µVision2 IDE的Memory Windows中观察和修改。在IDE集成环境中单击菜单View→Memory Windows,便会打开Memory窗口,Memory窗口可以同时显示4个不同存储器区域,单击窗口下部的编号可以相互切换显示。

在地址输入栏内输入待显示的存储器区起始地址。例如,D:45H表示从内部可直接寻址RAM区45H地址处开始显示,X:3F00H表示从外部RAM区3F00H处开始显示,C:0X1234表示从程序存储器ROM区1234H地址处开始显示,I:32H表示从内部间接寻址RAM区32H地址处开始显示。

在区域显示中,默认的显示形式为十六进制数(byte),但是可以选择其他显示方式,在Memory显示区域内右击,在弹出的菜单中可以选择的显示方式如下。

● Decimal:按照十进制方式显示。

● unsigned:按照无符号数字显示,又分为char单字节、int整型、long长整型。

● singed:按照无符号的数字显示,又分为char单字节、int整型、long长整型。

● ASCII:按照ASCII码的格式进行显示。

● float:按照浮点格式进行显示。

● double:按照双精度浮点格式显示。

在Memory窗口中显示的数据可以修改,修改方法为:用鼠标对准要修改的存储器单元,右键单击,在弹出的菜单中选择Modify Memory at 0x...,在弹出的对话框的文本输入栏内输入相应数值后,按回车键,修改即告完成。但代码区数据不能修改。

2.应用举例

(1)并行口的使用

并行口可以用来输入和输出信息,在Keil µVision2 IDE中,可以仿真并行口的输入和输出。下面用例子说明。

【例2-1】 以下程序实现把P1口输入的数据通过P0口输出。

            #include<reg52.h>
            void  main(void)
            {   unsigned  char  i;
                P1=0xff;
                while(1)
                {   i=P1;
                    P0=i;
                }
            }

当项目文件建立后,程序文件输入、项目编译、链接,然后启动调试后,用Peripherals菜单下的I/O-Ports命令打开P0和P1口,然后执行程序。程序执行后,修改P1口的值,可以看见P0口的内容随P1口的内容变化而变化。观察变量i的值,也可以看见i的值随P1口的内容变化而变化。

(2)定时/计数器的使用

定时/计数器工作在定时方式时,是对系统机器周期计数,定时时间到后触发中断,对外部脉冲T0(P3.4)或T1(P3.5)计数时,实现计数的功能。

【例2-2】 以下程序实现对定时/计数器T0定时,定时时间到则中断,显示相应提示信息。

            #include<reg52.h>
            #include<stdio.h>
            void  main(void)
            {   SCON=0X52;
                TMOD=0X22;
                TH1=0XF3;
                TR1=1;
                TL0=TH0=-200;
                EA=1;
                ET0=1;
                TR0=1;
                while(1)
                {   ;}
            }
            void timer0_int(void)  interrupt  1
            {   printf("I am TIMER0,I will serve you heart and so\n");
            }

程序执行后,打开Serial#窗口,可以看见不断输出的字符串:

            "I am TIMER0,I will serve you heart and so"

【例2-3】 以下程序实现对定时/计数器T0计数,工作于方式2,计数到则中断,显示相应提示信息。

            #include<reg51.h>
            #include<stdio.h>
            void  main(void)
            {   SCON=0X52;
                TMOD=0X26;
                TH1=0XF3;
                TR1=1;
                TL0=TH0=0XFE;
                EA=1;ET0=1;
                TR0=1;
                while(1);
            }
            void  COUNTER0_int(void)  interrupt  1
            {   printf("I  am  COUNTER0,I will serve you heart and so\n");
            }

程序执行后,打开Serial#1窗口,用Peripherals菜单下面的I/O-Ports命令打开P3窗口,用鼠标改变T0(P3.4),每改变两次,则溢出中断,在Serial#1窗口看见以下字符串一次:

            "I am COUNTER0,I will serve you heart and so"

(3)串行口的使用

通过串行口可以发送和接收信息,在Keil µVision2 IDE中,进行启动调试后,可以通过Peripherals菜单下面的Serial命令打开串行接口,看到串行口的相应情况。

【例2-4】 以下程序实现把P1口接收的数据通过串行口发送出去,再从串行口接收进来。

            #include<reg51.h>
            #include<stdio.h>
            void  main(void)
            {   unsigned  char  i,j;
                SCON=0X52;
                TMOD=0X20;
                TH1=0XF3;
                TR1=1;
                P1=0XFF;
                while(1)
                {   i=P1;
                    SBUF=P1;
                    while(!TI)
                    {   j=SBUF;
                    }
                }
            }

程序执行后,用Peripherals菜单下面的I/O-Ports命令打开P1窗口,用Serial命令打开串行窗口,改变P1的输入,可以在下面的变量窗口中看见i变量的相应值,通过串行窗口看见串行口的数据缓冲区中的相应值。但变量i看不见,因为这里只是软件仿真,串行口的发送数据线TXD和接收数据线RXD不能连在一起。

(4)外中断的使用

单片机有两个外中断源,中断请求每提出一次,则中断一次。

【例2-5】以下程序在外部中断INT0中断一次时,显示提示信息一次。

            #include<reg51.h>
            #include<stdio.h>
            void  main(void)
            {   SCON=0X52;
                TMOD=0X22;
                TH1=0XF3;
                TR1=1;
                EA=1;EX0=1;
                IT0=1;
                while(1);
            }
            void  int0_int(void)  interrupt  0
            {   printf("I am INT0,I will serve you heart and so\n");
            }

程序执行后,打开Serial#1窗口,用Peripherals菜单下面的I/O-Ports命令打开P3窗口,用鼠标改变INT0(P3.2),每改变一次,则中断一次,在Serial#1窗口看见以下字符串一次:

            "I am INT0,I will serve you heart and so"