打印

C51延时子程序

[复制链接]
4295|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ksslx|  楼主 | 2008-3-14 10:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
近期在网上看到一个通用的延时子程序,如下:

C51S级延时子程序 
  
void delay(unsigned int N) //N = 1000 时间为1S
{
  unsigned int i;
  for(;N>0;N--)
     { 
      for(i=0;i<124;i++)
        {;}
     } 
}

我有点疑问哈,按他这样用的话,是不是不论用到哪延时时间都比较准确啊?
比如 ,我用的单片机是w77e58,delay(200)就差不多延时200ms吗?跟其他的有没有关系哈?谢啦!

补充一点:我用的晶振是24M的。

相关帖子

沙发
ayb_ice| | 2008-3-14 10:53 | 只看该作者

这样的程序影响MCU的效率

使用特权

评论回复
板凳
grady1125| | 2008-3-14 11:07 | 只看该作者

跟晶振频率和指令周期有关

使用特权

评论回复
地板
ksslx|  楼主 | 2008-3-14 11:23 | 只看该作者

再问...

一个for(i=0;i<124;i++)语句的机器周期是几个哈?

使用特权

评论回复
5
ksslx|  楼主 | 2008-3-14 11:32 | 只看该作者

问ayb_ice

我用这么个延时程序,主要是还想在定时器中断里面用,要不然在延时程序里利用定时器计时的话,就在定时器中断里用不成了啊!

使用特权

评论回复
6
zlgmcuCHTZ| | 2008-3-14 16:19 | 只看该作者

优化级不一样定时也不一样哦!

使用特权

评论回复
7
68336016| | 2008-3-14 16:34 | 只看该作者

自己拿KEIL编译一下看汇编代码了

还得自己计算,例如12M情况下KEIL编译的
void delay1s()//12M晶振下实现1s延时
{
    uchar h,i,j,k;
    for(i=5;i>0;i--)
        for(j=4;j>0;j--)
            for(k=116;k>0;k--)
                for(h=214;h>0;h--);
}
汇编下刚好也是1S
C:0x0003    7F05     MOV      R7,#0x05
C:0x0005    7E04     MOV      R6,#0x04
C:0x0007    7D74     MOV      R5,#0x74
C:0x0009    7CD6     MOV      R4,#0xD6
C:0x000B    DCFE     DJNZ     R4,C:000B
C:0x000D    DDFA     DJNZ     R5,C:0009
C:0x000F    DEF6     DJNZ     R6,C:0007
C:0x0011    DFF2     DJNZ     R7,C:0005
C:0x0013    22       RET      

使用特权

评论回复
8
ksslx|  楼主 | 2008-3-14 16:52 | 只看该作者

一个简单的疑问

c语言写的程序用KEIL编译后在哪看汇编代码哈? 

使用特权

评论回复
9
mohanwei| | 2008-3-14 17:05 | 只看该作者

#pragma SRC 或者启动仿真后打开汇编窗口

使用特权

评论回复
10
大漠孤烟| | 2008-3-14 18:38 | 只看该作者

通过这样程序空跑延时不是上策

通过这样程序空跑延时不是上策

大大影响执行效率,听高手说用定时器进行延时,但一直不解,只好先用KEIL 自带的RTX_TINY了,请熟悉定时器延时的高手们指点迷津,谢谢!

使用特权

评论回复
11
5880527| | 2008-3-14 20:11 | 只看该作者

都是书本害的

一开始就不要这样用

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

105

帖子

0

粉丝