单片机产生于19世纪70年代,80年代人们开始使用C语言作为单片机的开发语言,在1985年许多公司都推出51系列单片机的C语言编辑器,我们把面向51单片机的C语言简称为C51。目前C51软件中最为流行的就是Keil C。 [1]编程调试灵活方便。因为它是一门高级语言,高级语言的特点就是编程方式灵活,同时,当前所有的单片机都有相应的C语言级别的仿真调试系统,使得它的调试十分方便。 [3]完全模块化。C语言的基本构成单位是函数,其本身就是模块化的开发方式。程序的模块化可以最大程度地实现资源共享,十分有利于多人协作,进行大系统项目的开发。 [5]便于项目维护管理。用C语言开发的代码便于开发小组计划项目、灵活管理、分工合作以及后期维护,基本上可以杜绝因开发人员变化而给项目进度或后期维护或升级所带来的影响,从而保证了整个系统的高品质、高可靠性及可升级性。 [1]C51针对的是硬件系统,所以在程序的最开始应加载关于该系列芯片的头文件,如reg51.h或reg52.h,头文件中定义了各种SFR和SFR中可寻址位的信息。 [3]从数据的存储类型上说,C51可分为data、code、bdata、idata、pdata、xdata等类型,不同的数据存储类型有着不同的执行效率。 [5]C51不支持扩展16位字符,同时不支持递归特性。 三、C51的关键字 四、C51的数据类型 char(1B)、int(2B)、long(4B)、float(4B)。 sfr可以访问51单片机内所有的SFR,用于声明一个8位的SFR。如sfr P1=0x90; sbit用于访问位地址空间中的可寻址位或SFR中的可寻址位。 sbit CY=0XD7; sfr SCON=0x98; sbit RB8=SCON^2; sbit OV=0xD0^2; data 存储在可直接寻址的片内低128B的RAM中,访问速度最快。 idata 存储在可间接寻址的片内RAM的256B。允许访问全部片内地址。 xdata 存储在可寻址的片外RAM的全部64KB空间,相当于MOVX @DPTR指令。 六、绝对地址的访问方法 char data *dp; *dp=0x23; CBYTE DBYTE PBYTR XBYTR 例如: val2=XBYTE[0x7fdd]; unsigned char xdata com8255 _at_ 0xffef; 七、中断服务程序 n是中断号,取值为0~4,using m指明该中断服务程序对应的工作寄存器组,取值范围:0~3。使用C51编写中断服务程序,无需关心ACC、B、DPH、DPL、PSW等寄存器的保护,C51会自动增加入栈和出栈对这些寄存器进行保护。 [1]赋值运算符:= [3]关系运算符:> < >= <= == != [5]位运算符:& | ^ ~ << >> [7]指针和地址运算符:* & [1]本征函数 _crol_(x,n); _cror_(x,n); _lrol_(x,n); _lror_(x,n); _testbit_(bitbar); [2]非本征函数 absacc.h 该文件中定义了几个宏,以确定各存储空间的绝对地址。 stdio.h 通过51单片机的串口或用户定义的I/O口读写数据,默认为串口,如需修改,可以修改LIB目录中的getkey.c及putchar.c源文件。 十、C51语法结构 [2]多分支结构: { case 值2:………..; case 值n:…………; } [4]while循环:while(条件){……} [6]goto 标号 十一、C51应用技巧 由于单片机系统的存储器资源有限,为了提高执行效率,对存储器类型的设定应该根据以下原则:只要条件满足,尽量先使用内部直接寻址存储器(data),其次设定变量为间接寻址存储器(idata),在内部存储器数量不够的情况下,才使用外部存储器,而且在外部存储器,优先选择pdata,最后才是xdata,而且,在内部和外部存储器共同使用的情况下,要合理分配存储器,对经常使用和计算频繁的数据,应该使用内部存储器,其他的则使用外部存储器。 [3]再一个提高代码效率的方法是使用无符号类型,原因是51单片机指令不支持符号运算。若使用有符号类型的变量,C51编译器将要增加相应的库函数去处理符号运算。 [5]尽量使用库函数。C51的库函数提供的许多调令,尤其是本征函数,直接对应着汇编指令,编译效率较高。 [7]灵活设置变量,高效利用存储器。 对于标志位要使用bit或sbit定义,而不要使用unsigned char。这样可以大量节省内存,编写C51程序时,不是特别必要的地方一般不要使用全局变量,尽量使用局部变量。
|