中山大学单片机实验二1.docx
《中山大学单片机实验二1.docx》由会员分享,可在线阅读,更多相关《中山大学单片机实验二1.docx(14页珍藏版)》请在冰豆网上搜索。
中山大学单片机实验二1
中山大学单片机实验二实验报告
【实验原理】
第一部分:
软件使用指南
软件启动:
在启动MCS51仿真程序之前,先将实验系统板的电源线连接好,并将实验系统板串行通信线与计算机连接好,然后接通实验系统板电源。
启动软件和系统板连接:
点击“开始”→“程序”→“MCS51”→按下系统板“RESET”→将串口改为“COM1”波特率改为“2400”→“确定”。
在编译调试的过程中,如遇到问题需要对系统进行复位,可在主菜单区的“调试”子目录中点击确定,系统板将复位,并重新与计算机通信连接。
第二部分:
编程学习
【程序一】查表程序
实验步骤:
(1)按照软件使用指南连接好实验电路设置参数并打开MCS51建立与系统板之间的通信,点击新建汇编文件符号,打开新建窗口;
(2)将查表程序按上面所示输入汇编窗口中,并存盘,注意文件名不要有中文字和最好不要超过八个字符;
(3)点击汇编命令开始进行汇编,汇编结束后将会弹出编译结果窗口,根据提示修改程序中的错误,直到没有错误为止;
(4)汇编程序没有错误后,点击“调试”,将OBJ文件下载到系统板中,此时系统板上的绿色LED一闪一闪的亮,表示计算机正在和系统板通信,通信完毕,就可以运行程序了。
(5)将光标放到LOOP:
SJMPLOOP选择“运行到光标处”,程序即开始运行了。
做完后可以查看寄存器和内部数据存储器的数据。
(6)选择“调试”→“程序复位”,可以看到PC变为4000H,修改60H中的数值为“00”,再将光标放到LOOP:
SJMPLOOP后面,运行完程序以后,记录60H,61H,62H中的数值。
(7)重复(6)的步骤,将60H中的数值从“01”到“21”变化,记录数据如下表所示:
储存单元
60H
(BCD)码
00
01
02
03
04
05
06
07
08
09
10
11
12
13
61H
实验值
DA
00
00
00
00
01
02
03
05
07
10
13
17
21
理论值
00
00
00
00
00
01
02
03
05
07
10
13
17
21
62H
实验值
00
01
08
27
64
25
16
43
12
29
00
31
28
97
理论值
00
01
08
27
64
25
16
43
12
29
00
31
28
97
60H
(BCD)码
14
15
16
17
18
19
20
21
61H
实验值
27
33
40
49
58
68
80
92
理论值
27
33
40
49
58
68
80
92
62H
实验值
44
75
96
13
32
59
00
61
理论值
44
75
96
13
32
59
00
61
✧实验数据结果分析:
程序一的查表程序是查立方表程序,把以BCD码形式表示的,不大于21的某数存入60H中,运行程序后便可以在61H,62H单元差得其立方值。
我们上面的数据可以看出,除了60H中存储的是00H不满足程序意图外,其他的均是实验值和理论值一样,我们可以说,这个程序能达到目的。
至于00H得不到理论值,有可能是机器自身的原因,与程序本身无太大关系。
这正好可以说明汇编语言没有C语言好把握。
【程序二】排序程序
实验步骤:
(1)按照软件使用指南连接好实验电路设置参数并打开MCS51建立与系统板之间的通信,点击新建汇编文件符号,打开新建窗口;
(2)将查表程序按上面所示输入汇编窗口中,并存盘,注意文件名不要有中文字和最好不要超过八个字符;
(3)点击汇编命令开始进行汇编,汇编结束后将会弹出编译结果窗口,根据提示修改程序中的错误,直到没有错误为止;
(4)汇编程序没有错误后,点击“调试”,将OBJ文件下载到系统板中,此时系统板上的绿色LED一闪一闪的亮,表示计算机正在和系统板通信,通信完毕,就可以运行程序了。
(5)打开内部存储器窗口,记录50H~55H六个存储单元的初始值,将光标移到LOOP:
SJMPLOOP处,然后选择运行到光标处,运行结束后,再查看50H~55H中的数据。
数据结果如下表所示:
存储单元
50H
51H
52H
53H
54H
55H
初始值
FFH
15H
3BH
A4H
CEH
09H
执行后理论值
09H
15H
3BH
A4H
CEH
FFH
执行结果
09H
15H
3BH
A4H
CEH
FFH
✧实验数据结果分析:
这个程序是把六个数从小到大排序的程序,从我们的理论值和实验值完全吻合可以看出我们的程序调试很成功,达到了预期的目的。
【程序三】算术运算程序
实验步骤:
(1)
(2)(3)(4)步与上面的两个实验基本相同,这里都不再赘述。
(5)打开寄存器窗口,点击调试,单步执行程序,记录寄存器ACC和B的结果,如下所示:
单步执行次数
实验值
理论值
A
B
A
B
1
00H
00H
00H
00H
2
00H
00H
00H
00H
3
B9H
00H
B9H
00H
4
7DH
00H
7DH
00H
5
AEH
00H
AEH
00H
6
14H
00H
14H
00H
7
14H
00H
14H
00H
8
50H
00H
50H
00H
9
50H
00H
50H
00H
10
50H
03H
50H
03H
11
1AH
02H
1AH
02H
12
34H
00H
34H
00H
13
34H
00H
34H
00H
14
34H
00H
34H
00H
15
34H
00H
34H
00H
16
34H
00H
34H
00H
✧通过比较实验一中系统板单步执行结果可以看出,用MCS51记录的结果和直接在系统板上输入机器码执行结果相同,我们可以用软件编辑汇编语言程序,然后他自己生成OBJ码,下载到系统板上相应的存储区,运行效果是一样的,这比我们手动将机器码输入存储单元要简单快捷,但是不管怎么样,程序都要遵循硬件配置
(6)列表文件:
命名为d22.lst
A51MACROASSEMBLERD22DATE28/10/11PAGE1
MS-DOSMACROASSEMBLERA51V4.4
OBJECTMODULEPLACEDINE:
\09331027\D22.OBJ
ASSEMBLERINVOKEDBY:
A51E:
\09331027\D22.ASMDEBUG
LOCOBJLINESOURCE
1;d22.asm
40002ORG4000H
4000C2003MAIN:
CLR00H
40027F054MOVR7,#05H
400478505MOVR0,#50H
4006E66MOVA,@R0
4007FA7COMP:
MOVR2,A
4008088INCR0
4009C39CLRC
400A9610SUBBA,@R0
400BEA11MOVA,R2
400C400612JCNCHAN
400ED20013SETB00H
4010C614CHAN:
XCHA,@R0
40111815DECR0
4012C616XCHA,@R0
40130817INCR0
4014E618NCHAN:
MOVA,@R0
4015DFF019DJNZR7,COMP
40172000E620JB00H,MAIN
401A80FE21LOOP:
SJMPLOOP
22END
A51MACROASSEMBLERD22DATE28/10/11PAGE2
SYMBOLTABLELISTING
------------------
NAMETYPEVALUEATTRIBUTES
CHAN...CADDR4010HA
COMP...CADDR4007HA
LOOP...CADDR401AHA
MAIN...CADDR4000HA
NCHAN...CADDR4014HA
REGISTERBANK(S)USED:
0
ASSEMBLYCOMPLETE,NOERRORSFOUND
【程序四】字符显示驱动
实验步骤:
(1)实验连线:
接线前要关机!
将P1口的P1.0~~P1.5与数码管的输入LED6~~LED1相连,74LS273的00~~07与LEDA~~LEDP相连,片选信号CS273与CS0相连。
(2)在开机前将数码管旁边的八个并排的跳针拔不来。
(3)以下的步骤跟实验一中
(1)
(2)(3)(4)类似,这里不再赘述。
(4)点击调试——全速运行,则看到六个数码管轮流显示0000,1111,2222,3333,4444,5555,6666,7777,8888,9999,0000等等。
✧实验结果分析:
本实验采用动态显示,也就是一位一位的轮流点亮显示器LED,把字符的显示代码送出在数码管上显示。
【程序五】自编程序
程序编写要求:
设50H单元放有一个十六进制数,要把它转换为十进制数,放在51H,52H,单元,请附上上机运行调试好的汇编程序。
实验数据记录如下:
存储单元
实际值
理论值
实际值
理论值
实际值
理论值
实际值
理论值
50H
EAH
FFH
10H
2FH
51H
02H
02H
20H
02H
00H
00H
00H
00H
52H
34H
34H
55H
55H
16H
16H
47H
47H
实验值与理论值一样,我的程序正确。
第三部分:
思考题
1.写出每个程序的运行结果,画出程序4的流程图。
流程图如下图所示:
2.在查表程序中,若把输入到60H单元的十进制数扩大为可达到50的数,应该如何修改程序?
数据表格要同时如何修改?
写出修改后的程序。
答:
50*50*50=125000,所以要用三个存储单元才能完全够用,因此,列表要三个字节表示一个BCD码的立方值,列表要将00~50的所有立方按顺序以三个字节列出来,所以前面的变址A要再原来BCD码的基础上变为三倍,最后我们还要扩展存储单元63H。
修改后的程序如下所示:
;d21.asm
ORG4000H
MOVSP,#70H
MOVA,60H
ANLA,#0F0H
SWAPA
MOVB,#0AH
MULAB
MOVR0,A
MOVA,60H
ANLA,#0FH
ADDA,R0
MOVB,A
RLA
ADDA,B
MOVR0,A
MOVDPTR,#DATA1
MOVCA,@A+DPTR
MOV61H,A
INCR0
MOVA,R0
MOVCA,@A+DPTR
MOV62H,A
INCR0
MOVA,R0
MOVCA,@A+DPTR
MOV63H,A
LOOP:
SJMPLOOP
DATA1:
000000H,000001H,000008H,000027H
000064H,000125H,000216H,000343H
000512H,000729H,001000H,001331H
001728H,002197H,002744H,003375H
004096H,004913H,005832H,006859H
008000H,009261H,010648H,012167H
013824H,015625H,017576H,019683H
021952H,024389H,027000H,027991H
032768H,035937H,039304H,042875H
046656H,050653H,054872H,059319H
064000H,068921H,074088H,079507H
085184H,091125H,097336H,103823H
110592H,117649H,125000H
END
3.在排序程序中,若要从升序改为降序,该如何修改?
答:
将程序中JCNCHAN改为JCCHAN,前面一个比后面一个大,则不交换,前面一个比后面一个小,则交换,其他地方可以不用改变,方法和原理都差不多。
4.在运行程序4时,为何要将数码显示管旁边的8个跳针拔出来?
举例子说明。
答:
我们在做前面实验一中的实验时,没有使用电脑串口,跳针没有拔出,我们默认选择了系统板上51单片机的输出,当我们要利用另外的输入时,就要将七段数码管的输入端连接到其他输出上面,这样避免冲突就必须拔掉跳针,也就是说,跳针只是相当于一个选择开关。