导航:首页 > 编程语言 > 单片机编程为什么要延迟10毫秒

单片机编程为什么要延迟10毫秒

发布时间:2024-12-13 06:25:23

单片机—DJNZ 指令练习

单片机实战:深入理解DJNZ指令



一、精准延时


在12MHz的时钟频率下,一个机器周期仅为1微秒。若要实现10毫秒的延时,我们可以巧妙地利用DJNZ指令。首先,将R6的初始值设为20,对应于一个机器周期。在循环开始后,进入D2标签:


MOV R7, #249
D2: MOV R6, #20
DJNZ R7, $
DJNZ R6, D2
在这一系列操作中,每一步消耗2个机器周期,总计1+249×2+2个周期。总的延时计算如下:t = 1 + 20 × (1 + 249 × 2 + 2) = 10021 微秒,接近10毫秒的精确延时。

二、点亮闪烁灯


在P1.0口连接一个LED灯L1,我们目标是实现0.2秒的亮灭交替。从ORG 1000H地址开始,设置灯亮后调用DELAY函数进行延时,接着熄灭:


START: SETB P1.0
LCALL DELAY
CLR P1.0
LCALL DELAY
SJMP START
DELAY函数的核心代码如下:
DELAY: MOV R5, #20
D1: MOV R6, #20
D2: MOV R7, #249
DJNZ R7, $
DJNZ R6, D2
DJNZ R5, D1
RET
总计t = 20 × [1 + (1 + 249 × 2 + 2) × 20 + 2] = 200460 微秒,接近0.2秒的闪烁周期。

三、流水灯的魅力


在P1口上,我们通过延时控制实现流水灯效果。当程序跳转到MAIN标签,先将所有灯熄灭,然后逐个点亮:


ORG 0030H
MAIN: MOV A, #0FFH
MOV P1, A // 灭掉所有灯
MOV A, #0FEH
MAIN1: MOV P1, A // 开P1.0口的灯
ACALL DELAY
RL A // 依次点亮其他灯
SJMP MAIN // 循环
在DELAY函数中,每一轮延时130815微秒,t = 255 × (1 + 255 × 2 + 2) = 130815 微秒,实现了0.13秒的灯亮循环。

通过这些DJNZ指令的实际操作,我们不仅掌握了延时和灯控制的基本技巧,还深入理解了单片机的时序逻辑。这些小练习不仅提升了编程技能,也为更复杂的项目打下了坚实基础。

❷ 用C语言怎么在单片机AT89C51上编写一个延时10秒的程序

1、十秒对于单片机来说是很长很长的时间了,单片机十秒的时间什么事都不能做,只在跑这延时程序,那是什么概念,用中断的话,单片机正常运行其他程序,只是时间到了才过来处理延时以后的程序,效率不知道高了多少 。

2、例程:

//假设晶振12MHZ

#include"reg51.h"
unsignedintYSJS=0;
voidmain(void)
{
TMOD|=0X10;//定时器1工作于方式1,16位定时器
TH1=0XFF;//定时器1定时时间=500uS
TL1=0X06;
ET1=1;//使能定时器1中断
EA=1;//开总中断
while(1)
{
}
}
voidTIMER1(void)interrupt3//定时器1中断函数使用默认寄存器组
{
TH1=0XFF;//定时器1定时时间=500us
TL1=0X06;
YSJS++;
if(YSJS==20000)//500uS*20000=10000000us=10s
{
P1=P1^0X01;//P1.0十秒钟翻转一次
YSJS=0
}
}

❸ 求助单片机软件延时10ms的程序和计算方法(急)

程序如下.
ORG 0000H
SJMP START
ORG 0030H
START:
MOV TMOD, #01H ;T0定时方式1
MOV TH0, #0D8H ;10ms@12MHz
MOV TL0, #0F0H ;65536-10000=D8F0H
SETB TR0 ;启动.

