APP下载

MCS-51单片机三种编程方式的探讨

2012-04-29李锐,吕琼

电脑知识与技术 2012年20期
关键词:汇编语言单片机

李锐,吕琼

摘要:MCS-51单片机是目前应用最为广泛的8位单片机,单片机的编程方式主要有汇编、C语言以及两者混合三种方式,掌握三种编程方式,在具体应用中灵活运用是非常重要的,该文通过这三种编程方式对MCS-51单片机的应用进行了详细的讨论。

关键词:单片机;汇编语言;C语言;混合编程

中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)20-4994-03

Discuss of Three Methods of Programming for MCS-51 Single Chip Microcomputer

LI Rui,LV Qiong

(College of Physics and Electronic Engineering, Qujing Normal University,Qujing 655011,China)

Abstract: MCS-51 is the most popular in the 8 bit single chip microcomputer at present. Single chip microcomputer are three ways for programming, they are assembly language, C language and complex programming. Used the techniques with great facility is very import. The document discuss the methods in detail.

Key words: single chip microcomputer; assembly language; C language; complex programming

MCS-51系列单片机是Intel公司的8位单片机,其中DIP封装的AT89S52单片机是美国Atmel公司生产的低电压、高性能CMOS 8位单片机,其片内含有8KB可在线编程的Flash闪速存储器,芯片采用Atmel公司的高密度、非易失性存储技术生产,与标准的MCS-51单片机的指令系统及引脚兼容、功能强大,适合于许多较多较为复杂的控制应用场合[1]。目前开发MCS-51系列单片机最流行的软件是美国Keil Software公司出品的Keil软件,这是一个功能强大的集成开发环境(μVision)。

1 MCS-51单片机的三种编程方式

1.1汇编方式

汇编语言是面向机器的程序设计语言,也称为符号语言。汇编语言中,用符号代替机器语言的二进制码,使之比机器语言易于读写、易于调试和修改,同时也具有机器语言执行速度快,占内存空间少等优点,但在编写复杂程序时具有明显的局限性,汇编语言依赖于具体的机型,不能通用,也不能在不同机型之间移植。

1.2 C语言方式

C语言是一种高级语言,其编写的程序比用汇编语言更符合人们的思考习惯,具有良好的模块化,容易阅读和维护等优点,开发者可以更专心地考虑算法而不是考虑一些细节问题,这样就减少了开发和调试的时间。同时C语言不依赖于硬件,这使其具有了很好的移植性[2]。另外,C语言还还有丰富的库函数支持,绘图能力也比较强。但C语言代码编译后的目标代码体积大,意味着存在占用空间多,执行速度较慢的问题。

1.3汇编与C语言混合方式

根据汇编和C语言的特点,选择编程语言的一种折中方式就是汇编和C语言混合编程。混合编程方式主要有两种形式,一种是在C语言中嵌入汇编代码,另一种是汇编和C语言相互调用函数,实现方法是通过关键词进行标识,如果涉及参数传递,主要是通过R2—R7这几个工作寄存器来存取。在应用中,通常在对时效性要求比较严格的时候,这部分代码使用汇编是唯一的选择,比如时钟的中断计时服务程序等,而其它时候,使用C语言比较方便。

2三种编程方式的应用——经典流水灯实验

2.1汇编方式

ORG 0000H;标记程序起始位置

SJMP MAIN;跳转到主程序地址

ORG 000BH;计时/计数器0的中断入口地址

AJMP TIMER0;跳转到计时中断服务程序

ORG 0033H;标记主程序起始的绝对位置MAIN: MOV TMOD,#02H ;设置为计时器工作方式2

MOV TH0,#06H;预设溢出的自动赋值数据MOV TL0,#06H;预设一次计时的初值

SETB ET0;打开计时/计数器中断控制

SETB EA;打开总中断控制

SETB TR0;开启计时

MOV R1,#00H

MOV R0,#00H

MOV A,#01H;初始化状态数据LOOP: MOV P0,A;点亮发光二极管

SJMP LOOP

TIMER0: INC R1;机器周期计时

