目录
一、点亮LED灯的延时函数(实现每隔1s点亮一个灯)
1.汇编指令延时函数理解
首先,我们通过上述代码来理解延时函数。
"DELAY: MOV R7,#250" 给寄存器R7赋值250;
"D1: MOV R6,#250" 给寄存器R6赋值250;
“D2: DJNZ R6,D2” 对R6进行减1操作,R6不为0 时跳转到D2执行。
(执行一条DJNZ指令用时2μs;直到R6=0时,共用时250*2=500μs)
“DJNZ R7,D1” 对R6进行减1操作,R6不为0 时跳转到D1执行,再次对R6进行减法循环。
(即将全面的指令循环执行250遍,共执行0.5*250=125ms)
2.通过多重循环软件计数的定时方法点亮LED流水灯
通过我们对上述延时代码的理解,我们来编写一个定时1s点亮一个LED灯的LED流水灯程序。
代码实现:
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN: MOV SP, #60H
MOV A, #0FEH
LOOP:
INC R0;
RR A
MOV P1,A
ACALL DELAY
AJMP LOOP
DELAY:
MOV R4, #100
DEL1:
MOV R6, #100
DEL2: MOV R7, #50
DJNZ R7,$
DJNZ R6,DEL2
DJNZ R4,DEL1
RETI
END
代码解释:
该程序采用了三重循环结构。
DELAY: MOV R4, #1000 ; 对寄存器R4赋值100
DEL1: MOV R6, #100 ; 对寄存器R6赋值100
DEL2: MOV R7, #50 ; 对寄存器R7赋值50
DJNZ R7,$ ; 执行该行代码,每次对R7减1,减至0为止。用时2*100μs
DJNZ R6,DEL2 ;每次对R6进行减1,减后不为0转移执行DELAY2,再次对R7进行减法内循环。
DJNZ R4,DEL1 ;对R4进行减1,减后不为0转移执行DELAY1。
总共用时:2 * R7 * R6 * R5=1s
可以看见每过1s,LED灯被依次点亮
Edsim51仿真:
发现LED流水灯成功点亮。
3.通过 循环+ nop 指令的方法点亮LED流水灯
_nop_()函数 包括在库函数intrins.h中的
51单片机12M晶振,晶振周期为1/12μs,一个机器周期包含12个晶振周期,所以12M晶振时机器周期=12x(1/12)=1μs。
代码实现:
#include <reg51.h>
#include <intrins.h>//_nop_()
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)
{
P1=0xfe;//1111 1110
delay_ms(160);
P1=0xfd;//1111 1101
delay_ms(160);
P1=0xfb;//1111 1011
delay_ms(160);
P1=0xf7;//1111 0111
delay_ms(160);
P1=0xef;//1110 1111
delay_ms(160);
P1=0xdf;//1101 1111
delay_ms(160);
P1=0xbf;//1011 1111
delay_ms(160);
P1=0x7f;//0111 1111
delay_ms(160);
}
}
由于for循环和delay调用都需要时间,所有将a设定为160
二、汇编程序实现查找平方数
代码实现:
ORG 0000H
tab:DB 00h,01h,04h,09h,10h,19h,24h
MOV DPTR,#tab
MOV R1,#5
CALL A1
A1:
MOV A,R1
MOVC A,@A+DPTR
MOV R2,A
RET
END
代码解释:
tab:DB 00h,01h,04h,09h,10h,19h,24h ;建立一个tab 表格,用于存放平方数
MOV DPTR,#tab ;将DPTP指向tab表格,方便后续调用表格
MOV R1,#5 ;对R1进行赋值5
CALL A1 ;调用函数A1
MOV A,R1 ;将R1的值移动到A中
MOVC A,@A+DPTR ;在tab表格中查找对应的平方数
MOV R2,A ;将A的值移动到R2中,便于我们查看结果是否正确。
EDSIM51仿真:
可以看见R1显示:0x05;R2显示:0x19(转换为10进制为25)
三、在普中单片机开发板上完成LED流水灯的点亮
1.普中单片机开发板的介绍与驱动安装
该开发板是基于STC89C52 STC89Cxx 芯片,搭配数码管(共阴极);8×8的点阵屏;流水灯;扩展IO芯片(595);键盘;温度传感器等的学习套件。
普中单片机开发板具体介绍可以查看这个博客:开发知识点-普中51-单核-A2单片机_普中51单片机开发板资料-CSDN博客
首先进行驱动安装:(所有操作都需要连接普中开发板进行)
下载PZ-SIP;打开PZ-SIP,若串口号显示如图,则证明驱动安装成功
下载完成后,根据我们的芯片选择开发板对应的芯片类型,点击打开文件选择对应的".hex"或".asm"文件。
点击程序下载,若下载成功会出现如图:
2.LED流水灯点亮
代码实现:
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN: MOV SP, #60H
MOV A, #0FEH
LOOP:
INC R0;
RR A
MOV P2,A
ACALL DELAY
AJMP LOOP
DELAY:
MOV R4, #100
DEL1:
MOV R6, #100
DEL2: MOV R7, #50
DJNZ R7,$
DJNZ R6,DEL2
DJNZ R4,DEL1
RETI
END
(注:普中开发板中LED流水灯接口为P2,若代码中接口为P1,需将其改成P2,以确保LED能够正常点亮)