海盗船 发表于 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); } |
谢谢各位指点,不过还是不是很理解,汇编这块不懂 |
long 是浮点数,浮点数有:底数(3个字节)和阶码(一个字节)组成,类似于科学记数法。做加减法时,要先对阶(相当于浮点转定点),而后再加减,且是带符号计算,最后再计算阶码,还原成浮点格式。比定点运算复杂许多倍。 不懂汇编的师兄们,是很难理解这些的。 |
因为你的单片机是8位的,如果使用long这种类型,编译出来代码会很大很大(可以看反汇编),这样延时执行起来,时间就长很多了。 |
1、对单片机的数据结构没有真正明白的原理。 2、不懂汇编。 建议: 将程序进行编译,看编译后的汇编代码,或许你就明白了。 提示:硬延时,虽然每次动作都是减1或加1的累计。但对于不同的数据结构,加减1的复杂程序是不同的,即运行复杂程度是不一样的,所以时间不同。 |
延时要准, 就要 用多个 char 嵌套, 不能简单用 long 或 INT |
别看仿真 STC下载器有现成代码 Keil是传统8051内核,它是按AT系列的8051走的 STC的指令时间和AT的是不一样的 至于为什么不是两倍关系,你先去了解一下单片机的编译原理吧,这是基础 |