标题: 51单片机LED延时程序问题 [打印本页]

作者: 海盗船    时间: 2022-4-11 23:10
标题: 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, 下载次数: 55)

51hei截图_20220411230035.png

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

51hei截图_20220411230516.png

作者: Y_G_G    时间: 2022-4-11 23:52
别看仿真
STC下载器有现成代码
Keil是传统8051内核,它是按AT系列的8051走的
STC的指令时间和AT的是不一样的
至于为什么不是两倍关系,你先去了解一下单片机的编译原理吧,这是基础
作者: 188610329    时间: 2022-4-11 23:56
延时要准, 就要 用多个 char 嵌套, 不能简单用 long 或 INT
作者: yzwzfyz    时间: 2022-4-12 11:15
1、对单片机的数据结构没有真正明白的原理。
2、不懂汇编。
建议:
将程序进行编译,看编译后的汇编代码,或许你就明白了。
提示:硬延时,虽然每次动作都是减1或加1的累计。但对于不同的数据结构,加减1的复杂程序是不同的,即运行复杂程度是不一样的,所以时间不同。
作者: zhxiufan    时间: 2022-4-12 12:34
不可能是2倍关系的,int是两个字节,long是4个字节,如果转为汇编,那么前者是2个循环,后者则是4个循环,因为51单片机是8位机,所以各个指令的转移判据最高也是8位。
作者: 搬运工2014    时间: 2022-4-12 17:57
因为你的单片机是8位的,如果使用long这种类型,编译出来代码会很大很大(可以看反汇编),这样延时执行起来,时间就长很多了。
作者: yzwzfyz    时间: 2022-4-13 16:32
long 是浮点数,浮点数有:底数(3个字节)和阶码(一个字节)组成,类似于科学记数法。做加减法时,要先对阶(相当于浮点转定点),而后再加减,且是带符号计算,最后再计算阶码,还原成浮点格式。比定点运算复杂许多倍。
不懂汇编的师兄们,是很难理解这些的。

作者: 海盗船    时间: 2022-4-13 17:57
谢谢各位指点,不过还是不是很理解,汇编这块不懂
作者: 188610329    时间: 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);
}







欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1