单片机编程软件keil(单片机常用编程软件)

单片机编程软件keil(单片机常用编程软件)

如图 1-5 所示,Xtal 后面的数值是晶振频率值,默认值是所选目标 CPU 的最高可用频率值,该值与最终产生的目标代码无关,仅用于软件模拟调试时显示程序执行时间。正确设置该数值可使显示时间与实际所用时间一致,一般将其设置成与你的硬件所用晶振频率相同,如果没必要了解程序执行的时间,也可以不设。

Memory Model 用于设置 RAM 使用情况,有三个选择项:Small:所有变量都在单片机的内部 RAM 中;Compact:可以使用一页(256 字节)外部扩展 RAM;Larget:可以使用全部外部的扩展 RAM。Code Model 用于设置 ROM 空间的使用,同样也有三个选择项:Small:只用低于 2K 的程序空间;Compact:单个函数的代码量不能超过 2K,整个程序可以使用 64K 程序空间;Larget:可用全部 64K 空间;这些选择项必须根据所用硬件来决定,由于本例是单片应用,所以均不重新选择,按默认值设置。Operating:选择是否使用操作系统,可以选择 Keil 提供了两种操作系统:Rtx tiny 和Rtx full,也可以不用操作系统(None),这里使用默认项 None,即不用操作系统。

OutPut 页如图 1-6 所示,这里面也有多个选择项,其中 Creat Hex file 用于生成可执行代码文件,该文件可以用编程器写入单片机芯片,其格式为 intelHEX 格式,文件的扩展名为.HEX,默认情况下该项未被选中,如果要写片做硬件实验,就必须选中该项。工程设置对话框中的其它各页面与 C51 编译选项、A51 的汇编选项、BL51 连接器的连接选项等用法有关,这里均取默认值,不作任何修改。以下仅对一些有关页面中常用的选项作一个简单介绍。Listing 页该页用于调整生成的列表文件选项。在汇编或编译完成后将产生(*.lst)的列表文件,在连接完成后也将产生(*.m51)的列表文件,该页用于对列表文件的内容和形式进行细致的调节,其中比较常用的选项是“C Compile Listing”下的“Assamble Code”项,选中该项可以在列表文件中生成 C 语言源程序所对应的汇编代码,建议会使用汇编语言的 C 初学者选中该项,在编译完成后多观察相应的 List 文件,查看 C 源代码与对应汇编代码,对于提高 C 语言编程能力大有好处。C51 页该页用于对 Keil 的 C51 编译器的编译过程进行控制,其中比较常用的是“Code Optimization”组,如图 1.7 所示,该组中 Level 是优化等级,C51 在对源程序进行编译时,可以对代码多至 9 级优化,默认使用第 8 级,一般不必修改,如果在编译中出现一些问题,可以降低优化级别试一试。Emphasis 是选择编译优先方式,第一项是代码量优化(最终生

成的代码量小);第二项是速度优先(最终生成的代码速度快);第三项是缺省。默认采用速度优先,可根据需要更改。

Debug 页该页用于设置调试器,Keil 提供了仿真器和一些硬件调试方法,如果没有相应的硬件调试器,应选择 Use Simulator,其余设置一般不必更改,有关该页的详细情况将在程序调试部

分再详细介绍。至此,设置完成,下面介绍如何编译、连接程序以获得目标代码,以及如何进行程序的调试工作。

流水灯程序**************************************************/ #include “reg51.h” #include “intrins.h” #define uchar unsigned char #define uint unsigned int /*延时程序由 Delay 参数确定延迟时间*/ void mDelay(unsigned int Delay) { unsigned int i; for(;Delay>0;Delay–) { for(i=0;i<124;i ) {;} } } void main() { unsigned char OutData=0xfe; for(;;) { P1=OutData; OutData=_crol_(OutData,1); //循环左移 mDelay(1000); /*延时 1000 毫秒*/ } } 设置好工程后,即可进行编译、连接。选择菜单 Project->Build target,对当前工程进行连接,如果当前文件已修改,将先对该文件进行编译,然后再连接以产生目标代码;如果选择 Rebuild All target files 将会对当前工程中的所有文件重新进行编译然后再连接,确保最终生产的目标代码是最新的,而 Translate ….项则仅对当前文件进行编译,不进行连接。以上操作也可以通过工具栏按钮直接进行。图 1-9 是有关编译、设置的工具栏按钮,从左到右分别是:编译、编译连接、全部重建、停止编译和对工程进行设置。

图 1-12 所示界面。使用菜单 STEP 或相应的命令按钮或使用快捷键 F11 可以单步执行程序,使用菜单 STEP OVER 或功能键 F10 可以以过程单步形式执行命令,所谓过程单步,是指把 C 语言中的一个函数作为一条语句来全速执行。按下 F11 键,可以看到源程序窗口的左边出现了一个黄色调试箭头,指向源程序的第一行。每按一次 F11,即执行该箭头所指程序行,然后箭头指向下一行,当箭头指向“mDelay(1000);”行时,再次按下 F11,会发现,箭头指向了延时子程序 mDelay 的第一行。不断按 F11 键,即可逐步执行延时子程序。如果 mDelay 程序有错误,可以通过单步执行来查找错误,但是如果 mDelay 程序已正确,每次进行程序调试都要反复执行这些程序行,会使得调试效率很低,为此可以在调试时使用 F10 来替代 F11,在 main 函数中执行到 mDelay(1000)时将该行作为一条语句快速执行完毕

