经典的单片机应用程序一般多采用汇编语言编写。汇编语言执行效率和代码的存储效率都很好,在实时性高的场合有着不可替代的地位,但汇编程序的可读性差,调试麻烦,移植困难,代码维护难度大,直接影响开发周期。为了提高单片机应用程序的开发效率,采用高级语言无疑是一种最好的选择。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程序的一般结构如下:
预处理命令
全局变量说明;
函数声明;
下面是一个C51程序的例子,它的功能是实现接在P1.0口的LED灯闪烁。
(2)数据类型 C51的数据类型共有5种,分别为基本类型、指针数据类型、指针类型、空类型和扩充数据类型,如图9-31所示。C51编译器能识别的数据类型见表9-26,表中的后四行为扩展类型。
图9-31 C51的数据类型
表9-26 KeilC51编译器能识别的数据类型
C51提供以下变量修饰符:
1)const。首先需要注意的是,const修饰的是在它前面的类型,如果它前面没有类型,那它修饰的是紧跟着它的那个类型,作用是限定一个变量值不允许被改。const还用于参数列表,通常修饰的是指针类型,表明该函数不会试图对传入的地址进行写操作。
2)static。当static用于修饰全局变量声明时,它表示该变量只具有当前文件的作用域,不能被其他源文件中的代码访问;当static用于修饰局部变量声明时,它的初始化仅有一次,除了只能在定义它的函数内访问外,它运行时的特征和全局变量完全一样,函数返回不会影响它的状态。
3)volatile。防止编译器优化该变量,必须要为这个变量的读写操作生成代码。
①用户自定义数据类型格式:
}自定义数据类型的名称;
②数组声明:
语法:类型名变量1[大小],变量2[大小],…,变量n[大小];
③指针声明:
语法:类型名∗变量1,∗变量2,…,∗变量n;
④指针数组:
语法:类型名∗变量1[大小],∗变量2[大小],…,∗变量n[大小];
⑤枚举类型定义:
语法:
⑥结构类型定义:
⑦联合类型定义:
(3)变量和常量 C51常量有整型、浮点型、字符型和字符串常量,常量表示见表9-27。
表9-27 常量表示法
变量是一种在程序执行过程中其数值不断变化的量。同ANSIC一样,C51规定变量必须先定义后使用。C51对变量进行定义的格式如下:
[存储种类]数据类型[存储器类型]变量名表其中,存储种类和存储器类型是可选项,可省略。
存储种类是指变量在程序执行过程中的作用范围。变量的存储种类有四种,分别为auto,extern,static和register(不加说明则为auto型),其作用范围在定义它的函数体或复合语句内部,特点是在语句被执行时,C51才为其分配内存空间,当语句执行结束时,内存空间被释放,可被其他函数使用。KeilC51编译器能识别的存储器类型见表9-28。
表9-28 KeilC51编译器能识别的存储器类型
定义变量时如果省略了存储器类型,编译器会根据编译选项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中的关键字
(续)
表9-30 C51扩展的关键字
(5)C语言运算符及其优先级 C语言运算符及其优先级见表9-31。
表9-31 C语言运算符及其优先级
(续)
(6)C语言基本控制语句
3)for循环。
for(初值;条件;变化值)语句;
4)while循环
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数据类型
表9-33 常见的中断向量表
3)绝对地址的访问。
①在C51中用_at_关键词来给变量地址进行绝对地位,用法如下:
type[memory_space]variable_name_at_constant
memory_space变量的存储空间如果在声明中没有,则使用默认的存储空间默认的存储空间type变量类型
variable_name变量名
constant定位变量的地址
例:charxdatatxt[256]_at_0xE000;
②采用C51宏定义来进行绝对地址的操作,在系统的头文件ABSACC.H定义了如下一些宏:
(8)编译指令 常用编译指令见表9-34。
表9-34 常用编译指令
(9)KeilC51常用库函数 KeilC51常用库函数见表9-35~表9-40。
表9-35 本征库intrins.h函数
表9-36 字符处理函数
(续)
表9-37 字符串处理函数
(续)
表9-38 输入输出函数
(续)
表9-39 类型转换和内存分配函数
(续)
表9-40 数学计算函数
(续)
(10)keil应用实例 首先建立一个项目文件夹pic,下面新建的文件都保存在这里。
1)启动μVison4。
2)单击菜单project,选择新建,文件名为“keilSamp1”,如图9-32所示。
图9-32 新建项目
3)选择主芯片如图9-33所示,这里选择AT89C52。
图9-33 选择芯片
4)加入启动代码,如图9-34所示。
图9-34 加入启动代码
5)选择左上角的新建文件,建立一个C程序,输入代码并保存,文件名为-AIN.C,如图9-35所示。
-AIN.C的内容如下:
图9-35 输入代码
6)将-AIN.C加入工程,方法如图9-36所示。先右键单击SourceGroup1,然后选择AddGroup。
7)右键单击工程窗口的Target1,选择第一项,出现如图9-37所示窗口,将CreatHex File勾选。
8)编译工程。选择系统菜单Project,再选择Build target,如果没有错误,将出现图9-38所示信息,表明已经产生了正确的目标文件。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。