1、精品文档图-沔葡片贩*$ i麦发龙二载买班点加灯效京,实验二“流水灯”一、实验目的:1 .初步了解汇编语言2 .通过实验了解单片机最小系统3 .了解单片机的I/O 口通信。4 .学习延时子程序的编写和使用 二、实验内容:1.流水灯(跑马灯). 单片机控制着8支发光 二极管,每一时刻只有 一支发光二极管点亮, 如图示,延时200ms后 熄灭而与之相邻的发光 二极管点亮,直到点亮 最后一个发光二极管后 一,又以相反的方向依次点 亮发光二极管,随意编辑TCCWrvr AMI mmtEg*RimF3KAI*) nrudJi从单片机最简系统出 发.给I/O口添加8支 发光二极管,得系统 电路如图示.当然
2、, 除了使用P2 口外还可 以使用PO、P1、P3完 成这个实例口精品文档流水表步骤P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7十六进制1011111117FH2101111110BFH3110111110DFH4111011110EFH5111101110F7H6111110110FBH7111111010FDH8111111100FFHMOV P1, #7FHACALL DELAYMOV P1, #0BFHACALL DELAYMOV P1, #0DFHACALL DELAYMOVACALLMOVACALLP2OP2 1P2 2 P2 3 P2 4P2 5P2 6 P2
3、7不科学P1, #0FDHDELAYP1, #0FFHDELAY精品文档随意编辑指令指令类别功能说明ORG伪指令用于设计程序计数器 PC的初始值,一般出现在程序开始处MAIN#程序中使用一个便于理解的字符串来指向程序存储器中的地 址MOVP0,#00H数据装载将立即数00H装载到P0寄存器,即从 P0 口输出CALL DELAY调用指令调用程序存储器范围内的子程序JMP START跳转指令控制程序的走向和实现循环执行特定程序段RRC逻辑操作指令经过进位位的累加器循环右移RLC逻辑操作指令经过进位位的累加器循环左移DJNZ R5,$循环指令将一段程序重复执行一定次数(R5的值决定了重复的次数)。
4、 寄存器减一,不为零则转移。RET返回指令在子程序末尾,提示子程序结束,返回主程序END伪指令告诉汇编器程序的结束点,END以后的程序被视为是无效的LOCF:RRC;进位标志位C在累黑器A中从左向右轮换一次CX2;R1 X 二,如果 R:0 则三垣LOCF*但0-1 “ A不 H;起始地址ORG 00HSTART:MOVA, #0FFHCLR CMOVR1, #8RIGHT:RRC AMOVP1, AACALL DELAYDJNZ R1, RIGHT;程序一开始,初始一些所需要变量,如进位C 的清 0 等;累加器 A 的 8 位全置 1 ( 0FFH) ,发光二极管全熄灭;进位 C 被清0 ,
5、 C=0;R1=8 , 循环8 次(右移 8 次),用 R 1 作计数器;这是发光二极管向右“流动” 的循环体;把进位C 在累加器 A 中 从左向右轮换一位;输出至 P1 口;调延时子程序 ,延时 200msJMP START;跳回一开始,重复执行该流水灯程序;R1 减 1 ,如果不为 0 跳回 RIGHT 循环执行DELAY:D1:D2:;延时 200ms 的子程序MOVR3,#20MOVR4,#20MOVR5,#248; 2+248 X2=498=498 gDJNZR5, $;R5 减 1 ,如果不为0 ,就执行本行DJNZR4, D2; 2+20 X (498+2 ) =10002 g1
6、0msDJNZR3, D1RET;子程序结束标志,返回主程序END;程序结束点( 3 )取表法要显示的数据之间不存在简单的运算关系, 不能使用 ADD 和 SUBB 等指令根据上一状态计算出下一状态的显示值。 但 显示的数据存在依次取用的特点, 这时一般就会用到取表的方法。取表法是单片机程序中很常用的一种编程思想。 在汇编程序末尾附加一个数据表, 这个数据表可以是可以是字节型, 也可是英文字母等数据。 数据表与汇编程序一起可以被汇编,之后数据表就成为数据的一部分包含在生成的 .HEX 文件中。通过下载之后,数据表和程序代码就固化在单片机的程序存储器中。ORG 00HSTART:;装表,即DPT
7、R 指向表 TABLE 的表MOVDPTR,#TABLE;数据指针寄存器DPTR 指向表 TABLE 头LOADTABLE:;取表程序段,表中的数据载入累加器ACC 中,并判断是否已经完成CLR A;累加器ACC清零MOVC A,A+DPTR;基址加变址寻址,将表中数据载入 ACC;CJNE A,#data rel比较立即数和A不相等则转移。如果取到88H说明表已经取完,否则显示;如果取完,跳回 START,重新开始累加器 ACC的数据输出到P1将ACC的数据输出到P1 口;调延时子程序;DPTR加1 ,准备取表中的下一个数据;跳回取表程序段的子程序;R5减1 ,如果不为0,就执行本行TABL
8、E:DB07FH,0BFH,0DFH,0EFH;右移DB0F7H,0FBH,0FDH,0FEHDB88H;结束码END;程序结束点;子程序结束标志,返回主程序CJNE A,#88H,DISPLAYJMP STARTDISPLAY:;显示程序段MOVP1,AACALL DELAYINCDPTRJMPLOADTABLEDELAY:;延时 200msMOV R3, #20D1:MOVR4, #20D2:MOVR5, #248DJNZR5, $DJNZR4, D2DJNZR3, D1RET步甄pi.aP1.2.PL3)Pl rPl. 5rPi . 6.Pl.74十六迸制,101J1 二Ip1-31q匕”即1,AIfOBFH1.0*,1laODFH-心1Q1产LADKFHj*1*1gIpOF1H.6*10la0/L14OEBH小耳1-1k*l-3融1#1.1-1-11一山OFFH-取表法的优点是预先存放所需数据,在程序需要时调用,这样一来,程序简洁, 易于调试.三、实验报告1 .分别用两种方法编程实现流水灯从右向左的点亮,并调试.2 .分别用两种方法编程实现流水灯从左向右,再从右向左来回流动的程序,并调试 .3 .编程实现发光二极管自左向右,每隔 0.5 秒循环相邻两个点亮一次(相邻两个亮 ,其余灭 )4 . 分析延时子程序的延时原理