标题: 单片机延时程序到底怎么算的啊? [打印本页]

作者: ztw    时间: 2018-5-10 22:50
标题: 单片机延时程序到底怎么算的啊?
百度的1s的
void delayms()        
// 单片机延时子程序   对应12M晶振
{                                                
        unsigned int ms=1000;
        while(ms--)                                //每一次循环1ms
        {
                for(i = 0; i < 120; i++);
        }
}这个每次循环为什么是1ms?每次不是120*2个机器周期*1us=0.24ms吗?



作者: devcang    时间: 2018-5-11 00:28
不同類型的單片機,差別很大的。。。如果是使用STC單片機,那麼在其下載工具中,有軟件延時生成工具。
作者: 天才2333333    时间: 2018-5-11 01:25
你算的是正确的
作者: 天才2333333    时间: 2018-5-11 01:27
百度错了他少了一个循环
作者: 天才2333333    时间: 2018-5-11 01:28
这样算出来的只有0.24ms
作者: yaoshi    时间: 2018-5-11 02:44
我觉得你算得是对的
作者: wjm199452    时间: 2018-5-11 11:09
执行语句也是需要时间的,你可以直接编译看下这个延时函数到底需要多少时间,keil里有这个功能,这个延时函数大概是0.97 0.98左右
作者: 刘查理    时间: 2018-5-11 17:07
这个东西一般都是用软件算的,而且while、for等这些指令执行一次要花不止一个指令周期,具体要花几个指令周期要把它弄成汇编才看得出来。我只记得for语句好像执行一次是3个指令周期,while不清楚。
作者: 芝麻团子    时间: 2018-5-11 17:46
如果有条件,用示波器打一下,执行这个程序前把一个IO口拉低,进入函数把这个IO口拉高,退出函数时将IO口拉低,测量电平时间,就可以为实际运行时间。如果没条件,就用软件仿真,晶振频率设对,然后记录函数执行前的时间和执行后的时间,算一下就可以了!如果说要问怎么来的,翻译成为机器代码后再看吧,这个for大概有一次赋值,120次比较,120次自增,一次赋值2个机器周期,一次判断4个机器周期,一次自增一个机器周期,一个机器周期占用时间1us,你算一下?
作者: zl2168    时间: 2018-5-11 21:36
用c编写的延时函数一般无法计算,与编译器和变量类型都有关,但可在keil运行后查看寄存器窗口中,系统特殊寄存器组“Sys”中有一项“sec”和“states”,可查看程序执行时间和运行周期数。例如,执行到延时子程序时,记录进入该子程序的sec值,然后按过程单步键,快速执行该子程序完毕,再读取sec值,两者之差,即为该子程序执行时间。也可根据周期数states与图2-8中设置的晶振频率计算程序运行时间。(摘自张志良编著的:《80C51单片机实用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9, 用于学习51单片机原理,程序(双解c和汇编)语句条条有注解,便于阅读理解,便于自学,可从零基础c语言开始学习。)。
作者: 孤岛勇者    时间: 2018-5-11 23:48
你算的没错
作者: lzr513    时间: 2018-5-12 10:36
给楼主提供一个毫秒级延时程序
void delay(uint x) //延时X毫秒
{
uint y,z;
for(z=x;z>0;z--)
for(y=110;y>0;y--);
}

void delay_ms(uint n)   //延时n毫秒
{
   uchar i;
   while(n--)
   {
     for(i=0;i<120;i++);
}
}
作者: loading88    时间: 2018-5-28 15:44
你算得是对的
作者: zxrr    时间: 2018-5-28 16:39
for循环嵌套,通过程序计算数据时间来进行延时
作者: yulanhao    时间: 2018-5-28 21:30
兄dei,以我学习stc51 ,12,15系列单片机的经验来说,软件延时很扯!除非你汇编学得好。建议用_nop_()延时或者定时器计时,要不写IIC驱动,单总线驱动,你会烦死!!!
作者: 肖蠢蠢    时间: 2019-5-17 09:36
芝麻团子 发表于 2018-5-11 17:46
如果有条件,用示波器打一下,执行这个程序前把一个IO口拉低,进入函数把这个IO口拉高,退出函数时将IO口拉 ...

为什么题主算的还要乘2呢?
作者: wxzjzxwhq    时间: 2019-5-17 11:43
delay延时的基本原理是:让单片机什么也不干,一直空转,延时的时间等于空转的周期数,具体的时间要看你的单片机的晶振频率的高低。
作者: 51凡尘    时间: 2019-5-17 12:53
生成一个汇编文件,计算汇编指令周期 这样更精准哦
作者: abcd44    时间: 2019-5-17 14:59
这个时间是用软件慢慢调试出来的  你确定你程序每一行所用的时间是相同的   
作者: 三感    时间: 2019-5-17 20:53
void delay()unsigned
作者: lele5211314    时间: 2019-5-17 23:35
执行空指令
作者: 问青天磕大地    时间: 2019-5-18 10:20
芝麻团子 发表于 2018-5-11 17:46
如果有条件,用示波器打一下,执行这个程序前把一个IO口拉低,进入函数把这个IO口拉高,退出函数时将IO口拉 ...

高手,领教了
作者: yzhg    时间: 2019-5-20 22:11
可以参考一下本论坛一位大神发过的文章:http://www.51hei.com/mcu/4163.html
作者: 有心插花花木兰    时间: 2019-10-6 00:35
lzr513 发表于 2018-5-12 10:36
给楼主提供一个毫秒级延时程序
void delay(uint x) //延时X毫秒
{

要看具体的晶振,一条汇编语句一般执行时间是一个机器周期,一个机器周期是晶振的倒数。一条语句要运行多长时间要看这条语句有多少条反汇编语句。
作者: dengguangwen    时间: 2019-10-7 14:36
如果单片机的晶振周期不一样,那么时间也就不一样,从而单片机的处理程序时间也就不同,所以要对照单片机的晶振频率,从而计算时间。
作者: baiyun1234    时间: 2019-10-8 17:23
晶振:11.0592
1ms
void dealyms(int x)
    {
           int i,y;
         for(i=0;i<x;i++)
                    for(y=0;y<112;y++);
    }

作者: 阔爱的钊钊    时间: 2019-10-8 19:04
算法没问题,但是你要知道单片机的执行时间不单单只执行while里面的延时




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1