8051IDE仿真实验指导书.docx

上传人:b****2 文档编号:23228629 上传时间:2023-05-15 格式:DOCX 页数:37 大小:831.15KB
下载 相关 举报
8051IDE仿真实验指导书.docx_第1页
第1页 / 共37页
8051IDE仿真实验指导书.docx_第2页
第2页 / 共37页
8051IDE仿真实验指导书.docx_第3页
第3页 / 共37页
8051IDE仿真实验指导书.docx_第4页
第4页 / 共37页
8051IDE仿真实验指导书.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

8051IDE仿真实验指导书.docx

《8051IDE仿真实验指导书.docx》由会员分享,可在线阅读,更多相关《8051IDE仿真实验指导书.docx(37页珍藏版)》请在冰豆网上搜索。

8051IDE仿真实验指导书.docx

8051IDE仿真实验指导书

前言

MSC-51单片机自上世纪80年代出现以来,以其集成度高,处理功能强,可靠性高,系统结构简单,价格低廉等特点,在我国得到广泛的应用。

目前已在智能仪表,工业控制,机电一体化等方面取得了令人瞩目的成果。

对于电子,电气工程技术人员,以及非电类的工程技术人员来说,了解和掌握MSC-51单片机及其应用设计是非常必要的,在全国很多院校都开设了单片机及其应用接口等相关的课程,但编者在单片机的教学和实践中发现学生在学习和掌握单片机时存在如下几个问题:

1.单片机课程本身并不难学,学生在学习本门课程之前,基本已经掌握了8088、8086PC硬件技术的相关知识,相对于8088PC技术,单片机硬件系统和软件系统都相对简单易学,从教学的状况看,学生基本能懂得单片机的相关知识和概念,但无论是硬件设计和软件编程,学生普遍感到无从下手。

2.目前,用单片机仿真器结合PC机开发单片机是一种普遍的方法。

不容质疑的情况是学生对硬件系统的原理掌握比较好,比较重视硬件,轻视软件,让学生设计一个硬件系统不是难事,但当动手写一个程序,学生甚至连一行代码都写不出来。

这反映了学生的单片机综合应用能力比较差。

3.尽管现在的单片机C语言程序设计成为较为流行的趋势,但汇编语言指令程序效率高,且在能使学生更好,更深入地理解单片机知识方面仍然起到重要作用,因此,在学习阶段,汇编语言指令仍然使较为重要的教学过程。

本学习指导书旨在通过仿真软件8051IDE仿真单片机控制和运行的一些基本功能,期望能使学生更好地学习和掌握单片机的硬件和软件系统的相关知识。

一般说来,一些较为通用的算法和运行过程比如:

数值转换,基本计算,平方,开平方,傅立叶变换,定时,中断,接口,显示等软件仿真如果能通过,那么加载到实际应用系统上时,基本没有问题。

但应当指出的是:

仿真软件不能解决单片机的所有问题,如:

显示驱动,键盘扫描,8155,8255接口等,前向通道,后向通道等,仿真软件只能解决核心程序的仿真(如:

寄存器操作,接口操作,定时器计数器仿真,中断仿真,串行口仿真,甚至他们的综合仿真)和验证一些常用的算法等等。

实际系统设计时仍然要在真实的系统上运行。

8051IDE软件是美国ACEBUS公司1999年出品,集编辑,汇编,仿真于一体的基于WINDOWS的集成仿真软件,设计严谨,界面直观,编译检查清楚,符合单片机学习和设计的习惯。

特别是仿真功能:

有单步运行,单步断点,全速运行,监视窗口等等都和目前的单片机仿真系统运行方式几乎没有差异。

通过8051IDE软件仿真,相信学生能在单片机的软件开发设计和调试方面和理解单片机的硬件系统知识方面打下良好的基础。

 

上机前的注意事项

一.实验前应做好的实验准备包括:

◆了解实验目的、实验内容和要求

◆准备好试验仿真软件

◆思考实验步骤及每步应得到的结果

二.实验中细致认真并认真做好实验记录

◆要求自己独立编写实验仿真程序。

实验中,要独立思考,.记录中间结果、及时做好源文件的拷贝

◆实验结果要以仿真结果来说明

三.实验报告要求

1.实验目的

2.实验源程序

3.仿真结果

4.对思考题的理解或验证

5.实验收获和体会(只写体会最深的)

6.实验报告

注意:

除了熟悉8051IDE之外,在上机实验时,应做好实验准备(实验内容,源文件,以及实验目的),否则教师有权停止其上机实验。

