单片机实验指导_59728

  • 格式:doc
  • 大小:630.54 KB
  • 文档页数:27

1 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 2

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高低位,一般本程序用于把显示缓冲区的数据取出拼装成一字节。 三、实验程序框图: 3

拆字程序框图 拼字程序框图 四、实验步骤:用连续或单步方式运行程序,检查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 4

MOVX A,@DPTR ;(2000H)内容送A ANL A,#0FH ;屏蔽高位 ORL A,B ;或 INC DPTR MOVX @DPTR,A ;送2002H SJMP $ END

实验3 数据排序实验

一、实验目的:熟悉51指令系统,掌握程序设计方法。 二、实验内容:编写并调试一个排序子程序,其功能为用冒泡法将数据存储单元中几个单字节无符号的正整数,按从小到大的次序重新排列。 三、程序框图:

四、实验步骤: 将RAM 1000H~100FH 中放入不等的数据,用断点方法运行本实验程序后检查1000H~100FH中的内容是否按从小到大的次序排列。 五、思考:修改程序把1000H~100FH中内容从大到小排列。 1/程序清单: ORG 0000H LJMP SE01

开始 清标志位 DPTR取数送A (DPTR+1)送DPTR

(A)<((DPTR))?

置标志位,内容交换 长度-1=0? 标志位=0? 结束

Y N N

Y Y 5

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 6

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口的使用方法; 7

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