![]() |
發布時間: 2022-4-11 23:10
正文摘要:關于51單片機LED延時問題: 如圖:STC89C52RC,11.0592晶振,如果用unsigned int對變量進行定義delayms(50000)延時大約是0.489s,而用long對變量進行定義delayms(100000)延時大約是4.34s,為什么不是2倍關系呢,差 ... |
海盜船 發表于 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的是不一樣的 至于為什么不是兩倍關系,你先去了解一下單片機的編譯原理吧,這是基礎 |