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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5560|回復: 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個以上周期了,那么時間長了誤差不就越來越來了嗎,所以大家平時都是怎么控制延時的呢?

回復

使用道具 舉報

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 進行高精度延時的
回復

使用道具 舉報

ID:161164 發表于 2022-5-1 14:05 來自觸屏版 | 顯示全部樓層
毫秒級延時直接用定時器
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:584814 發表于 2022-5-1 23:22 | 顯示全部樓層
1、用定時器定時
2、用示波器校準
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品网站 | 久久看看 | 操人网站| 亚洲福利一区二区 | 亚洲精品视频观看 | 国产精品亚洲精品 | 激情国产视频 | 久久九九99 | 免费视频一区二区三区在线观看 | 中文字幕高清 | 99热这里都是精品 | 狠狠操婷婷 | 精品国产欧美一区二区 | www.色婷婷| 欧美一级久久 | 日韩成人免费视频 | 亚洲精品免费视频 | 99精品电影| 欧美一区二区综合 | 男女羞羞视频网站 | 欧美精品一区在线 | av中文字幕在线观看 | 在线欧美a | 日本国产欧美 | 国产999精品久久久 精品三级在线观看 | 国产三区在线观看视频 | 日韩在线观看中文字幕 | 日韩在线精品 | 久久久成 | 中文字幕在线一区二区三区 | 在线观看亚洲欧美 | 国产激情精品一区二区三区 | 久久久久国产精品午夜一区 | 国产视频一区二区在线观看 | 中文在线一区二区 | 日韩国产在线 | 男女羞羞在线观看 | 免费午夜视频在线观看 | 中文日韩在线视频 | 久久精品一 | 亚洲h色|