首页 > 范文大全 > 正文

基于Protues仿真的MCS―51单片机教学实践与探讨

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于Protues仿真的MCS―51单片机教学实践与探讨范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘 要:利用仿真软件protues和伟福编译软件可以生动直观地演示硬件电路和程序的执行过程,以此来解决单片机课程中常见的问题。通过具体实例的讲解,解释清楚这些问题的本质。

关键词:mcs-51 汇编语言 仿真 Protues 伟福软件

Practice and discussion of MCS-51 MCU teaching based on simulation of Protues

Hou Juncai, Yang Shuqin

Northwest A&F university, Yangling, 712100, China

Abstract: In teaching practice, software of Protues was used to demonstrate the work process of circuit and program of MCS system, to students, the difficult problem become easy to understand. The paper using typical examples reveal the essence of these difficulties. The Protues is recommended in MCS teaching.

Key words: MCS-51 MCU; assembling language; simulation; Protues; Wave software

单片机是高校电子、电气、机电、信息类专业一门重要的专业基础课,具有极强的实践性和综合性,对学生硬件电路设计能力、软件编程能力、创新能力的培养有着重要作用;另外对学生掌握职业技能、增强就业竞争力具有十分重要的意义。受各种条件限制,传统的教学往往把理论讲授、实验教学、实践环节分开。在理论讲授时,由于有些问题教材中介绍不清,学生学习时,不可避免地存在迷惑和误解。Protues软件以其强大的单片机仿真功能受到学习者的欢迎,它可以对单片机系统进行软硬件设计和仿真。在教学环节中引入Protues软件来模拟实际电路,通过各个显示窗口可以直观地展示电路的工作过程和代码的执行过程,增加了学习的兴趣,让学生感性认识电路与程序的运行过程,更有助于掌握授课内容。

笔者根据教学实践,利用Protues对学生在学习过程中常见的问题和误区进行分析和探讨

1 MCS-51单片机常见问题与误区在Protues下仿真解决及解释

1.1 内部数据存储器RAM高128 B单元与特殊功能寄存器地址重叠问题

初学者往往对内部RAM高128 B的使用问题易混淆。52子系列单片机80H~0FFH的单元既是内部RAM地址,又是特殊功能寄存器(SFR)的地址。作为RAM使用时只能用寄存器间接寻址,而对SFR只能直接寻址。对51子系列内部RAM高128 B不可用,虽然对这些地址单元用寄存器间接寻址方式寻址读写时编译不会出错,但读写无效;对这些地址单元用直接寻址方式访问时,访问的是SFR。即对高128 B的内部数据存储器单元来说,作为RAM和SFR有着相同的地址单元,但有着不同的物理空间。例如在Protues下选取80C51单片机,用下列程序进行验证:

ORG 0000H

MOV R0,#90H

MOV A,@R0

MOV @R0,#08HH

MOV 90H,#80H

SJMP $

END

在Protues下单步仿真结果如图1所示:

①代码窗口 ②内部RAM窗口

③SFR窗口

a 第一条指令执行完后的状态

①代码窗口 ②内部RAM窗口 ③SFR窗口

b 第二条指令执行完后的状态

①代码窗口 ②SFR窗口

c 第三条指令执行完后的状态

①代码窗口 ②SFR窗口

d 第四条指令执行完后的状态

图1 80C51单片机高128个地址单元访问仿真过程

程序编译时完全通过,不提示错误,但从图1的仿真可以看出,在Protues仿真图的Internal Memory窗口中并没有给出高128个地址单元。程序的前三条指令执行完后,SFR窗口中地址单元90H的内容并没有变化,因为寄存器间接寻址方式对SFR无效。而第四条指令执行后,地址单元90H的内容发生改变,因为直接寻址访问的是SFR。

接着看8052的情形,用下列程序来验证:

ORG 0000H

MOV 90H,#55H

MOV R0,#90H

MOV A,@R0

MOV @R0,#08H

SJMP $

END

