MCS-51单片机三种编程方式探析摘要:MCS-51单片机是目前应用最为广泛的8位单片机,单片机的编程方式主要有汇编、C语言以及两者混合三种方式,掌握三种编程方式,在具体应用中灵活运用是非常重要的,该文通过这三种编程方式对MCS-51单片机的应用进行了详细的讨论。关键词:单片机;汇编语言;C语言;混合编程中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)20-4994-03DiscussofThreeMethodsofProgrammingforMCS-51SingleChipMicrocomputerLIRui,LVQiong(CollegeofPhysicsandElectronicEngineering,QujingNormalUniversity,Qujing655011,China)Abstract:MCS-51isthemostpopularinthe8bitsinglechipmicrocomputeratpresent.Singlechipmicrocomputerarethreewaysforprogramming,theyareassemblylanguage,Clanguageandcomplexprogramming.Usedthetechniqueswithgreatfacilityisveryimport.Thedocumentdiscussthemethodsindetai1.Keywords:singlechipmicrocomputer;assemblylanguage;Clanguage;complexprogrammingMCS-51系列单片机是Intel公司的8位单片机,其中DIP封装的AT89S52单片机是美国Atmel公司生产的低电压、高性能CMOS8位单片机,其片内含有8KB可在线编程的Flash闪速存储器,芯片采用Atmel公司的高密度、非易失性存储技术生产,与标准的MCS-51单片机的指令系统及引脚兼容、功能强大,适合于许多较多较为复杂的控制应用场合[1]。目前开发MCS-51系列单片机最流行的软件是美国Ke订Software公司出品的Keil软件,这是一个功能强大的集成开发环境(^Vision)。1MCS-51单片机的三种编程方式1.1汇编方式汇编语言是面向机器的程序设计语言,也称为符号语言。汇编语言中,用符号代替机器语言的二进制码,使之比机器语言易于读写、易于调试和修改,同时也具有机器语言执行速度快,占内存空间少等优点,但在编写复杂程序时具有明显的局限性,汇编语言依赖于具体的机型,不能通用,也不能在不同机型之间移植。1.2C语言方式C语言是一种高级语言,其编写的程序比用汇编语言更符合人们的思考习惯,具有良好的模块化,容易阅读和维护等优点,开发者可以更专心地考虑算法而不是考虑一些细节问题,这样就减少了开发和调试的时间。同时C语言不依赖于硬件,这使其具有了很好的移植性[2]。另外,C语言还还有丰富的库函数支持,绘图能力也比较强。但C语言代码编译后的目标代码体积大,意味着存在占用空间多,执行速度较慢的问题。1.3汇编与C语言混合方式根据汇编和C语言的特点,选择编程语言的一种折中方式就是汇编和C语言混合编程。混合编程方式主要有两种形式,一种是在C语言中嵌入汇编代码,另一种是汇编和C语言相互调用函数,实现方法是通过关键词进行标识,如果涉及参数传递,主要是通过R2—R7这几个工作寄存器来存取。在应用中,通常在对时效性要求比较严格的时候,这部分代码使用汇编是唯一的选择,比如时钟的中断计时服务程序等,而其它时候,使用C语言比较方便。2三种编程方式的应用一一经典流水灯实验2.1汇编方式ORG0000H;标记程序起始位置SJMPMAIN;跳转到主程序地址ORGOOOBH;计时/计数器0的中断入口地址AJMPTIMERO;跳转到计时中断服务程序ORG0033H;标记主程序起始的绝对位置MAIN:MOVTMOD,#02H;设置为计时器工作方式2MOVTH0,#06H;预设溢出的自动赋值数据MOVTL0,#06H;预设一次计时的初值SETBETO;打开计时/计数器中断控制SETBEA;打开总中断控制SETBTRO;开启计时MOVR1,#OOHMOVRO,#OOHMOVA,#O1H;初始化状态数据LOOP:MOVPO,A;点亮发光二极管SJMPLOOPTIMERO:INCRl;机器周期计时CJNERl,#250,EXT;而方式2使用的是8位字长,因此使用了R0和R1扩展MOVR1,#OOHINCROCJNERO,#32,EXTMOVRO,#OOHRLA;循环左移点亮状态数据EXT:RETI;中断返回END;程序结束2.2C语言方式unsignedintt二0;//计时变量unsignedchars=0x01;//发光二极管点亮状态数据变量voidtimerO()interrupt1using1{//中断函数申明t++;//每次中断,计时变量加1if(t=8000){//需要8000次中断,时间才到1秒s=_crol_(s,1);//点亮状态数据变为下一状态t=0;//到1秒后,赋0重新计时}}voidmain(){TM0D=0x02;//设置...