单片机实验指导
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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指令系统,掌握程序设计方法。
二、实验内容:编写并调试一个排序子程序,其功能为用冒泡法将数据存储单元中几个单字节无符号的正整数,按从小到大的次序重新排列。
验程序后检查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),以便观察。
程序清单:
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.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,SSE1 ;六位显示完了吗?
RET
DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH
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
实验9 小直流电机调速实验
一、实验目的:掌握用单片机数控直流电机的速度。
二、实验内容:利用DAC0832芯片进行数/模控制,输出的电压经放大后驱动小直流电机的
速度进行数字量调节。
三、实验接线图:
四、实验步骤:
(1),将JX2接JX0,CS5接8000H,AOUT接DJ;
(2),运行程序,数码管上显示DJ--XX,数码管最后二位上显示的数字量不断加大或减小,电机速度也随之不断加快或减慢。
程序清单:正确的程序
ORG 0000H
LJMP SE13
ORG 05E0H
SE13: ;MOV SP,#53H
MOV 7EH,#00H
MOV 7DH,#08H
MOV 7CH,#03H
MOV 7BH,#02H
MOV A,#43H
MOV DPTR,#0FF20H
MOVX @DPTR,A
LO20: MOV R6,#00H
mov R4,#0Dh
LO21: MOV DPTR,#8000H
MOV A,R6
MOVX @DPTR,A
MOV R0,#79H
LCALL PTDS
LCALL SSEE
MOV R2,#08H
LCALL DELY
djnz R4,LO21
MOV R4,#0DH
INC R6
CJNE R6,#0ffH,LO21
LO22: MOV DPTR,#8000H
DEC R6
MOV A,R6
MOVX @DPTR,A
MOV R0,#79H
LCALL PTDS
LCALL SSEE
MOV R2,#08H
LCALL DELY
CJNE R6,#00H,LO22
LJMP LO20
ORG 0d20H
PTDS: MOV R1,A
LCALL PTDS1
MOV A,R1
SWAP A
PTDS1:ANL A,#0FH
MOV @R0,A
INC R0
RET
ORG 1050H
SSEE: ;SETB RS1
; MOV R5,#05H
SSE2: MOV 30H,#20H
MOV 31h,#7EH
MOV R7,#06H
SSE1: MOV DPTR,#0FF21H
MOV A,30H
CPL A
MOVX @DPTR,A
MOV R0,31H
MOV A,@R0
MOV DPTR,#DDFF
MOVC A,@A+DPTR
MOV DPTR,#0FF22H
MOVX @DPTR,A
MOV R2,#09H
LCALL DELY
MOV A,30H
RR A
MOV 30H,A
DEC 31H
MOV A,#0FFH
MOVX @R1,A
DJNZ R7,SSE1
; DJNZ R5,SSE2
;CLR RS1
RET
DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH
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
实验十8279键盘显示实验
1,实验目的:掌握8051系统中,扩展8279键盘显示接口的方法。
2,实验内容:按下数字键,数码管上应相应能显示数字,按下功能键,能相应执行其它程序。
3,实验接线图
4,实验程序框图:
5,实验步骤:把CS6孔用插针连至8000孔,JSL接JS,JRL接JR,JOUT接JLED,SW3,SW4,SW5置OFF(实验完后置ON),运行程序,数码管上显示P,按下数字键,数码管上应能显示相应数字,按下功能键,数码管上显示相应的0字l字2字循环。
6,程序清单:
ORG 0000H
LJMP H900
ORG 00D0H
H900: MOV SP,#53H
MOV DPTR,#8001H
MOV A,#00H ;
MOVX @DPTR,A ;8279方式字写入
MOV A,#32H
MOVX @DPTR,A ;分频
MOV A,#0DFH
MOVX @DPTR,A ;清缓冲区
H901: MOVX A,@DPTR ;读状态字
JB ACC.7,H901
MOV A,#85H
MOVX @DPTR,A
MOV DPTR,#8000H ; 字位选择
MOV A,#0c8H
MOVX @DPTR,A ;字形送入
INC DPTR
MOV A,#85H
MOVX @DPTR,A ;字位送入,显示P
H902: MOV 30H,#85H
MOV 31H,#40H ;自己定义的字符缓冲区的首地址
H903: MOV DPTR,#8001H
MOVX A,@DPTR
ANL A,#07H
CJNE A,#00H,H904 ;有键按下吗?
AJMP H903
H904: MOV DPTR,#8000H
MOVX A,@DPTR
MOV B,A ;取出键值
MOV R1,#00H
MOV DPTR,#GOJZ
H905: MOV A,#00H
MOVC A,@A+DPTR ;查键值表是否相同
CJNE A,B,H906 ;相等化转移,即转移到功能键处理方式
AJMP H907 ;转数字处理程序,即不是功能键则是数据键
H906: INC DPTR ;键表地址加1
INC R1 ;查找次数加1
MOV A,R1
JB ACC.4,H908 ;是功能键吗?够16个
AJMP H905 ;继续查找
H908: MOV R1,#00H
MOV DPTR,#GOJZ1
H909: MOV A,#00H
MOVC A,@A+DPTR ;功能键键值取出
CJNE A,B,H90A ;键值相等吗?
AJMP H90B ;转功能键处理子程序
H90A: INC DPTR
INC R1
MOV A,R1
JNB ACC.2,H909 ;继续查找,够四次的话认为是功能返回键,不够的话继续查找。
AJMP H900 ;无键按下返回,即显示P
H907: MOV A,30H
MOV DPTR,#8001H ;字位送入8279
MOVX @DPTR,A
MOV A,R1
MOV R0,31H
MOV @R0,A
INC 31H ;字形缓冲区加1
MOV DPTR,#ZOE0
MOVC A,@A+DPTR ;取出字形代码
MOV DPTR,#8000H
MOVX @DPTR,A ;送入8279显示
DEC 30H ;字位减1
MOV A,30H
CJNE A,#7fH,H90C ;显示到第8位,从头显示
AJMP H902
H90C: AJMP H903
H90B: MOV DPTR,#CKEY3 ;功能键散转处理
MOV A,R1
RL A
ADD A,R1
JMP @A+DPTR
CKEY3: LJMP L240
LJMP L241
LJMP L242
LJMP H900
GOJZ: DB 0C9H,0C1H,0D1H,0E1H,0C8H,0D8H,0E8H,0C0H,0D0H DB 0E0H,0F0H,0F8H,0F1H,0F9H,0E9H,0D9H
GOJZ1: DB 0F2H,0FAH,0F3H,0FBH
ZOE0: DB 0CH,9FH,4AH,0BH,99H,29H,28H,8FH,08H,09H,88H DB 38H,6CH,1AH,68H,0E8H
ORG 0E41H
L240: MOV R5,#0CH
LJMP L245 ;0字循环
L241: MOV R5,#9FH
LJMP L245 ;1字循环
L242: MOV R5,#4AH
L245: MOV R6,#80H ;2字循环
L246: MOV A,R6
MOV DPTR,#8001H
MOVX @DPTR,A ;字位送入8279
MOV A,R5
MOV DPTR,#8000H
MOVX @DPTR,A ;字形送入8279
MOV R2,#20H
LCALL DELY ;延时
MOV A,#0FFH
MOVX @DPTR,A ;关显示
INC R6 ;下一位显示
CJNE R6,#88H,L246
AJMP L245 ;不到最后一位继续
RET
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。