禁止在上机时打游戏、实验报告互相抄袭,由于上机时间有限,请同学利用课余时间主动完成实验内容。

有条件的同学可以在自己的计算机上完成所有的实验设计任务。

 

8051IDE操作指南

1.,双击SETUP.EXE

图1安装界面

2.运行8051:

安装完成,启动8051IDE,如图2所示(打开的是示例程序)。

图2:

运行界面

2.输入程序(编辑)

选择:

FILE--NEW--系统打开一个编辑界面。

一般来说,考虑到程序“标号”区域,按三次TAB键,第二次,TAB键空出的区域使程序美观,第三次空出的区域用于写标号,标号的长度为8个字符的宽度。

建议在程序的头部空出几行,用几次回车。

一般建议,写程序用大写,尽管系统不区分大小写。

输入程序尽量使标号右对齐,程序左对齐,如上图示。

用;注释,如:

MOVA,R2;将数据送到累加器

首行应写ORG伪指令,末行应ENDSTART

3.汇编

选择“Assemble”菜单,如图示:

选择“Assemble”对源程序进行汇编。

如果没有错误,打开“View”菜单,选择“Output”,如图所示:

图3汇编菜单

图4汇编无错误输出

图5汇编存在错误输出

3.界面调整:

×选择:

Option---Default—出现以下界面,将Default选项改为“hexadecimal”,将Processor选项:

改为“8031

图6系统设置

选择View菜单:

图7View菜单

将你需要监视的窗口,在桌面上整齐排列。

如图2所示。

图8寄存器,端口,SFR,内部RAM(DIRECTRAM)状态

图9外部存贮器

4.系统仿真:

选择,菜单“Simulator”,“StartSimulator”,如图8所示。

图10运行菜单

全速运行:

将你的光标置与运行的程序之前,选择,“RunToCursor”,在程序中即可全速运行到光标处。

单步运行:

启动仿真之后,即可按F11,(STEPINTO)或者F10(STEPOVER)

单步跟踪运行,单步全速运行。

是一种最为常见的仿真方法。

在此过程中可以查看:

PORT,REGISTER,CONTROLREGISTER,DIRECTRAMEXTENALRAM,状态。

断点运行:

在需要设置断点的程序所在行首点击,选择“Simulator”菜单,选择“Togglebreakpoint”,在断点处左侧显示一个红色小点,表示此处即为程序运行的断点,程序运行到此处即自动停止。

如果程序要在多处设置断点,可以重复上述操作。

取消断点的方法是:

选择“Simulator”,选择“Removeallbreakpoints”,此时,左侧红色小点消失,断点设置全部取消。

图11单步仿真

图12单步断点仿真

注意:

8051IDE仿真系统给用户提供的资源,8031芯片的整个资源,如:

寄存器资源,(A,B,R0-R7),控制寄存器资源(TCON,SCON,TMOD,DPTR等等),接口(P0-P3),定时中断,内部RAM(directRAM):

00H-FFH,用户像利用真实的8031资源一样在软件编程时利用这些资源。

特别指出的是:

8031IDE给用户假设提供了64K的可编程程序空间和64K的外部RAM空间。

因此:

整个程序编程空间地址是:

0000H------FFFFH

外部RAM存贮空间的地址是:

0000H------FFFFH

实验一:

熟悉仿真环境,仿真实现简单的加法和直接数据存贮

实验目的:

编写简单的加法程序,通过仿真熟悉仿真软件的开发环境和基本操作。

实验要求:

将50H开始的20H个单元的内容和80H开始的20H个单元的内容分别相加,不计进位,将结果存入50H开始的单元.

程序初始是:

50H-70H先存入11H,80-A0H存入22H

程序参考:

ORG0000HSTART:

LJMP0100HORG0100HPROG:

MOVR0,#50H;被加数首地址MOVR1,#80H;加数首地址MOVR3,#20HLOOP1:

MOV@R0,#11HINCR0DJNZR3,LOOP1;循环置数MOVR3,#20HLOOP2:

MOV@R1,#22HINCR1DJNZR3,LOOP2;循环置数MOVA,#00HMOVR0,#50HMOVR1,#80HMOVR3,#20HLOOP3:

MOVA,@R0ADDA,@R1;加法运算MOV@R0,A;存入(50H)INCR0INCR1DJNZR3,LOOP3;循环存入ENDSTART

仿真过程:

系统经过汇编,没有错误后,启动仿真,打开寄存器显示,直接内存显示,连续按F11,系统将跟踪8031执行的过程,系统给50H单元置数时,观察直接内存状态如下图1.1,执行加法运算时观察内存如图1.2

 

 

