《嵌入式C语言在工程编程中的应用技巧.pdf》由会员分享,可在线阅读,更多相关《嵌入式C语言在工程编程中的应用技巧.pdf(4页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第24卷第1期 中南民族大学学报(自然科学版)Vol.24 No.12005年3月Journal of South2CentralU niversity for Nationalities(Nat.Sci.Edition)M ar.2005嵌入式C语言在工程编程中的应用技巧田晓梅王月姣(中南民族大学 电子信息工程学院,武汉430074)摘要指出了用C语言开发单片机系统较汇编语言开发所具有的优势,结合笔者用Keil C51开发的经验,重点阐述、分析了嵌入式C51语言的非AN 512C扩展部分及开发中应注意的问题.关键词嵌入式系统;C51语言;8XX51单片机;C语言中图分类号TP368文献标识码
2、A文章编号167224321(2005)0120061203Application Techn ique of Embedded C Languageon Engineering Programm ingT ian X iaom eiW ang YuejiaoAbstractThe article brings forward the advantage of developing SCM system w ith C language compared to w ithassemble language.Based on the authors developing practicew it
3、h KeilC51,the article expounds and analyzes thenon2AN 512C extension part of embedded C51 and the problem s that should be noticed in developing.Keywordsembedded system;C51 language;8XX51 SCM;C languageTian XiaomeiL ect,College of Electronics and Information Engineering,SCU FN,W uhan 430074,China嵌入式
4、系统是以嵌入式的形式隐藏在各种装置、产品和系统中的一种软硬件高度专业化并执行独立功能的特定计算机系统.随着电子技术的迅猛发展,计算机技术和产品对其他行业广泛渗透,嵌入式系统有着广阔的应用前景1.嵌入式系统中的核心硬件是各类的M CU,单片机就是其中之一,其软件必须高效率地设计,嵌入在ROM、RAM与FLA SH存贮器中.实际上,系统程序的编写效率在很大程度上决定了目标系统的研制成效.早期在开发研制单片机应用系统时,大多以汇编语言作为软件工具,随着市场竞争的日趋激烈,要求电子工程师在短时间内编写出执行效率高而又可靠的嵌入式软件的执行代码,同时由于实际系统的日趋复杂,要求所写代码规范、模块化并便于
5、多个工程师以软件工程的形式进行协同开发.汇编语言作为传统的嵌入式系统的编程语言已经不能满足这样的实际需要了2,3.而C语言是一种简洁、高效而又贴近硬件的编程语言,就其开发速度、软件质量、结构严谨、程序坚固等方面而言,C语言的完美绝非汇编语言能比拟的,因而目前单片机C语言已成为专业水平的高级语言,Keil公司开发的C51(简称C51)已成为如今广泛使用流行的一种嵌入式C语言.1嵌入式C语言的非AN SI2C的扩展部分C51是用C语言开发8XX51系列单片机的一种嵌入式语言1,3,它与C语言的差异关键是非AN SI2C的扩展部分.对于开发人员,除了熟悉AN SI2C标准,还要熟悉非AN SI2C的
6、扩展标准,这是进行嵌入式软件开发的前提.C51中的非AN SI2C的扩展部分主要如下.1.1头文件8XX51系列单片机目前有100多种型号,发展成了一个大家族,这些型号的芯片,其指令系统基本兼容,主体结构大同小异,为了访问内部的特殊功能寄存器(SFR)和片内?外的数据RAM或I?O,只需要将相应的头文件加载到程序中,就可以实现它们所指定的收稿日期2005201212作者简介田晓梅(19702),女,讲师,研究方向:计算机应用,E2mail:xm 不同功能.(1)对特殊功能寄存器访问的头文件.其包含语句可为:#include 寄存器定义文件可自由起名,但扩展名要用H或h,其中XXX为芯片型号的缩
7、写,常用的reg51.h,reg52.h等.C51只要建立了头文件,在该文件中就对所有的特殊功能寄存器进行了sfr定义,对特殊功能寄存器有位名称的可寻址的位进行了sbit定义,因此,只要用包含语句#include ,就可以直接引用特殊功能寄存器的名,或直接引用位名称.使用中注意:一是引用时,特殊功能寄存器位名称必须大写.二是中,对R0R8无定义,对P0P3口字节有定义,对其中的位无定义,若要对P3.2置1,不能写成P3.2=1或直接写成P32=1,而要写成:Sbit P32=P3 2;P32=1.(2)对存贮器或I?O的绝对地址访问的头文件.其包含语句格式为:#include 利用绝对地址访问
8、的头文件absacc.h,可对不同的存贮区进行访问.该头文件的函数有:CBYTE?CWORD (访问code区字符型?整型)DBYTE?DWORD (访问data区字符型?整型)PBYTE?PWORD (访问Pdata区或I?O口字符型?整型)XBYTE?XWORD (访问Xdata区或I?O口字符型?整型)使用中注意:一是absacc.h一定要包含进程序,二是XBYTE函数名要大写,三是变量要用#define宏定义.1.2变量的存贮类型C51中的变量定义如下:存贮类型数据类型存贮器类型变量名表;其中存贮类型和C语言相同,为auto(缺省),extern,register,static.C51
9、数据类型:char,int,long,float,3pointer,bit,str,sr16,sbit.存贮类型对C51是必须的.C51开发的对象是8XX51系列单片机,它所定义的变量必须以一定的存贮类型定位在8XX51硬件系统的某一存贮区中,否则无意义.8XX51系列单片机有程序存贮器ROM,片内外的数据存贮器RAM,因此,C51在定义变量类型时,一定要定义它们的存贮类型,具体见表1.表1C51变量的存贮类型存贮类型描 述data直接寻址内部RAM区btata可位寻址的内部RAM区idata间接寻址内部RAM区Pdata分页(256Byte)的外部RAM区Xdata外部的RAM区(64KBy
10、tes)CodeROM区(64KBytes)1.3对位变量的定义8XX51单片机片内RAM 20H2FH,除了字节寻址还可位寻址,共128个位空间(00H7FH),另外还有11个特殊功能寄存器也可位寻址,对它们的访问,C51有3种方法.(1)将变量用bit类型定义符定义为bit类型,其位地址C51自行安排在内部RAM可位寻址的bdata区.(2)利用字节寻址变量位方法.如:bdata int ibase;?3ibase定义为bdata区整型变量3?sbitmybit=ibase 15;?3mybit定义为ibase第15位3?这里的位运算符 相当于汇编中的.,其后的取值依赖于该位所在字节寻址变
11、量的定义类型,若定义为int取值为015,若定义为char取值为 为07.(3)对特殊功能寄存器SFR的位定义.a.使用头文件,再直接用位名称.b.使用头文件及sbit定义符,多用于无位名的可寻址位.c.用字节地址位定义.格式:Sbit位变量名=字节地址位位置.d.用寄存器名位定义,C51提供了一种自主形式的定义方式,使用特定关键字sfr,定义以后,程序中就可直接引用寄存器名.1.4函数(1)中断函数.格式:函数类型 函数名(形式参数)interruptnU singm.其中:interruptn:声明该函数为中断服务函数,n为中断源的编号,不允许带运算符的表达式,n通常的取值为:0-外部中断
12、0中断;1-定时0?计数器0溢出中断;2-外部中断1中断;3-定时器1?计数器1溢出中断;4-串行口发送或接收中断.U singm:工作寄存器组选择,m的取值范围为026中南民族大学学报(自然科学版)第24卷3.注:若中断函数中调用了其他函数,被调用函数使用的寄存器组必须和中断函数相同,否则会出错.(2)递归函数.C51中,普通函数(非再入函数)不能递归调用,只有再入函数(reentrant属性)才可能被递归调用.格式:函数类型函数名(形式参数表)reentrant.2编程技巧一个实用的软件采用模块化结构,在实际开发中,模块变量的灵活定义与模块之间参数的合理传递对程序运行效率至关重要,以下是用
13、C51对实际的工程编程与调试的一些技巧.2.1合理设置变量数据类型以及设置运算模式可大大减少程序代码,提高程序执行效率8XX51系列单片机是8位机,它只能直接处理8位无符号数的运算,而对其他类型的数据则需要通过额外的算法来实现.因此,在对变量进行类型定义时,只要能满足编程要求,应尽量使用无符号的最小数据类型(unsigned char).如2个无符号char类型的对象相乘与8XX51的指令MUL AB相符,这样产生的代码比用整型完成的同样的运算要少得多,从而可提高程序的运行效率.在运算时,可以用定点运算的尽量用定点运算,避免使用浮点运算.例如,8位的A?D采样后,得到的是一个8位的00FFH的
14、数字量D,要把这个D值还原成通道对应的一个模拟量M,往往要乘上一个系数K,即M=KD,K通常是一个浮点数,如为2.7,则M=2.7D=273D?10(K1=27为M的新系数),将所有通道新的系数用unchar code db=.;定义,运算时,通过指针取code中的系数,既便于程序的书写、修改,又能大大减少程序代码,提高程序执行效率.2.2合理定义变量存贮器类型,提高程序运行效率变量的存贮器类型有data、idata、pdata、xdata,当对不同的存贮器类型进行操作时,编译后的代码执行效率各不相同.为了提高程序执行效率,对存贮器类型设置应根据以下原则:只要条件满足,尽量先使用内部直接寻址存
15、贮器(data),其次为间接寻址的存贮器(idata),由于8XX51单片机片内RAM容量有限,在片内RAM容量不够的情况下,才使用外部的RAM,在外部的RAM中,优先选择pdata,最后才是xdata.另外,在内部和外部RAM共同使用的情况下,对那些经常使用和计算频繁的数据,应使用内部的RAM,因为访问片内RAM比访问片外RAM快得多.2.3灵活设置变量存贮种类,提高程序执行效率在嵌入式编程中,通常是模块化设计,正确的函数变量的传递十分重要,子程序模块中与其他变量无关的变量尽量使用局部变量,对整个程序都要使用的变量,将其设置为全局变量,这样子程序模块文件中用extern声明要使用的变量为外部
16、变量即可.而使用静态static变量时,它只限于函数体内有效,不能在函数体外使用.另外,C语言中的指针、结构、联合,如灵活使用,可大大方便数据的传递,提高编程的效率.2.4适当地将汇编程序嵌入到C程序中,加快实时响应或精确控制任务汇编语言具有执行速度快,直接操作硬件的优势.在工程应用中,对一些实时性要求很高的场合,如:数据采集、中断服务程序处理、实时控制等,建议将汇编语言程序嵌入到C51程序中,在C51编译系统中,提供了C与汇编程序的接口,在C51中,C语言程序调用汇编语言程序注意以下3点:(1)被调用函数在主程序后,要在主程序前先说明.在汇编程序中要使用code选项有效并声明为可再定位类型,
17、并根据不同情况,对函数名作转换.(2)对为其它模块使用的符号进行PUBL IC声明,对外来符号进行EXTRN声明.(3)参数的传递.C51中模块的入?出口参数传递可使用工作寄存器或存贮器.利用工作寄存器进行数据传送,这种方式比较安全,根据数据类型(char、int、cong?float、一般指针)的不同,只能传送13个参数.若传递参数的寄存器不够用,可以使用存贮器传送,通过指针取得参数,这种方式,其传递数据可自行控制,但需要开发人员仔细控制.2.5正确选择编译控制指令,加速程序调试过程C51提供了3类(源控制、列表控制、目标控制)共20多条编译控制指令,这些指令分成2组:首要控制指令(用P表示
18、)和一般控制指令(用G表示).首要控制指令只能引用一次,一般控制指令可多次引用.这一点在源程序中采用#progma来引用时必须加以注意.对于首要控制指令通常放在源程序的开始处,并且只能出现一次,如果重复使用将导致致命的编译错误而停止编译.对于一般控制指令可以多次出现在源程序中(下转第81页)36第1期田晓梅,等:嵌入式C语言在工程编程中的应用技巧图3分频器原理图的脉冲信号,然后利用CC4013进行二分频得到频率为1Hz,周期为1s的脉冲信号.(3)改为不同进制电路.如要改为7进制,通过对预置端改为“1000”,则对应反相器后数码管显示为“7”,再进行倒计时.(4)增加功能.增加发光二极管,当倒
19、计时器正常工作时,绿灯亮;当倒计时器处于“保持”或者计时时间到时,红灯亮.(5)在图2中,去掉反相器,将计数器与译码器直接连接,同时将计数器初值设置为0000(对应十进制数0),便是我们常用的递增型数字秒表了。3结束语从倒计时秒表的制作及其电路的改动,可以看出利用中规模集成电路和半导体器件设计的倒计时秒表电路简单、可靠,有一定的实用价值.参考文献1赵从毅.555定时器的功能图表示法及其用法J.安徽工业大学学报,2002,(4):1281302付家才.电子工程实践技术M.北京:化学工业出版社,2003.323阎石.数字电子技术基础M.北京:高等教育出版社,1998.6768(上接第63页)任何一
20、行上.最常用的列表控制指令定义:#progmaSYMBOL S(缩写为SB):产生程序模块使用过的符号表#progmaCODE(CD):列表文件后附加汇编程序代码最常用的目标控制指令定义:#progmaDEBU G(DB):将符号调试或信息加入目标文件#progmaOBJECTEXTEND(OE):目标文件中包含附加变量定义#progmaSMALL(SM):小编译模式,变量局限于data区#progmaCOM PACT(CP):紧凑编译模式,参数、变量位于PDA TA区#progmaLARGE(LA):大编译模式,参数、变量位于XDA TA区注:在调试时,为了获得足够多的调试信息,在对一个C5
21、1程序进行编译时,在源程序的开头处加上如下预处理命令行:#progmacddbsboe这样得到的目标程序中将包含所有调试信息,从而可以方便地进行源程序的调试,加快调试的进程.3结语尽管嵌入式C语言是一种强大而方便的开发工具,但开发人员要达到用C51快速编写出高效、易于维护的嵌入式系统程序,首先必须对C语言编程风格要有较为透彻的掌握,同时,要对8XX51系列单片机的结构细节及汇编语言编程要有深入的理解,还要知道整个硬件系统的特点与功能.只有这样,才能针对各类实际工程的需要,合理定义变量的存贮类型、数据类型,灵活设置函数变量,在较短的时间内编写出规范、高效率、高可靠、易维护的嵌入式系统的执行代码.参考文献1徐爱钧,彭秀华.单片机高级语言C51应用程序设计M.北京:电子工业出版社,20022马忠梅,籍顺心,张凯,等.单片机的C语言应用程序设计M.北京:北京航空航天大学出版社,2001.113梁合庆,吕京建,博洋.从C到嵌入式C编程语言M.北京:北京航空航天大学出版社,2002.418第1期樊金荣,等:数字倒计时秒表的设计与实现
限制150内