原理c语言for循环延时1s,for循环实现C语言精确延时
for循环实现C语言精确延时
for循环实现C语言精确延时
----- djh2000
C语言最大的缺点就是实时性差,我在网上到看了一些关于延时的讨论,其中有篇文章
51单片机 Keil C 延时程序的简单研究,作者:InfiniteSpace Studio/isjfk
写得不错,他是用while(--i);产生DJNZ 来实现精确延时,后来有人说如果while里面不能放其它语句,否则也不行,用do-while
就可以,具体怎样我没有去试.所有这些都没有给出具体的实例程序来.还看到一些延时的例子多多少少总有点延时差.为此我用
for循环写了几个延时的子程序贴上来,希望能对初学都有所帮助.(晶振12MHz,一个机器周期1us.)
一. 500ms延时子程序
程序:
void delay500ms(void)
{
unsigned char i,j,k;
for(i=15;i>0;i--)
for(j=202;j>0;j--)
for(k=81;k>0;k--);
}
产生的汇编:
C:0x0800 7F0F MOV R7,#0x0F
C:0x0802 7ECA MOV R6,#0xCA
C:0x0804 7D51 MOV R5,#0x51
C:0x0806 DDFE DJNZ R5,C:0806
C:0x0808 DEFA DJNZ R6,C:0804
C:0x080A DFF6 DJNZ R7,C:0802
C:0x080C 22 RET
计算分析:
程序共有三层循环
一层循环n:R5*2 = 81*2 = 162us DJNZ 2us
二层循环m:R6*(n+3) = 202*165 = 33330us DJNZ 2us + R5赋值 1us = 3us
三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值 1us = 3us
循环外: 5us 子程序调用 2us + 子程序返回 2us + R7赋值 1us = 5us
延时总时间 = 三层循环 + 循环外 = 499995+5 = 500000us =500ms
计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5
二. 200ms延时子程序
程序:
void delay200ms(void)
{
unsigned char i,j,k;
for(i=5;i>0;i--)
for(j=132;j>0;j--)
for(k=150;k>0;k--);
}
产生的汇编
C:0x0800 7F05 MOV R7,#0x05
C:0x0802 7E84 MOV R6,#0x84
C:0x0804 7D96 MOV R5,#0x96
C:0x0806 DDFE DJNZ R5,C:0806
C:0x0808 DEFA DJNZ R6,C:0804
C:0x080A DFF6 DJNZ R7,C:0802
C:0x080C 22 RET
三. 10ms延时子程序
程序:
void delay10ms(void)
{
unsigned char i,j,k;
for(i=5;i>0;i--)
for(j=4;j>0;j--)
for(k=248;k>0;k--);
}
产生的汇编
C:0x0800 7F05 MOV R7,#0x05
C:0x0802 7E04 MOV R6,#0x04
C:0x0804 7DF8 MOV R5,#0xF8
C:0x0806 DDFE DJNZ R5,C:0806
C:0x0808 DEFA DJNZ R6,C:0804
C:0x080A DFF6 DJNZ R7,C:0802
C:0x080C 22 RET
四. 1s延时子程序
程序:
void delay1s(void)
{
unsigned char h,i,j,k;
for(h=5;h>0;h--)
for(i=4;i>0;i--)
for(j=116;j>0;j--)
for(k=214;k>0;k--);
}
产生的汇编
C:0x0800 7F05 MOV R7,#0x05
C:0x0802 7E04 MOV R6,#0x04
C:0x0804 7D74 MOV R5,#0x74
C:0x0806 7CD6 MOV R4,#0xD6
C:0x0808 DCFE DJN
原理c语言for循环延时1s,for循环实现C语言精确延时相关推荐
- c51语言1秒延时程序,KeilC51程序设计中几种精确延时方法
实现延时通常有两种方法: 一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时:另一种是软件延时,这种方法主要采用循环体进行. 1 使用定时器/计数器实现精确延时 ...
- keil4延时1秒C语言,KEIL单片机C语言精确延时值的计算
关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而51hei给出的本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为S ...
- c51语言双层for循环延时2ms,51单片机利用for语句嵌套实现简单的延时1s功能
原标题:51单片机利用for语句嵌套实现简单的延时1s功能 51单片机利用for语句嵌套实现简单的延时1s功能 名词解释: (1)时钟周期.定义为时钟频率的倒数,本例使用12MHz的时钟频率,它的时钟 ...
- 单片机原理及应用(1)--延时1s
单片机原理及应用(1)–延时1s 目录 单片机原理及应用(1)--延时1s 1.前言 2.关于11.0592Mhz晶振 3.关于"无用指令" 3.1nop 3.2DJNZ 4.程序 ...
- c语言for循环延时,如何利用for循环实现C语言的精确延时.doc
如何利用for循环实现C语言的精确延时 C语言最大的缺点就是实时性差,我在网上到看了一些关于延时的讨论,其中有篇文章51单片机 Keil C 延时程序的简单研究,他是用while(--i);产生DJN ...
- pic单片机延时程序C语言,PIC单片机C语言延时程序和循环子程序实现方法
PIC单片机C语言延时程序和循环子程序实现方法 很多朋友说C中不能精确控制延时时间,不能象汇编那样直观. 其实不然,对延时函数深入了解一下就能设计出一个理想的框价出来. 一般的我们都用 for(x=1 ...
- c语言while延时10ms,for循环实现C语言精确延时
51单片机Keil C延时程序的简单研究,作者:InfiniteSpace Studio/isjfk 写得不错,他是用while(--i);产生DJNZ来实现精确延时,后来有人说如果while里面不能 ...
- 延时1s的程序设计c语言,C语言延时程序.doc
标准的C语言中没有空语句.但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果. 这在汇编语言中很容易实现,写几个nop就行了. 在keil C51中,直接调用库函数: #include / ...
- c语言调用延时子程序的例子,C语言精确延时.doc
C语言精确延时 C语言最大的缺点就是实时性差,我在网上到看了一些关于延时的讨论,其中有篇文章 51单片机 Keil C 延时程序的简单研究,作者:InfiniteSpace Studio/isjfk ...
最新文章
- 文本挖掘预处理之向量化与Hash Trick
- 贝叶斯推断及其互联网应用(三):拼写检查
- GitLab创建空仓库后拉取并上传文件遇到的系列问题
- PHP的PHPStorm的使用姿势
- JQuery 定期刷新网页,保持登录状态Session
- 员工辞职的十大原因!
- Mysql学习总结(6)——MySql之ALTER命令用法详细解读
- WebBrowser keystroke
- 9 月,有远见的程序员,都关注了这个人!
- 武侠人士的10大绝招
- Vue中条件判断 v-if 、v-show
- 【ACL2020】tBERT: 结合主题模型和BERT实现语义相似度分析
- 28天肝完阿里面试通关宝典,含答案解析
- css集合——好看的按钮样式+阴影+渐变
- 收文和发文管理流程分析
- 第7周 项目6—停车场模拟
- PHP QQ网页三方登录
- ETL——实现Kettle作业定时任务
- 如何去除2345好压的广告弹窗
- xbox one x驱动_如何在Windows,OS X和Linux上使用Xbox One控制器
热门文章
- 使用matplotlib时报错:RuntimeWarning: Glyph 20998 missing from current font.
- 水果分割论文、代码和数据集汇总
- tableView 取消 cell 默认下划线样式 - iOS
- 三、Amlogic A311D 音频驱动指南
- 区块链治理框架总结,从Telos实践说起
- C++-图像目标区裁剪ImageCropping
- CSS基础之背景样式
- 计算机用用技巧,计算机使用技巧介绍汇总
- 东财《计算机应用基础》综合作业
- 齐二TK6916/20/26/32系列数控落地铣镗床简介1