欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6073|回復: 8
打印 上一主題 下一主題
收起左側

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

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

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

地板
ID:1023100 發表于 2022-5-1 12:40 | 只看該作者
這邊基本都是基于定時器0 進行高精度延時的
回復

使用道具 舉報

5#
ID:161164 發表于 2022-5-1 14:05 來自觸屏版 | 只看該作者
毫秒級延時直接用定時器
回復

使用道具 舉報

6#
ID:386288 發表于 2022-5-1 15:25 | 只看該作者
直接使用STC出的stc-isp軟件中的軟件延時計算器,計算可選項區分Y1、Y3、Y5及Y6,可以滿足樓主的需求。
回復

使用道具 舉報

7#
ID:229502 發表于 2022-5-1 17:58 | 只看該作者
我理解的延時函數是滿足硬件指令間時間間隔的要求或是大概的延時要求用的,和時間精準沒有因果關系。
回復

使用道具 舉報

8#
ID:230742 發表于 2022-5-1 22:50 | 只看該作者
我感覺還要用外接晶振的。不要用內部晶振的。內部的晶振每次燒錄時會有誤差。
回復

使用道具 舉報

9#
ID:584814 發表于 2022-5-1 23:22 | 只看該作者
1、用定時器定時
2、用示波器校準
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表