单片机实验指导书.docx
《单片机实验指导书.docx》由会员分享,可在线阅读,更多相关《单片机实验指导书.docx(21页珍藏版)》请在冰豆网上搜索。
单片机实验指导书
第四章实验内容
实验一数码转换程序
一.单字节十六进制到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.程序连续运行,观察发光二极管状态的变化。
若有错误应改用单步或断点分段调试程序,排除软件错误,直至达到本实验的要求为止。