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

[复制链接]
11686|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时间啊
21Embedded 发表于 2007-9-11 08:51 | 显示全部楼层

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

ayb_ice 发表于 2007-9-11 09:36 | 显示全部楼层

程序可以仿OS结构...

saystar 发表于 2007-9-11 10:41 | 显示全部楼层

看IC

51是1/12
PIC是1/4
AVR是1/1
还要看编译后的汇编指令(工具不同结果不同)
PS:所谓OS的时间片在一些简单应用中可能导致程序复杂化(如小家电玩具),应该具体问题具体分析.
colorwu 发表于 2007-9-11 16:21 | 显示全部楼层

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


一切以示波器为准就对了!
5880527 发表于 2007-9-11 17:30 | 显示全部楼层

都是书本害的

这种延时是书本上的标准模式,可实际应用中你真要这样写那说明你对单片机还没入门
huntington 发表于 2007-9-11 17:39 | 显示全部楼层

延时少用无用的操作

 楼主| 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延时?

erhui_cn 发表于 2007-9-12 11:18 | 显示全部楼层

re

楼上的,你尝试用它控制一个IO,然后用示波器测试一个这个延时看看就知道了,测试完说来听听哦.
 楼主| mostever 发表于 2007-9-12 20:58 | 显示全部楼层

明白,我马上学习一下

好的
szzghmcu 发表于 2007-9-12 21:04 | 显示全部楼层

呵呵

以示波器为准
ayb_ice 发表于 2007-9-13 07:46 | 显示全部楼层

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

HWM 发表于 2007-9-13 07:58 | 显示全部楼层

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

用循环做延时很正常,特别是在一般的控制系统内。
 楼主| 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
jeoge 发表于 2007-9-17 14:27 | 显示全部楼层

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

   這樣延時會浪費大量的cpu時間,也就是說,cpu不能做別的事情了.在這段時間只能在延時程序中打圈圈.正確的延時法是用時間中斷.這樣不會浪費cpu的時間.
音乐乐乐 发表于 2007-9-17 16:49 | 显示全部楼层

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

 一般情况下,cpu的利用率不可能是100%,现在不浪费,在其他地方也必须得浪费掉!
dudongdao 发表于 2007-9-17 16:54 | 显示全部楼层

高手给写几个常用的吧

    请高手写几个例子,大家共同学习饿啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

10

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部