单片机实验指导书.docx

上传人:b****6 文档编号:7260633 上传时间:2023-01-22 格式:DOCX 页数:21 大小:112.09KB
下载 相关 举报
单片机实验指导书.docx_第1页
第1页 / 共21页
单片机实验指导书.docx_第2页
第2页 / 共21页
单片机实验指导书.docx_第3页
第3页 / 共21页
单片机实验指导书.docx_第4页
第4页 / 共21页
单片机实验指导书.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

单片机实验指导书.docx

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

单片机实验指导书.docx

单片机实验指导书

第四章实验内容

实验一数码转换程序

一.单字节十六进制到BCD码的转换

1.实验目的:

熟悉8051汇编语言的编制、调试。

2.编制说明:

将十六进制数除以一百得百位BCD码,余数除以十得十位BCD码,再得余数为个位BCD码。

3.操作说明:

将原文件在编辑器中进行编辑,编辑后回到主介面,建立工程文件,将原文件插入工程文件中,编译连接生成可执行文件。

若编译连接成功,打开寄存器窗口,在R2中输入八位无符号十六进制数,单步或设断点运行程序,并检查运行结果。

(运行结果在R6、R5中存放)

4.程序清单:

NAMEBCD1

CSEGAT0000H

LJMPBCD1

CSEGAT4100H

BCD1:

MOVA,R2

MOVB,#64H

DIVAB

MOVR6,A

MOVA,#0AH

XCHA,B

DIVAB

SWAPA

ADDA,B

MOVR5,A

NOP

END

5.实验步骤

①编辑源程序、建立工程文件、编译连接生成可执行程序

②在R2中输入八位无符号十六进制整数

③单步执行程序,记录每条指令执行后有关寄存器和PSW中内容

④给R2中输入五组不同参数,改用设断点连续执行程序,自行设计表格记录程序执行后A、B、PSW、R5和R6中内容

二.双字节十六进制到BCD码的转换

1.编制说明:

因为:

(a15a14...a1a0)2=(...(0*2+a15)*2+a14...)+a0

所以,将十六进制数从最高位逐次左移入BCD码寄存器的最低位,并且每次都实现(...)*2+ai的运算,共循环十六次,由R7控制。

2.操作说明:

操作说明同上。

入口:

R3、R2(为十六位无符号十六进制整数)。

出口:

R6(万位)、R5(千位、百位)、R4(十位、个位)存放五位BCD码。

3.程序清单

NAMEBCD2

CSEGAT0000H

LJMPBCD2

CSEGAT4100H

BCD2:

CLRA

MOVR4,A

MOVR5,A

MOVR6,A

MOVR7,#10H

LPO:

CLRC

MOVA,R2

RLCA

MOVR2,A

MOVA,R3

RLCA

MOVR3,A

MOVA,R4

ADDCA,R4

DAA

MOVR4,A

MOVA,R5

ADDCA,R5

DAA

MOVR5,A

MOVA,R6

ADDCA,R6

DAA

MOVR6,A

DJNZR7,LPO

NOP

END

4.实验步骤

①编辑源程序、建立工程文件、编译连接生成可执行程序

②在R3、R2中输入双字节无符号十六进制整数

③单步执行程序,每次在DAA指令前,检查和记录A内容和PSW中标志位(主要为Cy和AC标志)的状态;在DAA指令后仍检查和记录A内容和标志位的状态。

从而深入了解DAA指令是根据什么调整和如何调整的,这样单步执行循环七次,然后连续执行。

④给R3、R2中输入五组不同参数,改用设断点连续执行程序,自行设计表格记录程序执行后R6、R5和R4中内容

5.思考题

DAA指令只对什么寄存器起作用?

DAA指令安排在程序何处,才能得到正确结果?

三.双字节BCD码到十六进制的转换

1.编制说明:

因为:

(d3d2d1d0)BCD=(d3*10+d2)*100+(d1*10+d0)

所以,di+1*10+di的运算可由子程序BCD2B完成。

2.操作说明:

操作说明同一。

入口:

将BCD装入R5(千位、百位)、R4(十位、个位)。

出口:

R5、R4(为四位无符号十六进制整数)。

