![]() |
發布時間: 2021-9-7 16:39
正文摘要:本意是每分鐘響一聲,現在出了兩個菜鳥搞不明白的問題: 一是第一次響聲短暫,符合預期,之后的響聲延長了。 二是運行幾分鐘后時間誤差變大,它跑得快了。謝謝你的觀看和指正。 單片機源程序如下: #include< ... |
50Ms初值50000*11.0592/12=46080你算錯了 |
可能程序自身有延遲 |
你這個同時用代碼延時和中斷延時肯定會有誤差的,因為當中斷到來時,delay語句必定會因為中斷停止自加的。每來一次中斷delay語句那里就會停止一次,久而久之,蜂鳴器響的時間會越來越長。 |
delay(250);這句完全多余,if(num==1200)本身就是延遲的意思。 |
Y_G_G 發表于 2021-9-7 23:12 謝謝!稍后我修改代碼再試。 |
我下載了原本沒有的“STC89C5xRC.H”,之后試過你改寫的代碼,精度更高了,謝謝。 |
定時器可以這么用,但你的代碼本身就是錯誤的 if(num==1200); num是全局變量,而且是在中斷中增加的,隨時會變的 如果是在比較if(num==1200)的過程中num的值剛好增加 而且,你之后有代碼又有延時,不知道延時不多長,但定時器可是自動加載工作的,num的值是一直在變化的 錯過了if(num==1200),比如大于,那就是會一直加到65535然后,歸零之后再加.... 你可以改成if(num>=1200)試一下 下面的延時改動一下,它會影響閃燈的時間 |
|
盡量少用循環語句實現的軟件延時,時間會被中斷打亂。 |
xianfajushi 發表于 2021-9-7 19:05 感謝你的指導。 |
wulin 發表于 2021-9-7 18:47 試過你改寫的代碼了,發光管隔1秒一亮,響聲始終是短暫的,符合預期。時間精度也高多了,估計是不使用時鐘模塊所能達到的最高精度。 謝謝。稍后我去理解你寫的代碼。 |
提幾個小建議, 1, STC89C52RC 是有 T2 定時器, 并且支持自動重載功能的。STCMCU點COM 上面有手冊可以下載。用那個會準的多。 2,STC89C52RC 的T2L, T2H 支持 SFR16 的定義, 可以直接接收 雙字節的賦值 3,不知道你用的什么編譯器,在51單片機很多編譯器中,unsigned int 是 單字節的 等同于 unsigned char, 如果你要確保是雙字節的 最好用 unsigned short num; 來聲明 num變量。 最后說一下,不要把C++的很多習慣帶到單片機里來, 最好用最保險的 CHAR SHORT LONG 來定義 單,雙,四字節,絕對不會有歧義。INT這種 可單可雙還可四的最好不要用。 |
受中斷響應速度影響,合理的程序可能影響小些也是有影響的,因此才有時鐘芯片。 |
定時器中斷周期越短越容易調整精度
|