图1.150-70H单元初始状态图1.2加法运算时状态

 

实验二基本程序练习

实验目的:

通过基本程序的练习,进一步掌握仿真过程和方法。

实验要求:

1.将R1,R2,R3,R4中的BCD码依次相加,要求中间计算和仍为BCD结果存放于片内RAM30H,31H,32H单元

2.比较片内相邻单元无符号数的大小,使按小数在前,大数在后的顺序存放,如两数相等,则建立起标志F0

程序参考:

程序1

ORG0000HLJMP0100HORG0100HMAIN:

MOVR0,#30HMOVR1,#09HMOVR2,#08HMOVR3,#07HMOVR4,#06HMOVA,R1ADDA,R2first:

ACALLSUB;调用BCD调整second:

ADDA,R3ACALLSUBADDA,R4ACALLSUBNOPSUB:

MOVR7,A;保留现场DAA;将当前和调整成BCDMOV@R0,AINCR0MOVA,R7RETENDSTART

 

仿真过程:

上述程序的关键是中间和仍然为BCD的程序的编写,当调用SUB子程序时,将已经计算得到的和转化为BCD仍然存放到A中,再进行下次的累加。

图2.1监视最后一次累加时A中数值为1EH,10进制调整为24,(算法是:

低半字节大于09,低半字节加06),结果如图2.2所示。

值得注意的是:

示例中的累加没有考虑进位位C.在上述程序中,读者可以在系统调用子程序时,观察堆栈SP的变化。

例如:

设定(SP)=30H,当程序执行到FIRST行时,堆栈记住的是SECOND行的地址,SECOND行的地址是0111H,因此,当调用FIRST行时,堆栈中的31H,32H单元的内容分别是:

11H,01H.点击“VIEW””DIRECTMEMORY”,观察直接内存单元如图2.3所示。

图2.1累加器A的情况图2.230H-32H累加和

图2.3堆栈中的变化(30H-32H单元)

程序2:

ORG0000HLJMP0100HORG0100HMAIN:

CLRF0MOV30H,#55HMOV31H,#33H;预先存入先大后小的数MOVR1,#31HMOVA,@R1MOVR2,A;暂存MOVR0,#30HMOVA,@R0MOVR7,A;暂存SUBBA,R2JCDONE;若(30H)-(31H)有借位,前数小JZESTAB;等于0,建立标志MOVA,R7;没有借位,前数大XCHA,@R1;交换MOV@R0,A;存入30H单元SJMPDONEDONE:

MOV32H,#0CCHJMPSTESTAB:

SETBF0ST:

SJMP$ENDMAIN

仿真过程:

程序在作减法运算时,A中存放的是R0单元的内容,R2中存放的R1单元的内容,接下来,若产生借位,说明R0单元的内容小,建立标志,结束程序。

若不产生借位,且不等于零,说明R0单元内容大,指令MOVA,R7,在于恢复A中的内容,为30H单元的内容,如图2.4所示。

下一步,将A与31H单元的内容互换,这时,(A)=33H,(31H)=55H,原(30H)=55H,不变,如图2.5所示。

最后将A中内容存放到30H单元。

如图2.6所示

图2.4A内容变化图2.5交换A与31H单元图2.6仿真结果

实验三两个双字节数相乘

实验目的:

通过较复杂程序的编写和仿真,强化学生设计和分析程序的能力。

实验内容:

设定被乘数的高字节已经在R7中,低字节在R6中,乘数的高字节在R5中,低字节在R4中。

积的四个字节依R0中的内容为初地址存放。

程序分析:

上述程序的算法是:

R6*R4=(R3)(R0)

R7*R4=(R2)(A+R3)

R6*R5=(R2)(A+R3)

R7*R5=(B+R1)(A+R2)

R7

R6

R5

R4

R3<-B

(R0)<-A

R2<=B

R3<-A+R3

(R0+1)<-A+R3

R2<-R2+B

(R0+3)<-B+R1

(R0+2)<-A+R2

 

注:

每次相乘,即执行MULAB积的低字节在A中,高字节在B中。

参考程序:

ORG0000HLJMP0100HORG0100H

START:

MOVR7,#09HMOVR6,#08HMOVR5,#07HMOVR4,#06HMUL1:

MOVR0,#30HMOVA,R6MOVB,R4MULABMOV@R0,AMOVR3,BMUL2:

MOVA,R7MOVB,R4MULABADDA,R3MOVR3,AMOVA,BADDCA,#00HMOVR2,AMUL3:

MOVA,R6MOVB,R5MULABADDA,R3INCR0MOV@R0,AMOVA,R2ADDCA,BMOVR2,AJNCMUL4MOVR1,#01HMUL4:

MOVA,R7MOVB,R5MULABADDA,R2INCR0MOV@R0,AMOVA,BADDCA,R1INCR0MOV@R0,AENDSTART

 

仿真过程:

按照上述程序算法,整个程序实际上分四步骤,每次都是两个单字节相乘。

将积按上图存放。

第一次相乘,积高字节在B中,低字节在A中,B转存于R3中。

如图3.1所示。

第二次相乘,积的高字节转存于R2中,低字节A与前面高字节相加后存放到R3中,如图3.2所示。

第三次相乘,继续同样的过程,但低字节存放到(R0+1)中,如图3.3所示。

第四次相乘时,只是将积的低字节和前面累加得到的R2相加存放到(R0+2)中,积的高字节考虑可能的进位存放到(R0+3)中,如图3.4所示。

图3.1第1次相乘图3.2第2次相乘

 

图3.3第3次相乘的高字节图3.3第3次相乘的低字节

图3.4第四次相乘,结果存放到32H,33H单元

 

实验四:

数制转换

 

实验目的:

数制转换程序的练习有助于学生掌握在设计较大的程序时更加得心应手。

实验内容:

1.将8位二进制转换为BCD码

2.将16进制转换为ASCII码

3.将BCD码转换为ASCII码

实验程序

程序1:

设8位二进制数已在A中,转换后的BCD存入片内20H,20H单元

ORG0000HLJMP0100HORG0100HMAIN:

MOVA,#0ECHMOVB,#100DIVABMOVR0,#21HMOV@R0,AMOVR0,#20HMOVA,#10XCHA,BDIVABSWAPAADDA,BMOV@R0,AENDMAIN

仿真过程:

程序首先除以100,将得到的数存入21H单元,A寄存器中的数为236(十进制),如图4.1所示。

这时,余数在B中,交换指令使得中为余数,B中为10,除法指令使得商在A中,余数在B中,如图4.2所示。

图4.1累加器A中的数图4.2第二次除法得到的结果

图4.3A中的数半字节交换图4.4最后得到的结果(21H,20H单元)

通过半字节交换指令,在A寄存器中得到的数如图4.3所示。

这是将A,B寄存器中的数相加,得到BCD码。

如图4.4所示。

程序2:

数字0-9的ASCII码是30-39,英文大写A-F的ASCII码是41-46,可见该十六进制数若<10,加30H,如大于等于10,则除加30H外,另加07H.

ORG0000HLJMP0100HORG0100HMAIN:

MOVA,#09HMOVR2,AADDA,#0F6H;MOVA,R2JNCAD30ADDA,#07HAD30:

ADDA,#30HSJMP$

仿真过程:

上述程序比较简单,程序仿真时,要打开寄存器观察,如果要转换的数据是09,则作加法运算时,自然不会产生进位,故再加30H,得到39H,如图4.5所示。

当要转换的数据为0FH时,则由于产生进位,则除加上30H外,再加07H,最后结果如图4.6所示。

图4.5数字9转换后的结果图4.60FH转换后的结果

将BCD码转换为ASCII码

设定待转换的BCD码在A中,则相应的程序如下:

ORG0000H

LJMP0100H

MAIN:

MOVA,#08H

MOVDPTR,#TAB

MOVCA,@A+DPTR

SJMP$

TAB:

DB30

DB31

DB32

DB33

DB34

DB35

DB36

DB37

DB38

DB39

仿真过程:

数字0-9的ASCII码先存放到一个缓冲区中,通过查表指令,即可得到数字0-9的ASCII码,读者再此程序中要仔细体会查表指令的应用。

并通过观察寄存器仔细体会单片机程序指针DPTR的变化,再上述程序中,当执行完指令MOVCA,@A+DPTR后,再A寄存器中已经得到查表后的结果,如图4.7所示

 

图4.7查表得到的结果(累加器A)

 

实验5定时器应用

 

实验目的:

编写简单的定时程序,掌握定时器的使用。

实验要求:

设定定时器T0,用方式1,当时间到使(50H)单元-70H单元数均为0CCH

程序参考:

ORG0000HSTART:

LJMP0100HORG0100HPROG:

MOVR1,#50HMOVR6,#20HLOOP2:

MOV@R1,#00HINCR1DJNZR6,LOOP2;循环置数,使得(50H-70H)=00HMOVR0,#0FCH;R0作为循环定时,可以定时较CLRTF0;长时间,观察状态时此值较大LOOP3:

MOVTMOD,#00000001B;方式1,用T0MOVTH0,#3CHMOVTL0,#0AFH;初值设定SETBTR0;启动JNBTF0,$;等,直到定时时间到,TF0=1CLRTF0;为下次,TF0=1作准备DJNZR0,LOOP3;循环定时,

CLRTR0;关闭定时器MOVR1,#50HMOVR3,#21HLOOP4:

MOV@R1,#0CCHINCR1DJNZR3,LOOP4;定时时间到,循环置数0CCHENDSTART

仿真过程:

分两个步骤,对于定时器,一种方法是:

将光标置于ENDSTART之前,然后,选择,“Simulator”“RunToCursor”,直接观察DIRECTRAM状态,如图5.1所示。

一种方法是更改定时器的初值,TH0,TL0,将其置于较大的数:

如(TH0)=0FFH

(TL0)=00H,并将R0循环次数改为较小的数,如(R0)=02H,这样作的目的是便于用单步的方法进行跟踪,定时器单步几次即可溢出,循环几次就循环结束,更有利于观察程序的运行。

如图5.2所示。

特别咬说明的是:

当修改了程序后,要重新汇编,重新启动仿真。

图5.1跟踪T0的变化图5.2直接运行到光标处,输出结果

 

实验6定时器中断

实验目的:

编写简单的定时器中断程序,理解中断系统执行过程,会编写中断服务程序。

更直观地理解堆栈的变化。

实验要求:

设定定时器T1,用方式1,当时间到通过中断服务程序使(50H)单元=0CCH

程序参考:

ORG0000HAJMP0100HORG001BH;T1中断入口地址LJMP2000HORG0100HSTART:

MOVSP,#30H

MOVTMOD,#10010000H;采用T1,方式1MOVTH1,#0FEHMOVTL1,#0F0HMOVIE,#99H;开放中断T1SETBTR1;启动定时器T1JNBTF1,$;等,时间到CLRTF1

CLRTR1NOPNOP;中断服务程序ORG2000H;时间到,发生中断MOVR0,#50HMOVA,#0CCH;中断所完成的任务MOV@R0,ARETI;注意:

中断返回指令ENDSTART

 

仿真过程:

同样用单步跟踪过程,上述程序中定时器初值设定的比较大,如图6.1所示。

单步跟踪比较容易,现在要注意的问题是:

当定时器时间到,发生中断,系统立即跳到001BH地址执行,通过LJMP2000H跳到中断服务程序完成执行的过程。

读者通过单步执行上述程序可以更好地理解中断服务程序的执行过程,和掌握中断服务程序的编写方法。

若对执行堆栈感兴趣,可以查看堆栈中地址值的变化。

图中JNBTF1的地址是:

0111H,系统发生中断时,将此地址压入堆栈,将(SP)<-(SP)+2,PC=001BH,如图6.2所示。

而从图6.3中则可以看出堆栈指针所指向的地址是:

0111H,当中断服务程序返回时,将压入堆栈的地址赋值给PC,(PC)=0111H,此时堆栈出栈,(SP)=30H,如图6.4所示。

图6.1定时器初值的变化

图6.2压入堆栈后堆栈指针的变化,堆栈初值为(SP)=30H

图6.3堆栈指针所指向的地址

图6.4调用中断服务程序结束,堆栈指针的变化

 

实验7定时器中断的累加变化

实验目的:

掌握利用定时器定时较大的时间,比如1秒。

掌握产生秒脉冲的方法。

实验要求:

设定定时器T1,用方式1,每隔1秒,通过中断服务程序使(50H)单元从00加1变化到0FFH后停止。

程序参考:

ORG0000HSTART:

LJMP0100HORG001BHLJMP2000HORG0100HPROG:

MOVSP,#30H

MOVR0,#50HMOVR1,#00HMOVR4,#00HMOVR5,#00HMOVTMOD,#10010000B;定时器T1,方式1MOVTH1,#15HMOVTL1,#80H;定时50毫秒MOVIE,#10001000B;开放中断SETBTR1CLRTF1LOOP:

CJNER4,#0FFH,LOOP;构造死循环,当(50H)CLRTF1;没有变化到FFH时,NOPNOPORG2000HTINT:

INCR1CJNER1,#14H,LOOP2;中断累计20次,时间1秒MOVR1,#00H;计数器清零,为下一个1INCR5;秒作准备MOVA,R5MOV@R0,A;1秒到,(50H)内容加1LO

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 信息与通信

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1