汇编程序与周期性任务设计(使用延时函数点亮LED流水灯,实现汇编语言查找平方数)

目录

一、点亮LED灯的延时函数(实现每隔1s点亮一个灯)

1.汇编指令延时函数理解

2.通过多重循环软件计数的定时方法点亮LED流水灯

3.通过 循环+ nop 指令的方法点亮LED流水灯

二、汇编程序实现查找平方数

三、在普中单片机开发板上完成LED流水灯的点亮

1.普中单片机开发板的介绍与驱动安装

2.LED流水灯点亮


一、点亮LED灯的延时函数(实现每隔1s点亮一个灯)

1.汇编指令延时函数理解

首先,我们通过上述代码来理解延时函数。

"DELAY: MOV R7,#250" 给寄存器R7赋值250;

"D1: MOV R6,#250" 给寄存器R6赋值250;

“D2: DJNZ R6,D2” 对R6进行减1操作,R6不为0 时跳转到D2执行。

(执行一条DJNZ指令用时2μs;直到R6=0时,共用时250*2=500μs)

“DJNZ R7,D1” 对R6进行减1操作,R6不为0 时跳转到D1执行,再次对R6进行减法循环。

(即将全面的指令循环执行250遍,共执行0.5*250=125ms)

2.通过多重循环软件计数的定时方法点亮LED流水灯

通过我们对上述延时代码的理解,我们来编写一个定时1s点亮一个LED灯的LED流水灯程序。

代码实现:

	ORG 0000H
		AJMP MAIN
	ORG 0030H
		MAIN:	MOV	SP,	#60H
				MOV	A,	#0FEH	
		
		LOOP:	
				INC	R0;			
				RR	A					
				MOV P1,A		
				ACALL	DELAY	
				AJMP	LOOP		
				
		
		DELAY:	
				MOV R4,	#100
		DEL1:	
				MOV R6,	#100	 
		DEL2:	MOV R7, #50
				DJNZ    R7,$   
				DJNZ	R6,DEL2        
                                    
				DJNZ	R4,DEL1
				RETI          
			
			END

代码解释:

该程序采用了三重循环结构。

DELAY: MOV R4, #1000  ; 对寄存器R4赋值100

DEL1: MOV R6, #100  ; 对寄存器R6赋值100

DEL2: MOV R7, #50   ; 对寄存器R7赋值50

DJNZ R7,$   ; 执行该行代码,每次对R7减1,减至0为止。用时2*100μs

DJNZ R6,DEL2   ;每次对R6进行减1,减后不为0转移执行DELAY2,再次对R7进行减法内循环。

DJNZ R4,DEL1   ;对R4进行减1,减后不为0转移执行DELAY1。

总共用时:2 * R7 * R6 * R5=1s

可以看见每过1s,LED灯被依次点亮

Edsim51仿真:

发现LED流水灯成功点亮。

3.通过 循环+ nop 指令的方法点亮LED流水灯

_nop_()函数 包括在库函数intrins.h中的

51单片机12M晶振,晶振周期为1/12μs,一个机器周期包含12个晶振周期,所以12M晶振时机器周期=12x(1/12)=1μs。

代码实现:

 #include <reg51.h>
	#include <intrins.h>//_nop_()
	void delay_ms(int a)
	{
		int i,j;
		for(i=0;i<a;i++)
		{
			for(j=0;j<1000;j++) _nop_();
	
		}
	}
	
	void main(void)
	{
		while(1)
		{
			P1=0xfe;//1111 1110
			delay_ms(160);
			P1=0xfd;//1111 1101
			delay_ms(160);
			P1=0xfb;//1111 1011
			delay_ms(160);
			P1=0xf7;//1111 0111
			delay_ms(160);
			P1=0xef;//1110 1111
			delay_ms(160);
			P1=0xdf;//1101 1111
			delay_ms(160);
			P1=0xbf;//1011 1111
			delay_ms(160);
			P1=0x7f;//0111 1111
			delay_ms(160);
		}
	}

由于for循环和delay调用都需要时间,所有将a设定为160

二、汇编程序实现查找平方数

代码实现:

ORG 0000H
       
tab:DB 00h,01h,04h,09h,10h,19h,24h
 MOV DPTR,#tab
 MOV R1,#5
CALL A1    
       
 A1:  
 MOV A,R1
 MOVC A,@A+DPTR
 MOV R2,A
 RET
 END

代码解释:

tab:DB 00h,01h,04h,09h,10h,19h,24h ;建立一个tab 表格,用于存放平方数

MOV DPTR,#tab ;将DPTP指向tab表格,方便后续调用表格

MOV R1,#5 ;对R1进行赋值5

CALL A1 ;调用函数A1

MOV A,R1 ;将R1的值移动到A中

MOVC A,@A+DPTR ;在tab表格中查找对应的平方数

MOV R2,A ;将A的值移动到R2中,便于我们查看结果是否正确。

EDSIM51仿真:

可以看见R1显示:0x05;R2显示:0x19(转换为10进制为25)

三、在普中单片机开发板上完成LED流水灯的点亮

1.普中单片机开发板的介绍与驱动安装

该开发板是基于STC89C52 STC89Cxx 芯片,搭配数码管(共阴极);8×8的点阵屏;流水灯;扩展IO芯片(595);键盘;温度传感器等的学习套件。

 普中单片机开发板具体介绍可以查看这个博客:开发知识点-普中51-单核-A2单片机_普中51单片机开发板资料-CSDN博客

首先进行驱动安装:(所有操作都需要连接普中开发板进行)

下载PZ-SIP;打开PZ-SIP,若串口号显示如图,则证明驱动安装成功

下载完成后,根据我们的芯片选择开发板对应的芯片类型,点击打开文件选择对应的".hex"或".asm"文件。

点击程序下载,若下载成功会出现如图:

2.LED流水灯点亮

代码实现:

	ORG 0000H
		AJMP MAIN
	ORG 0030H
		MAIN:	MOV	SP,	#60H
				MOV	A,	#0FEH	
		
		LOOP:	
				INC	R0;			
				RR	A				
				MOV P2,A				
				ACALL	DELAY	
				AJMP	LOOP		
				
		
		DELAY:	
				MOV R4,	#100
		DEL1:	
				MOV R6,	#100 
		DEL2:	MOV R7, #50
				DJNZ    R7,$   
				DJNZ	R6,DEL2        
                                  
				DJNZ	R4,DEL1
				RETI           
			
			END

(注:普中开发板中LED流水灯接口为P2,若代码中接口为P1,需将其改成P2,以确保LED能够正常点亮)

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值