3.程序清单

NAMEBCD3

CSEGAT0000H

LJMPBCD3

CSEGAT4100H

BCD3:

MOVA,R5

MOVR2,A

ACALLBCD2B

MOVB,#64H

MULAB

MOVR6,A

XCHA,B

MOVR5,A

MOVA,R4

MOVR2,A

ACALLBCD2B

ADDA,R6

MOVR4,A

MOVA,R5

ADDCA,#00H

MOVR5,A

NOP

RET

BCD2B:

MOVA,R2

ANLA,#0F0H

SWAPA

MOVB,#0AH

MULAB

MOVR3,A

MOVA,R2

ANLA,#0FH

ADDA,R3

MOVR2,A

RET

END

4.实验步骤

①编辑源程序、建立工程文件、编译连接生成可执行程序

②在R5、R4中输入BCD码

③断点设在第一个ACALLBCD2B,检查和记录在ACALLBCD2B指令执行前后,堆栈指针SP、堆栈中内容及程序计数器PC中内容。

④断点设在第二个ACALLBCD2B,检查和记录在ACALLBCD2B指令执行前后,堆栈指针SP、堆栈中内容及程序计数器PC中内容。

⑤给R5、R4中输入五组不同参数,改用设断点连续执行程序,自行设计表格记录程序执行后R5和R4中内容

5.思考题

SP表示什么,有几位,作用是什么?

本实验系统复位后SP中内容是什么?

实验二双字节有符号数加、减法

一、双字节无符号数加法程序

1.实验目的:

进一步熟悉MCS-51的指令系统,掌握汇编语言的程序设计方法。

2.编制说明:

补码表示的数可以直接相加,所以双字节无符号数加、减程序也适用于补码的加、减法。

3.操作说明:

入口:

将(R2、R3)和(R6、R7)分别装入双字节无符号数,然后相加。

出口:

相加结果送入R4、R5。

4.程序清单:

NAMENADD

CSEGAT0000H

LJMPNADD

CSEGAT4100H

NADD:

MOVA,R3

ADDA,R7

MOVR5,A

MOVA,R2

ADDCA,R6

MOVR4,A

NOP

RET

END

5.实验步骤

①编辑源程序、建立工程文件、编译连接生成可执行程序

②在(R2、R3)和(R6、R7)中装入双字节无符号数

③单步执行程序,记录每条指令执行后有关寄存器和PSW中内容

④给(R2、R3)和(R6、R7)中输入五组不同参数,改用设断点连续执行程序,自行设计表格记录程序执行后A、PSW、R4和R5中内容

6.思考题

ADD、ADDC指令有什么异同?

是否能将这两条指令的位置交换?

二、双字节无符号数减法程序

1.操作说明:

入口:

将(R2、R3)和(R6、R7)分别装入双字节无符号数,然后相减。

出口:

相加结果送入R4、R5。

2.程序清单:

NAMENSUB1

CSEGAT0000H

LJMPNSUB1

CSEGAT4200H

NSUB1:

MOVA,R3

CLRC

SUBBA,R7

MOVR5,A

MOVA,R2

SUBBA,R6

MOVR4,A

NOP

RET

END

3.实验步骤

同双字节无符号数加法程序

4.思考题

为什么第一条SUBB指令前加CLRC指令?

而第二条SUBB指令前不加CLRC指令?

三、双字节原码有符号数加、减程序

1.编制说明:

对于原码表示的数,不能直接执行加、减运算,必须先按操作数的符号决定运算种类,然后再对数值部分执行操作。

2.操作说明:

入口:

将(R2、R3)和(R6、R7)分别装入双字节原码表示的数,最高位为符号位,然后求(R2、R3)±(R6、R7),其中DADD为原码加法子程序入口,NAS为原码减法子程序入口。

出口:

相加减的结果送入R4、R5,Cy=1发生溢出,Cy=0为正常。

3.程序清单:

NAMENAS

CSEGAT0000H

LJMPNAS

CSEGAT4300H

NAS:

MOVA,R6

CPLACC.7

MOVR6,A

DADD:

MOVA,R2

MOVC,ACC.7

MOVF0,C

XRLA,R6

