1、8051IDE仿真实验指导书前 言MSC-51单片机自上世纪80年代出现以来,以其集成度高,处理功能强,可靠性高,系统结构简单,价格低廉等特点,在我国得到广泛的应用。目前已在智能仪表,工业控制,机电一体化等方面取得了令人瞩目的成果。对于电子,电气工程技术人员,以及非电类的工程技术人员来说,了解和掌握MSC-51单片机及其应用设计是非常必要的,在全国很多院校都开设了单片机及其应用接口等相关的课程,但编者在单片机的教学和实践中发现学生在学习和掌握单片机时存在如下几个问题:1单片机课程本身并不难学,学生在学习本门课程之前,基本已经掌握了8088、8086PC硬件技术的相关知识,相对于8088PC技术
2、,单片机硬件系统和软件系统都相对简单易学,从教学的状况看,学生基本能懂得单片机的相关知识和概念,但无论是硬件设计和软件编程,学生普遍感到无从下手。2目前,用单片机仿真器结合PC机开发单片机是一种普遍的方法。不容质疑的情况是学生对硬件系统的原理掌握比较好,比较重视硬件,轻视软件,让学生设计一个硬件系统不是难事,但当动手写一个程序,学生甚至连一行代码都写不出来。这反映了学生的单片机综合应用能力比较差。3尽管现在的单片机C语言程序设计成为较为流行的趋势,但汇编语言指令程序效率高,且在能使学生更好,更深入地理解单片机知识方面仍然起到重要作用,因此,在学习阶段,汇编语言指令仍然使较为重要的教学过程。本学
3、习指导书旨在通过仿真软件8051IDE 仿真单片机控制和运行的一些基本功能,期望能使学生更好地学习和掌握单片机的硬件和软件系统的相关知识。一般说来,一些较为通用的算法和运行过程比如:数值转换,基本计算,平方,开平方,傅立叶变换,定时,中断,接口,显示等软件仿真如果能通过,那么加载到实际应用系统上时,基本没有问题。但应当指出的是:仿真软件不能解决单片机的所有问题,如:显示驱动,键盘扫描,8155,8255接口等,前向通道,后向通道等,仿真软件只能解决核心程序的仿真(如:寄存器操作,接口操作,定时器计数器仿真,中断仿真,串行口仿真,甚至他们的综合仿真)和验证一些常用的算法等等。实际系统设计时仍然要
4、在真实的系统上运行。8051IDE 软件是美国ACEBUS 公司1999年出品,集编辑,汇编,仿真于一体的基于WINDOWS的集成仿真软件,设计严谨,界面直观,编译检查清楚,符合单片机学习和设计的习惯。特别是仿真功能:有单步运行,单步断点,全速运行,监视窗口等等都和目前的单片机仿真系统运行方式几乎没有差异。通过8051IDE 软件仿真,相信学生能在单片机的软件开发设计和调试方面和理解单片机的硬件系统知识方面打下良好的基础。上机前的注意事项一 实验前应做好的实验准备包括: 了解实验目的、实验内容和要求 准备好试验仿真软件 思考实验步骤及每步应得到的结果二 实验中细致认真并认真做好实验记录 要求自
5、己独立编写实验仿真程序。实验中,要独立思考,. 记录中间结果、及时做好源文件的拷贝 实验结果要以仿真结果来说明三. 实验报告要求1实验目的2实验源程序3仿真结果 4对思考题的理解或验证5实验收获和体会(只写体会最深的)6实验报告注意:除了熟悉8051IDE之外,在上机实验时,应做好实验准备(实验内容,源文件,以及实验目的),否则教师有权停止其上机实验。禁止在上机时打游戏、实验报告互相抄袭,由于上机时间有限,请同学利用课余时间主动完成实验内容。有条件的同学可以在自己的计算机上完成所有的实验设计任务。8051 IDE 操作指南1,双击SETUP.EXE 图1 安装界面 2运行8051:安装完成,启
6、动8051 IDE,如图2所示(打开的是示例程序)。 图2:运行界面 2输入程序(编辑) 选择:FILE-NEW-系统打开一个编辑界面。一般来说,考虑到程序“标号”区域, 按三次TAB键,第二次,TAB键空出的区域使程序美观,第三次空出的区域用于写标号,标号的长度为8个字符的宽度。建议在程序的头部空出几行,用几次回车。一般建议,写程序用大写,尽管系统不区分大小写。输入程序尽量使标号右对齐,程序左对齐,如上图示。用 ;注释,如:MOV A,R2 ;将数据送到累加器首行应写ORG 伪指令,末行应 END START 3汇编选择 “Assemble” 菜单,如图示:选择“Assemble” 对源程序
7、进行汇编。如果没有错误,打开“View ”菜单,选择 “Output”,如图所示:图3 汇编菜单图4 汇编无错误输出图5 汇编存在错误输出3.界面调整: 选择:Option-Default出现以下界面,将Default选项改为“hexadecimal”,将Processor 选项:改为“8031图6 系统设置选择 View 菜单:图7 View 菜单将你需要监视的窗口,在桌面上整齐排列。如图2所示。图8 寄存器,端口,SFR ,内部RAM(DIRECT RAM) 状态图9 外部存贮器4系统仿真: 选择,菜单“Simulator”,“Start Simulator ”,如图8所示。图10 运行菜
8、单全速运行:将你的光标置与运行的程序之前,选择,“Run To Cursor”,在程序中即可全速运行到光标处。单步运行:启动仿真之后,即可按 F11,(STEP INTO)或者F10(STEP OVER)单步跟踪运行,单步全速运行。是一种最为常见的仿真方法。在此过程中可以查看:PORT,REGISTER,CONTROL REGISTER,DIRECT RAM EXTENAL RAM,状态。断点运行:在需要设置断点的程序所在行首点击,选择“Simulator”菜单,选择“Toggle break point ”,在断点处左侧显示一个红色小点,表示此处即为程序运行的断点,程序运行到此处即自动停止。
9、如果程序要在多处设置断点,可以重复上述操作。取消断点的方法是:选择“Simulator”,选择“Remove all break points”,此时,左侧红色小点消失,断点设置全部取消。图11 单步仿真图12 单步断点仿真注意:8051IDE 仿真系统给用户提供的资源,8031 芯片的整个资源,如:寄存器资源,(A,B,R0-R7),控制寄存器资源(TCON,SCON,TMOD,DPTR 等等),接口(P0-P3),定时中断,内部RAM(direct RAM):00H-FFH,用户像利用真实的8031 资源一样在软件编程时利用这些资源。特别指出的是:8031 IDE 给用户假设提供了64K
10、的可编程程序空间和64K的外部RAM 空间。因此:整个程序编程空间地址是: 0000H-FFFFH 外部RAM 存贮空间的地址是:0000H-FFFFH实验一:熟悉仿真环境,仿真实现简单的加法和直接数据存贮实验目的:编写简单的加法程序,通过仿真熟悉仿真软件的开发环境和基本操作。实验要求:将50H 开始的20H个单元的内容和80H 开始的20H个单元的内容分别相加,不计进位,将结果存入50H 开始的单元. 程序初始是:50H70H 先存入11H,80-A0H 存入22H 程序参考: ORG 0000H START: LJMP 0100H ORG 0100H PROG: MOV R0,#50H ;
11、被加数首地址 MOV R1,#80H ;加数首地址 MOV R3,#20H LOOP1: MOV R0,#11H INC R0 DJNZ R3,LOOP1 ;循环置数 MOV R3,#20H LOOP2: MOV R1,#22H INC R1 DJNZ R3,LOOP2 ;循环置数 MOV A,#00H MOV R0,#50H MOV R1,#80H MOV R3,#20H LOOP3: MOV A,R0 ADD A,R1 ;加法运算 MOV R0,A ;存入(50H) INC R0 INC R1 DJNZ R3,LOOP3 ;循环存入 END START仿真过程:系统经过汇编,没有错误后,启
12、动仿真,打开寄存器显示,直接内存显示,连续按 F11,系统将跟踪8031 执行的过程,系统给50H 单元置数时,观察直接内存状态如下图1.1,执行加法运算时观察内存如图1.2 图1.1 50-70H单元初始状态 图1.2 加法运算时状态实验二 基本程序练习实验目的:通过基本程序的练习,进一步掌握仿真过程和方法。实验要求:1 将R1,R2,R3,R4 中的BCD 码依次相加,要求中间计算和仍为BCD 结果存放于片内RAM 30H,31H,32H单元2 比较片内 相邻单元无符号数的大小,使按小数在前,大数在后的顺序存放,如两数相等,则建立起标志F0程序参考:程序1ORG 0000H LJMP 01
13、00H ORG 0100H MAIN:MOV R0,#30H MOV R1,#09H MOV R2,#08H MOV R3,#07H MOV R4,#06H MOV A,R1 ADD A,R2 first: ACALL SUB ;调用BCD调整 second:ADD A,R3 ACALL SUB ADD A,R4 ACALL SUB NOP SUB: MOV R7,A ;保留现场 DA A ;将当前和调整成BCD MOV R0,A INC R0 MOV A,R7 RET END START仿真过程:上述程序的关键是中间和仍然为BCD的程序的编写,当调用SUB子程序时,将已经计算得到的和转化为B
14、CD 仍然存放到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”DIRECT MEMORY”,观察直接内存单元如图 2.3 所示。 图
15、2.1 累加器A的情况 图2.2 30H32H累加和图2.3 堆栈中的变化(30H32H单元)程序2: ORG 0000H LJMP 0100H ORG 0100H MAIN: CLR F0 MOV 30H,#55H MOV 31H,#33H ;预先存入先大后小的数 MOV R1,#31H MOV A,R1 MOV R2,A ;暂存 MOV R0,#30H MOV A,R0 MOV R7,A ;暂存 SUBB A,R2 JC DONE ;若(30H)-(31H)有借位,前数小 JZ ESTAB ;等于0,建立标志 MOV A,R7 ;没有借位,前数大 XCH A,R1 ;交换 MOV R0,A
16、 ;存入30H 单元 SJMP DONE DONE: MOV 32H,#0CCH JMP ST ESTAB: SETB F0 ST: SJMP $ END MAIN 仿真过程:程序在作减法运算时,A中存放的是R0 单元的内容,R2中存放的R1单元的内容,接下来,若产生借位,说明R0 单元的内容小,建立标志,结束程序。若不产生借位,且不等于零,说明R0单元内容大,指令 MOV A,R7,在于恢复A 中的内容,为30H单元的内容,如图2.4所示。下一步,将A与31H 单元的内容互换,这时,(A)=33H, (31H)=55H,原(30H)=55H ,不变,如图2.5 所示。最后将A 中内容存放到
17、30H 单元。如图2.6 所示 图2.4 A 内容变化 图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)R7R6R5R4R3-B(R0)-AR2=BR3-A+R3(R0+1)-A+R3R2-R2+B(R
18、0+3)-B+R1(R0+2)-A+R2注:每次相乘,即执行MUL AB 积的低字节在A中,高字节在B中。 参考程序: ORG 0000H LJMP 0100H ORG 0100HSTART: MOV R7,#09H MOV R6,#08H MOV R5,#07H MOV R4,#06H MUL1:MOV R0,#30H MOV A,R6 MOV B,R4 MUL AB MOV R0,A MOV R3,B MUL2: MOV A,R7 MOV B,R4 MUL AB ADD A,R3 MOV R3,A MOV A,B ADDC A,#00H MOV R2,A MUL3: MOV A,R6 MO
19、V B,R5 MUL AB ADD A,R3 INC R0 MOV R0,A MOV A,R2 ADDC A,B MOV R2,A JNC MUL4 MOV R1,#01H MUL4: MOV A,R7 MOV B,R5 MUL AB ADD A,R2 INC R0 MOV R0,A MOV A,B ADDC A,R1 INC R0 MOV R0,A END START 仿真过程:按照上述程序算法,整个程序实际上分四步骤,每次都是两个单字节相乘。将积按上图存放。第一次相乘,积高字节在B中,低字节在A中,B 转存于R3中。如图 3.1 所示。第二次相乘,积的高字节转存于R2 中,低字节A与前面高
20、字节相加后存放到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
21、码转换为ASCII 码实验程序程序1:设8位二进制数已在A中,转换后的BCD存入片内20H,20H单元 ORG 0000H LJMP 0100H ORG 0100H MAIN: MOV A,#0ECH MOV B,#100 DIV AB MOV R0,#21H MOV R0,A MOV R0,#20H MOV A,#10 XCH A,B DIV AB SWAP A ADD A,B MOV R0,A END MAIN仿真过程:程序首先除以100,将得到的数存入21H单元,A寄存器中的数为236(十进制),如图4.1 所示。这时,余数在B中,交换指令使得中为余数,B中为10,除法指令使得商在A中,
22、余数在B中,如图4.2 所示。 图4.1 累加器A中的数 图4.2 第二次除法得到的结果 图4.3 A中的数半字节交换 图4.4 最后得到的结果(21H,20H单元)通过半字节交换指令,在A寄存器中得到的数如图4.3 所示。这是将A,B寄存器中的数相加,得到BCD码。如图4.4所示。程序2:数字09 的ASCII码是3039,英文大写A-F 的ASCII 码是4146,可见该十六进制数若10,加30H, 如大于等于10,则除加30H 外,另加07H. ORG 0000H LJMP 0100H ORG 0100H MAIN: MOV A,#09H MOV R2,A ADD A,#0F6H ; M
23、OV A,R2 JNC AD30 ADD A,#07H AD30: ADD A,#30H SJMP $仿真过程:上述程序比较简单,程序仿真时,要打开寄存器观察,如果要转换的数据是09,则作加法运算时,自然不会产生进位,故再加30H,得到39H,如图4.5 所示。当要转换的数据为0FH 时,则由于产生进位,则除加上30H外,再加07H,最后结果如图4.6所示。 图4.5 数字9转换后的结果 图4.6 0FH 转换后的结果将BCD 码转换为ASCII码设定待转换的BCD码在A中,则相应的程序如下: ORG 0000HLJMP 0100HMAIN: MOV A,#08HMOV DPTR,#TAB M
24、OVC A,A+DPTRSJMP $TAB: DB 30DB 31DB 32DB 33DB 34DB 35DB 36DB 37DB 38DB 39 仿真过程:数字09 的ASCII 码先存放到一个缓冲区中,通过查表指令,即可得到数字09的ASCII码,读者再此程序中要仔细体会查表指令的应用。并通过观察寄存器仔细体会单片机程序指针DPTR 的变化,再上述程序中,当执行完指令 MOVC A,A+DPTR 后,再A 寄存器中已经得到查表后的结果,如图4.7 所示图4.7 查表得到的结果(累加器A)实验5 定时器应用实验目的:编写简单的定时程序,掌握定时器的使用。实验要求:设定定时器T0,用方式1,当
25、时间到使(50H)单元70H单元数均为0CCH程序参考:ORG 0000H START: LJMP 0100H ORG 0100H PROG: MOV R1,#50H MOV R6,#20H LOOP2:MOV R1,#00H INC R1 DJNZ R6,LOOP2 ;循环置数,使得(50H-70H)=00H MOV R0,#0FCH ;R0 作为循环定时,可以定时较 CLR TF0 ;长时间,观察状态时此值较大 LOOP3:MOV TMOD,#00000001B ;方式1,用T0 MOV TH0,#3CH MOV TL0,#0AFH ;初值设定 SETB TR0 ;启动 JNB TF0,$
26、 ;等,直到定时时间到,TF0 1 CLR TF0 ;为下次,TF0=1 作准备 DJNZ R0,LOOP3 ;循环定时,CLR TR0 ;关闭定时器 MOV R1,#50H MOV R3,#21H LOOP4: MOV R1,#0CCH INC R1 DJNZ R3,LOOP4 ;定时时间到,循环置数 0CCH END START仿真过程:分两个步骤,对于定时器,一种方法是:将光标置于 END START 之前,然后,选择,“Simulator” “Run To Cursor ”,直接观察 DIRECT RAM 状态,如图5.1 所示。一种方法是更改定时器的初值,TH0,TL0,将其置于较大
27、的数:如 (TH0)=0FFH(TL0)=00H,并将R0 循环次数改为较小的数,如(R0)=02H,这样作的目的是便于用单步的方法进行跟踪,定时器单步几次即可溢出,循环几次就循环结束,更有利于观察程序的运行。如图5.2 所示。特别咬说明的是:当修改了程序后,要重新汇编,重新启动仿真。图5.1 跟踪T0 的变化 图5.2 直接运行到光标处,输出结果实验6 定时器中断实验目的:编写简单的定时器中断程序,理解中断系统执行过程,会编写中断服务程序。更直观地理解堆栈的变化。实验要求:设定定时器T1,用方式1,当时间到通过中断服务程序使(50H)单元0CCH 程序参考:ORG 0000H AJMP 01
28、00H ORG 001BH ;T1 中断入口地址 LJMP 2000H ORG 0100H START: MOV SP,#30HMOV TMOD,#10010000H ;采用T1,方式1 MOV TH1,#0FEH MOV TL1,#0F0H MOV IE,#99H ;开放中断T1 SETB TR1 ;启动定时器T1 JNB TF1,$ ;等,时间到 CLR TF1CLR TR1 NOP NOP ;中断服务程序 ORG 2000H ;时间到,发生中断 MOV R0,#50H MOV A,#0CCH ;中断所完成的任务 MOV R0,A RETI ;注意:中断返回指令 END START仿真过程
29、:同样用单步跟踪过程,上述程序中定时器初值设定的比较大,如图6.1所示。单步跟踪比较容易,现在要注意的问题是:当定时器时间到,发生中断,系统立即跳到001B H地址执行,通过LJMP 2000H 跳到中断服务程序完成执行的过程。读者通过单步执行上述程序可以更好地理解中断服务程序的执行过程,和掌握中断服务程序的编写方法。若对执行堆栈感兴趣,可以查看堆栈中地址值的变化。图中 JNB TF1 的地址是:0111H,系统发生中断时,将此地址压入堆栈,将(SP)-(SP)+2,PC=001BH,如图6.2 所示。而从图6.3中则可以看出 堆栈指针所指向的地址是:0111H,当中断服务程序返回时,将压入堆
30、栈的地址赋值给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后停止。 程序参考: ORG 0000H START: LJMP 0100H ORG 001BH LJMP 2000H ORG 0100H P
31、ROG: MOV SP,#30HMOV R0,#50H MOV R1,#00H MOV R4,#00H MOV R5,#00H MOV TMOD,#10010000B ;定时器T1,方式1 MOV TH1,#15H MOV TL1,#80H ;定时50毫秒 MOV IE,#10001000B ;开放中断 SETB TR1 CLR TF1 LOOP: CJNE R4,#0FFH,LOOP ;构造死循环,当(50H) CLR TF1 ;没有变化到FFH 时, NOP NOP ORG 2000H TINT: INC R1 CJNE R1,#14H,LOOP2 ;中断累计20次,时间1秒 MOV R1,#00H ;计数器清零,为下一个1 INC R5 ;秒作准备 MOV A,R5 MOV R0,A ;1秒到,(50H)内容加1 LO
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1