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

一、汇编语言LED延时点亮

在这里插入图片描述

根据实验课所给上图程序请查阅汇编指令 “MOV R6,#250”和“DJNZ R6,D2”的指令周期数,计算其对应的时钟周期 us值;然后计算 Delay函数的总的循环次数和对应的时钟周期总数us。

(1)指令周期是指CPU从内存取出一条指令并执行指令所需时间。一般用CPU周期(机器周期)来表示;一个周期指令周期包含若干个机器指令

机器指令是CPU执行一条指令所需最短时间,通常由多个时钟周期组成

时钟周期=振荡周期即单片机晶振频率倒数即1/12M。

根据查阅汇编指令可知MOV R6,#250是一个周期;DJNZ R6,D2是两个周期,

即执行MOV这句语句一次需要1μs,给R6被赋值250;而DJNZ这条指令是给R6减1并循环执行250次且该句是两个周期因此该语句需要500μs。

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

(2)根据上图的DELAY函数可以看出相当于两个循环叠加先在R6进行250次循环然后R7减1再次赋值进行R6又250次循环这样子进行250次,即D1循环进行了250次,D2循环了250X250次,其中第二句的R7-1循环250次。计算可得总次数为63000。而整个函数延时为:125ms即0.125s。

(3)实现LED 每隔1s亮灭。

由于两个寄存器的叠加循环无法达到实现一秒的延时,因此要增加一层循环增加一个R5以增长延时。

代码如下:

LOOP:SETB 90H ;led0置1
	  LCALL DELAY ;调用延时函数
	  CLR 90H    ;led0置0
	  LCALL DELAY 
	  AJMP LOOP  ;跳转到LOOP
	
DELAY: MOV R5,#25 ;延时函数
D1:	   MOV R6,#100
D2:   MOV R7,#200
D3:    DJNZ R7,D3
      DJNZ R6,D2
	   DJNZ R5,D1
	   RET  ;返回主函数
	   END ;指令结束

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

(1)写一个汇编查找平方数的程 序并解释,附上在Edsim51、proteus截图。

ORG 000H
LJMP START
ORG  80H
START:
NOP
NOP
MOV SP,#60H
MOV DPTR,#0300H
MOV A,#4
MOVC A,@A+DPTR
MOV 40H,A
LOOP:
SJMP LOOP
ORG 300H
DB 00H,01H,04H,09,10H,19H,24H,31H,40H,51H,64H,79H,90H,0C4H
END

此处代码参考B站:8051汇编查表程序与DB伪指令 —老头学汇编之十一

(2)在Edsim51进行验证,结果如下:

在这里插入图片描述

三、LED闪烁及流水灯实验

​ 关于使用普中单片机开发板实验

(1)汇编闪烁。

ORG 0000H 
  LJMP MAIN  
  ORG 0010H
  MAIN:
  Start:
      SETB P2.0 
	  LCALL DELAY 
	  CLR P2.0    
	  LCALL DELAY 
	  AJMP Start  
	
DELAY: MOV R5,#25 
D1:	   MOV R6,#100
D2:   MOV R7,#200
D3:   DJNZ R7,D3
      DJNZ R6,D2
	  DJNZ R5,D1
	  RET  
	  END 

在Keil中创建项目并将代码写入生成对应hex文件然后用PZ-ISP将hex文件写入

在这里插入图片描述

开发板上led出现闪烁效果如下:

在这里插入图片描述

ORG 000H  
  LJMP MAIN  
  ORG 0030H
  MAIN:
  MOV A,#0FEH           
  LOOP:                 
  MOV P2,A                   
  LCALL DELAY
  RL A  
  SJMP LOOP 
 DELAY: MOV R5,#25 
D1:	   MOV R6,#100
D2:   MOV R7,#200
D3:   DJNZ R7,D3
      DJNZ R6,D2
	  DJNZ R5,D1
	  RET  
	   END 

在Keil中创建项目并将代码写入生成对应hex文件然后用PZ-ISP将hex文件写入

在这里插入图片描述

开发板上led出现流水灯效果如下:
在这里插入图片描述

(3)C语言闪烁。

#include<reg51.h>
void delay(unsigned int t);
void main()
{
       while(1)
          {
              P2=0xfe;
              delay();
              P2=0xff;
              delay();
          }
}
void delay(unsigned int t)
{
	while(--t);
	}

在Keil中创建项目并将代码写入生成对应hex文件然后用PZ-ISP将hex文件写入

在这里插入图片描述

开发板上led出现闪烁效果如下:

在这里插入图片描述

(4)C51流水灯。

#include <reg51.h>
	#include <intrins.h>
	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)
		{
			P2=0xfe;
			delay_ms(1000);
			P2=0xfd;
			delay_ms(1000);
			P2=0xfb;
			delay_ms(1000);
			P2=0xf7;
			delay_ms(1000);
			P2=0xef;
			delay_ms(1000);
			P2=0xdf;
			delay_ms(1000);
			P2=0xbf;
			delay_ms(1000);
			P2=0x7f;
			delay_ms(1000);
		}
	}

在Keil中创建项目并将代码写入生成对应hex文件然后用PZ-ISP将hex文件写入

在这里插入图片描述

开发板上led出现流水灯效果如下:

在这里插入图片描述

四、总结

本次实验让我对汇编的延时函数等相关知识有了更多了解。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值