MOVC,ACC.7

MOVA,R2

CLRACC.7

MOVR2,A

MOVA,R6

CLRACC.7

MOVR6,A

JCDAB2

ACALLNADD

MOVA,R4

JBACC.7,DABE

DAB1:

MOVC,F0

MOVACC.7,C

MOVR4,A

NOP

RET

DABE:

SETBC

RET

DAB2:

ACALLNSUB1

MOVA,R4

JNBACC.7,DAB1

ACALLCMPT

CPLF0

SJMPDAB1

CSEGAT4400H

CMPT:

MOVA,R5

CPLA

ADDA,#1

MOVR5,A

MOVA,R4

CPLA

ADDCA,#0

MOVR4,A

RET

END

4.实验步骤

①编辑源程序、建立工程文件、编译连接生成可执行程序

应注意双字节原码有符号数加、减程序中调用了三个程序:

NADD无符号数加法程序、NSUB1无符号数减法程序、CMPT带符号数求补程序。

由源程序生成可执行程序由两种方法:

一种方法:

首先将NADD、NSUB1、CMPT分别进行编辑、编译连接生成三个可执行程序;然后将原码有符号数加、减程序中ACALLNADD,ACALLNSUB1,ACALLCMPT三条指令中的符号地址NADD、NSUB1、CMPT用相应程序的直接地址代替即NADD用4100H、NSUB1用4200H、CMPT用4400H代替;最后将原码有符号数加、减程序进行编辑、编译连接生成可执行程序。

另一种方法:

将NADD程序、NSUB1程序、CMPT程序和原码有符号数加、减程序在一个源程序进行编辑、编译连接生成一个可执行程序,此时原码有符号数加、减程序中ACALLNADD,ACALLNSUB1,ACALLCMPT三条指令如程序给出,不用改变。

注意:

在执行减法运算时,原码有符号数加、减程序如程序清单所给,在执行加法运算时,将程序清单中LJMPNAS指令更正为LJMPDADD。

②在(R2、R3)和(R6、R7)中装入双字节无符号数

③在执行加法运算时,断点设在两条RET指令处,全速断点运行程序,记录程序执行后R4、R5中内容;在执行减法运算时,断点设在第一条RET指令处,全速断点运行程序,记录程序执行后R4、R5中内容。

注:

给(R2、R3)和(R6、R7)中输入五组不同参数,全速断点运行程序,自行设计表格记录程序执行后R4和R5中内容。

5.思考题:

①在程序中,哪些指令是位操作指令?

请总结位操作指令的功能?

②试画出此程序框图。

实验三双字节有符号数乘、除法

一、双字节无符号数乘法程序

1.实验目的:

进一步熟悉在多字节情况下,如何运用乘、除法指令。

2.编制说明:

MCS-51乘法指令实现两个八位无符号数直接相乘,因此双字节相乘需分解为四次单字节相乘,才可利用乘法指令。

3.操作说明:

入口:

将(R5、R4)装入双字节无符号数作为被乘数,

将(R3、R2)装入双字节无符号数作为乘数。

出口:

乘积送入以R1(积的低位字节地址指针)为地址指针的四个单元中。

4.程序清单:

NAMEDUMUL

CSEGAT0000H

LJMPSTART

CSEGAT4130H

START:

MOVA,R1

MOVR6,A

MOVR7,#04

CLEAR:

MOV@R1,#00H

INCR1

DJNZR7,CLEAR

MOVA,R6

MOVR1,A

MM:

MOVA,R2

MOVB,R4

MULAB

ACALLADDM

DECR1

MOVA,R2

MOVB,R5

MULAB

ACALLADDM

MOVA,R3

MOVB,R4

MULAB

ACALLADDM

MOVA,R3

MOVB,R5

MULAB

ACALLADDM

MOVA,R6

MOVR1,A

NOP

RET

ADDM:

ADDA,@R1

MOV@R1,A

MOVA,B

INCR1

ADDCA,@R1

MOV@R1,A

INCR1

MOVA,@R1

ADDCA,#00H

MOV@R1,A

DECR1

RET

END

二、双字节原码有符号数乘法程序

1.编制说明:

