|
發(fā)布時間: 2025-4-21 17:39
正文摘要:使用的是stc8h8k64u單片機(jī),需要延時3秒,代碼由stc-isp生成,延時程序名Delay3000ms(), 在keil調(diào)試,顯示的卻是54秒,(見圖)。 程序下載運行,實測是4.5秒,相差太大了。 為什么keil調(diào)試顯示是54?我 ... |
|
晶振11.0592MHz請參考,自己調(diào)試一下 #include <intrins.h> void Delay3000ms() { unsigned int i, j; for (i = 0; i < 628; i++) { // 外層循環(huán)628次 for (j = 0; j < 0x2A4; j++) { // 內(nèi)層循環(huán)0x2A4(十進(jìn)制676)次 _nop_(); // 每個空指令占用1個時鐘周期 } } } // 或使用更精確的定時器方法(推薦) void Delay3000ms() { TMOD &= 0xF0; // 設(shè)置定時器模式:T1為16位定時器模式 TMOD |= 0x10; TH1 = 0xDC; // 初始化定時值(11.0592MHz下,定時50ms) TL1 = 0x00; ET1 = 0; // 禁用定時器中斷 TR1 = 1; // 啟動定時器 for (unsigned int count = 0; count < 60; count++) { // 60*50ms=3000ms while (!TF1); // 等待定時器溢出 TF1 = 0; // 清除溢出標(biāo)志 TH1 = 0xDC; // 重載初值 TL1 = 0x00; } TR1 = 0; // 停止定時器 } 晶振12MHz void Delay3000ms() //@12.000MHz { unsigned char i, j, k; i = 224; do { j = 200; do { k = 200; do { // 空循環(huán),由k--操作實現(xiàn) } while (--k); } while (--j); } while (--i); } |
ziyueboy 發(fā)表于 2025-4-24 22:35 還在用89C52芯片的人,還談啥非阻塞啊,RTOS啊 |
程序中不要用delay1ms(XXX),初始化可以用倒無所謂!要么定時器開滴答做系統(tǒng)時間分片基準(zhǔn),要么定時器中做個時間基準(zhǔn)。多任務(wù)分時執(zhí)行時候,或RTOS時候,用delay1ms(XXX)都會出很多莫名其妙的問題,特別模擬SPI,I2C等通訊,要做好delay1ms(XXX)規(guī)劃,能用硬SPI,I2C等外設(shè),最好不要用模擬,出問題不好找出問題點啦!除非你能把握每一處細(xì)節(jié),做到入微,那么用倒無所謂。目前MCU項目都做多任務(wù)的,delay1ms(XXX)能不用盡量別用,養(yǎng)好習(xí)慣![]() ![]() ![]() ![]() |
|
89系列太古老了,建議直接用Ai8051U,USB 型 1T 8051,支持32位和8位指令集, RMB2.3,支持硬件USB下載 硬件USB仿真 管腳兼容天王級別的: 89C52RC, 12C5A60S2 要兼容 8位8051指令集, 可以用 Keil C51/IAR/SDCC 編譯器 ===就相當(dāng)于更強(qiáng)大的 8H8K64U 要兼容 32位8051指令集,可以用 Keil C251 編譯器,雙核兼容設(shè)計 ===就相當(dāng)于更強(qiáng)大的 32G12K128, 32G8K64 34K SRAM(2K edata, 32K xdata), 64K Flash TFPU@120MHz, 硬件浮點/硬件三角函數(shù) 運算器 DMA支持PWM, DMA支持外設(shè)直接到外設(shè), P2P 120MHz-PWM支持硬件移相,16位PWM; 真12位ADC USB, 4組串口,12位ADC, 軌到軌比較器 QSPI, SPI, I2S, I2C, TFT-i8080/M6800 接口 PDIP40,LQFP44,LQFP44
|
|
必須直接設(shè)置3000ms,不能1ms 3000次,否則會累積3000個誤差 |
8b0381a8b59509b5b4f04d4351c8576.jpg (62.39 KB, 下載次數(shù): 0)
| 謝謝大家!繼續(xù)學(xué)習(xí)。 |
| 你還是用stc89吧,老老實實呆在舒適區(qū),8h太新了,不適合你 |
wh8010jky 發(fā)表于 2025-4-22 17:04 為什么對仿真這么執(zhí)著呢? 程序最終是要用來運行的,不是用來仿真的 設(shè)置一個u8全局變量,開啟一個定時器中斷,在中斷對這個變量進(jìn)行++運算,然后在所有函數(shù)中都可以通過讀取這個變量來進(jìn)行延時之類的時間操作 不推薦用上古時期的8051了,功能少,燒錄不方便,片上資源少,運行速度慢,價格又高,資料也少,出了問題找不到相關(guān)資料,這都完美的避開了STC的所有優(yōu)點 |
| 軟仿真吧?那是12T模式的老51的時間。STC51大部分指令都1T的了。 |
| ms級以上延時,開一個定時器才能準(zhǔn)確,因為不同編譯會產(chǎn)生不同效果,改一點代碼又會改變 |
| 阻塞延時我很少用, 一般只用幾個nop 延時;正常使用都是用定時器, 所以你這個情況沒有試過也沒有碰到過, 但是分析一下 主要是 編譯器不能識別是1T還是12T, 默認(rèn)都是以12T在模擬運行, 所以54/12=4.5秒 就是正常的; 另外4.5秒與軟件設(shè)置的3秒有誤差, 這個可能就是軟件延時本身的誤差, 或者程序中還有其他的地方影響到了延時; 比如定時器等等。 可以試試注釋掉其他的所有函數(shù),主程序就只寫個延時點燈的測試下。 |
| 指命的延時都不一樣 |
|
|
降低stc8h的速度至stc89c52一樣,這時你會發(fā)現(xiàn)又比較準(zhǔn)了。 還有個辦法就是外接晶振,加用示波器一類的輔助調(diào)節(jié)。 |
| 現(xiàn)在單片機(jī)都是1T的,還有中斷等影響,我一般都是用示波器實測調(diào)整。 |
|
超過1mS的延時,正常來說都是要用定時器或者PCA計數(shù)器來延時的,而不是讓程序死等,雖然說你程序可能 很簡單,不需要什么效率,但是,一個良好的編程習(xí)慣還是要有的 Keil是傳統(tǒng)8051指令,跟STC的指令是不同的,除非你用硬件在線仿真 |
| 用STC的ISP軟件直接生成延時試試。STC是有1T的模式,也有12T模式,會影響延時。Atmel的都是12T的。 |
Powered by 單片機(jī)教程網(wǎng)