Keil 软件还提供了一些窗口,用以观察一些系统中重要的寄存器或变量的值,这也是很重要的调试方法。以下通过一个对延时程序的延迟时间的调整来对这些调试方法作一个简单的介绍。这个程序中用到了延时程序 mDelay,如果使用汇编语言编程,每段程序的延迟时间可以非常精确地计算出来,而使用 C 语言编程,就没有办法事先计算了。为此,可以使用观察程序执行时间的方法了来解。进入调试状态后,窗口左侧是寄存器和一些重要的系统变量的窗口,其中有一项是 sec,即统计从开始执行到目前为止用去的时间。按 F10,以过程单步的形式执行程序,在执行到 mDelay(1000)这一行之前停下,查看 sec 的值(把鼠标停在 sec后的数值上即可看到完整的数值),记下该数值,然后按下 F10,执行完 mDelay(1000)后再次观察 sec 值,如图 1-13 所示,这里前后两次观察到的值分别是:0.00040400 和 1.01442600,其差值为 1.014022s,如果将该值改为 124 可获得更接近于 1s 的数值,而当该值取 123 时所获得的延时值将小于 1s,因此,最佳的取值应该是 124。

C 语言的一些特点通过上述的几个例子,可以得出一些结论:1、C 程序是由函数构成的,一个 C 源程序至少包括一个函数,一个 C 源程序有且只有一个名为 main()的函数,也可能包含其它函数,因此,函数是 C 程序的基本单位。主程序通过直接书写语句和调用其它函数来实现有关功能,这些其它函数可以是由 C 语言本身提供给我们的(如例 3 中的_crol_(…)函数),这样的函数称之为库函数,也可以是用户自己编写的(如例 2、3 中用的 mDelay(…)函数),这样的函数称之为用户自定义函数。那么库函数和用户自定义函数有什么区别呢?简单地说,任何使用 Keil C 语言的人,都可以直接调用 C 的库函数而不需要为这个函数写任何代码,只需要包含具有该函数说明的相应的头文件即可;而自定义函数则是完全个性化的,是用户根据自己需要而编写的。Keil C 提供了 100 多个库函数供我们直接使用。2、一个函数由两部份组成:(1)函数的首部、即函数的第一行。包括函数名、函数类型、函数属性、函数参数(形参)名、参数类型。例如:void mDelay (unsigned int DelayTime) 一个函数名后面必须跟一对圆括号,即便没有任何参数也是如此。(2)函数体,即函数首部下面的大括号“{}”内的部份。如果一个函数内有多个大括号,则最外层的一对“{}”为函数体的范围。函数体一般包括:声明部份:在这部份中定义所用到的变量,例 1.2 中 unsigned char j。执行部份:由若干个语句组成。在某此情况下也可以没有声明部份,甚至即没有声明部份,也没有执行部份,如:void mDelay() {} 这是一个空函数,什么也不干,但它是合法的。在编写程序时,可以利用空函数,比如主程序需要调用一个延时函数,可具体延时多少,怎么个延时法,暂时还不清楚,我们可以主程序的框架结构弄清,先编译通过,把架子搭起来再说,至于里面的细节,可以在以后慢慢地填,这时利用空函数,先写这么一个函数,这样在主程序中就可以调用它了。3、一个 C 语言程序,总是从 main 函数开始执行的,而不管物理位置上这个 main()放在什么地方。例 1.2 中就是放在了最后,事实上这往往是最常用的一种方式.

4、主程序中的 mDelay 如果写成 mdelay 就会编译出错,即 C 语言区分大小写,这一点往往让初学者非常困惑,尤其是学过一门其它语言的人,有人喜欢,有人不喜欢,但不管怎样,你得遵守这一规定。5、C 语言书写的格式自由,可以在一行写多个语句,也可以把一个语句写在多行。没有行号(但可以有标号),书写的缩进没有要求。但是建议读者自己按一定的规范来写,可以给自己带来方便。6、每个语句和资料定义的最后必须有一个分号,分号是 C 语句的必要组成部份。7、可以用/*…..*/的形式为 C 程序的任何一部份作注释,在“/*”开始后,一直到“*/”为止的中间的任何内容都被认为是注释,所以在书写特别是修改源程序时特别要注意,有时无意之中删掉一个“*/”,结果,从这里开始一直要遇到下一个“*/”中的全部内容都被认为是注释了。原本好好的一个程序,编译已过通过了,稍作修改,一下出现了几十甚至上百个错误,初学 C 的人往往对此深感头痛,这时就要检查一下,是不是有这样的情况,如果有的话,赶紧把这个“*/”补上。特别地,Keil C 也支持 C 风格的注释,就是用“//”引导的后面的语句是注释,例: P1_0=!P1_0; //取反 P1.0 这种风格的注释,只对本行有效,所以不会出现上面的问题,而且书写比较方便,所以在只需要一行注释的时候,我们往往采用这种格式。但要注意,只有 Keil C 支持这种格式,早期的 Franklin C 以及 PC 机上用的 TC 都不支持这种格式的注释,用上这种注释,编译时通不过,会报告编译错误。

发表评论

登录后才能评论