汇编程序与周期性任务设计


提示:以下是本篇文章正文内容,下面案例可供参考

一、LED周期性闪烁的汇编程序

1.汇编代码

LOOP:SETB 90H
      LCALL DELAY
      CLR 90H
      LCALL DELAY
      AJMP LOOP

DELAY: MOV R7,#250
D1:MOV R6,#250
D2:DJNZ R6,D2
   DJNZ R7,D1
   RET
END

实验结果:

在这里插入图片描述
在这里插入图片描述

2.延时分析

问:请查阅汇编指令 “MOV R6,#250”和“DJNZ R6,D2”的指令周期数,计算其对应的时钟周期 us值;然后计算 Delay函数的总的循环次数和对应的时钟周期总数us, 说明这个LED灯大约每隔多少毫秒(ms)或秒(s)才变化一次亮灭状态;

答:根据8051微控制器的规格,我们可以找到MOV和DJNZ指令的指令周期时间。假设系统时钟频率为12MHz,则每个指令周期为12/12 = 1微秒(us)。
指令“MOV R6,#250”是一个单字节指令(一个字节的立即数操作),需要1个指令周期。
指令“DJNZ R6,D2”是一个双字节指令(一个字节的寄存器操作和一个字节的相对跳转),需要2个指令周期。
因此,MOV R6,#250和DJNZ R6,D2总共需要3个指令周期,即3微秒。
在DELAY子程序中,外部循环的计数器R7被初始化为250,内部循环的计数器R6也被初始化为250。因此,外部循环需要250次迭代,内部循环在每次外部循环迭代中需要250次迭代。
D1循环的总指令周期数为250次外部循环 × 250次内部循环 × 3指令周期/迭代 = 187,500指令周期。
Delay函数的总指令周期数为:187,500指令周期 × 1微秒/指令周期 = 187,500微秒(us)。
因此,这个LED灯大约每隔187,500微秒(或0.1875秒或187.5毫秒)才变化一次亮灭状态。

二、实现准确的LED 每隔1s亮灭的周期性变化

1.汇编代码

LOOP:SETB 90H
     LCALL DELAY
     CLR 90H
     LCALL DELAY
     AJMP LOOP

DELAY:MOV R0,#8
D0: MOV R7,#250
D1:	MOV R6,#250
D2:	DJNZ R6,D2
   	DJNZ R7,D1
	DJNZ R0,D0
  	RET
END

2.实验结果

在这里插入图片描述

三、完成一个查找平方数的汇编程序

1.汇编程序


ORG 0000H		
LJMP A1		
ORG 0080H		
A1: NOP	
	NOP
	MOV SP,#60H
	MOV DPTR,#2000H
    MOV A,#03H
	MOVC A,@A+DPTR
A2: SJMP A2
	ORG 2000H
    DB 01h,04h,09h,10h,19h,24h,31h,40h,51h	
	END

2.实验结果

在这里插入图片描述

四、普中单片机开发板上完成点亮流水灯和LED灯周期性闪烁

1.汇编语言代码

LOOP:SETB 90H
     LCALL DELAY
     CLR 90H
     LCALL DELAY
     AJMP LOOP

DELAY:MOV R0,#8
D0: MOV R7,#250
D1:	MOV R6,#250
D2:	DJNZ R6,D2
   	DJNZ R7,D1
	DJNZ R0,D0
  	RET
END

2.C语言代码

#include<reg52.h>    
#define uchar unsigned char
#define uint unsigned int
void delay(uint z);
sbit LED=P2^0;   
void main()
{
    while(1)  
	    {
		LED=0;    
		delay(1000); 
		LED=1;      
		delay(1000); 
		}             
}
void delay(uint z)
{
 	uint x,y;
 	for(x=z;x>0;x--)
 	for(y=110;y>0;y--);  
}

3.实验结果

在这里插入图片描述

  • 11
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值