由图2可以看出,第一条指令执行完后,数据55H直接传送给SFR的90H,而Internal Memory中90H的内容并没有改变,因为对目的操作数而言,寻址方式是直接寻址,直接寻址访问的是SFR,而不是内部数据存储器。MOV A,@R0执行完后A(地址为SFR中的E0H)的内容为00H,而非55H,因为内部数据存储单元90H中的内容为00H,指令对源操作数的访问方式为寄存器间接寻址,访问的是内部数据存储单元,而不是SFR。根据以上表述,指令MOV @R0,#08H执行后,内部数据存储单元90H内容自然就变为08H。

①SFR窗口 ②内部数据存储器窗口 ③代码窗口

a 第一条指令执行完后的状态

①SFR窗口 ②内部数据存储器窗口 ③代码窗口

b 第二条指令执行完后的状态

①SFR窗口 ②内部数据存储器窗口 ③代码窗口

c 第三条指令执行完后的状态

①SFR窗口 ②内部数据存储器窗口 ③代码窗口

d 第四条指令执行完后的状态

图2 80C52单片机高128个地址单元访问仿真过程

1.2 寄存器寻址与直接寻址、位寻址区别

1.2.1 C与CY的区别

C是位累加器,采用寄存器寻址方式,而不能用直接寻址方式。CY则为位名,访问形式是位寻址。例如位操作中的数据传送指令MOV C,BIT和MOV BIT,C,不能写作MOV CY,BIT和MOV BIT,CY,如果写成后者,编译会提示有非法字符,因为位数据传送时必须借助位累加器C。既然对C的访问为寄存器寻址,对CY访问为普通位寻址,那么位操作指令SETB C,CLR C,CPL C与SEB CY,CLR CY,CPL CY就不相同,前三者为寄存器寻址,其机器码为单字节,后三者为位寻址,机器码为双字节。用下列程序验证,仿真如图3所示。

ORG 0000H

SETB C

CLR C

SETB CY

CLR CY

CPL C

CPL CY

SJMP $

END

图3 C与CY的位操作仿真图

如图3所示,编译通过,其中CY作操作数时代码占2个字节,C作操作数时占1个字节。

1.2.2 A与Acc的区别

(1)在字节操作指令中,A是SFR中的累加器,Acc与A是同一物理存在,有着同一单元地址。但是对A的寻址为寄存器寻址,其占有机器代码字节数少,执行时所需机器周期短;对Acc的寻址为直接寻址,机器代码字节数多,执行时所需机器周期长。还有,在寻址累加器单元的位x(x=0~7)时,只能写作Acc.x,而不能写作A.x,否则编译出错。

(2)对累加器单元的内容进行堆栈操作时,只能采用PUSH Acc和POP Acc直接寻址方式,而不能采用PUSH A和POP A寄存器寻址方式,因为在堆栈操作指令中出现的操作数只能用直接寻址方式。如果将A错写成Acc,Protues编译不会通过,提示有非法字符。

1.3 寄存器Ri(i=0,1)间接寻址外部RAM

利用Ri作为间接寄存器可以访问内部RAM,也可以寻址外部RAM。对于Ri间接访问内部RAM此处不做讨论,只讨论访问外部RAM的情形。访问外部RAM时的指令为:

MOVX @Ri,A和MOV A,@Ri

这两条指令的寻址空间取决于P2和Ri的内容,单片机复位时P2=0FFH,那么程序中在该两条指令执行前不再给出P2的值,则执行这两条指令时寻址外部RAM的0FF(Ri)H单元地址。有些教材上说:如果P2无定义,默认P2为00H,指令执行时访问外部RAM的00(Ri)地址单元。显然这种说法是错误的。任何时候这两条指令执行时,访问外部RAM的地址值由当前的P2值和Ri值确定。程序如下:

ORG 0000H

MOV R0,#30H

MOV A,#55H

MOVX @R0,A

SJMP $

END

上电后单片机复位,此时P2=0FFH,程序中没有修改P2的内容,由图4可见,在执行MOVX指令后并没有修改外部空间0030H的内容。该段程序在伟福仿真时,单步执行MOVX @R0,A后的仿真图如图5所示,显然,这种情况下访问了0FF30H,也就是P2=0FFH。