WAIT: ;下面使用查询方式.
JNB TF0, WAIT ;没有溢出就循环等待.
MOV TH0, #0D8H ;到了10ms,重新写入初始值.
MOV TL0, #0F0H ;65536-10000=D8F0H
CLR TF0
;-----------------------------------------------
;在这里编写 每到10ms 应该执行的指令.
CPL P1.0 ;可以使外接的LED闪光.
;-----------------------------------------------
SJMP WAIT ;继续查询.
END

❹ 如何利用单片机汇编指令编程实现延时10ms利用汇编指令设计多重循环编程实现20ms延时

这是调用一个延时10毫秒的延时子程序 当然,子程序的名字可以自己定 DELY1MS: 这个名字一定要与调用中出现的名字一样,否则的话,调用的就不是这个子程序了

DELAY10MS:
MOV R2,#20
DELAY10MS1:
MOV R3,#250
DJNZ R3,$
DJNZ R3,DELAY10MS1
RET

这是调用一个延时20毫秒的延时子程序 当然,子程序的名字可以自己定 DELY1MS: 这个名字一定要与调用中出现的名字一样,否则的话,调用的就不是这个子程序了

DELAY20MS:
MOV R2,#40
DELAY20MS1:
MOV R3,#250
DJNZ R3,$
DJNZ R3,DELAY20MS1
RET

RETRET的作用是子程序返回。调用一个子程序,当单片机执行到RET语句的时候,单片机就会返回到调用的地方并继续向下执行。

下面给你一个例程:

闪烁灯

ORG 00H

AJMP START

ORG 30H

START:

MOV P0,#00H

LCALL DELY;调用延时子程序

MOV P0,#0FFH

LCALL DELY;调用延时子程序

AJMP START

DELY:

MOV R7,#250

DL1:MOV R6,#250

DJNZ R6,$

DJNZ R7,DL1

RET

❺ 51单片机C语言程序中延时函数delay的原理是什么

原理:只是执行一些所谓的“无实际意义的指令”,如缩放或执行一个int自加,简单地说,就像高中数学中的“乘法原理”一样,很容易迅速增加上面提到的“无意义指令”的数量

关于大小的值:如果是在C语言中,该值不仅与水晶振动、单片机本身的速度,但也与C的编译器,所以,虽然这个值可以精确计算,但大多数情况下,程序员是经验值。

当然,如果你在汇编中编程,情况就不同了,因为每条指令使用一定数量的机器周期,你当然可以根据所有指令使用的总时间来计算特定延迟的总时间。

(5)单片机编程为什么要延迟10毫秒扩展阅读:

定义延迟XMS毫秒的延迟函数

Voiddelay(unsignedintXMS)//XMS表示需要延迟的毫秒数

无符号intx,y;

For(x=XMS;X0;X-)

For(y=110;Y”0;Y-);

使用:

VoidDelay10us(ucharMs)

Uchar数据我;

(;女士“0;------Ms)

对于(I = 26)我> 0;我-);

I=[(延迟值-1.75)*12/ms-15]/4

阅读全文

与单片机编程为什么要延迟10毫秒相关的资料

热点内容
vcu盘加密怎么设置 浏览:412
如何加密备份微信聊天记录 浏览:527
安卓手机如何模拟键盘 浏览:930
查看dns地址命令 浏览:767
android录屏工具 浏览:840
成都互动直播系统源码 浏览:955
usb蓝牙android 浏览:409
服务器显示error1什么意思 浏览:710
python代码精简 浏览:459
文件加密了怎么找到了 浏览:195
jellyfin插件怎么选择主服务器 浏览:838
asp用户注册源码 浏览:48
什么是照片压缩文件 浏览:392
java调用js代码 浏览:979
昆山市民app怎么修改身份信息 浏览:779
php登陆次数 浏览:745
python字符转成数字 浏览:822
海川用的是什么服务器 浏览:376
口才是练出来的pdf 浏览:460
云服务器哪个公司性价比高 浏览:519