资源描述
51系列单片机
原理与应用实验
实验1 简单汇编语言实验
一、实验目的:掌握汇编语言设计和调试方法,熟悉键盘操作。熟悉汇编语言编程。
二、实验内容:
1.查找相同数据个数:在2000H~200FH的N个单元中填入零,运行本程序后检查2100H中是否为N;
2.清零:把2000H~20FFH的内容清零。
三、实验程序框图:
查找相同数据个数程序实验框图 清零程序框图
四、实验步骤:
1、在2000H~200FH的几个单元中填入零,运行查找相同数据个数程序后检查2100H中是否是几个单元数。
2、用连续或单步方式运行清零程序,检查2000~20FF中执行程序前后的内容变化。
五.思考:
1、修改程序,查找其它内容。
2、修改清零程序,假使把2000H~20FFH中的内容改成FF,如何修改程序。
1/ 查找相同数据个数程序程序清单:
ORG 0000H
LJMP L5800
ORG 0AA0H
L5800: MOV R0,#10H ;查找16个字节
MOV R1,#00H
MOV DPTR,#2000H
L5811: MOVX A,@DPTR
CJNE A,#00H,L5816 ;取出内容与00H相等吗?
INC R1 ;取出个数加1
L5816: INC DPTR
DJNZ R0,L5811 ;未完继续
MOV DPTR,#2100H
MOV A,R1
MOVX @DPTR,A ;相同数的个数送2100H
L581E: SJMP L581E
END
2/ 清零程序清单:
ORG 0000H
LJMP SE01
ORG 0640H
SE01: MOV R0,#00H
MOV DPTR,#2000H ;(0000H)送DPTR
LOO1: CLR A
MOVX @DPTR,A ;0送(DPTR)
INC DPTR ;DPTR+1
INC R0 ;字节数加1
CJNE R0,#00H,LOO1 ;不到FF个字节再清
LOOP: SJMP LOOP
END
实验2 拆字和拼字程序
一、实验目的:掌握汇编语言设计和调试方法。
二、实验内容:
1、把2000H的内容拆开,高位送2001H低位,低位送2002H低位,2001H、2002H高位清零,一般本程序用于把数据送显示缓冲区时用;
2、把2000H.2001H的低位分别送入2002H高低位,一般本程序用于把显示缓冲区的数据取出拼装成一字节。
三、实验程序框图:
拆字程序框图 拼字程序框图
四、实验步骤:用连续或单步方式运行程序,检查2000H~2002H中内容变化情况。
五、思考:如何用断点方式调试本程序。
1/拆字程序清单:
ORG 0000H
LJMP SE02
ORG 0660H
SE02: MOV DPTR,#2000H
MOVX A,@DPTR
MOV B,A ;(2000)→A→B
SWAP A ;交换
ANL A,#0FH ;屏蔽高位
INC DPTR
MOVX @DPTR,A ;送2001H
INC DPTR
MOV A,B
ANL A,#0FH ;(2000)内容屏蔽高位
MOVX @DPTR,A ;送2002H
LOOP: SJMP LOOP
END
2/拼字程序清单:
ORG 0000H
LJMP START
ORG 0680H
START: MOV DPTR,#2000H
MOVX A,@DPTR
ANL A,#0FH ;(2000H)内容屏蔽高位
SWAP A ;交换
MOV B,A ;保存
INC DPTR
MOVX A,@DPTR ;(2000H)内容送A
ANL A,#0FH ;屏蔽高位
ORL A,B ;或
INC DPTR
MOVX @DPTR,A ;送2002H
SJMP $
END
实验3 数据排序实验
一、实验目的:熟悉51指令系统,掌握程序设计方法。
二、实验内容:编写并调试一个排序子程序,其功能为用冒泡法将数据存储单元中几个单字节无符号的正整数,按从小到大的次序重新排列。
开始
三、程序框图:
清标志位
DPTR取数送A
(DPTR+1)送DPTR
(A)<((DPTR))?
Y
N
置标志位,内容交换
N
长度-1=0?
Y
N
标志位=0?
Y
结束
四、实验步骤: 将RAM 1000H~100FH 中放入不等的数据,用断点方法运行本实验程序后检查1000H~100FH中的内容是否按从小到大的次序排列。
五、思考:修改程序把1000H~100FH中内容从大到小排列。
1/程序清单:
ORG 0000H
LJMP SE01
ORG 0640H
SE01: CLR 00H ;标志位
MOV DPTR,#1000H ;起始地址
MOVX A,@DPTR
MOV R7,#04H ;要排序的数据个数
LOOP: MOV 22H,A ;第一个数送22h
INC DPTR
MOVX A,@DPTR ;第二个数送A
CLR C ;清零C
CJNE A,22H,LOOP5 ;判断是哪个数大
LOOP5: JNC LOOP1 ;前面的数小则不作处理,否则交换位置
LOOP2: DEC DPL ;交换位置
MOV R5,DPL
CJNE R5,#0FFH,LOOP4
DEC DPH
LOOP4: MOVX @DPTR,A
MOV A,22H
INC DPTR
MOVX @DPTR,A
SETB 00H
LOOP1: DJNZ R7,LOOP;;;;;不交换位置
JB 00H,SE01 ;判断此次循环有无交换发生
LOOP3:SJMP LOOP3
END
例4-1 有一变量在片内RAM的20H单元,取值范围:00H~05H。编制一段程序,根据变量值求其平方值,并存入片内RAM的21H单元。
ORG 0000H
LJMP SE01
ORG 0640H
SE01:MOV DPTR,#2000H
MOV A,20H
MOVC A,@A+DPTR
MOV 21H,A
SJMP $
ORG 2000H
TABLE:DB 01,01,04,09,16,25
END
例4-2 设变量 x 以补码的形式存放在片内RAM的30H单元,变量 y 与 x 的关系是:当 x 大于0时,y =x;当 x =0时,y =20H;当 x 小于0时,y =x+5。编制程序,根据 x 的大小求y并送回原单元。
ORG 0000H
LJMP START
ORG 0640H
START:MOV A,30H
JZ NEXT
ANL A,#80H ;判断符号位
JZ LP
MOV A,#05H
ADD A,30H
MOV 30H,A
SJMP LP
NEXT:MOV 30H,#20H
LP:SJMP $
END
例4-3 编写程序,将内部RAM的30H至3FH单元初始化为00H。
ORG 0000H
LJMP MAIN
ORG 0040H
MAIN:MOV R0,#30H
MOV A,#00H
MOV R7,#16
LOOP:MOV @R0,A
INC R0
DJNZ R7,LOOP
SJMP $
END
例4-4 将内部RAM中起始地址为60H的数据串传送到外部RAM中起始地址为1000H的存储区域内,直到发现’ $’字符停止传送。由于循环次数事先不知道,但循环条件可以测试到。该程序采用先判断后执行的结构。
ORG 0000H
LJMP MAIN
ORG 0040H
MAIN: MOV R0,#60H
MOV DPTR,#1000H
LOOP0: MOV A,@R0
CJNE A,#24H,LOOP1
SJMP DONE
LOOP1: MOVX @DPTR,A
INC R0
INC DPTR
SJMP LOOP0
DONE: SJMP DONE
END
实验4-1 P1口亮灯实验
一、 实验目的:
l)学习P1口的使用方法;
2)学习延时子程序的编写。
二、 实验顶备知识:
(l).Pl口为准双向口,每一位都可独立地定义为输入或输出,在作输入线使用前,必须向锁存器相应位写入“1”,该位才能作为输入。
(2).本实验中延时子程序采用指令循环来实现,机器周期(12/6MHz)*指令所需机器周期数*循环次数,在系统时间允许的情况下可以采用此方法。
三、 实验内容: P1口输出口,接八只发光二极管,编写程序,使发光二极管循环点亮。
四、 实验程序框图:
五、 实验步骤 :P1.0~P1.7用插针连至L1~L8,运行程序后,观察发光二极管闪亮移位情况。
六、 思考: 改变延时常数,使发光二极管闪亮时间改变。
修改程序,使发光二极管闪亮移位方向改变
程序清单
ORG 0000H
LJMP SE18
ORG 0790H
SE18: MOV P1,#0FFH ;送P1口
LO34: MOV A,#0FEH ;L1发光二极管点亮
LO33: MOV P1,A
LCALL SE19 ;延时
RL A ;左移位
SJMP LO33 ;循环
ORG 07A0H
SE19: MOV R6,#0A0H
LO36: MOV R7,#0FFH
LO35: DJNZ R7,LO35
DJNZ R6,LO36 ;延时
RET
END
实验4-2 P1口转弯灯实验
一、实验目的:进一步了解P1口的使用,学习汇编语言编程方法及调试技巧。
二、实验内容:P1.0 开关接5V,右转弯灯闪亮,P1.1开关接5V时左转弯灯闪亮,P1.0,P1.1开关同时接5V或接地时,转弯灯均不闪亮。
三、实验程序框图:
四、实验接线图:
五、实验步骤:P1.0 接K1,P1.1接K2,P1.4~P1.7接L1、L5、L9、L13,连续运行本程序,应看到转弯灯正确闪亮,在用单步方式调试本程序时需修改延时子程序,(例可把延时程序第一个字节改成返回指令22H),以便观察。
程序清单:
ORG 0000H
LJMP PX00
ORG 0C30H
PX00: MOV P1,#0FFH ;初始化
PX03: MOV A,P1
MOV B,A
ANL A,#03H
CJNE A,#01H,PX01 ;满足只是P1.0为高条件?
JB 00H,PX04 ;闪烁标志位
CLR P1.4
CLR P1.5 ;开右灯
SETB P1.6
SETB P1.7 ;关左灯
MOV R2,#20H
LCALL DELY ;延时
SETB 00H ;置标志位
LJMP PX03 ;继续查找状态
PX04: SETB P1.4
SETB P1.5
SETB P1.6 ;关灯
SETB P1.7
MOV R2,#20H
LCALL DELY ;延时
CLR 00H ;清标志位
AJMP PX03 ;继续查找状态
PX01: CJNE A,#02H,PX02 ;满足只是P1.1为高条件吗?
JB 01H,PX05 ;判标志位
SETB P1.4
SETB P1.5 ;开左灯
CLR P1.6
CLR P1.7 ;关右灯
MOV R2,#20H
LCALL DELY ;延时
SETB 01H ;置标志位
LJMP PX03 ;继续查找
PX05: SETB P1.4
SETB P1.5
SETB P1.6 ;关灯
SETB P1.7
MOV R2,#20H
LCALL DELY ;延时
CLR 01H ;清标志位
LJMP PX03 ;继续查找状态
QPX02: SETB P1.4
SETB P1.5
SETB P1.6 ;关灯
SETB P1.7
LJMP PX03 ;继续
DELY: PUSH 02H
DEL2: PUSH 02H
DEL3: PUSH 02H ; 延时
DEL4: DJNZ R2,DEL4
POP 02H
DJNZ R2,DEL3
POP 02H
DJNZ R2,DEL2
POP 02H
DJNZ R2,DELY
RET
END
实验5-1 P3口输入,P1口输出
一、实验目的:掌握P3口 P1口简单使用。
二、实验内容:P3.3口输入一脉冲, P1口按16进制加一方式点亮发光二极管。
三、实验程序框图:
四、实验步骤: P3.3用接针连至K1 P1.0~P1.7插针连至L1~L8,K1拨动一次,L1~L8发光二极管按16进制方式加一点亮。
五、思考:修改程序,使发光二极管左移方式点亮。
程序清单:
ORG 0000H
LJMP J100
ORG 0810H
J100: MOV A,#00H
J101: JB P3.3,J101
MOV R2,#10H
LCALL DELY
JB P3.3,J101 ;P3.3电平为低吗?
J102: JNB P3.3,J102
MOV R2,#10H
LCALL DELY
JNB P3.3,J102 ;P3.3电平为高吗?
INC A ;加1
PUSH ACC
CPL A ;取反
MOV P1,A ;驱动发光二极管
POP ACC
AJMP J101 ;循环
DELY: PUSH 02H
DEL2: PUSH 02H
DEL3: PUSH 02H
DEL4: DJNZ R2,DEL4 ;延时
POP 02H
DJNZ R2,DEL3
POP 02H
DJNZ R2,DEL2
POP 02H
DJNZ R2,DELY
RET
END
实验5-2 简单I/O口扩展
一、实验目的:
(1)学习单片机系统中扩展简单I/O口的方法。
(2)学习数据输入输出程序的编制方法。
二、实验内容: 利用74LS244作为输入口,读取开关状态,并将此状态,通过74LS273再驱动发光二极管显示出来。
三、实验程序框图:
四、实验步骤:Y0~Y7接K1~K8,Q0~Q7接L1~L8,CS1接8000孔,CS2接9000孔,JX0接JX7,执行程序,按动K1~K8,观察L1~L8是否对应点亮。
五、思考: 可否用273输入,244输出。
程序清单:
ORG 0000H
LJMP GOD0
ORG 0B80H
GOD0: MOV DPTR,#8000H
MOVX A,@DPTR ;取出244状态
MOV DPTR,#9000H
MOVX @DPTR,A ;送273驱动发光二极管
SJMP GOD0
END
实验6 继电器控制
一、实验目的 掌握用继电器的基本方法和编程。
二、实验内容 利用P1口输出高低电平,控制继电器的开合,以实现对外部装置的控制。
三、实验预备知识 现代自动控制设备中都存在一个电子与电气电路的互相联结问题,一方面要使电子电路的控制信号能够控制电气电路,提供良好的电隔离,以保护电子电路和人身的安全,继电器便能完成这一桥梁作用。
四、实验接线图:
五、实验步骤: 把Pl.0接JIN端,继电器的JZ通过K1接地。JK接L1,JB接L2。编制程序,使P1.0电平变化,高电平时继电器吸合,常开触点接上Ll点亮,L2熄灭,低电平时继电器不工作,常闭触点闭合,Ll熄灭,L2点亮。
程序清单:
ORG 0000H
LJMP LOOP
ORG 0F00H
LOOP: CLR P1.0
MOV R2,#30H
LCALL DELY
SETB P1.0
MOV R2,#30H
LCALL DELY
SJMP LOOP
DELY: PUSH 02H
DEL2: PUSH 02H
DEL3: PUSH 02H
DEL4: DJNZ R2,DEL4
POP 02H
DJNZ R2,DEL3
POP 02H
DJNZ R2,DEL2
POP 02H
DJNZ R2,DELY
RET
END
实验7-1 8255A.B.C口输出方波
一、实验目的:掌握可编程I/O接口芯片8255的接口原理使用,熟悉对8255初始化编程和输入/输出软件的设计为法。
二、实验内容:在8255的A.B.C口用万用表可测出每个口线的高低电平变化。
三、实验程序框图:
四、实验步骤:执行程序,用万用表测量8255A.B.C口应有高低电平变化(或用8255A.B.C口分别用插针连至Ll~L8,观察发光二极管变化情况)。
程序清单:
ORG 0000H
LJMP SE09
ORG 0580H
SE09: MOV DPTR,#0FF2BH
MOV A,#80H
MOVX @DPTR,A ;8255初始化
MOV A,#55H ;一位隔一位高电平
LO15: MOV DPTR,#0FF28H
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A ;A、B、C口送入
MOV R2,#10H ;延时
LCALL DELY
CPL A ;取反
SJMP LO15 ;循环
ORG 05A0
DELY: PUSH 02H
DEL2: PUSH 02H
DEL3: PUSH 02H ;延时
DEL4: DJNZ R2,DEL4
POP 02H
DJNZ R2,DEL3
POP 02H
DJNZ R2,DEL2
POP 02H
DJNZ R2,DELY
RET
END
实验7-2 8255PA口控制PB口
一、实验目的:掌握单片机系统中扩展外围芯片的方法,了解8255芯片的结构及编程方法。
二、实验内容:用8255 PA口作开关量输入口,PB口作输出口。
三、实验程序框图:
四、实验接线图:
五、实验步骤:8255PA口接Kl~K8,PB口接L1~L8运行程序,按K1~K8,观察L1~L8发光二极管是否对应点亮。
程序清单:
ORG 0000h
LJMP SE17
ORG 0770H
SE17: MOV DPTR,#0FF2BH
MOV A,#90H
MOVX @DPTR,A ;8255初始化
LO32: MOV DPTR,#0FF28H
MOVX A,@DPTR ;PA口状态读出
INC DPTR
MOVX @DPTR,A ;送PB口
SJMP LO32
END
实验7-3 8255控制交通灯
一、实验目的:进一步了解8255芯片的结构及编程方法,学习模拟交通控制的实现方法。
二、实验内容:用8255做输出口,控制十二个发光二极管燃灭,模拟交通灯管理。
三、实验程序框图:
四、实验接线图:
五、实验步骤:8255 PA0~PA7 PB0~PB3接发光二极管L15~L13、L11~L9、L7~L5、L3~L1。执行程序,初始态为四个路口的红灯全亮之后,东西路口的绿灯亮,南北路口的红灯亮,东西路口方向通车,延时一段时间后东西路口的绿灯熄灭,黄灯开始闪烁,闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北路口方向开始通车,延时一段时间后,南北路口的绿灯熄灭,黄灯开始闪烁,闪烁若干次后,再切换到东西路口方向,之后重复以上过程
ORG 0000H
LJMP JOD0
ORG 0BB0H
JOD0: MOV SP,#60H
MOV DPTR,#0FF2BH
MOV A,#88H
MOVX @DPTR,A ;8255初始化
MOV DPTR,#0FF28H
MOV A,#0B6H
MOVX @DPTR,A
INC DPTR
MOV A,#0DH
MOVX @DPTR,A ;点亮4个红灯
MOV R2,#25H ;延时
LCALL DELY
JOD3: MOV DPTR,#0FF28H
MOV A,#75H
MOVX @DPTR,A
INC DPTR
MOV A,#0DH
MOVX @DPTR,A ;东西绿灯亮,南北红灯亮
MOV R2,#55H
LCALL DELY ;延时
MOV R7,#05H ;闪烁次数
JOD1: MOV DPTR,#0FF28H
MOV A,#0F3H
MOVX @DPTR,A
INC DPTR
MOV A,#0CH
MOVX @DPTR,A ;东西黄灯亮,南北红灯亮
MOV R2,#20H
LCALL DELY ;延时
MOV DPTR,#0FF28H
MOV A,#0F7H
MOVX @DPTR,A
INC DPTR
MOV A,#0DH
MOVX @DPTR,A ;南北红灯亮
MOV R2,#20H
LCALL DELY ;延时
DJNZ R7,JOD1 ;闪烁次数未到继续
MOV DPTR,#0FF28H
MOV A,#0AEH
MOVX @DPTR,A
INC DPTR
MOV A,#0BH
MOVX @DPTR,A ;东西红灯亮,南北绿灯亮
MOV R2,#55H
LCALL DELY ;延时
MOV R7,#05H ;闪烁次数
JOD2: MOV DPTR,#0FF28H
MOV A,#9EH
MOVX @DPTR,A
INC DPTR
MOV A,#07H
MOVX @DPTR,A ;东西红灯亮,南北黄灯亮
MOV R2,#20H
LCALL DELY ;延时
MOV DPTR,#0FF28H
MOV A,#0BEH
MOVX @DPTR,A
INC DPTR
MOV A,#0FH
MOVX @DPTR,A ;东西红灯亮
MOV R2,#20H
LCALL DELY ;延时
DJNZ R7,JOD2 ;闪烁次数未到继续
LJMP JOD3 ;循环
ORG 0C30H
DELY: PUSH 02H
DEL2: PUSH 02H
DEL3: PUSH 02H ;延时
DEL4: DJNZ R2,DEL4
POP 02H
DJNZ R2,DEL3
POP 02H
DJNZ R2,DEL2
POP 02H
DJNZ R2,DELY
RET
END
实验8 A/D转换实验
一、实验目的:(1)掌握A/D转换与单片机接口的方法;
(2)了解A/D芯片0809转换性能及编程方法;
(3)通过实验了解单片机如何进行数据采集。
二、实验内容:利用实验系统上的0809做A/D转换器,实验系统上的电位器提供模拟量输入,编制程序,将模拟量转换成数字,通过数码管显示出来。
三、实验接线图:
四、实验程序框图:
五、实验步骤:把0809的零通道INT0用插针接至AOUT1孔,CS4接8000H孔,JX0接JX6,运行程序,数码管上显示0809.XX,,后二位显示当前采集的电压转换的数字量,调节W1,该二位将随着电压变化而相应变化。
六、思考:修改程序,用其它通道轮流采样显示。
程序清单:正确的程序
程序清单:
ORG 0000H
LJMP SE11
ORG 05A0H
SE11: MOV A,#43H
MOV DPTR,#0FF20H
MOVX @DPTR,A
MOV 7EH,#00H
MOV 7DH,#08H
MOV 7CH,#00H
MOV 7BH,#09H
MOV 7AH,#10H
MOV 79H,#10H ;显示缓冲区初值
LO18: LCALL SSEE ;显示
MOV A,#00H
MOV DPTR,#8000H
MOVX @DPTR,A ;0809的0通道采样
MOV R7,#0FFH ;延时
LO17: DJNZ R7,LO17
MOVX A,@DPTR ;取出采样值
MOV R0,#79H
LCALL PTDS
SJMP LO18 ;采样值送显示缓冲区
ORG 05D0H
PTDS: MOV R1,A ;拆送显示缓冲区
ACALL PTDS1
MOV A,R1
SWAP A
PTDS1: ANL A,#0FH
MOV @R0,A
INC R0
RET
ORG 0D50H
SSEE: MOV 30H,#20H ;位选信息给30H
MOV 31H,#7EH ;数据缓冲器首地址给31H
MOV R7,#06H ;位选次数给R7
SSE1: MOV DPTR,#0FF21H ;8155的A口
MOV A,30H
CPL A
MOVX @DPTR,A ;字位送入
MOV R0,31H
MOV A,@R0 ;要显示的内容给A
MOV DPTR,#DDFF
MOVC A,@A+DPTR ;取字形代码
MOV DPTR,#0FF22H ;8155的B口
MOVX @DPTR,A ;字形送入
MOV R2,#08H
LCALL DELY
MOV A,30H
RR A ;位选右移
MOV 30H,A
DEC 31H ;数据缓冲器地址减一
MOV A,#0FFH
MOVX @DPTR,A ;关显示
DJNZ R7,SSE
展开阅读全文