目录
简介:
在之前的学习中我们已经可以运用好汇编语言编写相关的程序了,下面我们对于程序的周期性进行探讨,在本次周期性设计中,我们要了解什么是周期,以及延时函数、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软件的操作,即可完成。