一、C语言编程与汇编语言编程相比的优势
[1]编程调试灵活方便。因为它是一门高级语言,高级语言的特点就是编程方式灵活,同时,当前所有的单片机都有相应的C语言级别的仿真调试系统,使得它的调试十分方便。
[2]生成的代码编译效率高。尤其是用于较为复杂的单片机系统,用C语言开发更具明显优势,当前较好的C语言编辑系统的编译效率已经基本达到中高级程序人员的开发水平。
[3]完全模块化。C语言的基本构成单位是函数,其本身就是模块化的开发方式。程序的模块化可以最大程度地实现资源共享,十分有利于多人协作,进行大系统项目的开发。
[4]可移植性好。当对C语言程序进行移植时,只需将部分与硬件相关的地方进行适度修改,如:头文件。完全是算法类的程序无需修改就可以直接从一种单片机移植到另外一种单片机上。
[5]便于项目维护管理。用C语言开发的代码便于开发小组计划项目、灵活管理、分工合作以及后期维护,基本上可以杜绝因开发人员变化而给项目进度或后期维护或升级所带来的影响,从而保证了整个系统的高品质、高可靠性及可升级性。
二、与ANSI C的区别
[1]C51针对的是硬件系统,所以在程序的最开始应加载关于该系列芯片的头文件,如reg51.h或reg52.h,头文件中定义了各种SFR和SFR中可寻址位的信息。
[2]从数据类型上讲,C51多了一种位类型,可以使得单片机的位操作更加方便。
[3]从数据的存储类型上说,C51可分为data、code、bdata、idata、pdata、xdata等类型,不同的数据存储类型有着不同的执行效率。
[4]由于单片机系统资源有限,所以编译系统不允许有太多的程序嵌套。
[5]C51不支持扩展16位字符,同时不支持递归特性。
[6]printf和scanf函数在C51中不再是用于屏幕打印和接收字符,而是用于串行口通信时数据的收发。
三、C51的关键字
关键字是编程语言保留的特殊标识符,在程序中不允许另做他用。ANSI C中有32个关键字,C51在此基础上又扩展了20个,包括_at_, alien, bdata, bit, code, compact, data, idata, interrupt, large, pdata, _priority_, reentrant, sbit, sfr, sfr16, small, _task_, using,xdata。
四、C51的数据类型
ANSI C包括的数据类型有char、int、short、long、float、double、指针型,在C51中,short等同于int,double等同于float,除此之外,还增加了bit、sfr、sfr16、sbit这些特殊的数据类型。
char(1B)、int(2B)、long(4B)、float(4B)。
bit用于定义一个位标量,该位标量的值不是0就是1,类似某些高级语言中的Boolean类型数据。
sfr可以访问51单片机内所有的SFR,用于声明一个8位的SFR。如sfr P1=0x90;
sfr16用于定义存在于51单片机内部RAM的16位的特殊功能寄存器。如sfr16 T0=0x8c;
sbit用于访问位地址空间中的可寻址位或SFR中的可寻址位。
如:sbit OV=0xD2;
sbit CY=0XD7;
*********************
sfr SCON=0x98;
sbit RI=SCON^0;
sbit RB8=SCON^2;
************************
sbit OV=0xD0^2;
五、数据的存储器类型
data 存储在可直接寻址的片内低128B的RAM中,访问速度最快。
bdata 存储在可位寻址的内部RAM中(20H-2FH),允许位和字节混合访问。
idata 存储在可间接寻址的片内RAM的256B。允许访问全部片内地址。
pdata 存储在可分页寻址的外部RAM的256B空间内,相当于MOVX @Ri指令。
xdata 存储在可寻址的片外RAM的全部64KB空间,相当于MOVX @DPTR指令。
code 存储在全部64KB的程序存储区,相当于MOVC @A+DPTR指令。
六、绝对地址的访问方法
[1]使用指针。
char data *dp;
dp=0x61;
*dp=0x23;
[2]使用预定义宏(需包含absacc.h)
CBYTE DBYTE PBYTR XBYTR
CWORD DWORD PWORD XWORD
例如: val2=XBYTE[0x7fdd];
[3]使用关键字_at_
unsigned char xdata com8255 _at_ 0xffef;
com8255=0x90;
七、中断服务程序
格式: void 函数名() interrupt n [using m]
n是中断号,取值为0~4,using m指明该中断服务程序对应的工作寄存器组,取值范围:0~3。使用C51编写中断服务程序,无需关心ACC、B、DPH、DPL、PSW等寄存器的保护,C51会自动增加入栈和出栈对这些寄存器进行保护。
八、C51的运算符和表达式
[1]赋值运算符:=
[2]算术运算符:+ - * / %
[3]关系运算符:> < >= <= == !=
[4]逻辑运算符:&& || !
[5]位运算符:& | ^ ~ << >>
[6]复合运算符:+= >>= %= &=等
[7]指针和地址运算符:* &
九、C51库函数:
[1]本征函数
注意:调用这些函数时,需包含intrins.h
_crol_(x,n); _cror_(x,n);
_iror_(x,n); _irol_(x,n);
_lrol_(x,n); _lror_(x,n);
_nop_();
_testbit_(bitbar);
_chkfloat_(fltbar);
[2]非本征函数
reg51.h或reg52.h,其中包括了所有SFR的定义。
absacc.h 该文件中定义了几个宏,以确定各存储空间的绝对地址。
string.h 包括复制、比较、移动等函数如:memccpy, memchr, memcmp, memcpy, memmove, memset等。
stdio.h 通过51单片机的串口或用户定义的I/O口读写数据,默认为串口,如需修改,可以修改LIB目录中的getkey.c及putchar.c源文件。
maths.h 各种数学函数如:sqrt、exp等。
十、C51语法结构
[1]单分支结构:if(条件)……else……
[2]多分支结构:
switch(变量)
{
case 值1:……..;
case 值2:………..;
………….
case 值n:…………;
default:…………;
}
[3]for循环:for(起始条件;循环条件;变量递增){ ………}
[4]while循环:while(条件){……}
[5]do while循环:do{……}while(条件);
[6]goto 标号
[7]死循环:while(1);here:goto here;for(;;);
十一、C51应用技巧
[1]灵活选择变量的存储器类型。
由于单片机系统的存储器资源有限,为了提高执行效率,对存储器类型的设定应该根据以下原则:只要条件满足,尽量先使用内部直接寻址存储器(data),其次设定变量为间接寻址存储器(idata),在内部存储器数量不够的情况下,才使用外部存储器,而且在外部存储器,优先选择pdata,最后才是xdata,而且,在内部和外部存储器共同使用的情况下,要合理分配存储器,对经常使用和计算频繁的数据,应该使用内部存储器,其他的则使用外部存储器。
[2]另一个提高代码效率的方法就是减小变量的长度,51单片机是8位的,若使用int型的无疑是空间上的极大浪费。应尽可能选择的char、unsigned char、或bit,它们只占用1B或1位。
[3]再一个提高代码效率的方法是使用无符号类型,原因是51单片机指令不支持符号运算。若使用有符号类型的变量,C51编译器将要增加相应的库函数去处理符号运算。
[4]尽量避免使用浮点变量。浮点数占用4个字节,对单片机的存储器资源来说就是极大的浪费。浮点运算应尽量通过提高数值数量级或使用整型运算代替浮点运算。尽量减少乘除法运算,如*2或/2,可以使用移位操作代替,这样不仅可以减少代码量,同时还能大大提高程序执行效率。
[5]尽量使用库函数。C51的库函数提供的许多调令,尤其是本征函数,直接对应着汇编指令,编译效率较高。
[6]使用宏替换。宏替换可以使程序具有更好的可读性,且当需要修改宏时,只要修改宏定义处即可。
[7]灵活设置变量,高效利用存储器。
对于标志位要使用bit或sbit定义,而不要使用unsigned char。这样可以大量节省内存,编写C51程序时,不是特别必要的地方一般不要使用全局变量,尽量使用局部变量。
上一篇:基于SD2300的定时采集存储系统设计
下一篇:基于AT89S52的24C02使用
推荐阅读最新更新时间:2024-03-16 15:17