找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于Delay组成的C语言语句问题

[复制链接]
跳转到指定楼层
楼主
DelayMS(3800)   是3.8s,怎么跑了0.18s

IMG_20190930_172408.jpg (9.6 MB, 下载次数: 28)

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

使用道具 举报

沙发
ID:275826 发表于 2019-10-4 12:11 | 只看该作者

DelayMS(3800)  谁说是3.8s,具体多长跟晶振和子程序函数都有关系
回复

使用道具 举报

板凳
ID:619205 发表于 2019-10-4 14:34 | 只看该作者
Delay程式 延遲的時間和你所使用的指令週期與Delay方法有關我看你的圖片事阻塞式延遲,原理就是跑空指令,根據芯片不同每一個指令都需要花費數個指令週期
你的Delay在副程式中視兩個空的迴圈函數,裡面的for(i=0;i<y;i++) 中的y代表你每次執行會跑幾個空迴圈
,whie(x--) 中的x 是你可以輸入的變數,意思是你要跑幾次for迴圈 , 如果你輸入x,那你執行空迴圈的次數就是x*y次,如果你輸入x=3800那
,就是執行了3800*y次迴圈空迴圈.
如果使用這種方式來來完成Delay你可以去看你芯片執行指令需要多少時間來計算實際的延遲時間,會者用其他發法一個一個嘗試來確定執行1次for迴圈需要多久.
當然用這種方式時間不會太準確,如果時間要求精度高可以選擇使用TIM,或改用組合語言.

评分

参与人数 2黑币 +90 收起 理由
机子单 + 30
admin + 60 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:616666 发表于 2019-10-4 14:38 | 只看该作者
有没有大神,指导下,工作过程
回复

使用道具 举报

5#
ID:155507 发表于 2019-10-4 18:12 | 只看该作者
机子单 发表于 2019-10-4 14:38
有没有大神,指导下,工作过程

你可以参考这个

http://www.51hei.com/bbs/dpj-4711-1.html
回复

使用道具 举报

6#
ID:619372 发表于 2019-10-5 05:48 | 只看该作者
不是循环多少次就是多少秒的,可以直接搜delay()函数,可以查到很多常用的。
回复

使用道具 举报

7#
ID:155507 发表于 2019-10-5 07:16 | 只看该作者
一、51单片机软件延时:
1、 几种周期介绍
  周期名称
            描述
            时间
  
  振荡
            单片机提供时钟脉冲信号
  的振荡源的周期
            T=1/f
  
  状态
            振荡周期经二分频后得到
  的
            2T
  
  机器
            CPU 可以完成一个独立操
  作所需要的周期
            12T
  
  指令
            指 CPU 完成一条操作所需
  的全部时间
            n*12T
  


2、指令:
1、MUL、DIV:仅有的 4 周期指令
2、包含 DPTR 和 PC 的指令均为 2 周期指令
3、所有的绝对跳转和条件转移指令,均为 2 周期指令
4、所有包括 A 寄存器的指令,均为单周期指令
5、位操作指令中,ANL 和 ORL 是 2 周期指令
6、所有包含立即地址的指令,除 INC direct 及 DEC direct 外,均为 2 周期指令
7、剩下的均为单周期指令。如:
void delay(uint z)
{
uint i ,j;
for(i = z; i> 0;i--)


for(j =0; j < 921; j++)
}


分析:
1.先计算你单片机的振荡(时钟)周期 T=1/晶振(11.0592MHZ)
2.一次 i--操作为 12T
3.忽略变量定义,上述延时函数共需时间:921*z*12T
4.带入 T:921*12*T*z 约为 z us
3、计算误差出现的原因:
1.软件仿真时,函数调用的时候入栈出栈操作的耗时。
2.指令周期随指令的不同而不同导致的误差。
3.中断的影响。
4.变量的范围超过,从而与预计时间不一样。


while(i--):如果 i 为 char 型,执行一次大概为 5us 左右;如果 i 为 int 型则执行一次大概为 10us 左右。注意:软件延时通常用于时序要求较高的编程中,其它需延时较长的地方必须采用单片机内部定时器。

评分

参与人数 1黑币 +12 收起 理由
机子单 + 12

查看全部评分

回复

使用道具 举报

8#
ID:445775 发表于 2019-10-5 10:33 | 只看该作者
延时时间和单片机的时钟频率有关,可以去网上下载例如单片机小精灵之类的工具,不仅可以生成相对准确的延时,提供了波特率生成器等工具,简单暴力
回复

使用道具 举报

9#
ID:451448 发表于 2019-10-5 16:48 | 只看该作者
这个是跟你的CPU的执行速度有关,假如你用的CPU一毫秒能执行2条指令,那么循环体里面的数值为2时,代表执行一次这个函数所花的时间为1ms,数值为4的话,代表执行一次这个函数代表花费时间为2ms,依次来达到延时的目的,不过这种延时是不够精准的,用在要求精度不高的事件
回复

使用道具 举报

10#
ID:158375 发表于 2019-10-5 17:19 | 只看该作者
DelayMS(3800)   是3.8s,怎么跑了0.18s
  -----
  软件延时,不太准确,与许多都有关系,例如中断等等.....再说,DelayMS(3800) ,你咋确定是3.8S的?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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