9094|20

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

在keilc51中我用c语言要写个精确的时间,怎么写?(不可以用中断) [复制链接]

在keilc51中我用c语言要写个精确的时间,怎么写?(不可以用中断)

如:12MHz晶振
void dalay()
{
  uchar i,j,k;  
  for(i=0;i<100;i++);
  for(j=0;j<100;j++)
     for(k=0;k<100;k++);
}

有人会算吗? 包括调用程序的时间 总共是延时多少时间?
能把算法写出来吗  或者举个例子说明也可以!
此帖出自编程基础论坛

最新回复

如果用c51   12M的晶振, 最短的时间能做到多少us?       详情 回复 发表于 2007-4-18 09:49
点赞 关注
 

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
void dalay()
{
  uchar i,j,k;  

    EA =0;//关中断

  for(i=0;i<100;i++);
  for(j=0;j<100;j++)
     for(k=0;k<100;k++);

    EA = 1;//开中断
}//利用关总中断把其它的可能给毙了,这样就可以不被打断了

然后查看,编译后关/开中断间的生成的代码,然后计算循环指令的时间,慢慢算...

此帖出自编程基础论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
不错 好办法 但这又影响我的秒表和时间的精确性啊
我学做一个红外线接收器 不知道那个时间的同步性要很准!
此帖出自编程基础论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 
又想马儿跑,又想马儿不吃草,这做不到的

权衡,中间做取舍,呵呵
此帖出自编程基础论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

5
 
一开始我是想用汇编嵌入的
比如:
void Delay_865us(void)
{
#progam asm
MOV R4,#12 ; 1.09*(2R5+4)*R4+2延时子程序1,精确延时865微秒
D1:  MOV R5,#31
     DJNZ R5,$
     DJNZ R4,D1
#end asm
}
EA=0中断是在外部关掉的   恩 那个嵌入语句应该是#progam asm ..#end asm  只看过 没用过

请问lbing7(向青润老大学习!!!)  这样可以吗 有个问题就是难以保证R4 R5不被其他调用了哦

此帖出自编程基础论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 
这是我用延时函数
void delay_8us(uchar us)
{uchar i;
for(i=0;i }

在main函数调用 delay_8us(1) 生成汇编如下(+n 表示指令周期)

C:0x002F    7F01     MOV      R7,#0x01                 +1
C:0x0031    12003B   LCALL    delay_8us(C:003B)        +2
     5: void delay_8us(uchar us)
     6: {uchar i;
     7:  for(i=0;i C:0x003B    E4       CLR      A                        +1
C:0x003C    FE       MOV      R6,A                     +1    +1
C:0x003D    EE       MOV      A,R6                     +1    +1
C:0x003E    C3       CLR      C                        +1    +1
C:0x003F    9F       SUBB     A,R7                     +1    +1
C:0x0040    5003     JNC      C:0045                   +2    +2
C:0x0042    0E       INC      R6                       +1   
C:0x0043    80F8     SJMP     C:003D                   +1   
     8: }
C:0x0045    22       RET                                     +2     

计算它的调用时间: 23*1us(晶振为12MHz)=23us   
如果我调用delay_8us(n)
那么计算它的调用时间: [(12*n+1+2+1+1+2)*1us]/n=12us (当n比较大时)   
不知道是不是这样算   有没有错? 它为什么是说是延时8us呢?
这种方法搞延时也太难了吧
此帖出自编程基础论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

7
 
当我T1 T0的中断都用别的程序了 我要加个红外线接收的 那个时间9ms 和4.5ms 1.125ms 2.5ms
该怎么用c比较准确延时呢?
此帖出自编程基础论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

8
 
数下编译出来的汇编指令就行了,
此帖出自编程基础论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

9
 
请问lbing7(向青润老大学习!!!)  这样可以吗 有个问题就是难以保证R4 R5不被其他调用了哦


换另一个寄存器组不就完了?

呵呵
此帖出自编程基础论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

10
 
配置计时器。
在第一句中TM0CE = 1;
然后在最后一句读出16 bits counter的剩余的值,就是周期数。
安你自已的实现情况写。
此帖出自编程基础论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

11
 
linuxhaha() ( ) 信誉:100    Blog   加为好友  2007-04-17 09:49:53  得分: 0  
   配置计时器。
在第一句中TM0CE = 1;
然后在最后一句读出16 bits counter的剩余的值,就是周期数。
安你自已的实现情况写。
  
-------------------------------------------------------
这个也不是可靠的,想想,如果定时器停了呢?

可是超过一个周期了...

呵呵,如果要去掉这些个可能,那事情也同样就多了起来,也就不准了...

此帖出自编程基础论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

12
 
学习
此帖出自编程基础论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

13
 
void  Delay(uchar us)
{
   while(--us);
}

编译后看看汇编的代码吧,非常精简
此帖出自编程基础论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

14
 
//*************
请问lbing7(向青润老大学习!!!)  这样可以吗 有个问题就是难以保证R4 R5不被其他调用了哦


不就完了?

呵呵
//***************
我在网上找了点资料:"被c程序调用的汇编函数可以用所有的寄存器,而不用担心会修改c程序中使用的寄存器."
这个对吗? 如果这句不对 也不用换另一个寄存器组 因为我也不知道那个寄存器组用了没有啊!
可以 push 我所用的寄存器     最后返回在pop出来就可以了吧!

我第一次用嵌套 还不会用 汇编也很少用 还不太懂!
此帖出自编程基础论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

15
 
今天试一试sz_04022(帮别人开启一扇窗,也就是让自己看到更完整的天空)的程序 但出现错误了
#include
//# define InfData P3^3  //define Infrared Data     p3.3是红外线接受数据pinout
# define uchar unsigned char
# define uint unsigned int
void delay_8us(unsigned char us);
void delay_ms(uint ms);
void delay_8us(unsigned char us)
{
while(--us);  

}
//*===================delay_ms(uint ms),延时函数,参数为毫秒数=========================
void delay_ms(uint ms)  //
{uint i,j;
for(i=0;i    for(j=0;j<113;j++)
   ;
}
void main(void)
{
        int i=0;
        delay_8us(8);
        delay_ms(9);
}

linking...
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
    SYMBOL:  ?C_START
    MODULE:  STARTUP.obj (?C_STARTUP)
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  ?C_START
    MODULE:  STARTUP.obj (?C_STARTUP)
    ADDRESS: 003DH
Program Size: data=11.0 xdata=0 code=66

我看工程没有reg51.h include不进去啊

为什么啊
此帖出自编程基础论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

16
 
哦 对于WARNING L1: UNRESOLVED EXTERNAL SYMBOL 已经解决了  我之前用嵌入汇编 设置了keil环境参数  没改回来 改回来就ok了
此帖出自编程基础论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

17
 
现在延时程序时间怎么样啊

把汇编部分分析下

跟你学习一下
此帖出自编程基础论坛
 
 
 

回复

47

帖子

0

TA的资源

一粒金砂(初级)

18
 
"跟你学习一下" 还是不要好了
我只会这个
void Delay_500us(void)        //T=[2DTime + 4] * (12 / Fosc)
{
   DTime=0xf7;
   while(--DTime);  
}
此帖出自编程基础论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

19
 
lbing7:不可能超过一个计时周期,0xFFFF个时钟周期够长了,几条指令不可能超的。
时钟停了是什么意思?
此帖出自编程基础论坛
 
 
 

回复

95

帖子

0

TA的资源

一粒金砂(初级)

20
 
用c来实现精确定时是不可能的。
此帖出自编程基础论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表