找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 24696|回复: 26
打印 上一主题 下一主题
收起左侧

单片机延时程序到底怎么算的啊?

  [复制链接]
跳转到指定楼层
楼主
ID:242547 发表于 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吗?


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

来自 2#
ID:327731 发表于 2018-5-11 17:46 来自手机 | 只看该作者
如果有条件,用示波器打一下,执行这个程序前把一个IO口拉低,进入函数把这个IO口拉高,退出函数时将IO口拉低,测量电平时间,就可以为实际运行时间。如果没条件,就用软件仿真,晶振频率设对,然后记录函数执行前的时间和执行后的时间,算一下就可以了!如果说要问怎么来的,翻译成为机器代码后再看吧,这个for大概有一次赋值,120次比较,120次自增,一次赋值2个机器周期,一次判断4个机器周期,一次自增一个机器周期,一个机器周期占用时间1us,你算一下?

评分

参与人数 2黑币 +28 收起 理由
Double4X + 8 很给力!
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:277550 发表于 2018-5-11 00:28 | 只看该作者
不同類型的單片機,差別很大的。。。如果是使用STC單片機,那麼在其下載工具中,有軟件延時生成工具。

评分

参与人数 2黑币 +25 收起 理由
Double4X + 5 很给力!
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:327277 发表于 2018-5-11 01:25 | 只看该作者
你算的是正确的
回复

使用道具 举报

5#
ID:327277 发表于 2018-5-11 01:27 | 只看该作者
百度错了他少了一个循环
回复

使用道具 举报

6#
ID:327277 发表于 2018-5-11 01:28 | 只看该作者
这样算出来的只有0.24ms
回复

使用道具 举报

7#
ID:327290 发表于 2018-5-11 02:44 | 只看该作者
我觉得你算得是对的
回复

使用道具 举报

8#
ID:326301 发表于 2018-5-11 11:09 | 只看该作者
执行语句也是需要时间的,你可以直接编译看下这个延时函数到底需要多少时间,keil里有这个功能,这个延时函数大概是0.97 0.98左右

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

9#
ID:293977 发表于 2018-5-11 17:07 | 只看该作者
这个东西一般都是用软件算的,而且while、for等这些指令执行一次要花不止一个指令周期,具体要花几个指令周期要把它弄成汇编才看得出来。我只记得for语句好像执行一次是3个指令周期,while不清楚。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

10#
ID:111634 发表于 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语言开始学习。)。
回复

使用道具 举报

11#
ID:327527 发表于 2018-5-11 23:48 | 只看该作者
你算的没错
回复

使用道具 举报

12#
ID:328086 发表于 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++);
}
}
回复

使用道具 举报

13#
ID:317135 发表于 2018-5-28 15:44 | 只看该作者
你算得是对的
回复

使用道具 举报

14#
ID:339882 发表于 2018-5-28 16:39 | 只看该作者
for循环嵌套,通过程序计算数据时间来进行延时
回复

使用道具 举报

15#
ID:338173 发表于 2018-5-28 21:30 | 只看该作者
兄dei,以我学习stc51 ,12,15系列单片机的经验来说,软件延时很扯!除非你汇编学得好。建议用_nop_()延时或者定时器计时,要不写IIC驱动,单总线驱动,你会烦死!!!
回复

使用道具 举报

16#
ID:537232 发表于 2019-5-17 09:36 | 只看该作者
芝麻团子 发表于 2018-5-11 17:46
如果有条件,用示波器打一下,执行这个程序前把一个IO口拉低,进入函数把这个IO口拉高,退出函数时将IO口拉 ...

为什么题主算的还要乘2呢?
回复

使用道具 举报

17#
ID:540563 发表于 2019-5-17 11:43 | 只看该作者
delay延时的基本原理是:让单片机什么也不干,一直空转,延时的时间等于空转的周期数,具体的时间要看你的单片机的晶振频率的高低。
回复

使用道具 举报

18#
ID:424408 发表于 2019-5-17 12:53 | 只看该作者
生成一个汇编文件,计算汇编指令周期 这样更精准哦
回复

使用道具 举报

19#
ID:446841 发表于 2019-5-17 14:59 来自手机 | 只看该作者
这个时间是用软件慢慢调试出来的  你确定你程序每一行所用的时间是相同的   
回复

使用道具 举报

20#
ID:530977 发表于 2019-5-17 20:53 | 只看该作者
void delay()unsigned
回复

使用道具 举报

21#
ID:93224 发表于 2019-5-17 23:35 | 只看该作者
执行空指令
回复

使用道具 举报

22#
ID:541189 发表于 2019-5-18 10:20 来自手机 | 只看该作者
芝麻团子 发表于 2018-5-11 17:46
如果有条件,用示波器打一下,执行这个程序前把一个IO口拉低,进入函数把这个IO口拉高,退出函数时将IO口拉 ...

高手,领教了
回复

使用道具 举报

23#
ID:393193 发表于 2019-5-20 22:11 | 只看该作者
可以参考一下本论坛一位大神发过的文章:http://www.51hei.com/mcu/4163.html
回复

使用道具 举报

24#
ID:495323 发表于 2019-10-6 00:35 来自手机 | 只看该作者
lzr513 发表于 2018-5-12 10:36
给楼主提供一个毫秒级延时程序
void delay(uint x) //延时X毫秒
{

要看具体的晶振,一条汇编语句一般执行时间是一个机器周期,一个机器周期是晶振的倒数。一条语句要运行多长时间要看这条语句有多少条反汇编语句。
回复

使用道具 举报

25#
ID:612180 发表于 2019-10-7 14:36 | 只看该作者
如果单片机的晶振周期不一样,那么时间也就不一样,从而单片机的处理程序时间也就不同,所以要对照单片机的晶振频率,从而计算时间。
回复

使用道具 举报

26#
ID:609989 发表于 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++);
    }
回复

使用道具 举报

27#
ID:222006 发表于 2019-10-8 19:04 | 只看该作者
算法没问题,但是你要知道单片机的执行时间不单单只执行while里面的延时
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表