单片机实验----控制流水灯

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mylovewanzi/article/details/82891804

单片机实验----控制流水灯


效果:
如图:
效果
(上传的gif,好像不太支持)

知识点:

  • 学习MOVC,INC,CJNE,DB指令
  • 学习一种新的编程方法——查表法

代码展示:

		ORG 	0000H				
MAIN: 	MOV 	DPTR,#TAB			;数据指针中装人表格的初始地址#TAB
		MOV 	R0,#0				;数据表指针取初值0
LOOP: 	MOV 	A,R0				;将指针的值转送给累加器
		MOVC 	A,@ A+DPTR			;将(A+DPTR)作为地址查找到表格中的并放回A中
		MOV 	P0,A				;将查表得到的数据传送给P1口使小灯点亮
		LCALL 	DELAY				;调用延时子程序
		MOV 	P0,#0FFH			;按要求点亮后关闭所有小灯
		INC 	R0					;查表指针加1
		CJNE 	R0,#28,LOOP			;判断RO中的数是否为最后一个(这里为28),
									 若是则顺序往下执行,若否就跳转执行LOOP标号指令
		LJMP 	MAIN				;流水灯循环点亮
DELAY: 	MOV 	R1,#200				;延时子程序
D1:    	MOV 	R2,#150
D2:	   	DJNZ 	R2,D2
		DJNZ 	R1,D1
		RET							;返回延时程序
TAB:	DB 		0FH,0F0H,0FH,0F0H
		DB 		0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0DFH,07FH
		DB 		07FH,0BFH,0DFH,0F7H,0FBH,0FDH,0FEH
		DB 		0E7H,0C3H,81H,00H,81H,0C3H,0E7H,0FFH
END		
		  

什么是查表法:
该程序中用到了查表法,那什么是查表法呢?
所谓查表法就是取一组按控制要求的数据,并将这组数据按照顺序写入程序存储器中。

指令说明:

MOV DPTR, #TAB

这是一条“16位数的数据传送”指令,其功能是将一个16位的立即数送人DPTR中。其中,“TAB”代表“DB”后面的数据表起始位置的地址。因此,这句话的作用是将标号“TAB” 代表的数据表的首地址传送给“DPTR"

  1. 变址寻址方式MOVC:
    格式:MOVC A,@A +DPTR
    功能:先把DPTR与A的内容相加,获得操作数地址,再把该地址( 即程序存储器地址)的内容送A。其中符号“@”是对(A +DPTR) 的,而不是单单对“A”的。
    例如: A =05H, DPTR =0F00H,变址寻址形式的操作数地址为A + DPTR =05H +0F0OH=OFO5H,而0F05H单元的内容为0FDH,故该指令执行结果是A的内容为OFDH
    (A +DPTR) =(0SH +0F00H) =0F05H

  2. 加1指令INC。
    格式: INC 操作数
    功能:该指令可以对累加器A、寄存器Rn、内部RAM单元以及数据指针DPTR进行加1操作。该指令不能响程序状态字psw的状态。在本任务的程序中在表指针RO不断加1,使数据表的地址向后移动。

  3. 数据比较转移指令CJNE。
    格式:CJNE 左操作数,右操作数,跳转位置
    它有如下几种格式:

CJNE A, #data,rel  ;累加器内容与立即数不等转移
CJNE A,direct, rel  ;累加器内容与内部RAM单元内容不等转移
CJNE Rn,#data, rel ;寄存器内容与立即数不等转移
CJNE @Ri, #data, rel ;内部RAM前128单元内容与立即数不等转移

功能:对左右两个操作数进行比较,若结果不相等,则转移到指定的跳转位置rel;若结果相等,则顺序执行下一条指令。
例如,在本任务的程序中,该指令将“RO”的内容与立即数“#28”相比较,如果“R0”不等于28,则程序就跳回标号“LOOP”行去执行程序。

这条指令还有一个特点,就是在两个数作比较时,比较出的结果会改变“PSW”中进位标志位“C”的状态:

  • 左操作数=右操作数时,程序顺序执行,即C=0。
  • 左操作数> 右操作数时,程序跳转至标号处,即C=0。
  • 左操作数<右操作数时,程序跳转至标号处,即C=1。

AT89C51中没有专门的数值比较指令,用户若需要对两个数的数值进行比较,民可用该指令来实现,数值比较可在程序转移的基础上进行。

  1. 定义字节命令DB。
    格式:标号: DB 8位数表
    功能:用于从指定的地址开始,在程序存储器的连续单元中定义字节数据。字节数据可以是一个字节常数或字符、用逗号分开的字节串、用引号括起来的字符串。常使用本指令存放数据表格,例如本程序中的“TAB”数据表。每次写数据时都要用逗号隔开,并且每次数据表每次换行时,前面都必须加‘DB’命令。

时间:2018年9月29日00:28:33


-END-

猜你喜欢

转载自blog.csdn.net/mylovewanzi/article/details/82891804