rlc网络论文
挑?想要吗?富兰克林简介?详细讨论了C51交叉编译器的特点、C51语言编程的基本技巧、其与汇编语言程序的混合编程、中断处理等实际问题,并给出了相应的处理程序。
关键词?FranklinC51编译器汇编语言结构化设计模块中断
-
汇编语言是开发单片机应用系统时常用的软件工具。可以直接操作硬件,指令执行速度快。但其指令系统的固有格式受硬件结构限制较大,编写和调试困难,可移植性也较差。随着单片机硬件性能的提高,其工作速度越来越快,所以在编写单片机应用系统程序时,更多的是关注程序本身的编程效率。富兰克林呢。C51交叉编译器是专为80C51系列单片机设计的高效C语言编译器。使用它可以缩短开发周期,降低开发成本。此外,开发的系统易于维护,可靠性高,可移植性好。甚至在代码的使用效率上,完全可以与汇编语言相媲美,因此成为开发80C51系列单片机的热门工具。
1?C51语言编程的基本技巧
c语言是一种高级编程语言,提供了非常完整的标准化过程控制结构。因此,在使用C51语言设计单片机应用系统的程序时,首先应尽可能采用结构化编程方法,这样可以使整个应用系统程序结构清晰,易于调试和维护。对于一个较大的程序,可以把整个程序按照功能分成几个模块,不同的模块完成不同的功能。针对不同的功能模块,分别指定相应的入口参数和出口参数,将一些经常使用的程序更好地编译成函数,既不会造成整个程序管理的混乱,又增强了可读性和可移植性。
在编程过程中,要充分利用C51语言的预处理命令。对于一些常用的常量,比如TRUE、FALSE、PI和各种特殊函数寄存器,或者程序中一些可以根据外部条件改变的重要常量,可以使用宏定义“# #define”或者把它们放在一个头文件中一起定义,然后使用文件包含命令“# #include”添加到程序中。这样,当一个参数需要修改时,只需要修改相应的包含文件或宏定义,而不需要修改每一个使用它们的程序文件,有利于文件的维护和更新。以下是一些例子:
例1?对于不同的单片晶体振荡器,程序采取不同的延迟时间,延迟时间的长短可以根据外界条件的变化进行修改。对于这样的程序,可以用宏定义和条件编译来实现。该过程如下:
#定义?旗帜?1?
#ifdef?flag==1?
#definefosc6M?
延时= 10;?
#elif?旗帜?=?=?0?
#定义?fosc8M?
延时= 12;?
#其他?
#definefosc?12M?
延迟= 20;?
#endif?
main()?
{?
for(I = 0;我& lt延迟;i++);?
}?
这样,源程序不需要任何修改就可以应用于不同时钟频率的单片机系统,并且可以根据不同的情况取不同的延迟值来完成不同的目的。
2?C51语言与汇编语言程序的混合编程
C51编译器可以高效地编译C语言源程序,生成高效简洁的代码。大多数情况下,用C语言编程就可以达到预期的目的。但是有时候为了直观编程或者处理一些特殊地址,就需要使用某种汇编语言来编程。在其他场合,出于某种目的,汇编语言也可以调用C语言。在这种混合编程中,关键是参数的传递和函数的返回值。他们必须有完整的协议,否则数据的交换可能是错误的。我们以力源公司的10位串行A/D转换器TLC1549为例。举个例子说明C语言程序和汇编语言程序的调用。?
图1?TLC1549引脚图
1549的引脚图和时序图分别如图1和图2所示,假设数据?OUT连接P1.0,P1.1,CLOCK连接P1.2。
1549的具体功能请参考相关资料。
图二?TLC1549时序图
例2?c语言程序和汇编语言程序调用,其子程序如下:
公共?AD?;入口地址?
SEG_AD?段位?代码;节目片段?
RSEG?SEG_AD?
使用?0?
广告:MOV?R6,00号?
MOV?R7,#00?
SETB?P1.1?
打电话?延迟?
CLR?P1.1?
打电话?延迟?
MOV?R0,#10?
RR0:?SETB?P1.2?
NOP?
CLR?P1.2?
DJNZ?R0,RR0?
打电话?延迟?
MOV?30H,R6?;A/D转换高吗?
;两个保存在R6?
打电话?CIR?
MOV?R6,30H?
SETB?P1.2?
NOP?
CLR?P1.2?
MOV?30H,R6?
打电话?CIR?
MOV?R6,30H?
MOV?R0,#8?;A/D转换低吗?
;R7中存储8位?
RR2:?SETB?P1.2?
NOP?
CLR?P1.2?
MOV?30H,R7?
打电话?CIR?
MOV?R7,30H?
DJNZ?R0,RR2?
RET?
CIR:?CLR?c?
MOV?c,P1.0?
MOV?a,30H?
RLC?答?
MOV?30H,A?
RET?
结束?
在上面的程序中,函数的返回值是一个无符号整数。根据调用规则,返回值的高阶必须在R6,低阶必须在R7,这样才能保证数据传输不出错。另外,在调用过程中,一定要注意寄存器的堆栈。这样以后用A/D转换的时候,可以用C语言调用汇编语言子程序AD()。
3?C51中断处理过程
C51编译器支持在C源程序中直接开发中断程序,减少了使用汇编语言的繁琐工作,提高了开发效率。中断服务函数的完整语法如下:
Void函数名(void)[模式]
[再入]]中断?n?【使用?r]
其中n (0 ~ 31)代表中断数。C51编译器允许32个中断,使用哪个中断由80C51系列芯片决定。R (0 ~ 3)代表r组寄存器。调用中断函数时,要求中断程序调用的函数必须使用同一个寄存器组。“重入”用于指示中断处理程序是否具有“重入”能力。C51编译器及其对C语言的扩展允许程序员控制中断的所有方面并使用寄存器组。这种支持使得程序员可以创建高效的中断服务程序,用户只需要关心C语言中的中断和必要的寄存器组切换操作。
例3?设置单片机的fosc=12MHz,要求以T0的形式编程1,在P1.0脚输出周期为2ms的方波。
用C语言编写的中断服务程序如下:
#包含?& ltreg 51 . h & gt;?
sbit?p1_0=p1^0;?
作废?定时器0(无效)中断?1?使用?1?{?
/*T0中断服务程序入口*/?
P1_0=!p 1 _ 0;?
TH0 =-(1000/256);/*重新加载初始计数值*/?
TL0 =-(1000% 256);?
}?
作废?main(void)?
{?
TMOD = 0x 01;?/*T0工作在定时器模式1*/?
p 1 _ 0 = 0;?
TH0 =-(1000/256);?/*预设初始计数值*/?
TL0 =-(1000% 256);?
EA = 1;/*中断时的CPU */?
ET0 = 1;?/*T0打开中断*/?
TR0 = 1;?/*开始T0*/?
do { } while(1);?
}?
写中断服务程序的时候,一定要注意不能传参数和返回值。
4?结论
C51编译器不仅可以缩短单片机控制系统的开发周期,而且易于调试和维护。此外,C51语言还有很多强大的功能,比如提供丰富的库函数供用户直接调用,完整的编译控制指令为程序调试提供必要的符号信息等。总之,C51语言是广大单片机开发人员的有力工具。