首页 理论教育 KeilC51单片机开发技术详解

KeilC51单片机开发技术详解

时间:2023-06-26 理论教育 版权反馈
【摘要】:C51编译器主要有GCC、IAR、Keil等。Keil公司开发的KeilC51是一种专门为8051单片机设计的高效率C语言编译器,符合ANSI标准,生成的程序代码运行速度极高,所需要的存储器空间极小,可以更容易、更有效地解决问题。编译器版本KeilC51的最新版本是v9,本书主要以μVision4和KeilC51v9为例来说明开发方法。KeilC51编译器能识别的存储器类型见表9-28。goto标签;KeilC51对硬件的操作1)bit,sbit,sfr,sfr16数据类型。

KeilC51单片机开发技术详解

1.C语言开发单片机概述

经典的单片机应用程序一般多采用汇编语言编写。汇编语言执行效率和代码的存储效率都很好,在实时性高的场合有着不可替代的地位,但汇编程序的可读性差,调试麻烦,移植困难,代码维护难度大,直接影响开发周期。为了提高单片机应用程序的开发效率,采用高级语言无疑是一种最好的选择。C语言是一种通用的计算机程序设计语言,既具有一般高级语言的特点,还能方便地对硬件进行操作,表达和运算能力也较强,很多以前使用汇编语言解决的问题现在可以改用C语言来解决。C51编译器主要有GCC、IAR、Keil等。

Keil公司(2005年被ARM公司收购)开发的KeilC51是一种专门为8051单片机设计的高效率C语言编译器,符合ANSI标准,生成的程序代码运行速度极高,所需要的存储器空间极小,可以更容易、更有效地解决问题。Keil开发一个集成开发环境μVision,集成了C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器。μVision目前的最新版本是μVision 4,国内用户仍然以μVision 2和μVision 3居多。编译器版本KeilC51的最新版本是v9,本书主要以μVision4和KeilC51v9为例来说明开发方法。C51具有丰富的函数库,包含100多种功能函数,为用户编程提供了极大的方便。C51程序可以实现与汇编语言的接口,两者相互之间的调用十分方便。

2.KeilC51的基本语法

(1)KeilC51程序的一般结构 C51的程序结构与标准C语言相同。一个C51程序就是各种函数的集合,其中只有一个名为main的主函数。C51程序的一般结构如下:

预处理命令

全局变量说明;

函数声明;

978-7-111-46058-9-Part01-187.jpg

下面是一个C51程序的例子,它的功能是实现接在P1.0口的LED灯闪烁。

978-7-111-46058-9-Part01-188.jpg

(2)数据类型 C51的数据类型共有5种,分别为基本类型、指针数据类型、指针类型、空类型和扩充数据类型,如图9-31所示。C51编译器能识别的数据类型见表9-26,表中的后四行为扩展类型。

978-7-111-46058-9-Part01-189.jpg

图9-31 C51的数据类型

9-26 KeilC51编译器能识别的数据类型

978-7-111-46058-9-Part01-190.jpg

C51提供以下变量修饰符:

1)const。首先需要注意的是,const修饰的是在它前面的类型,如果它前面没有类型,那它修饰的是紧跟着它的那个类型,作用是限定一个变量值不允许被改。const还用于参数列表,通常修饰的是指针类型,表明该函数不会试图对传入的地址进行写操作。

2)static。当static用于修饰全局变量声明时,它表示该变量只具有当前文件的作用域,不能被其他源文件中的代码访问;当static用于修饰局部变量声明时,它的初始化仅有一次,除了只能在定义它的函数内访问外,它运行时的特征和全局变量完全一样,函数返回不会影响它的状态。

3)volatile。防止编译器优化该变量,必须要为这个变量的读写操作生成代码。

①用户自定义数据类型格式:

978-7-111-46058-9-Part01-191.jpg

}自定义数据类型的名称;

数组声明:

语法:类型名变量1[大小],变量2[大小],…,变量n[大小];

