找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1309|回复: 8
打印 上一主题 下一主题
收起左侧

51单片机LED延时程序问题

[复制链接]
跳转到指定楼层
楼主
关于51单片机LED延时问题:
如图:STC89C52RC,11.0592晶振,如果用unsigned int对变量进行定义delayms(50000)延时大约是0.489s,而用long对变量进行定义delayms(100000)延时大约是4.34s,为什么不是2倍关系呢,差的太多了吧,实验板上跑过程序,真的是4s多

51hei截图_20220411230035.png (60.18 KB, 下载次数: 39)

51hei截图_20220411230035.png

51hei截图_20220411230516.png (61.69 KB, 下载次数: 32)

51hei截图_20220411230516.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:401564 发表于 2022-4-11 23:52 | 只看该作者
别看仿真
STC下载器有现成代码
Keil是传统8051内核,它是按AT系列的8051走的
STC的指令时间和AT的是不一样的
至于为什么不是两倍关系,你先去了解一下单片机的编译原理吧,这是基础
回复

使用道具 举报

板凳
ID:624769 发表于 2022-4-11 23:56 | 只看该作者
延时要准, 就要 用多个 char 嵌套, 不能简单用 long 或 INT
回复

使用道具 举报

地板
ID:123289 发表于 2022-4-12 11:15 | 只看该作者
1、对单片机的数据结构没有真正明白的原理。
2、不懂汇编。
建议:
将程序进行编译,看编译后的汇编代码,或许你就明白了。
提示:硬延时,虽然每次动作都是减1或加1的累计。但对于不同的数据结构,加减1的复杂程序是不同的,即运行复杂程度是不一样的,所以时间不同。
回复

使用道具 举报

5#
ID:121859 发表于 2022-4-12 12:34 | 只看该作者
不可能是2倍关系的,int是两个字节,long是4个字节,如果转为汇编,那么前者是2个循环,后者则是4个循环,因为51单片机是8位机,所以各个指令的转移判据最高也是8位。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:61883 发表于 2022-4-12 17:57 | 只看该作者
因为你的单片机是8位的,如果使用long这种类型,编译出来代码会很大很大(可以看反汇编),这样延时执行起来,时间就长很多了。
回复

使用道具 举报

7#
ID:123289 发表于 2022-4-13 16:32 | 只看该作者
long 是浮点数,浮点数有:底数(3个字节)和阶码(一个字节)组成,类似于科学记数法。做加减法时,要先对阶(相当于浮点转定点),而后再加减,且是带符号计算,最后再计算阶码,还原成浮点格式。比定点运算复杂许多倍。
不懂汇编的师兄们,是很难理解这些的。
回复

使用道具 举报

8#
ID:282519 发表于 2022-4-13 17:57 | 只看该作者
谢谢各位指点,不过还是不是很理解,汇编这块不懂
回复

使用道具 举报

9#
ID:624769 发表于 2022-4-13 21:39 | 只看该作者
海盗船 发表于 2022-4-13 17:57
谢谢各位指点,不过还是不是很理解,汇编这块不懂

因为, 你不懂汇编, 也不懂  char  int   long 的判断, 对于 51核 的单片机来说 根本上的区别是什么。
所以,你无法理解  INT 延时  和 long 延时 为什么不是两倍关系。
如果,一定要弄懂,就去补知识, 如果不愿意去补,就把 这个“为什么” 先放一边,只要知道,“就是这样的”。就好了。

你要相对 准确的延时,就用unsigned char 来嵌套,如:
void Delay100us(unsigned char x)      // x个 100us  @11.0592MHz
{
unsigned char i;
while(--x)
   {
        i = 43;
        while (--i);
   }
}

void Delay10ms(unsigned char x)       // x 个10ms  @11.0592MHz
{
       while(--x)Delay100us(100);
}

void Delay1s(unsigned char x)           // x 个1s  @11.0592MHz
{
       while(--x)Delay10ms(100);
}


回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表