找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5401|回復(fù): 8
收起左側(cè)

關(guān)于STC 51單片機(jī)不同指令集的(Y1-Y3-Y5-Y6)軟件延時(shí)函數(shù),如何才能更精確?

[復(fù)制鏈接]
ID:916679 發(fā)表于 2022-5-1 04:43 | 顯示全部樓層 |閱讀模式
關(guān)于STC 51單片機(jī)不同指令集的,Y1-Y3-Y5-Y6軟件延時(shí)函數(shù),大家都是怎么寫的呢?
本人,以前學(xué)了幾天STC89**的,通過STC-ISP生成延時(shí)函數(shù)改造一直使用著,沒覺得誤差有多大:如下
  1. //延時(shí)n毫秒 @11.0592MHz _STC89C52RC
  2. void delay_ms(unsigned int n)
  3. {
  4.     unsigned int i,j;
  5.     for(i=n;i>0;i–)
  6.     for(y=114;y>0;y–);
  7. }
復(fù)制代碼
之前就學(xué)了點(diǎn),對(duì)于51單片機(jī)了解的也不多,就沒再研究過其他型號(hào)。直到前幾天一個(gè)同學(xué)要做東西,問我會(huì)不會(huì)51,一想,這玩意我會(huì)呀,學(xué)STM32之前學(xué)過幾天,所以就答應(yīng)幫他看程序,但當(dāng)他把單片機(jī)拿過來,燒好我寫的程序時(shí),怎么都跑不正確,有關(guān)延時(shí)的全部跑飛了。。。。。。。。。。
于是我就去查了資料,原來51分不同指令集,不同的型號(hào)指令執(zhí)行周期不同,而我拿到同學(xué)的是個(gè)STC12C5A系列的,屬于Y3指令集,它的一個(gè)振蕩周期=一個(gè)機(jī)器周期,管他一條指令消耗幾個(gè)狀態(tài)周期,這玩意兒速度自然比89系列(一個(gè)12個(gè)振蕩周期=一個(gè)機(jī)器周期)的快了10倍左右吧。
  1. void delay_ms(unsigned int k){
  2.         unsigned char i, j;
  3.         for(k; k>0; k--){        
  4.                 _nop_();
  5.                 i = 11,j = 190;
  6.                 do
  7.                 {
  8.                         while (--j);
  9.                 } while (--i);
  10.         }
  11. }
復(fù)制代碼
于是呢:我又在STC-ISP軟件生成了一個(gè)1ms的延時(shí)函數(shù),然后循環(huán)N次執(zhí)行,表面雖然解決了,但是呢每次循環(huán),還有首次循環(huán)賦值消耗的時(shí)間呢?
這中間得有至少2個(gè)以上周期了,那么時(shí)間長了誤差不就越來越來了嗎,所以大家平時(shí)都是怎么控制延時(shí)的呢?

回復(fù)

使用道具 舉報(bào)

ID:390416 發(fā)表于 2022-5-1 11:45 | 顯示全部樓層
1、假設(shè)在同一個(gè)硬件上做測(cè)試,單片機(jī)CPU指令周期是一致的。那么 變量i、K,存放在data跟存放在XDATA,讀寫速度能一樣?精確計(jì)算有意義嗎?
2、假設(shè)都存放在data,延遲1ms只需要char類型的變量即可完成,但是,延遲100ms必須16位變量,那么執(zhí)行時(shí)間還能照著公式去套算?
3、假設(shè)上述條件都一樣,計(jì)算好的延遲時(shí)間是1ms并且誤差1%,打開中斷之后,延遲時(shí)間變成了5毫秒了。誤差500%了,精確計(jì)算有意義嗎?
4、假設(shè)上述條件不影響延遲時(shí)間,那么,編譯器呢?誰敢說編譯器不同的優(yōu)化等級(jí)不影響delay的延遲時(shí)間?
5、還有硬件不同的情況,就需要重新計(jì)算了。比如晶振頻率不同,CPU內(nèi)核速度不同,STC8H單片機(jī)就比STC15快了很多了比89系列快了十幾倍了。
實(shí)例說明:
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2022-5-1 12:09 | 顯示全部樓層
void Delay_ms(unsigned int a)                //@12.000MHz,1mS延時(shí)函數(shù),代碼從STC下載器復(fù)制來
{
        unsigned char i, j;
        for(a;a>0;a--)
            {
                i = 16;
                j = 147;
                do
                {
                        while (--j);
                }         while (--i);
          }
}
從1mS到1秒,我都是用這個(gè)
誤差肯定是有的,但這重要嗎?
誤差不會(huì)很大的,不會(huì)是1S延時(shí)變成2S或者50S的,誤差肯定是在可以接受的范圍內(nèi)的
你都用軟件來進(jìn)行延時(shí)了,對(duì)精度本身就不會(huì)太大的要求了,你想軟件延時(shí)10S,誤差只有幾u(yù)S的,那得在這上面耗上多少精力?直接用定時(shí)器不就行了
高精度延時(shí)用軟件延時(shí),這就是把好鋼用在刀把上
高精度時(shí)間控制,都是用定時(shí)器完成的
延時(shí)很短的,直接用空指令
回復(fù)

使用道具 舉報(bào)

ID:1023100 發(fā)表于 2022-5-1 12:40 | 顯示全部樓層
這邊基本都是基于定時(shí)器0 進(jìn)行高精度延時(shí)的
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2022-5-1 14:05 來自手機(jī) | 顯示全部樓層
毫秒級(jí)延時(shí)直接用定時(shí)器
回復(fù)

使用道具 舉報(bào)

ID:386288 發(fā)表于 2022-5-1 15:25 | 顯示全部樓層
直接使用STC出的stc-isp軟件中的軟件延時(shí)計(jì)算器,計(jì)算可選項(xiàng)區(qū)分Y1、Y3、Y5及Y6,可以滿足樓主的需求。
回復(fù)

使用道具 舉報(bào)

ID:229502 發(fā)表于 2022-5-1 17:58 | 顯示全部樓層
我理解的延時(shí)函數(shù)是滿足硬件指令間時(shí)間間隔的要求或是大概的延時(shí)要求用的,和時(shí)間精準(zhǔn)沒有因果關(guān)系。
回復(fù)

使用道具 舉報(bào)

ID:230742 發(fā)表于 2022-5-1 22:50 | 顯示全部樓層
我感覺還要用外接晶振的。不要用內(nèi)部晶振的。內(nèi)部的晶振每次燒錄時(shí)會(huì)有誤差。
回復(fù)

使用道具 舉報(bào)

ID:584814 發(fā)表于 2022-5-1 23:22 | 顯示全部樓層
1、用定時(shí)器定時(shí)
2、用示波器校準(zhǔn)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表