图4 寄存器间接寻址外部RAM空间仿真图

图5 寄存器间接寻址外部RAM空间的伟福仿真图

1.4 相对转移类指令的跳转问题

控制转移类指令中的相对转移指令(如累加器为零转移指令JZ rel,短转移指令SJMP rel等)的机器码中都有一个字节的偏移量rel,但这个rel在汇编程序中不能按偏移量给出,要按目的地址给出,或者以目的地址的标号形式给出。机器码中的偏移量是编译软件经过计算后得到的。例如:指令JZ rel,关于这类指令,许多MCS-5l单片机教材认为rel是偏移量,甚至有教材给出诸如SJMP 0FBH汇编指令后,解释说此处0FBH是地址偏移量。对于指令SJMP rel执行过程而言,PCPC+2+rel,许多教材的表述是:其机器指令的代码为80H rel,其中80H是SJMP指令的操作码,rel是地址偏移量。笔者认为这是不正确的。虽然在程序中也可以用符号“rel”来表示此处是相对转移,转移量范围在-128 B~+127 B内,但此处的rel和机器码中的rel不同。实际上,在汇编程序中的rel代表的是跳转的目的地址,只能用目的地址或代表目的地址的标号来表示,该目的地址到当前指令的下一条指令之间的距离不能超过-128 B~+127 B;在汇编语言中,此处不应该给出相对偏移量,如果给出相对偏移量,那么程序就会跳转到所谓偏移量数值为目的地址的程序单元,即仍然以此处数值作为目的地址,当然前提是不能超出-128 B~+127 B。

下面以JNZ 08H为例在Protues中观察其跳转过程,验证程序及其各条指令占用地址如下:

ORG 0000H

0000H MOV A,#0

0002H JZ 08H

0004H SJMP $

ORG 0008H

0008H MOV R7,#255

000AH DJNZ R7,$

000CH MOV P1,#60H

000FH SJMP $

END

由图6可以看出,地址为0002H的相对转移指令JZ 08H执行后,程序直接跳转到以0008H作为目的地址的指令上,而并非是0002+2+08H=000CH的指令上。对这段程序在伟福软件下进行编译,可以观察到指令JZ 08H形成的机器代码为6004H,其中60H为操作符JZ的机器代码,04H为实际偏移量,这个偏移量就是按跳转的目的地址(0008H)减当前PC值(0004H)得出的,当执行指令JZ 08H时,PC指向下一条指令地址0004H,即当前PC值为0004H。所以教材中所说的偏移量rel是存储在机器码中,而汇编语言中要给出目的地址或者代表目的地址的标号,机器码中的偏移量是由编译软件算出的。

①跳转指令执行前 ②跳转指令执行后

图6 相对转移指令执行过程仿真图

2 结束语

在单片机教学中引入Protues软件,可以对知识点作出适时仿真,让学生看清楚问题的本质,对单片机问题有更深入的认识。通过仿真直观感性地接受知识,对一些容易模糊不清的概念和知识进行辨别、了解,澄清教材错误和学生的误解,能够更好地掌握单片机知识。教学过程中适时运用Proteus仿真可以解决单片机授课中常见的问题与难点,在单片机教学中具有一定的推广意义。

参考文献

[1] 高玉芹.单片机原理与应用及C51编程技术[M].北京:机械工业出版社,2011.

[2] 俞国亮.MCS-51单片机原理与应用[M].北京:清华大学出版社,2008.

[3] 牛昱光.单片机原理与接口技术[M].北京:电子工业出版社,2008.

[4] 郭文川.单片机原理与接口技术[M].北京:中国农业出版社,2007.

[5] 任斌.单片机学习中的常见问题和误区[J].科教文汇:上旬刊,2007(5):191-192.

[6] 姜志海.单片机原理及应用[M].北京:电子工业出版社,2005.

[7] 张志良.单片机原理与控制技术[M].北京:机械工业出版社,2001.

[8] 薛钧义,张彦斌.MCS-51/96系列单片微型计算机及其应用[M].西安:西安交通大学出版社,1997.

[9] 李广弟.单片机基础[M].北京:北京航空航天大学出版社,1994.