③指针声明:

语法:类型名∗变量1,∗变量2,…,∗变量n;

④指针数组:

语法:类型名∗变量1[大小],∗变量2[大小],…,∗变量n[大小];

⑤枚举类型定义:

语法:

978-7-111-46058-9-Part01-192.jpg

⑥结构类型定义:

978-7-111-46058-9-Part01-193.jpg

⑦联合类型定义:

978-7-111-46058-9-Part01-194.jpg

978-7-111-46058-9-Part01-195.jpg

(3)变量和常量 C51常量有整型浮点型、字符型和字符串常量,常量表示见表9-27。

9-27 常量表示法

978-7-111-46058-9-Part01-196.jpg

变量是一种在程序执行过程中其数值不断变化的量。同ANSIC一样,C51规定变量必须先定义后使用。C51对变量进行定义的格式如下:

[存储种类]数据类型[存储器类型]变量名表其中,存储种类和存储器类型是可选项,可省略。

存储种类是指变量在程序执行过程中的作用范围。变量的存储种类有四种,分别为auto,extern,static和register(不加说明则为auto型),其作用范围在定义它的函数体或复合语句内部,特点是在语句被执行时,C51才为其分配内存空间,当语句执行结束时,内存空间被释放,可被其他函数使用。KeilC51编译器能识别的存储器类型见表9-28。

9-28 KeilC51编译器能识别的存储器类型

978-7-111-46058-9-Part01-197.jpg

定义变量时如果省略了存储器类型,编译器会根据编译选项small、compact或large来规定默认的存储器类型。

1)small。变量被定义在8051单片机的片内数据存储器中,对这种变量的访问速度最快。

2)compact。变量被定义在分页寻址的片外数据存储器中,每一页片外数据存储器的长度为256B。这时对变量的访问通过寄存器间址进行,堆栈位于8051单片机片内数据存储器中。采用这种编译模式时,变量的高8位地址由P2口确定,低8位地址由R0或R1的内容决定。采用这种模式的同时,必须适当改变启动配置文件STARTUP.A51中的参数:PDATASTART和PDATALEN;在用BL51进行连接时还必须采用连接控制命令“PDATA”对P2口地址进行定位,这样才能确保P2口为所需要的高8位地址。

3)large。变量被定义在片外数据存储器中,空间大,可达64KB,使用数据指针DPTR来间接访问变量。这种访问数据的方法的缺点是效率不高,尤其是对于两个以上字节的变量。

(4)C51的关键字与扩展的关键字 C51的关键字与扩展的关键字见表9-29与表9-30。

9-29 C51中的关键字

978-7-111-46058-9-Part01-198.jpg

(续)

978-7-111-46058-9-Part01-199.jpg

9-30 C51扩展的关键字

978-7-111-46058-9-Part01-200.jpg

(5)C语言运算符及其优先级 C语言运算符及其优先级见表9-31。

9-31 C语言运算符及其优先级

978-7-111-46058-9-Part01-201.jpg

(续)

978-7-111-46058-9-Part01-202.jpg

(6)C语言基本控制语句

978-7-111-46058-9-Part01-203.jpg

978-7-111-46058-9-Part01-204.jpg

3)for循环。

for(初值;条件;变化值)语句;

4)while循环

978-7-111-46058-9-Part01-205.jpg

5)goto语句。

标签:语句;

goto标签;

(7)KeilC51对硬件的操作

1)bit,sbit,sfr,sfr16数据类型。(www.xing528.com)

①bit:定义位变量,定义位变量时可以为变量赋值,但不能定义为指针,也不能定义为数组,共可定义128个。

定义格式:bit 变量名=变量值。

②sbit:用于可位寻址的特殊功能寄存器中的某个位。

三种定义格式:sbit变量名=位地址;

sbit变量名=SFR地址^位序号

sbit变量名=sfr16变量^位序号。

③sfr:用于访问指定的8位特殊功能寄存器,地址范围为0x80~0xFF。

