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

目录

一、周期:

指令周期:

机器周期:

时钟周期

二、延时函数 

单重循环:

多重循环:

NOP指令:

 三、汇编语言求平方数(查表法)

1、汇编程序

2、Edsim中验证程序

3、Protues中验证程序

四、普中开发板应用实例


简介:

       在之前的学习中我们已经可以运用好汇编语言编写相关的程序了,下面我们对于程序的周期性进行探讨,在本次周期性设计中,我们要了解什么是周期,以及延时函数、NOP指令等,其中还有利用所学的汇编语言求平方数,以及我们到手的普中开发板进行实践等。

一、周期:

这里我们需要了解到的周期主要是:指令周期,机器周期与时钟周期

指令周期:

CPU从存储器中取出并执行一条指令所需的全部时间称之为指令周期;包括从内存中读取指令、解码指令、执行指令等几个步骤。 一个指令周期通常由几个机器周期组成,具体取决于指令的复杂性和处理器的设计。 通过比较不同处理器的指令周期的长度和效率,可以了解它们的执行速度和性能优劣,也可以进一步指导优化指令执行效率。通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。

例如:MOV为单周期,DJNZ为双周期

机器周期:

其又称为CPU周期(CPU Cycle),机器周期是人为规定的,实际上是对一条指令执行过程阶段的划分。具体的划分方法随计算机的不同而不同。它一般由12个时钟周期(振荡周期)组成,即由6个状态周期组成,而振荡周期=1/晶振频率,因此单片机的机器周期=12/晶振频率。

例如:12M晶振频率,机器周期为1微秒

时钟周期

时钟周期也称为振荡周期,定义为时钟脉冲的倒数,时钟周期就是单片机外接晶振的倒数,是计算机中的最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。时钟脉冲是计算机的基本工作脉冲,控制着计算机的工作节奏。时钟频率越高,工作速度就越快。如:12M的晶振,它的时钟周期就是1/12微秒。

例如:12M的晶振,它的时钟周期就是1/12微秒。

二、延时函数 

对于延时函数,简单来说,延时函数的目的就是通过延长运行间隔时间,然后做到等,实际上就是要等一段时间再来执行接下来的代码。而这种简单的等,可以采用很多种方法来实现,例如循环、定时器等。

单重循环:

单重循环可以实现短暂延时,

DELAY:MOV R7,#100      ; 寄存器R7赋值100
D1:DJNZ R7,D1    	   ;--R7,结果不为0跳转到D1继续执行
   RET				   ;返回函数

上述代码则为单重循环的延时,DJNZ指令周期为两个机器周期,即执行DJNZ指令需要2μs,所以,每执行一次寄存器R7减一,不断重复,直到R7把100减为0后,指令结束,从而实现延迟。而D1语句执行次数为100次,所以延时为 100 * 2 = 200 μs

多重循环:

多重循环可以实现较长延时,

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

第一句后面虽然接有#250,但是只执行了一次,没有任何语句跳转给它,单周期 *1。
而 D1 执行了250次,全部是第四句跳过来的,单周期 *1。
D2: DJNZ R6,D2 ;原地执行了250次,而 D1 每执行一次,就要执行D2: DJNZ R6,D2 。也执行250次,而且还是双周期 *2。
DJNZ R7,D1 ; 从D2 第一句执行过来250次,同时双周期 *2。
综上所述,延时:(1 *1+250 *1+250 *250 *2+250 *2)*1 ≈ 0.125 s,换算约为0.125秒。

NOP指令:

在计算机科学中,NOP、no-op 或 NOOP(发音为 " no op " ;no operation 的缩写)是一种机器语言指令及其汇编语言助记符、编程语言语句或不执行任何操作的计算机协议命令。

在汇编语言中,nop指令是空指令,意味着什么都不做,一般用来控制CPU时间,达到时钟延时的效果。NOP指令为单周期指令,可由晶振频率计算出延时时间,对于12M晶振,延时1μs。

 三、汇编语言求平方数(查表法)

1、汇编程序

代码如下:

1|ORG 0000H		
2|LJMP A1		
3|ORG 0080H		
4|A1: NOP	
5|	  NOP
6|	  MOV SP,#60H
7|	  MOV DPTR,#tab 
8|    MOV A,#03H
9|	  MOVC A,@A+DPTR
10|A2: SJMP A2
11|ORG 2000H	
12|tab:DB 01h,04h,09h,10h,19h,24h,31h,40h,51h	
13|	END

2、Edsim中验证程序

3、Protues中验证程序

首先依然是在Protues软件中新建工程,然后再面板添加80C51芯片。在代码处copy上上述使用的代码。

 根据箭头指引完成操作,随后点击单步运行,同时注意ACC值的变化。

四、普中开发板应用实践

开发板实物图:

对于该开发板的相关信息可以在官网(链接:http://www.prechin.net/)找到,对于该开发板的一些需要用到的软件和相关知识等,可以参考链接:https://zhuanlan.zhihu.com/p/682895061 。

1、点亮LED灯

C语言代码如下:

#include<REGX52.H>
void Delay(unsigned int xms)
{
  unsigned char i, j;
  while(xms--)
  {
  i=2;
  j=199;
    do
    {
	while(--j);
	}while(--i);
  }
}
void main()
{
  while(1)
  {
    P2=0xFE;
	  Delay(1000);
	  P2=0xFE;
	  Delay(1000);
  }
}

汇编语言代码如下:

ORG 0000h
LJMP MAIN

ORG 0100H
MAIN:

LOOP:
MOV A,#7FH
MOV P2,A
LCALL DELAY
MOV A,#OFFH
MOV P2,A
LCALL DELAY
LJMP LOOP

DELAY:MOV R5,#10
D1:MOV R6,#200
D2:MOV R7,#250
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END

有了代码过后,参照前几期博客:点亮流水LED灯(链接:点亮流水LED灯-CSDN博客) ,生成

" .hex " 文件。随后使用STC-ISP( STC-ISP软件是专门给STC系列单片机下载烧录程序的,并不能适用于ARM系列单片机,下载地址:http://www.stcmcu.com/)。

再根据下图箭头指示操作,完成实践:

 点击下载之后,打开开发板的开关,出现操作完成的提示,即成功完成。

2、点亮流水LED灯

下面依次为点亮LED灯的C语言代码和汇编语言代码:

 再进行上述对STC-ISP软件的操作,即可完成。

  • 28
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值