对原码表示的带符号的二进制数乘法,只需在乘法之前,先按正正得正,负负得正,正负得负的原则,得出积的符号,然后清零符号位,执行无符号乘法,最后送积的符号。

2.操作说明:

操作说明同双字节无符号数乘法程序。

入口:

将(R5、R4)装入双字节原码有符号数作为被乘数,

将(R3、R2)装入双字节原码有符号数作为乘数。

出口:

乘积送入R4、R5、R6、R7,操作数的符号位在最高位。

3.程序清单:

NAMEIMUL

CSEGAT0000H

LJMPIMUL

CSEGAT4100H

IMUL:

MOVA,R5

XRLA,R3

MOVC,ACC.7

MOVF0,C

MOVA,R5

CLRACC.7

MOVR5,A

MOVA,R3

CLRACC.7

MOVR3,A

ACALL4130H

MOVA,@R1

MOVR7,A

INCR1

MOVA,@R1

MOVR6,A

INCR1

MOVA,@R1

MOVR5,A

INCR1

MOVA,@R1

MOVR4,A

MOVC,F0

MOVACC.7,C

MOVR4,A

RET

END

三、无符号二进制除法程序

1.编制说明:

MCS-51的除法指令只实现两个八位无符号数直接相除,因此采用移位除方法。

先把被除数高位和除数进行比较,如果被除数高位大于除数,则商1,并从被除数减去除数,形成一个部分余数;如果被除数高位小于除数,则商0,不执行减法。

接着把部分余数左移一位,并与除数再次比较,如此循环直至被除数的所有位都处理完为止。

一般情况下,如果除数和商都为双字节,则被除数为四个字节,如果被除数的高两个字节大于或等于除数,则商不能用双字节表示,即商至少为三字节。

所以在除法之前先检验是否发生溢出,如果溢出则置溢出标志不执行除法。

2.操作说明:

操作说明同双字节无符号数乘法程序。

入口:

将R2、R3、R4、R5装入四字节无符号数作为被除数,

将R6、R7装入两字节无符号数作为除数。

出口:

结果商送R4、R5,余数送R2、R3。

3.程序清单:

NAMENDIV1

CSEGAT0000H

LJMPNDIV1

CSETAT4100H

NDIV1:

MOVA,R3

CLRC

SUBBA,R7

MOVA,R2

SUBBA,R6

JNCNDVE1

MOVB,#16

NDVL1:

CLRC

MOVA,R5

RLCA

MOVR5,A

MOVA,R4

RLCA

MOVR4,A

MOVA,R3

RLCA

MOVR3,A

XCHA,R2

RLCA

XCHA,R2

MOVF0,C

CLRC

SUBBA,R7

MOVR1,A

MOVA,R2

SUBBA,R6

JBF0,NDVM1

JCNDVD1

NDVM1:

MOVR2,A

MOVA,R1

MOVR3,A

INCR5

NDVD1:

DJNZB,NDVL1

CLRF0

LOOP:

NOP

RET

NDVE1:

SETBOF

JMPLOOP

END

实验四P1口实验

一、实验题目

P1口作为输入、输出口。

P1.0、P1.1接K1、K2;P1.2、P1.3接发光二极管LI1、LI2;P1.4、P1.5接LI5、LI6。

K1作为左转弯开关,K2作为右转弯开关。

LI1、LI2作为左转弯灯,LI5、LI6作为右转弯灯。

要求编制程序实现如下功能,向上打K1时左转弯灯以一定频率闪烁,打K2时右转弯灯以一定频率闪烁,K1、K2同时向上或向下,发光二极管灭。

二、实验目的

1)学习P1口既作为输入,又作为输出的使用办法。

2)学习数据输入、输出程序的设计方法。

三、有关说明

P1口作为准双向口,P1的每一位都能独立的定义为输入线或输出线,作为输入的口线,必须向锁存器相应位写入“1”,该位才能作为输入。

8031中所有口锁存器在复位时均置位“1”,如果后来在口锁存器写入过“0”,在需要时应写入一个“1”使它成为一个输入。

再来看一下延时程序的实现。

现常用的有两种方法,一是用定时器中断来实现,一是用指令循环来实现。

