在EdSim51虚拟开发板和普中51开发板上实现LED灯的周期性闪烁
1. LED灯周期性闪烁的示例程序分析
以下是一个LED周期性闪烁的示例汇编程序。分号后为注释。
LOOP:
SETB 90H;LED0置1
LCALL DELAY;调用延时函数
CLR 90H;LED0置0
LCALL DELAY;调用DELAY, 进行"无效操作", 达到一定的延时效果
AJMP LOOP;跳转到LOOP, 形成主程序的死循环
DELAY:
MOV R7,#250;给通用寄存器R7, 赋值250
D1: MOV R6,#250;给通用寄存器R6, 赋值250
D2: DJNZ R6,D2;--R6 (R6减1), 结果不为0则跳转到D2继续, 否则执行下一条指令
DJNZ R7,D1;--R7 (R7减1), 结果不为0则跳转到D1继续, 否则执行下一条指令
RET;返回函数
END
该示例程序中 “MOV R6,#250” 和 “DJNZ R6,D2” 前者为单周期指令,在一个循环中,执行次数为250,周期数250,用时250μs;后者为双周期指令,在一个双重循环中,执行次数为250×250=62500,周期数为125000,用时125000μs。
DELAY函数中 “MOV R7,#250”, “MOV R6,#250” 为单周期指令,前者执行1次,后者执行251次;“DJNZ R6,D2”, “DJNZ R7,D1” 为双周期指令,前者执行250×250次,后者执行250次;“RET” 为四周期指令,执行1次。则该函数用时为1×1+251×1+250×250×2+250×2+1×4=125756μs,即LED灯每隔约0.13秒变化一次亮灭状态。
2. 在EdSim51上实现LED灯每隔1s的周期性闪烁(汇编程序)
若需实现较准确的LED每隔1s亮灭的周期性变化,可在示例程序代码的基础上增加一重循环,并调整赋值即可。其在EdSim51上实验的汇编代码如下。
LOOP:
SETB 90H
LCALL DELAY
CLR 90H
LCALL DELAY
AJMP LOOP
DELAY:
MOV R7,#79
D1: MOV R6,#79
D2: MOV R5,#79
D3: DJNZ R5,D3
DJNZ R6,D2
DJNZ R7,D1
RET
END
将此代码导入EdSim51中运行,可发现:上方计时器每过1s,下方的LED0就亮或灭一次。如下图。
3. 在普中51开发板上实现LED灯每隔1s的周期性闪烁(汇编程序、C程序)
开发板的使用方法
普中51开发板资料:https://pan.baidu.com/s/1t4M7p-WfYE7tDi36qqa-cQ?pwd=1234 提取码:1234
普中51开发板如下图所示。开发板的中央是STC89C52RC单片机。本次实验使用右侧的LED模块,该模块的8个LED灯与单片机的P2接口相连。
使用开发板,需先用数据线连接开发板与电脑,在电脑上安装CH340驱动(USB转串口的驱动,若已安装则忽略)。(驱动安装程序位置:5–开发工具\2–开发板CH340驱动\SETUP.EXE)
接着打开PZ-ISP软件,根据板载芯片型号选择芯片类型为 “STC89C5xx-RC series”, 将波特率设置为128000(如果按此波特率下载速度慢,可提高波特率;如果下载失败,可降低波特率)。其它选项保持默认设置。(软件位置:5–开发工具\3–程序下载软件\PZ-ISP\PZ-ISP.exe)
然后在下方文件路径点击“打开文件”,选择由实验程序生成的hex文件,点击“程序下载”即可将hex文件下载至单片机内并运行。
汇编程序
由于普中开发板的8个LED灯接在P2接口,故在EdSim51代码的基础上修改了SETB和CLR的地址。代码如下。
LOOP:
SETB P2.0
LCALL DELAY
CLR P2.0
LCALL DELAY
AJMP LOOP
DELAY:
MOV R7,#79
D1: MOV R6,#79
D2: MOV R5,#79
D3: DJNZ R5,D3
DJNZ R6,D2
DJNZ R7,D1
RET
END
将此代码导入Keil C51,在Keil设置的“输出”项内勾选“生成hex文件”,编译可得hex文件。连接开发板与电脑,将生成的hex文件导入普中51单片机软件,下载,开发板上的P0灯就开始按1s的间隔闪烁,如下图。
C程序
C程序代码同汇编程序代码一样设置了三重延迟循环,地址同为P2。代码如下:
#include <reg51.h>
#include <intrins.h>
void delay(int a)
{
int i,j,k;
for(i=0;i<a;i++)
for(j=0;j<52;j++)
for(k=0;k<52;k++)
_nop_();
}
void main()
{
while(1)
{
P2=0xff;
delay(52);
P2=0xfe;
delay(52);
}
}
将此代码导入Keil C51,在Keil设置的“输出”项内勾选“生成hex文件”,编译可得hex文件。连接开发板与电脑,将生成的hex文件导入普中51单片机软件,下载,开发板上的P0灯就开始按1s的间隔闪烁,如下图。