文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、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--);
}