微机基础原理及应用实验报告(中南大学2014年).doc
-/微机原理及应用实验报告班级: 姓名: 学号: 中南大学 机电工程学院 精密测控实验室实验二 软件程序设计1.实验目的:1、掌握MCS-51单片机指令系统及用汇编语言编程技巧;2、了解和熟悉用MCS-51单片机仿真开发机调试程序的方法。2.实验内容:1、编写排序程序并上机调试通过。已知8031内部RAM60H69H单元中,依次存放了FFH,99H,77H,CCH,33H,DDH,88H,BBH,44H,EEH,它们均为无符号数,编程将它们按递减次序排序,即最大数放在60H中,最小数放在69H中。2.、编写多字节加法程序并上机调试通过。 8031内部RAM20H22H单元中,存放了3字节被加数(低字节在前),在2AH2CH单元中存放3字节加数(低字节在前),求两数之和,并将结果存入以20H为起始地址的区域中(低字节在前)。3.实验设备名称、型号:台式微型计算机MCS-51仿真开发机THKSCM-2A4.画出软件程序流程图,写出上机调试通过的汇编语言程序清单:程序1、 编写排序程序并上机调试通过。已知8031内部RAM60H69H单元中,依次存放了FFH,99H,77H,CCH,33H,DDH,88H,BBH,44H,EEH,它们均为无符号数,编程将它们按递减次序排序,即最大数放在60H中,最小数放在69H中。解:本设计采用冒泡排序法,使用双重循环,并在内循环中进行比较如果合乎从大到小的顺序则不动,否则两两交换,这样比较下去,比较9次后,最小的那个数就会沉底,在下一次比较时将减少一次比较次数。如果一次比较完毕,没有发生交换,说明已经按照从大到小的顺序排列了。则可以退出循环,结束程序。程序结构框图和程序代码如下:ORG 1000HTEM DATA 50HMOV R7 , #9MOV 60H , #0FFHMOV 61H , #99HMOV 62H , #77HMOV 63H , #0CCHMOV 64H , #33HMOV 65H , #0DDHMOV 66H , #88HMOV 67H , #0BBHMOV 68H , #44HMOV 69H , #0EEHLOOP0: CLR F0MOV A , R7MOV R6, AMOV R0 , #60HMOV R1, #60HINC R1LOOP1: MOV A , R0MOV TEM , AMOV A , R1CJNE A ,TEM , NEXTSJMP NOCHANEXT: JC NOCHASETB F0MOV R0 , AXCH A , TEMMOV R1 , ANOCHA:INC R0INC R1DJNZ R6, LOOP1JNB F0, HALDJNZ R7, LOOP0HAL: SJMP $END程序2:编写多字节加法程序并上机调试通过。8031内部RAM20H22H单元中,存放了3字节被加数(低字节在前),在2AH2CH单元中存放3字节加数(低字节在前),求两数之和,并将结果存入以20H为起始地址的区域中(低字节在前)。解:改程序由三个字节数相加,其结果不会超过4个字节,可以采用循环求和的办法,吧加数和被加数依次从低位带进位相加,当然加最低位时必须先对进位位清零。可以采用线性结构,也可以采用循环结构。我在设计该程序采用单重循环,结构简单,特别是当相加的数较长时,优势更加明显。程序结构框图和源代码如下:ORG 1000HMOV 20H,#HMOV 21H,#HMOV 22H,#HMOV 2AH,#HMOV 2BH,#HMOV 2CH,#HMOV R0 #20HMOV R1 #2AHMOV R7 #03HCLR CLOOP0: MOV A ,R0MOV B ,R1ADDC A ,BMOV R0 ,AINC R0INC R1DJNZ R7 ,LOOP0NEXT : JNC HALINC R0MOV R0 ,#01HHAL: SJMP $END5.思考题1、如果题目1改为递增排序,如何修改程序,为什么?答:将NEXT中的指令中的JC 指令换为JNC指令即可2、如果题目1改为从30H单元开始的16个单元中无符号数排序,改哪几条指令?答:改变R7的值为15,将值赋予30H到3FH上就可以了3、如果题目2改为从50H开始的4字节数与60H开始的四字节数相加,如何修改?答:MOV R0 #20H 改为MOV R0 #50HMOV R1 #2AH 改为MOV R1 #60HMOV R7 #03H 改为MOV R7 #04H4、写出题目2中你处理最高位进位的相应指令。答:NEXT : JNC HALINC R0MOV R0 ,#01HHAL: SJMP $5、循环程序中为何常用间接寻址方式(Ri,DPTR)?答:因为间接寻址可以实现程序的循环,便于编写程序。6.心得体会: 通过实际模拟操作,加深了对单片机的理解,更好的理解编程语言,本次实验较为简单,我是独立按时完成,当我看到发光二极管一次亮时别提我的兴奋劲了。在试验的编程过程中弄清了定时器的使用方法,以及延时的计算。 审 阅: 实验三 定时/计数器实验1.实验目的:1、 掌握MCS-51单片机内部定时/计数器的功能与特点,工作方式选择和编程方法,中断功能的使用和中断服务程序的设计;2、 解和熟悉MCS-51单片机实验板的功能。2.实验内容:1、用MCS-51单片机的内部定时器定时中断,通过P1口控制实验板上八个LED发光二极管轮流循环显示发光,每个LED发光二极管显示时间为0.5秒;2、用MCS-51单片机的内部定时器定时中断,编写一段电子秒表程序。(选做)3.实验设备名称、型号:台式微型计算机MCS-51仿真开发机THKSCM-2A4.画出软件程序流程图写出上机调试通过的汇编语言程序清单:1、 用MCS-51单片机的内部定时器定时中断,通过P1口控制实验板上八个LED发光二极管轮流循环显示发光,每个LED发光二极管显示时间为0.5秒.分析:采用的晶振为11.0592MHz,所以时间周期T=1.085069s。采用方式一计时需要460800 次, 超过了计时范围, 故在采用一个内循环, 取为10 , 则共需46080010=46080。X=2(16)-46080=19456=4C00H编程:START:MOV TMOD,#01HMOV TH0,#4CHMOV TL0,#00HSETB TR0SETB EASETB ET0MOV A,#F7HMOV P1,AMOV 40H,#0AHSJMP $ORG 0000HLJMP STARTORG 00BHMOV TH0,#4CHMOV TL0,#00HDJNZ 40H,OVERMOV 40H,#0AHMOV P1,ARR AOVER: RETI5.思考题1、你采用的是定时器0还是定时器1?如果换用另外一个定时器,需要修改那些语句?为什么?答:采用定时器0 ,若用另一个则要替换的语句是MOV TMOD ,#01H 换为 MOV TMOD ,#10HMOV TH0 ,#4CH 换为 MOV TH1 ,#4CHMOV TL0, #00H 换为 MOV TL1, #00HSETB TR0 换为 SETB TR12、如果将延时时间变为1秒,如何修改程序,为何?答:两个程序均是将MOV 40H,#0AH 改为 MOV 40H,#14H3、改变发光二极管循环点亮方向,如何修改程序?如果间隔闪亮(亮一个,黑一个,亮一个)如何修改程序?你还能做哪些花样?答:将 RL A 改为 RR A如果要间隔闪亮可以将A 连续两次左移即RL A 变为 RL A 再加RL A就可以了。我还可以要其两同时亮,将累加器A 的值变为0FDH 就可以了语言是MOV A # 0FEH 变为MOV A ,#0FDH7.心得体会: 通过实际模拟操作,加深了对单片机的理解,更好的理解编程语言,本次实验较为简单,我是独立按时完成,当我看到发光二极管一次亮时别提我的兴奋劲了。在试验的编程过程中弄清了定时器的使用方法,以及延时的计算。审 阅: 实验四 串行数据传送实验1.实验目的:1、掌握七段LED数码管显示器工作原理,以及用动态扫描方法编程实现8位LED数码管显示的方法;2.进一步了解和熟悉MCS-51单片机实验板的功能。2. 实验内容:1.用MCS-51 的P1、P2输出段码和位码,编程实现8位LED数码管循环显示出“1”“2”“3”“4”“5”“6”间隔时间0.5秒。2.缩短间隔时间,直至显示效果为稳定的“123456”3.实验设备名称、型号:台式微型计算机MCS-51仿真开发机THKSCM-2A4.画出软件程序流程图,写出上机调试通过的汇编语言程序清单:说明:采用的晶振为11.0592MHz,所以时间周期T=1.085069s。执行一次DJNZ指令需要2T,要间隔0.5s。故需要执行0.5(2T)=230400次。取三次循环,第一次为4,第二次为256,第三次为2304004256=225=0E1H。代码如下:ORG 0000HMOV 40H,#00HMOV 41H,#01HMOV 42H,#02HMOV 43H,#03HMOV 44H,#04HMOV 45H,#05HSTART:MOV R0,#40HMOV R2,#06HMOV R7,#7FHLOOP: MOV A,R0MOV DPTR,#DISTABMOVC A,A+DPTRMOV P1,AMOV A,R7MOV P2,ARR AMOV R7,AMOV R3,#04HMOV R4,#00HMOV R5,#0E1HLOOP1:DJNZ R5,LOOP1DJNZ R4,LOOP1DJNZ R3,LOOP1INC R0DJNZ R2,LOOPLJMP STARTDISTAB: DB 06H;显示1DB 5BH;显示2DB 4FH;显示3DB 66H;显示4DB 6DH;显示5DB 7DH;显示6END修改 MOV R3,#04HMOV R4,#00HMOV R5,#0E1H可以缩短显示时间。当修改为 MOV R3,#04HMOV R4,#04HMOV R5,#02H时从视觉看已经看不出变化。用定时器实现方法:采用的晶振为11.0592MHz,所以时间周期T=1.085069s。采用方式一计时需要460800 次,超过了计时范围,故在采用一个内循环,取为50,则共需46080050=9216。X=216-9216=56350=DC1EH源代码如下:MOV TMOD,#01HMOV TH0,#0DCHMOV TL0,#1EHSETB EASETB ET0SETB TR0SJMP $0RGB 000BHMOV R2,#32HDJNZ R2,NEXTORG 0050HMOV 40H,#00HMOV 41H,#01HMOV 42H,#02HMOV 43H,#03HMOV 44H,#04HMOV 45H,#05HSTART:MOV R0,#40HMOV R2,#06HMOV R7,#EFHLOOP: MOV A,R0MOV DPTR,#DISTABMOVC A,A+DPTRMOV P1,AMOV A,R7MOV P2,ARR AMOV R7,AINC R0NEXT:RETIDISTAB: DB 06H;显示1DB 5BH;显示2DB 4FH;显示3DB 66H;显示4DB 6DH;显示5DB 7DH;显示6END5.思考题1、要显示实验当天的日期(如20100509),怎样调试?答:将 MOV R2,#06H 改为 MOV R2,#08HDISTAB: DB 06H;显示1 改为 DISTAB: DB 5BH;显示2DB 5BH;显示2 DB 3FH;显示0DB 4FH;显示3 DB 06H;显示1DB 66H;显示4 DB 3FH;显示0DB 6DH;显示5 DB 3FH;显示0DB 7DH;显示6 DB 6DH;显示5DB 3FH;显示0DB 6FH;显示92、用其中4位数码管显示“good”,程序如何修改?答:将 MOV R2,#06H 改为 MOV R2,#04HDISTAB: DB 06H;显示1 改为 DISTAB: DB 6FH;显示gDB 5BH;显示2 DB 3FH;显示0DB 4FH;显示3 DB 3FH;显示0DB 66H;显示4 DB 5EH;显示dDB 6DH;显示5DB 7DH;显示67.心得体会: 通过实际模拟操作,加深了对单片机的理解,更好的理解编程语言,本次实验我能够根据老师给出的代码理解完成,并且取得满意的结果。在试验的编程过程中弄清了很多在课堂上没有理解的操作码的含义。熟悉了各个操作码的使用方法及为什么如此用。审 阅:
收藏
- 资源描述:
-
-/
微机原理及应用实验报告
班级:
姓名:
学号:
中南大学
机电工程学院 精密测控实验室
实验二 软件程序设计
1.实验目的:
1、掌握MCS-51单片机指令系统及用汇编语言编程技巧;
2、了解和熟悉用MCS-51单片机仿真开发机调试程序的方法。
2.实验内容:
1、编写排序程序并上机调试通过。
已知8031内部RAM60H~69H单元中,依次存放了FFH,99H,77H,CCH,33H,DDH,88H,BBH,44H,EEH,它们均为无符号数,编程将它们按递减次序排序,即最大数放在60H中,最小数放在69H中。
2.、编写多字节加法程序并上机调试通过。
8031内部RAM20H~22H单元中,存放了3字节被加数(低字节在前),在2AH~2CH单元中存放3字节加数(低字节在前),求两数之和,并将结果存入以20H为起始地址的区域中(低字节在前)。
3.实验设备名称、型号:
台式微型计算机
MCS-51仿真开发机
THKSCM-2A
4.画出软件程序流程图,写出上机调试通过的汇编语言程序清单:
程序1、 编写排序程序并上机调试通过。
已知8031内部RAM60H~69H单元中,依次存放了
FFH,99H,77H,CCH,33H,DDH,88H,BBH,44H,EEH,它们均为无符号数,编程将它们按递减次序排序,即最大数放在60H中,最小数放在69H中。
解:本设计采用冒泡排序法,使用双重循环,并在内循环中进行比较如果合乎从大到小的顺序则不动,否则两两交换,这样比较下去,比较9次后,最小的那个数就会沉底,在下一次比较时将减少一次比较次数。如果一次比较完毕,没有发生交换,说明已经按照从大到小的顺序排列了。则可以退出循环,结束程序。
程序结构框图和程序代码如下:
ORG 1000H
TEM DATA 50H
MOV R7 , #9
MOV 60H , #0FFH
MOV 61H , #99H
MOV 62H , #77H
MOV 63H , #0CCH
MOV 64H , #33H
MOV 65H , #0DDH
MOV 66H , #88H
MOV 67H , #0BBH
MOV 68H , #44H
MOV 69H , #0EEH
LOOP0: CLR F0
MOV A , R7
MOV R6, A
MOV R0 , #60H
MOV R1, #60H
INC R1
LOOP1: MOV A , @R0
MOV TEM , A
MOV A , @R1
CJNE A ,TEM , NEXT
SJMP NOCHA
NEXT: JC NOCHA
SETB F0
MOV @R0 , A
XCH A , TEM
MOV @R1 , A
NOCHA:INC R0
INC R1
DJNZ R6, LOOP1
JNB F0, HAL
DJNZ R7, LOOP0
HAL: SJMP $
END
程序2:编写多字节加法程序并上机调试通过。
8031内部RAM20H~22H单元中,存放了3字节被加数(低字节在前),在2AH~2CH单元中存放3字节加数(低字节在前),求两数之和,并将结果存入以20H为起始地址的区域中(低字节在前)。
解:改程序由三个字节数相加,其结果不会超过4个字节,可以采用循环求和的办法,吧加数和被加数依次从低位带进位相加,当然加最低位时必须先对进位位清零。可以采用线性结构,也可以采用循环结构。我在设计该程序采用单重循环,结构简单,特别是当相加的数较长时,优势更加明显。
程序结构框图和源代码如下:
ORG 1000H
MOV 20H,#H
MOV 21H,#H
MOV 22H,#H
MOV 2AH,#H
MOV 2BH,#H
MOV 2CH,#H
MOV R0 #20H
MOV R1 #2AH
MOV R7 #03H
CLR C
LOOP0: MOV A ,@R0
MOV B ,@R1
ADDC A ,B
MOV @R0 ,A
INC R0
INC R1
DJNZ R7 ,LOOP0
NEXT : JNC HAL
INC R0
MOV @R0 ,#01H
HAL: SJMP $
END
5.思考题
1、如果题目1改为递增排序,如何修改程序,为什么?
答:将NEXT中的指令中的JC 指令换为JNC指令即可
2、如果题目1改为从30H单元开始的16个单元中无符号数排序,改哪几条指令?
答:改变R7的值为15,将值赋予30H到3FH上就可以了
3、如果题目2改为从50H开始的4字节数与60H开始的四字节数相加,如何修改?
答:MOV R0 #20H 改为MOV R0 #50H
MOV R1 #2AH 改为MOV R1 #60H
MOV R7 #03H 改为MOV R7 #04H
4、写出题目2中你处理最高位进位的相应指令。
答:NEXT : JNC HAL
INC R0
MOV @R0 ,#01H
HAL: SJMP $
5、循环程序中为何常用间接寻址方式(@Ri,@DPTR)?
答:因为间接寻址可以实现程序的循环,便于编写程序。
6.心得体会:
通过实际模拟操作,加深了对单片机的理解,更好的理解编程语言,本次实验较为简单,
我是独立按时完成,当我看到发光二极管一次亮时别提我的兴奋劲了。在试验的编程过程中
弄清了定时器的使用方法,以及延时的计算。
审 阅:
实验三 定时/计数器实验
1.实验目的:
1、 掌握MCS-51单片机内部定时/计数器的功能与特点,工作方式选择和编程方法,中断功能的使用和中断服务程序的设计;
2、 解和熟悉MCS-51单片机实验板的功能。
2.实验内容:
1、用MCS-51单片机的内部定时器定时中断,通过P1口控制实验板上八个LED发光二极管轮流循环显示发光,每个LED发光二极管显示时间为0.5秒;
2、用MCS-51单片机的内部定时器定时中断,编写一段电子秒表程序。(选做)
3.实验设备名称、型号:
台式微型计算机
MCS-51仿真开发机
THKSCM-2A
4.画出软件程序流程图写出上机调试通过的汇编语言程序清单:
1、 用MCS-51单片机的内部定时器定时中断,通过P1口控制实验板上八个LED发光二
极管轮流循环显示发光,每个LED发光二极管显示时间为0.5秒.
分析:采用的晶振为11.0592MHz,所以时间周期T=1.085069μs。采用方式一计时需要
460800 次, 超过了计时范围, 故在采用一个内循环, 取为10 , 则共需
46080010=46080。
X=2^(16)-46080=19456=4C00H
编程:
START:MOV TMOD,#01H
MOV TH0,#4CH
MOV TL0,#00H
SETB TR0
SETB EA
SETB ET0
MOV A,#F7H
MOV P1,A
MOV 40H,#0AH
SJMP $
ORG 0000H
LJMP START
ORG 00BH
MOV TH0,#4CH
MOV TL0,#00H
DJNZ 40H,OVER
MOV 40H,#0AH
MOV P1,A
RR A
OVER: RETI
5.思考题
1、你采用的是定时器0还是定时器1?如果换用另外一个定时器,需要修改那些语句?为什么?
答:采用定时器0 ,若用另一个则要替换的语句是
MOV TMOD ,#01H 换为 MOV TMOD ,#10H
MOV TH0 ,#4CH 换为 MOV TH1 ,#4CH
MOV TL0, #00H 换为 MOV TL1, #00H
SETB TR0 换为 SETB TR1
2、如果将延时时间变为1秒,如何修改程序,为何?
答:两个程序均是将MOV 40H,#0AH 改为 MOV 40H,#14H
3、改变发光二极管循环点亮方向,如何修改程序?如果间隔闪亮(亮一个,黑一个,亮一个……)如何修改程序?你还能做哪些花样?
答:将 RL A 改为 RR A
如果要间隔闪亮可以将A 连续两次左移即RL A 变为 RL A 再加RL A就可以了。我还可以要其两同时亮,将累加器A 的值变为0FDH 就可以了语言是MOV A # 0FEH 变为MOV A ,#0FDH
7.心得体会:
通过实际模拟操作,加深了对单片机的理解,更好的理解编程语言,本次实验较为简单,
我是独立按时完成,当我看到发光二极管一次亮时别提我的兴奋劲了。在试验的编程过程中弄清了定时器的使用方法,以及延时的计算。
审 阅:
实验四 串行数据传送实验
1.实验目的:
1、掌握七段LED数码管显示器工作原理,以及用动态扫描方法编程实现8位LED数码管显示的方法;
2.进一步了解和熟悉MCS-51单片机实验板的功能。
2. 实验内容:
1.用MCS-51 的P1、P2输出段码和位码,编程实现8位LED数码管循环显示出“1”“2”“3”“4”“5”“6”间隔时间0.5秒。
2.缩短间隔时间,直至显示效果为稳定的“123456”
3.实验设备名称、型号:
台式微型计算机
MCS-51仿真开发机
THKSCM-2A
4.画出软件程序流程图,写出上机调试通过的汇编语言程序清单:
说明:采用的晶振为11.0592MHz,所以时间周期T=1.085069μs。执行一次DJNZ指令需要2T,要间隔0.5s。故需要执行0.5(2T)=230400次。取三次循环,第一次为4,第二次为256,第三次为2304004256=225=0E1H。
代码如下:
ORG 0000H
MOV 40H,#00H
MOV 41H,#01H
MOV 42H,#02H
MOV 43H,#03H
MOV 44H,#04H
MOV 45H,#05H
START:MOV R0,#40H
MOV R2,#06H
MOV R7,#7FH
LOOP: MOV A,@R0
MOV DPTR,#DISTAB
MOVC A,@A+DPTR
MOV P1,A
MOV A,R7
MOV P2,A
RR A
MOV R7,A
MOV R3,#04H
MOV R4,#00H
MOV R5,#0E1H
LOOP1:DJNZ R5,LOOP1
DJNZ R4,LOOP1
DJNZ R3,LOOP1
INC R0
DJNZ R2,LOOP
LJMP START
DISTAB: DB 06H;显示1
DB 5BH;显示2
DB 4FH;显示3
DB 66H;显示4
DB 6DH;显示5
DB 7DH;显示6
END
修改 MOV R3,#04H
MOV R4,#00H
MOV R5,#0E1H
可以缩短显示时间。当修改为 MOV R3,#04H
MOV R4,#04H
MOV R5,#02H时从视觉看已经看不出变化。
用定时器实现方法:采用的晶振为11.0592MHz,所以时间周期T=1.085069μs。采用方式一
计时需要460800 次,超过了计时范围,故在采用一个内循环,取为50,则共需
46080050=9216。X=216-9216=56350=DC1EH
源代码如下:
MOV TMOD,#01H
MOV TH0,#0DCH
MOV TL0,#1EH
SETB EA
SETB ET0
SETB TR0
SJMP $
0RGB 000BH
MOV R2,#32H
DJNZ R2,NEXT
ORG 0050H
MOV 40H,#00H
MOV 41H,#01H
MOV 42H,#02H
MOV 43H,#03H
MOV 44H,#04H
MOV 45H,#05H
START:MOV R0,#40H
MOV R2,#06H
MOV R7,#EFH
LOOP: MOV A,@R0
MOV DPTR,#DISTAB
MOVC A,@A+DPTR
MOV P1,A
MOV A,R7
MOV P2,A
RR A
MOV R7,A
INC R0
NEXT:RETI
DISTAB: DB 06H;显示1
DB 5BH;显示2
DB 4FH;显示3
DB 66H;显示4
DB 6DH;显示5
DB 7DH;显示6
END
5.思考题
1、要显示实验当天的日期(如20100509),怎样调试?
答:将 MOV R2,#06H 改为 MOV R2,#08H
DISTAB: DB 06H;显示1 改为 DISTAB: DB 5BH;显示2
DB 5BH;显示2 DB 3FH;显示0
DB 4FH;显示3 DB 06H;显示1
DB 66H;显示4 DB 3FH;显示0
DB 6DH;显示5 DB 3FH;显示0
DB 7DH;显示6 DB 6DH;显示5
DB 3FH;显示0
DB 6FH;显示9
2、用其中4位数码管显示“good”,程序如何修改?
答:将 MOV R2,#06H 改为 MOV R2,#04H
DISTAB: DB 06H;显示1 改为 DISTAB: DB 6FH;显示g
DB 5BH;显示2 DB 3FH;显示0
DB 4FH;显示3 DB 3FH;显示0
DB 66H;显示4 DB 5EH;显示d
DB 6DH;显示5
DB 7DH;显示6
7.心得体会:
通过实际模拟操作,加深了对单片机的理解,更好的理解编程语言,本次实验我能够根
据老师给出的代码理解完成,并且取得满意的结果。在试验的编程过程中弄清了很多在课堂
上没有理解的操作码的含义。熟悉了各个操作码的使用方法及为什么如此用。
审 阅:
展开阅读全文