CJNE R1,#250,EXT ;而方式2使用的是8位字长,因此使用了R0和R1扩展

MOV R1,#00H

INC R0

CJNE R0,#32,EXT

MOV R0,#00H

RL A;循环左移点亮状态数据

EXT:RETI;中断返回

END;程序结束

2.2 C语言方式

unsigned int t=0;//计时变量

unsigned char s=0x01;//发光二极管点亮状态数据变量void timer0() interrupt 1 using 1{ //中断函数申明

t++;//每次中断,计时变量加1

if(t==8000){//需要8000次中断,时间才到1秒

s=_crol_(s,1);//点亮状态数据变为下一状态

t=0;//到1秒后,赋0重新计时

}

}

void main(){

TMOD=0x02;//设置计时/计数器的工作方式

TH0=0x06;//自动赋值设置TL0=0x06;//设置计时初值

ET0=1;//打开计时中断控制EA=1;//打开总中断控制

TR0=1;//开启计时

do{//死循环等待中断

P0=s;//点亮发光二极管

}while(1);

}

2.3汇编和C语言混合方式

2.3.1 C语言中嵌入汇编

实际应用中,如果对中断有严格的要求,可以把中断程序代码改为汇编,也就是嵌入汇编语言的形式,这种方式实现比较简单,而且C语言下定义的变量也可以直接使用,只不过超过单字节长度的变量的算法比较麻烦。

2.3.2 C语言和汇编相互调用

汇编代码既可以直接嵌入C语言中,也可以单独分离出来,下面的实例中把中断函数单独写为汇编语言,另外,为了方便说明汇编对C语言的调用,把逻辑循环左移函数重新自定义。在应用中,混合编程方式最麻烦就的相互代码和变量的调用,在MCS-51系列单片机中,存在一套规则,如表1。

2.4编译时需注意的问题

1)生成目标程序文件

使用Keil编译,可以生成16进制的后缀为.HEX的目标程序文件,这个文件可以直接写入单片机运行,但Keil默认是不生成. HEX文件的,需要进行设置,方法是在选中“Project Workspace”窗口中的“Target 1”,点鼠标右键,选择“Options for……”,在“Output”选项下进行设置。

2)编译混合方式的程序

首先,在Project窗口中的C文件上点鼠标右键,选择“Options for……”,使“Generate Assembler SRC File”和“Assemble SRC File”选项变成黑色(有效)状态;然后,根据选择的编译模式,把相应的库文件(如Small模式时,是KeilC51LibC51S.Lib)加入工程中,该文件必须作为工程的最后文件;最后进行编译,即可生成目标代码。

3结束语

以上代码均通过Keil的编译,并通过在线编程系统写入AT89S52单片机内部程序存储中,使用单片机最小系统能正常运行。三种编程方式在具体的应用中是很灵活的,需要根据其特点和使用者的经验来选择使用。对于初学者,熟练掌握前两种方式是非常必要的,而对于经验丰富的程序员,第三种方式不失为一种高效实用的方法。

参考文献

[1]邓兴成,姜宝钧.单片机原理与实践指导[M].北京:机械工业出版社,2009:1.

[2]赵亮,侯国锐.单片机C语言编程与实例[M].北京:人民邮电出版社,2003:1.

[3] Keil Elektronik GmbH. and Keil software. Cx51 Compiler, Users Guide 2001:118-132.

[4] Keil Elektronik GmbH. and Keil software. Macro Assembler and Utilities, Users Guide 2001:99-137.

猜你喜欢

汇编语言单片机
高等学校计算机专业课程教学改革实践——以汇编语言与接口技术课程为例
基于单片机的SPWM控制逆变器的设计与实现
基于单片机的层次渐变暖灯的研究
汇编语言与C语言的混合程序设计技术研究
基于单片机的便捷式LCF测量仪
小议PLC与单片机之间的串行通信及应用
提高《汇编语言程序设计》教学效率的思考与实践
基于单片机的平衡控制系统设计
试论汇编语言与C语言的混合程序设计技术
Microchip推出两个全新PIC单片机系列