打印

帮我看个简单的1ms延时程序

[复制链接]
9440|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mostever|  楼主 | 2007-9-10 11:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void delay1ms()          //1毫秒延时子程序
{
 unsigned char i;
 for(i=124;i>0;i--); 
  //C:0x00A8    7F7C     MOV      R7,#0x7C    1个机器周期
  //C:0x00AA    DFFE     DJNZ     R7,C:00AA   2个机器周期

}


 12M晶振,延时是不是这样计算:
124×2+1=249us?
这个怎么会有1ms延时?

相关帖子

沙发
5880527| | 2007-9-10 18:42 | 只看该作者

看到这样的延时就想说脏话

看到这样的延时就想说脏话

使用特权

评论回复
板凳
ayb_ice| | 2007-9-11 07:25 | 只看该作者

浪费宝贵的CPU时间...

使用特权

评论回复
地板
starlite_jason| | 2007-9-11 08:49 | 只看该作者

那请问楼上的

不跑OS的时候,怎样才不算浪费CPU时间啊

使用特权

评论回复
5
21Embedded| | 2007-9-11 08:51 | 只看该作者

回答楼上,用时基的方法就可以不浪费CPU的时间

使用特权

评论回复
6
ayb_ice| | 2007-9-11 09:36 | 只看该作者

程序可以仿OS结构...

使用特权

评论回复
7
saystar| | 2007-9-11 10:41 | 只看该作者

看IC

51是1/12
PIC是1/4
AVR是1/1
还要看编译后的汇编指令(工具不同结果不同)
PS:所谓OS的时间片在一些简单应用中可能导致程序复杂化(如小家电玩具),应该具体问题具体分析.

使用特权

评论回复
8
colorwu| | 2007-9-11 16:21 | 只看该作者

帮我看个简单的1ms延时程序


一切以示波器为准就对了!

使用特权

评论回复
9
5880527| | 2007-9-11 17:30 | 只看该作者

都是书本害的

这种延时是书本上的标准模式,可实际应用中你真要这样写那说明你对单片机还没入门

使用特权

评论回复
10
huntington| | 2007-9-11 17:39 | 只看该作者

延时少用无用的操作

使用特权

评论回复
11
mostever|  楼主 | 2007-9-11 18:01 | 只看该作者

汇报代码如下

void delay1ms()          //1毫秒延时子程序
{
unsigned char i;
for(i=124;i>0;i--); 
}
这个是我在View-Disassembly Window里看的汇编代码,
    17: void delay1ms()          //1毫秒延时子程序 
    18: { 
    19:  unsigned char i; 
    20:  for(i=124;i>0;i--);  
C:0x0003    7F7C     MOV      R7,#0x7C
C:0x0005    DFFE     DJNZ     R7,C:0005
    21: } 

12M晶振,延时是不是这样计算:
124×2+1=249us?
这个怎么会有1ms延时?

使用特权

评论回复
12
erhui_cn| | 2007-9-12 11:18 | 只看该作者

re

楼上的,你尝试用它控制一个IO,然后用示波器测试一个这个延时看看就知道了,测试完说来听听哦.

使用特权

评论回复
13
mostever|  楼主 | 2007-9-12 20:58 | 只看该作者

明白,我马上学习一下

好的

使用特权

评论回复
14
szzghmcu| | 2007-9-12 21:04 | 只看该作者

呵呵

以示波器为准

使用特权

评论回复
15
ayb_ice| | 2007-9-13 07:46 | 只看该作者

示波也没有计算的准...

使用特权

评论回复
16
HWM| | 2007-9-13 07:58 | 只看该作者

LZ:你只计算了循环体内的用时,还必须加上循环架构所用的

用循环做延时很正常,特别是在一般的控制系统内。

使用特权

评论回复
17
mostever|  楼主 | 2007-9-17 09:55 | 只看该作者

谢谢各位的关心,示波器的结果

C源程序
void delay1ms()          //1毫秒延时子程序
{
 unsigned int i,j;
 for(i=125;i>0;i--);
}

void display()
{
P0_1=~P0_1;  //对P0.1进行去反,查延时
delay1ms();
}

main()
{
  while(1)
 {
  display();
 }
}


编译后的汇编
     5: void delay1ms()          //1毫秒延时子程序 
     6: { 
     7:  unsigned int i,j; 
     8:  for(i=125;i>0;i--); 
C:0x0003    7F7D     MOV      R7,#0x7D    //1个周期
C:0x0005    7E00     MOV      R6,#0x00    //1个周期
C:0x0007    EF       MOV      A,R7        //1个周期
C:0x0008    1F       DEC      R7          //1个周期
C:0x0009    7001     JNZ      C:000C      //2个周期
C:0x000B    1E       DEC      R6          //1个周期
C:0x000C    EF       MOV      A,R7        //1个周期
C:0x000D    4E       ORL      A,R6        //1个周期
C:0x000E    70F7     JNZ      C:0007      //2个周期
     9: } 



最后对P0.1测量波形,周期是2.19ms
则单个延时2.19/2=1.095ms

根据汇编的结果:
1+1+2+1+1+1+2=9us
9*125=1125us=1.125ms
理论和示波器还差不多
over

使用特权

评论回复
18
jeoge| | 2007-9-17 14:27 | 只看该作者

這樣的延時就不要拿出來丟人現眼

   這樣延時會浪費大量的cpu時間,也就是說,cpu不能做別的事情了.在這段時間只能在延時程序中打圈圈.正確的延時法是用時間中斷.這樣不會浪費cpu的時間.

使用特权

评论回复
19
音乐乐乐| | 2007-9-17 16:49 | 只看该作者

看什么应用吧?这样的延时用的还是挺多的

 一般情况下,cpu的利用率不可能是100%,现在不浪费,在其他地方也必须得浪费掉!

使用特权

评论回复
20
dudongdao| | 2007-9-17 16:54 | 只看该作者

高手给写几个常用的吧

    请高手写几个例子,大家共同学习饿啊

使用特权

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

本版积分规则

3

主题

10

帖子

0

粉丝