1、51系列单片机原理与应用实验 实验1 简单汇编语言实验一、实验目的:掌握汇编语言设计和调试方法,熟悉键盘操作。熟悉汇编语言编程。二、实验内容:1.查找相同数据个数:在2000H200FH的N个单元中填入零,运行本程序后检查2100H中是否为N;2清零:把2000H20FFH的内容清零。三、实验程序框图: 查找相同数据个数程序实验框图 清零程序框图 四、实验步骤:1、在2000H200FH的几个单元中填入零,运行查找相同数据个数程序后检查2100H中是否是几个单元数。2、用连续或单步方式运行清零程序,检查200020FF中执行程序前后的内容变化。五思考:1、修改程序,查找其它内容。2、修改清零程
2、序,假使把2000H20FFH中的内容改成FF,如何修改程序。1/ 查找相同数据个数程序程序清单: ORG 0000H LJMP L5800 ORG 0AA0HL5800: MOV R0,#10H ;查找16个字节 MOV R1,#00H MOV DPTR,#2000HL5811: MOVX A,DPTR CJNE A,#00H,L5816 ;取出内容与00H相等吗? INC R1 ;取出个数加1L5816: INC DPTR DJNZ R0,L5811 ;未完继续 MOV DPTR,#2100H MOV A,R1 MOVX DPTR,A ;相同数的个数送2100HL581E: SJMP L5
3、81E END2/ 清零程序清单: ORG 0000H LJMP SE01 ORG 0640HSE01: MOV R0,#00H MOV DPTR,#2000H ;(0000H)送DPTRLOO1: 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高位清零,一般
4、本程序用于把数据送显示缓冲区时用;2、把2000H.2001H的低位分别送入2002H高低位,一般本程序用于把显示缓冲区的数据取出拼装成一字节。三、实验程序框图: 拆字程序框图 拼字程序框图四、实验步骤:用连续或单步方式运行程序,检查2000H2002H中内容变化情况。五、思考:如何用断点方式调试本程序。1/拆字程序清单: ORG 0000H LJMP SE02 ORG 0660HSE02: MOV DPTR,#2000H MOVX A,DPTR MOV B,A ;(2000)AB SWAP A ;交换 ANL A,#0FH ;屏蔽高位 INC DPTR MOVX DPTR,A ;送2001H
5、 INC DPTR MOV A,B ANL A,#0FH ;(2000)内容屏蔽高位 MOVX DPTR,A ;送2002HLOOP: SJMP LOOP END2/拼字程序清单: ORG 0000H LJMP START ORG 0680HSTART: 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
6、 $ END 实验3 数据排序实验一、实验目的:熟悉51指令系统,掌握程序设计方法。二、实验内容:编写并调试一个排序子程序,其功能为用冒泡法将数据存储单元中几个单字节无符号的正整数,按从小到大的次序重新排列。开始三、程序框图: 清标志位取数送()送()()?置标志位,内容交换长度?标志位?结束四、实验步骤: 将RAM HFH 中放入不等的数据,用断点方法运行本实验程序后检查HFH中的内容是否按从小到大的次序排列。五、思考:修改程序把HFH中内容从大到小排列。1/程序清单:ORG 0000HLJMP SE01ORG 0640HSE01: CLR 00H ;标志位 MOV DPTR,#1000H
7、;起始地址 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 DPHLOOP4: MOVX DPTR,A MOV A,22H INC DPTR MOVX DPTR,A SETB 00H LOOP1: DJNZ R7,LO
8、OP;不交换位置 JB 00H,SE01 ;判断此次循环有无交换发生LOOP3:SJMP LOOP3 END例4-1 有一变量在片内RAM的20H单元,取值范围:00H05H。编制一段程序,根据变量值求其平方值,并存入片内RAM的21H单元。ORG 0000HLJMP SE01ORG 0640HSE01:MOV DPTR,#2000H MOV A,20H MOVC A,A+DPTR MOV 21H,A SJMP $ ORG 2000HTABLE:DB 01,01,04,09,16,25 END例4-2 设变量 x 以补码的形式存放在片内RAM的30H单元,变量 y 与 x 的关系是:当 x 大
9、于0时,y =x;当 x =0时,y =20H;当 x 小于0时,y =x+5。编制程序,根据 x 的大小求y并送回原单元。ORG 0000HLJMP STARTORG 0640HSTART:MOV A,30H JZ NEXT ANL A,#80H ;判断符号位 JZ LP MOV A,#05H ADD A,30H MOV 30H,A SJMP LPNEXT:MOV 30H,#20HLP:SJMP $END例4-3 编写程序,将内部RAM的30H至3FH单元初始化为00H。ORG 0000H LJMP MAINORG 0040HMAIN:MOV R0,#30H MOV A,#00HMOV R7
10、,#16 LOOP:MOV R0,A INC R0 DJNZ R7,LOOP SJMP $ END例4-4 将内部RAM中起始地址为60H的数据串传送到外部RAM中起始地址为1000H的存储区域内,直到发现 $字符停止传送。由于循环次数事先不知道,但循环条件可以测试到。该程序采用先判断后执行的结构。 ORG 0000H LJMP MAINORG 0040HMAIN: MOV R0,#60H MOV DPTR,#1000HLOOP0: MOV A,R0 CJNE A,#24H,LOOP1 SJMP DONE LOOP1: MOVX DPTR,A INC R0 INC DPTR SJMP LOOP
11、0DONE: SJMP DONE END实验4-1 P1口亮灯实验一、 实验目的:l)学习P1口的使用方法;2)学习延时子程序的编写。二、 实验顶备知识: (l).Pl口为准双向口,每一位都可独立地定义为输入或输出,在作输入线使用前,必须向锁存器相应位写入“1”,该位才能作为输入。(2).本实验中延时子程序采用指令循环来实现,机器周期(12/6MHz)*指令所需机器周期数*循环次数,在系统时间允许的情况下可以采用此方法。三、 实验内容: P1口输出口,接八只发光二极管,编写程序,使发光二极管循环点亮。四、 实验程序框图: 五、 实验步骤 :P1.0P1.7用插针连至L1L8,运行程序后,观察发
12、光二极管闪亮移位情况。六、 思考: 改变延时常数,使发光二极管闪亮时间改变。修改程序,使发光二极管闪亮移位方向改变程序清单ORG 0000H LJMP SE18 ORG 0790HSE18: MOV P1,#0FFH ;送P1口LO34: MOV A,#0FEH ;L1发光二极管点亮LO33: MOV P1,A LCALL SE19 ;延时 RL A ;左移位 SJMP LO33 ;循环 ORG 07A0HSE19: MOV R6,#0A0HLO36: MOV R7,#0FFHLO35: DJNZ R7,LO35 DJNZ R6,LO36 ;延时 RET END实验4-2 P1口转弯灯实验一、
13、实验目的:进一步了解P1口的使用,学习汇编语言编程方法及调试技巧。二、实验内容:P1.0 开关接5V,右转弯灯闪亮,P1.1开关接5V时左转弯灯闪亮,P1.0,P1.1开关同时接5V或接地时,转弯灯均不闪亮。三、实验程序框图:四、实验接线图:五、实验步骤:P1.0 接K1,P1.1接K2,P1.4P1.7接L1、L5、L9、L13,连续运行本程序,应看到转弯灯正确闪亮,在用单步方式调试本程序时需修改延时子程序,(例可把延时程序第一个字节改成返回指令22H),以便观察。程序清单: ORG 0000H LJMP PX00 ORG 0C30HPX00: MOV P1,#0FFH ;初始化PX03:
14、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:
15、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
16、 ;关灯 SETB P1.7 LJMP PX03 ;继续DELY: PUSH 02HDEL2: PUSH 02HDEL3: 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.0P1.7插针连至L1L8,K1拨动一次,L1L8发光二
17、极管按16进制方式加一点亮。五、思考:修改程序,使发光二极管左移方式点亮。程序清单: ORG 0000H LJMP J100 ORG 0810HJ100: MOV A,#00HJ101: 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: PUS
18、H 02HDEL2: PUSH 02HDEL3: PUSH 02HDEL4: 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再驱动发光二极管显示出来。三、实验程序框图: 四、实验步骤:Y0Y7接K1K8,Q0Q7接L1L8,CS1接8000孔,CS2接90
19、00孔,JX0接JX7,执行程序,按动K1K8,观察L1L8是否对应点亮。五、思考:可否用273输入,244输出。程序清单: ORG 0000H LJMP GOD0 ORG 0B80HGOD0: MOV DPTR,#8000H MOVX A,DPTR ;取出244状态 MOV DPTR,#9000H MOVX DPTR,A ;送273驱动发光二极管 SJMP GOD0 END 实验6 继电器控制一、实验目的掌握用继电器的基本方法和编程。二、实验内容利用P1口输出高低电平,控制继电器的开合,以实现对外部装置的控制。三、实验预备知识现代自动控制设备中都存在一个电子与电气电路的互相联结问题,一方面要
20、使电子电路的控制信号能够控制电气电路,提供良好的电隔离,以保护电子电路和人身的安全,继电器便能完成这一桥梁作用。四、实验接线图: 五、实验步骤:把Pl.0接JIN端,继电器的JZ通过K1接地。JK接L1,JB接L2。编制程序,使P1.0电平变化,高电平时继电器吸合,常开触点接上Ll点亮,L2熄灭,低电平时继电器不工作,常闭触点闭合,Ll熄灭,L2点亮。程序清单: ORG 0000H LJMP LOOP ORG 0F00HLOOP: CLR P1.0 MOV R2,#30H LCALL DELY SETB P1.0 MOV R2,#30H LCALL DELY SJMP LOOPDELY: PU
21、SH 02HDEL2: PUSH 02HDEL3: PUSH 02HDEL4: 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口分别用
22、插针连至LlL8,观察发光二极管变化情况)。程序清单: ORG 0000H LJMP SE09 ORG 0580HSE09: 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 05A0DELY: PUSH 02HDEL2: PU
23、SH 02HDEL3: 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芯片的结构及编程方法。二、实验内容:用8255PA口作开关量输入口,PB口作输出口。三、实验程序框图: 四、实验接线图: 五、实验步骤:8255PA口接KlK8,PB口接L1L8运行程序,按K1K8,观察L1L8发光二极管是否对应点亮。程序清单: ORG 0000h LJM
24、P SE17 ORG 0770HSE17: 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 PA0PA7PB0PB3接发光二极管L15L1
25、3、L11L9、L7L5、L3L1。执行程序,初始态为四个路口的红灯全亮之后,东西路口的绿灯亮,南北路口的红灯亮,东西路口方向通车,延时一段时间后东西路口的绿灯熄灭,黄灯开始闪烁,闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北路口方向开始通车,延时一段时间后,南北路口的绿灯熄灭,黄灯开始闪烁,闪烁若干次后,再切换到东西路口方向,之后重复以上过程ORG 0000H LJMP JOD0 ORG 0BB0HJOD0: MOV SP,#60H MOV DPTR,#0FF2BH MOV A,#88H MOVX DPTR,A ;8255初始化 MOV DPTR,#0FF28H MOV A,#0
26、B6H MOVX DPTR,A INC DPTR MOV A,#0DH MOVX DPTR,A ;点亮4个红灯 MOV R2,#25H ;延时 LCALL DELYJOD3: 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 ;东西黄
27、灯亮,南北红灯亮 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
28、: 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 02HDEL2: PUSH 02HDEL3
29、: 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用插针接
30、至AOUT1孔,CS4接8000H孔,JX0接JX6,运行程序,数码管上显示0809.XX,,后二位显示当前采集的电压转换的数字量,调节W1,该二位将随着电压变化而相应变化。六、思考:修改程序,用其它通道轮流采样显示。程序清单:正确的程序 程序清单: ORG 0000H LJMP SE11 ORG 05A0HSE11: 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 S
31、SEE ;显示 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 05D0HPTDS: MOV R1,A ;拆送显示缓冲区 ACALL PTDS1 MOV A,R1 SWAP APTDS1: ANL A,#0FH MOV R0,A INC R0 RET ORG 0D50HSSEE: MOV 30H,#20H ;位选信息给30H MOV 31H
32、,#7EH ;数据缓冲器首地址给31H MOV R7,#06H ;位选次数给R7SSE1: 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