在系统时间允许的情况下可以采用后一种方法。

本实验系统晶振为6MHz,则一个机器周期为12÷6US即1÷0.5US。

现要写一个延时0.1s的程序,可大致写出如下:

MOVR7,#200

(1)

DE1:

MOVR6,#X

(2)

DE2:

DJNZR6,DE2(3)

DJNZR7,DE1(4)

上面MOV、DJNZ指令均需两个机器周期,所以每执行一条指令需1÷0.25US。

现求X值

(X×1÷0.25+1÷0.25+1÷0.25)×200+1÷0.25=0.1×106

指令(3)

(2)(4)

(1)

所需时间需时间需时间需时间

求出X=123。

代入上式可知实际延时约0.100004s,很精确了。

四、实验电路

 

 

GND

五、连线方法

见实验题目部分。

六、程序流程图

 

七、实验步骤

连接实验线路,编写程序并将其生成可执行程序,程序连续运行,拨动开关K1、K2,观察发光二极管状态的变化。

若有错误应改用单步或断点分段调试程序,排除软件错误,直至达到本实验的要求为止。

八、思考题

1.若延时时间为1s,延时程序怎样修改?

2.按要求编好程序并调试成功后,可将P1口锁存器置“0”,此时将P1做输入口,会有什么结果?

实验五定时器实验

一、实验题目

8031内部定时器1、按方式1工作,即作为16位定时器使用,每0.1秒T1溢出中断一次。

P1口的P1.0—P1.7分别接八个发光二极管。

要求编写程序模拟一时序控制装置。

开机后第一秒钟LI1、LI3亮,第二秒钟LI2、LI4亮,第三秒钟LI5、LI7亮,第四秒钟LI6、LI8亮,第五秒钟LI1、LI3、LI5、LI7亮,第六秒钟LI2、LI4、LI6、LI8亮,第七秒钟八个发光二极管全亮,第八秒钟全灭,以后从头开始,LI1、LI3亮,然后LI2、LI4亮,......一直循环下去。

二、实验目的

1)学习8031内部计数器的使用和编程方法。

2)进一步掌握中断处理程序的编程方法。

三、有关说明

1.定时常数的确定

定时器/计数器的输入脉冲周期与机器周期一样,为振荡器频率的1/12。

本实验中时钟频率位6MHz,现要采用中断方法来实现1秒延时,要在定时器1中设置一个时间常数,使其每隔0.1秒产生一次中断,CPU响应中断后将R0中计数值减一,令(R0)=0AH,即可实现1秒延时。

时间常数可按下法确定:

机器周期=12÷6×106=2×10-6s

需设初值为Χ,(216-Χ)×2×10-6=0.1

(216-Χ)=50000Χ=65536-50000=15536

化为十六进制数:

Χ=3CB0H,故初始值为TH1=3CH,TL1=0B0H

2.初始化程序

包括定时器初始化和中断系统初始化,主要是对IP、IE、TCON、TMOD的相应位进行正确的设置,并将时间常数送入定时器中。

由于只有定时器中断,IP便不必设置。

注意一点:

定时器1初始化时建议用下述指令:

ANLTMOD,#0FH

ORLTMOD,#10H

而不要用如下指令:

MOVTMOD,#10H

否则定时器0被屏蔽,可能会影响串行口波特率,使程序不能执行。

3.设计中断服务程序和主程序

中断服务程序除了完成计数减一工作外,还要将时间常数送入定时器中,为下一次中断做准备。

主程序则用来控制发光二极管按要求顺序亮灭。

四、

实验电路

五、连线方法

将P1.0—P1.7分别接发光二极管LI1—LI8

六、程序流程图

主程序:

中断服务程序:

七、实验步骤

1.连接实验线路。

2.编写程序并将其生成可执行程序。

3.断点设在中断服务程序入口,程序运行到中断入口,应进入中断服务程序,否则应检查T1初始化程序正确与否。

4.程序连续运行,观察发光二极管状态的变化。

若有错误应改用单步或断点分段调试程序,排除软件错误,直至达到本实验的要求为止。

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

当前位置:首页 > 人文社科 > 设计艺术

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

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