内容正文:
四川省(对口招生)电子信息类《单片机原理及应用》
知识点讲解
考点30 理解延时子程序编写
【考情分析】
本专题是51单片机程序设计核心考点,在高职单招、中职升高职联考及电子信息类专业技能高考中高频考查,考查形式以程序补全题、程序编写题、计算题为主,侧重单层、双层延时子程序的编写规范、循环参数计算及子程序调用方法,是软件定时功能实现的基础,常与时序周期考点结合出题,需重点掌握延时参数推导与代码编写逻辑。
考纲解读
1
掌握延时子程序的基本结构与编写规范,能独立编写单层、双层软件延时子程序
2
能根据目标延时时长,结合晶振频率计算循环次数,完成延时参数设计
3
理解延时子程序的调用方法,掌握子程序与主程序的配合逻辑
4
能识别延时程序的常见编写错误,完成程序改错与优化
延时子程序概述:
延时子程序是51单片机中实现软件定时的核心代码模块,通过循环嵌套执行指令消耗机器周期,达到精准延时的效果,无需占用硬件定时器资源,是单片机程序设计的基础技能。
延时子程序编写需遵循 “结构清晰、参数准确、可复用性强” 的原则,常作为功能子程序被主程序反复调用。
核心前提:默认采用51系列单片机,晶振频率默认12MHz(机器周期为1μs),指令周期规则与时序周期考点一致,题干另有说明除外。
延时子程序编写核心基础
(一)编写核心原则
以DJNZ循环指令为核心,利用指令执行的机器周期累加实现延时;
采用标准子程序结构,以自定义标号起始、RET 指令结尾,方便主程序调用;
循环参数需结合晶振频率与目标时长精准计算,保证延时精度;
多层循环需使用不同工作寄存器,避免计数值相互覆盖。
(二)编写计算依据(常用指令机器周期)
MOV 赋值指令:1个机器周期
DJNZ 循环跳转指令:2个机器周期
NOP 空操作指令:1个机器周期
RET 子程序返回指令:2个机器周期
LCALL 子程序调用指令:2个机器周期
典型延时子程序编写实例
(一)单层延时子程序编写
适用场景:短延时场景(几微秒到几百微秒),如按键消抖、引脚电平短延时
结构特点:单组寄存器控制循环,代码结构简单,执行开销小
编写示例:实现约200μs延时(12MHz 晶振)
Plain
DELAY_SHORT:
MOV R0, #100 ; 设置循环次数,1个机器周期
LOOP:
DJNZ R0, LOOP ; 循环跳转,单次执行2个机器周期
RET ; 子程序返回,2个机器周期
时长计算:
DJNZ循环总时长=100×2μs=200μs,加上MOV赋值与RET返回指令共3个机器周期,总延时约203μs,短延时场景下可近似为200μs。
编写要点:循环次数≈目标延时÷(2×机器周期时长),短延时可忽略首尾指令的微小误差。
(二)双层延时子程序编写
适用场景:中长延时场景(几毫秒到几百毫秒),考试核心考查类型
结构特点:外层循环嵌套内层循环,大幅延长总延时时间,兼顾代码简洁度与延时范围
编写示例:实现约100ms延时(12MHz晶振)
Plain
DELAY_100MS:
MOV R2, #200 ; 设置外层循环次数,1个机器周期
D1:
MOV R3, #250 ; 设置内层循环次数,1个机器周期
D2:
DJNZ R3, D2 ; 内层循环,单次执行2个机器周期
DJNZ R2, D1 ; 外层循环,单次执行2个机器周期
RET ; 子程序返回,2个机器周期
时长计算:
内层单轮总时长:250×2μs=500μs
外层单轮包含:内层MOV指令(1μs)+内层循环(500μs)+外层 DJNZ指令(2μs)=503μs
外层200轮总时长:200×503μs=100600μs
加上外层MOV与RET指令,总延时约100.6ms,近似100ms
简化计算公式(考试快速估算):
总延时≈外层循环次数×内层循环次数×2×机器周期时长
编写要点:先根据目标时长选定双层循环结构,再通过公式反推循环次数,优先取整数值方便记忆与书写。
(三)三层延时子程序编写
适用场景:长延时场景(几百毫秒到数秒),如LED秒级闪烁、设备启动等待
结构特点:三层循环嵌套,在双层循环基础上增加一级外层循环,实现秒级延时
编写示例:实现约1秒延时(12MHz晶振)
Plain
DELAY_1S:
MOV R1, #10 ; 最外层循环次数
D1:
MOV R2, #200 ; 中层循环次数
D2:
MOV R3, #250 ; 内层循环次数
D3:
DJNZ R3, D3
DJNZ R2, D2
DJNZ R1, D1
RET
编写要点:三层循环延时误差随层数增加略有增大,适用于对精度要求不高的长延时场景。
延时子程序标准化编写步骤
明确题干晶振频率,计算单机器周期的具体时长;
根据目标延时时长,选择对应循环层数(单层/双层/三层);
套用对应结构的估算公式,计算循环次数,取合理整数值;
按规范书写子程序:设置入口标号、循环体、RET返回指令;
复核总延时时长,微调循环参数修正误差。
编写常见错误与注意事项
遗漏RET返回指令:子程序必须以RET结尾,否则程序会出现跑飞异常;
循环寄存器混用:多层循环需使用不同工作寄存器(R0-R7),避免计数值相互覆盖;
晶振参数错用:未按题干给出的晶振频率计算,直接套用 12MHz下的固定参数;
循环逻辑颠倒:内外层循环顺序写反,导致实际延时时长与目标偏差极大;
忽略调用耗时:主程序调用子程序的LCALL指令会消耗2个机器周期,高精度场景需计入总时长。
例题 1. 编写51单片机延时子程序时,子程序的最后一条可执行指令必须是( )
A. END B. RET C. LJMP D. DJNZ
【解析】子程序必须通过 RET 指令实现返回主程序的功能,END 是程序结束伪指令,不属于可执行指令。答案:B
例题 2. 12MHz 晶振下,要实现 500μs 左右的短延时,采用单层循环时,DJNZ 的循环次数约为( )
A. 125 B. 250 C. 500 D. 1000
【解析】单次 DJNZ 指令执行时间为 2μs,500μs ÷ 2μs = 250 次。答案:B
例题 3. 双层延时子程序中,内外层循环需使用不同工作寄存器,主要原因是( )
A. 提高运行速度 B. 避免数值相互覆盖 C. 减少代码长度 D. 降低系统功耗
【解析】若使用同一寄存器,内层循环会修改外层的计数值,导致整个循环逻辑错误。答案:B
例题 4.(判断题)延时子程序只能实现固定时长的延时,无法调整延时时间。( )
【解析】通过修改循环次数参数,可灵活调整延时子程序的延时时长。答案:×
例题 5. 下列指令中,常作为延时子程序循环核心的是( )
A. MOV B. ADD C. DJNZ D. SETB
【解析】DJNZ 是减 1 不为零跳转指令,天然适合实现循环延时结构。答案:C
【参考答案】 B B B × C
【高考题实战】
真题 1(2025 高考 单选)51 单片机子程序返回主程序的指令是( )
A. RETI B. RET C. END D. RETURN
答案:B
真题 2(2024 高考 单选)12MHz 晶振下,双层延时子程序内层循环 200 次、外层 100 次,该子程序核心循环的延时约为( )
A. 10ms B. 20ms C. 40ms D. 100ms
答案:C
真题 3(2023 高考 单选)编写软件延时子程序时,无需考虑的因素是( )
A. 晶振频率 B. 指令机器周期数 C. 循环层数 D. 串口波特率
答案:D
真题 4(2025 高考 判断)延时子程序可以被主程序多次调用。( )
答案:√
真题 5(2024 单招 单选)要实现 1 秒的长延时,最适合采用的循环结构是( )
A. 单层循环 B. 双层循环 C. 三层循环 D. 顺序结构
答案:C
真题 6(2023 高考 判断)编写延时子程序时,循环次数越多,延时精度越高。( )
答案:×
【参考答案】 B C D √ C ×
【模拟演练】
一、单选题
1. 51 单片机延时子程序的核心循环指令是()
A. MOV B. DJNZ C. ADD D. SUBB
2. 标准子程序必须以哪条指令作为结尾()
A. END B. SJMP C. RET D. LCALL
3. 12MHz 晶振下,单层循环延时子程序循环次数为 100,DJNZ 部分的延时时长为()
A. 100μs B. 200μs C. 500μs D. 1ms
4. 双层延时子程序中,内层循环的作用是()
A. 控制延时粗调 B. 实现基础延时单元 C. 子程序返回 D. 调用主程序
5. 6MHz 晶振下,单次 DJNZ 指令的执行时长为()
A. 1μs B. 2μs C. 4μs D. 8μs
6. 下列关于延时子程序的说法,正确的是()
A. 只能使用 R0 作为循环寄存器 B. 不能嵌套多层循环
C. 可被主程序反复调用 D. 不需要返回指令
7. 要实现 50ms 延时(12MHz 晶振),采用双层循环且内层设为 250 次,外层次数约为()
A. 50 B. 100 C. 200 D. 250
8. 编写完整程序时,END 伪指令的位置应该在()
A. 子程序开头 B. 子程序中间 C. 整个程序末尾 D. 子程序结尾
9. 下列哪种场景不适合使用软件延时子程序()
A. 短延时按键消抖 B. 数码管动态显示刷新
C. 高精度长时间定时 D. LED 闪烁控制
10. 三层延时子程序相比双层循环,最主要的优势是()
A. 延时精度更高 B. 可实现更长延时
C. 代码更简洁 D. 执行速度更快
二、判断题
1. 软件延时子程序不需要占用硬件定时器资源。()
2. 延时子程序的循环次数只能是正整数。()
3. 12MHz 晶振下,双层循环延时 250×250 的总延时约为 125ms。()
4. 延时子程序中可以使用累加器 A 作为循环计数器。()
5. 晶振频率越高,相同循环次数的延时时间越长。()
6. 编写多层延时子程序时,所有循环可以使用同一个工作寄存器。()
7. 主程序通过 LCALL 指令调用延时子程序。()
8. NOP 指令可以用于微调延时子程序的时长。()
9. 延时子程序只能实现毫秒级延时,无法实现微秒级延时。()
10. 软件延时子程序在执行时会占用 CPU 全部运行资源。()
【参考答案】
一、单选题
B C B B C C B C C B
二、判断题
√ √ √ × × × √ √ × √
原创精品资源学科网独家享有版权,侵权必究
学科网(北京)股份有限公司zxxk.com
学科网(北京)股份有限公司
$