单片机KeilC语言应用研究.docx
- 文档编号:2780281
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:18
- 大小:33.28KB
单片机KeilC语言应用研究.docx
《单片机KeilC语言应用研究.docx》由会员分享,可在线阅读,更多相关《单片机KeilC语言应用研究.docx(18页珍藏版)》请在冰豆网上搜索。
单片机KeilC语言应用研究
KeilC单片机C语言应用研究
系别计算机系
专业计算机科学与技术
姓名刘志远
指导教师张连生
KeilC单片机C语言应用研究
刘志远
(太原师范学院计算机系200202班山西·太原030012)
指导老师:
张连生
【内容提要】KeilC是目前比较流行的单片机C语言调试和开发软件,多为当下单片机设计者所采用。
但是,KeilC和普通的C语言有很大的区别,KeilC支持符合ANSI标准的C程序设计,它完全支持C的标准指令和单片机优化C扩展指令。
特别地,针对8051单片机的自身特点它作了一些特殊扩展。
KeilC生成的目标代码效率非常高,生成的语句编码紧凑,易理解,在开发单片机软件时,能充分发挥单片机的有限资源,体现其高级语言的优势。
本文详细分析了KeilC语言的来源以及其与汇编语言、TurboC的区别,重点论述了KeilC的特殊功能寄存器(SFR)、存储类型、指针和中断服务,反映了KeilC作为单片机开发软件的优势和高效率,并探讨了KeilC应用中的一些方法、技巧和注意事项。
【关键字】单片机KeilC程序设计CSFR
引言:
为什么要使用KeilC?
近年来随着计算机在社会领域的渗透,单片机的应用正在不断地走向深入,随着单片机开发技术以及微控制技术(以软件代替硬件的高性能控制技术)的日益完善和发展,单片机的应用必定导致传统控制技术发生巨大的变化,也就是说,单片机的应用是对传统控制技术的一场革命,因此,了解单片机的应用技术尤其是开发技术是非常有意义的。
当设计一个小的嵌入式系统时,一般我们都用汇编语言,在很多工程中,这是一个很好的方法,因为代码一般都不超过8K,而且都比较简单,如果硬件工程师要同时设计软件和硬件,经常会采用汇编语言来做程序,而硬件工程师一般不熟系像C一类的高级语言。
与汇编语言相比KeilC它的可读性和可维护性都非常好,它是结构化的程序设计语言,编写效率很高,具有非常好的结构性和模块化,使得程序完全结构化,可移植性好而且更容易阅读和维护,代码的可重用性也比较高,虽然8051芯片的派生门类特别多(达到了上百种之多),但KeilC语言对于它们的硬件资源大部分都可以进行操作。
用KeilC编写程序比汇编更符合人们的思考习惯,开发者可以更专心的考虑算法而不是考虑一些细节问题,这样就减少了开发和调试的时间。
尤其重要的是使用KeilC这样的语言,程序员不必十分熟悉处理器的运算过程,也能够编出符合硬件实际的专业水平的程序,这意味着对新的处理器也能很快上手,不必知道处理器的具体内部结构,使得用KeilC编写的程序比汇编程序有更好的可移植性。
KeilC语言功能齐全,具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。
另外它也具有强大的图形功能,支持多种显示器和驱动器,而且计算功能、逻辑判断功能也比较强大,可以实现决策目的。
而且它的适用范围广,适合多种操作系统,如DOS、Windows、UNIX,也适用于多种机型。
用KeilC编写的程序具有坚固性:
数据被破坏是导致程序运行异常的重要因素。
KeilC语言对数据进行了许多专业性的处理,避免了运行中间非异步的破坏;它对不同函数的数据实行覆盖,有效利用片上有限的RAM空间;它提供复杂的数据类型(数组、结构、联合、枚举、指针等),极大地增强了程序处理能力和灵活性;它还提供auto、static、const等存储类型和专门针对8051单片机的data、idata、pdata、xdata、code等存储类型,自动为变量合理地分配地址;提供small、compact、large等编译模式,以适应片上存储器的大小;KeilC的中断服务程序的现场保护和恢复,中断向量表的填写,是直接与单片机相关的,都由KeilC编译器代办;它还提供了常用的标准函数库,以供用户直接使用;头文件中定义宏、说明复杂数据类型和函数原型,有利于程序的移植和支持单片机的系列化产品的开发;它有严格的句法检查,错误很少,可容易地在高级语言的水平上迅速地被排掉;并可方便地接受多种实用程序的服务:
如片上资源的初始化有专门的实用程序自动生成;再如,有实时多任务操作系统可调度多道任务,简化用户编程,提高运行的安全性等等。
与TurboC相比KeilC可以更有效地利用片上有限的RAM空间,利用其特有的特殊功能寄存器用sfr可以更加有效地对硬件的I/O接口,提供了更有效率的内部RAM可寻址位或特殊功能寄存器中的可寻址位操作,KeilC编译器支持C中大部分的函数但是一些不适用于嵌入式系统应用的库函数则没有包含,而是由C51扩充了一些非C标准函数使其更加适合单片机的操作,它同时针对8051单片机的自身特点作了一些特殊扩展。
德国keil公司的单片机C语言编译器KeilC支持九种基本数据类型,变量可存放在bit、data、bdta、idata、xdata、pdata等不同类型的存储器空间;支持AMD和DALLAS公司的80320等单片机的双数据指针和PHILIPS公司的807651等单片机的指令集以及Infieon(Siemens)公司80c517单片机中的算术单元和多重数据指针,支持数据覆盖。
KeilC是目前流行的单片机C语言调试和开发软件,Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(µVision)将这些部份组合在一起。
KeilC51软件提供丰富的库函数和功能强大的Windows界面集成开发调试工具。
重要的一点是KeilC51生成的目标代码效率非常高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时,更能体现高级语言的优势。
KeilC编译器能产生可重入代码,而且用KeilC语言可以打开和关闭中断。
KeilC程序结构与一般C语言没有什么差别。
一个C51源程序大体上是一个函数定义的集合,一个C源程序至少包括一个函数,在这个集合中有且仅有一个名为main()的函数(主函数),也可能包含其它函数,因此函数是C程序的基本单位。
主函数是程序的入口,一个C语言程序,总是从main()函数开始执行的,而不管物理位置上这个main()放在什么地方,主函数中的所有程序执行完毕,则程序执行完毕。
主程序通过直接书写语句和调用其它函数来实现有关功能,这些其它函数可以是由C语言本身提供给我们的,这样的函数称之为库函数;也可以是用户自己编写的,这样的函数称之为用户自定义函数。
那么库函数和用户自定义函数有什么区别呢?
库函数是C51在库文件中已定义的函数,其函数说明在相关的头文件中。
对于这类函数用户在编程时只要用include预处理指令将头文件包含在用户文件中直接调用即可,简单地说,任何使用KeilC语言的人,都可以直接调用C的库函数而不需要为这个函数写任何代码,只需要包含具有该函数说明的相应的头文件即可;而自定义函数则是完全个性化的,是用户根据自己需要而编写的。
KeilC提供了100多个库函数供我们直接使用。
在KeilC中,函数定义由函数类型、函数名、参数表和函数体四部分组成。
例如:
void mDelay (unsigned int DelayTime)。
函数名是一个标示符,标示符都是区分大小写的,最长为255个字符。
参数表是用圆括号括起来的若干参数,项与项之间用逗号隔开。
函数体是用大括号括起来的若干C语句,语句间用分号隔开,即函数首部下面的大括号“{}”内的部份,如果一个函数内有多个大括号,则最外层的一对“{}”为函数体的范围。
最后一个语句一般是return(在主函数中可以省略)。
每一个函数都返回一个值,该值由return语句中的表达式指定(省略时为零)。
函数体一般包括:
声明部份:
在这部份中定义所用到的变量;执行部份:
由若干个语句组成。
在某此情况下也可以没有声明部份,甚至即没有声明部份,也没有执行部份,
如:
voidmDelay(){}
这是一个空函数,什么也不干,但它是合法的。
在编写程序时,可以利用空函数,比如主程序需要调用一个延时函数,可具体延时多少,怎么个延时法,暂时还不清楚,我们可以主程序的框架结构弄清,先编译通过,把架子搭起来再说,至于里面的细节,可以在以后慢慢地填,这时利用空函数,先写这么一个函数,这样在主程序中就可以调用它了。
函数的类型就是返回值的类型,函数类型(除整形外)均需在函数名前加以指定。
C51的一般格式如下:
类型 函数名(参数表)
参数说明:
{
数据说明部分;
执行语句部分;
}
一个函数在程序中可以三种形态出现:
函数定义、函数调用和函数说名。
函数定义相当于汇编程序中的一般子程序。
函数调用相当于调用子程序的CALL语句,在C中更普遍地规定函数调用可以出现在表达式中。
函数定义和函数调用不分先后,但若调用在定义之前就必须先进行函数说明在调用前。
函数说明是一个没有函数体的函数定义,而函数调用则要求有函数名和实参数表。
主程序中的mDelay如果写成mdelay就会编译出错,即C语言区分大小写,这一点往往让初学者非常困惑,尤其是学过一门其它语言的人,有人喜欢,有人不喜欢,但不管怎样,你得遵守这一规定。
C语言书写的格式自由,每个语句和资料定义的最后必须有一个分号,分号是C语句的必要组成部份。
C语言本身没有输入输出语句。
输入和输出操作是由库函数scanf和printf等函数来完成的。
C对输入输出实行“函数化”。
而C51编译器提供的输入输出库函数scanf和printf是通过8051单片机的串口实现的,在程序中使用这种输入输出库函数必须先对8051单片机的串口进行初始化。
但对于单片机应用系统来说,由于具体要求不同,应用系统输入输出方式多种多样,不可能一律采用串行口作输入输出而应根据实际需要,由应用系统的研制人员自己来编写满足特定需求的输入输出函数。
可以用/*…..*/[item1]的形式为C程序的任何一部份作注释,特别地,KeilC也支持C++风格的注释,就是用“//”引导的后面的语句是注释。
KeilC的主要特点和它与C的不同之处
下面将介绍KeilC的主要特点和它与C的不同之处,并给你一些对8051使用C的启发。
Keil编译器除了少数一些关键地方外基本类似于C,差异主要是KeilC可以让用户针对8051的结构进行程序设计,其它差异主要是由8051的一些局限引起的。
KeilC51编译器不支持16位宽的字符,而C提供对宽字符国际字符集的支持。
KeilC有C的所有标准数据类型,除此之外,为了更加有利的利用8051的结构还加入了一些特殊的数据类型,C语言中的基本数据类型有char、int、short、long、float和double,但对于C51编译器来说,short类型与int类型相同double类型与float类型相同。
下表显示了标准数据类型在8051中占据的字节数,注意整型和长整型的符号位字节在最低的地址中。
数据类型
大小
char/unsignedchar
8bit
int/unsignedchar
16bit
long/unsignedlong
32bit
float/double
32bit
genericpointer
24bit
除了这些标准数据类型外,编译器还支持一种位数据类型(bit:
位类型),一个位变量存在于内部RAM的可位寻址区中,可像操作其它变量那样对位变量进行操作,而位数组和位指针是违法的。
是C51编译器的一种扩充数据类型,利用它可定义一个变量,但不能定义位指针,也不能定义位数组。
1.特殊功能寄存器
特殊功能寄存器用sfr来定义,而sfr16用来定义16位的特殊功能寄存器,
如:
DPTR
sfr是C51编译器的一种扩充数据类型,利用它可定义8051单片机的所有内部8位特殊功能寄存器。
sfr型数据占用一个内存单元变量,取值范围是0-255。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 KeilC 语言 应用 研究