4688|8

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

Keil下AT89C51的软件仿真速度问题。(难道时钟是1.2MHz吗?) [复制链接]

为AT89C51写了一个延时函数如下:


  1. void WhileTimeout(unsigned int pTimeout)
  2. //WhileTimeout函数
  3. //语法:WhileTimeout(pTimeout);
  4. //说明:产生pTimeout指定延时,单位为ms。
  5. //参数:unsigned int pTimeout        单位为ms的延时参数。
  6. {
  7.   //
  8.   unsigned int tTimerIndex;
  9.   unsigned int tTimerIndex_Length;
  10.   unsigned int tClockIndex;
  11.   unsigned int tClockIndex_Length;
  12.   //
  13.   tTimerIndex_Length=pTimeout;
  14.   tClockIndex_Length=12000;                        // 1ms=1/12MHz=12000
  15.   //
  16.   for (tTimerIndex=0; tTimerIndex
  17.   {
  18.     for (tClockIndex=0; tClockIndex
  19.         {
  20.         //
  21.         }
  22.   }
  23. }
复制代码


假定AT89C51以12MHz运行,其中tClockIndex_Length设置为12000,以获得1ms的延时。但实际Debug软件仿真发现这个函数延时在10ms,似乎是在1.2MHz运行。由于单片机还没有搭出来,所以暂时没烧到片里实际测试。不知是仿真速度就是这样?还是我计算有误?

完整程序如下(哪位如果有现成的单片机帮我测试一下就太好了,详情见main函数的说明):


  1. #include

  2. //

  3. void WhileTimeout(unsigned int pTimeout)
  4. //WhileTimeout函数
  5. //语法:WhileTimeout(pTimeout);
  6. //说明:产生pTimeout指定延时,单位为ms。
  7. //参数:unsigned int pTimeout        单位为ms的延时参数。
  8. {
  9.   //
  10.   unsigned int tTimerIndex;
  11.   unsigned int tTimerIndex_Length;
  12.   unsigned int tClockIndex;
  13.   unsigned int tClockIndex_Length;
  14.   //
  15.   tTimerIndex_Length=pTimeout;
  16.   tClockIndex_Length=12000;                        // 1ms=1/12MHz=12000
  17.   //
  18.   for (tTimerIndex=0; tTimerIndex
  19.   {
  20.     for (tClockIndex=0; tClockIndex
  21.         {
  22.         //
  23.         }
  24.   }
  25. }

  26. void ProtDevice_LO(unsigned char pConByte, unsigned char pProt)
  27. //ProtDevice函数
  28. //语法:ProtDevice(pConByte, pProt);
  29. //说明:驱动端口(低电平开启)。
  30. //参数:unsigned char pConByte                端口控制字节(高电平开启)。
  31. //                unsigned char pProt                        端口选择(0-3)
  32. {
  33.   switch(pProt)
  34.   {
  35.     case 0: P0=~pConByte;break;
  36.     case 1: P1=~pConByte;break;
  37.     case 2: P2=~pConByte;break;
  38.     case 3: P3=~pConByte;break;
  39.   }
  40. }

  41. void LoopOpen_LO(unsigned int pOpenTimeout, unsigned char pProt)
  42. //LoopOpen_LO函数
  43. //语法:LoopOpen_LO(pOpenTimeout, pProt);
  44. //说明:循环驱动端口(低电平开启)。
  45. //参数:unsigned int pOpenTimeout        开启时间设置(单位ms)
  46. //                unsigned char pProt                        端口选择(0-3)
  47. {
  48.   unsigned char tConByte;
  49.   unsigned int tLoopIndex;
  50.   unsigned int tLoopIndex_Length;

  51.   tLoopIndex_Length=7;

  52.   //开关0号。
  53.   tConByte=1;
  54.   ProtDevice_LO(tConByte, pProt);        //驱动端口
  55.   WhileTimeout(pOpenTimeout);

  56.   //开关1-7号。
  57.   for (tLoopIndex=0; tLoopIndex
  58.   {
  59.   tConByte=tConByte<<1;
  60.   ProtDevice_LO(tConByte, pProt);        //驱动端口
  61.   WhileTimeout(pOpenTimeout);
  62.   }
  63. }

  64. void main()
  65. {
  66.   unsigned char tProtA;
  67.   unsigned char tProtB;
  68.   unsigned char tConByte;
  69.   unsigned int tOpenTimeout;
  70.   unsigned int tWhileTimeout;
  71.   tProtA=1;
  72.   tProtB=2;
  73.   tOpenTimeout=50;  //按照道理应该是500
  74.   tWhileTimeout=300;  //按照道理应该是3000
  75.   tConByte=0;
  76.   ProtDevice_LO(tConByte, tProtA);
  77.   ProtDevice_LO(tConByte, tProtB);
  78.   while(1)
  79.   {
  80.         //第一端口
  81.         LoopOpen_LO(tOpenTimeout, tProtA);
  82.         tConByte=0;
  83.     ProtDevice_LO(tConByte, tProtA);
  84.     //第二端口
  85.     LoopOpen_LO(tOpenTimeout, tProtB);
  86.         tConByte=0;
  87.     ProtDevice_LO(tConByte, tProtB);
  88.         //等待
  89.     WhileTimeout(tWhileTimeout);
  90.   }
  91. }
复制代码

最新回复

如果时间不是很准确。 用汇编延时比较接近实际!  详情 回复 发表于 2008-1-29 12:51
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
用定时器计数比较好,就是计数值要调整。
在你另个贴回了。
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
jf
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 
ok
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

5
 
8051-based Fullly Static 24MHz CMOS controller with 32  I/O Lines,
2 Timers/Counters, 6 Interrupts/2 Priority Levels, UART,
Three-Level Program Memory Lock, 4K Bytes Flash Memory,
128 Bytes On-chip RAM

传说中的小仙妹哈

你看看KEIL里的AT89C51的参数说明

是不是你的问题OK了?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
    嘿嘿,这个子函数的延时肯定是会大于1ms的,因为你用了两个for循环,建议你将这个子程序反汇编,然后,根据汇编程序每条指令执行时间算出要延时的时间。
    如果要精确延时,还是用定时器吧。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

7
 
我来接粉了, 美女,谢谢哦,嘿嘿
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

8
 
嘿嘿!做人要讲信用!说杀你全家,就杀你全家!说给你分就一定会等你接分!
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(初级)

9
 
如果时间不是很准确。 用汇编延时比较接近实际!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
Microchip 直播|利用motorBench开发套件高效开发电机磁场定向控制方案 报名中!
直播主题:利用motorBench开发套件高效开发电机磁场定向控制方案
直播时间:2025年3月25日(星期二)上午10:30-11:30
快来报名!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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