定义格式:sfr变量名=变量地址。

④sfr16:用于可访问16为特殊功能寄存器。

定义格式:sfr16变量名=变量地址。变量地址为16位中的低8位地址,其地址范围为0x80~0xFF。通过sfr16变量读16位特殊功能寄存器时,先读低字节,后读高字节;写特殊功能寄存器时先写高字节,后写低字节。4种数据类型见表9-32。

2)中断服务函数。C51编译器支持在C源程序中直接开发中断过程,使用该扩展属性的函数定义语法如下:

返回值函数名interruptn其中n对应中断源的编号,其值从0开始,具体的中断号n和中断向量取决于8051系列单片机的具体型号决定,常见的中断向量见表9-33。

9-32 bit,sbit,sfr,sfr16数据类型

978-7-111-46058-9-Part01-206.jpg

9-33 常见的中断向量表

978-7-111-46058-9-Part01-207.jpg

3)绝对地址的访问。

①在C51中用_at_关键词来给变量地址进行绝对地位,用法如下:

type[memory_space]variable_name_at_constant

memory_space变量的存储空间如果在声明中没有,则使用默认的存储空间默认的存储空间type变量类型

variable_name变量名

constant定位变量的地址

例:charxdatatxt[256]_at_0xE000;

②采用C51宏定义来进行绝对地址的操作,在系统的头文件ABSACC.H定义了如下一些宏:

978-7-111-46058-9-Part01-208.jpg

978-7-111-46058-9-Part01-209.jpg

(8)编译指令 常用编译指令见表9-34。

9-34 常用编译指令

978-7-111-46058-9-Part01-210.jpg

(9)KeilC51常用库函数 KeilC51常用库函数见表9-35~表9-40。

9-35 本征库intrins.h函数

978-7-111-46058-9-Part01-211.jpg

9-36 字符处理函数

978-7-111-46058-9-Part01-212.jpg

(续)

978-7-111-46058-9-Part01-213.jpg

9-37 字符串处理函数

978-7-111-46058-9-Part01-214.jpg

(续)

978-7-111-46058-9-Part01-215.jpg

9-38 输入输出函数

978-7-111-46058-9-Part01-216.jpg

(续)

978-7-111-46058-9-Part01-217.jpg

9-39 类型转换和内存分配函数

978-7-111-46058-9-Part01-218.jpg

(续)

978-7-111-46058-9-Part01-219.jpg

9-40 数学计算函数

978-7-111-46058-9-Part01-220.jpg

(续)

978-7-111-46058-9-Part01-221.jpg

(10)keil应用实例 首先建立一个项目文件夹pic,下面新建的文件都保存在这里。

1)启动μVison4。

2)单击菜单project,选择新建,文件名为“keilSamp1”,如图9-32所示。

978-7-111-46058-9-Part01-222.jpg

图9-32 新建项目

3)选择主芯片如图9-33所示,这里选择AT89C52。

978-7-111-46058-9-Part01-223.jpg

图9-33 选择芯片

4)加入启动代码,如图9-34所示。

978-7-111-46058-9-Part01-224.jpg

图9-34 加入启动代码

5)选择左上角的新建文件,建立一个C程序,输入代码并保存,文件名为-AIN.C,如图9-35所示。

-AIN.C的内容如下:

978-7-111-46058-9-Part01-225.jpg

978-7-111-46058-9-Part01-226.jpg

图9-35 输入代码

978-7-111-46058-9-Part01-227.jpg

978-7-111-46058-9-Part01-228.jpg

6)将-AIN.C加入工程,方法如图9-36所示。先右键单击SourceGroup1,然后选择AddGroup。

7)右键单击工程窗口的Target1,选择第一项,出现如图9-37所示窗口,将CreatHex File勾选。

8)编译工程。选择系统菜单Project,再选择Build target,如果没有错误,将出现图9-38所示信息,表明已经产生了正确的目标文件。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