rlc网络论文

C51语言应用程序设计中的几个问题

挑?想要吗?富兰克林简介?详细讨论了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语言是广大单片机开发人员的有力工具。