久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

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

回復(fù)

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 综合久久久久 | 国产精品国产亚洲精品看不卡15 | 亚洲狠狠 | 黑人巨大精品欧美一区二区免费 | 国产农村妇女毛片精品久久麻豆 | 一区二区三区视频在线观看 | 久久久久久久久国产 | 欧美一级淫片免费视频黄 | 91资源在线| 久久久久久久久久一区二区 | 在线色| 你懂的在线视频播放 | 最新一级毛片 | 伊人免费在线观看 | 欧美精品一区二区三区在线播放 | a在线观看| 精品在线一区二区三区 | 91免费入口 | 国产精品久久久久久久久久久久久 | 日韩一区二区在线看 | 亚洲网站免费看 | 免费看国产精品视频 | 日韩播放| 日韩欧美国产一区二区 | 天天天操操操 | 欧美日韩在线精品 | 日韩综合在线播放 | 国产亚洲一区二区三区在线 | 91久久国产综合久久 | 91xxx在线观看| 国产成人精品视频在线观看 | 久久一二三区 | 欧美激情一区二区三区 | 欧美日韩视频网站 | 精品欧美乱码久久久久久1区2区 | 久久天堂| 国产精品1区 | 国产精品久久久亚洲 | 老司机狠狠爱 | 日韩精品 电影一区 亚洲 | 国产精品日产欧美久久久久 |