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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機的幾種精確延時

[復制鏈接]
跳轉到指定樓層
樓主
ID:827139 發表于 2020-10-13 11:22 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
實現延時通常有兩種方法:一種是硬件延時,要用到定時器/計數器,這種方法可以提高CPU的工作效率,也能做到精確延時;另一種是軟件延時,這種方法主要采用循環體進行。 今天主要介紹軟件延時,關于硬件延時,之后定時器部分再做詳細說明。
首先介紹單片機的幾個周期
在電子技術中,脈沖信號是一個按一定電壓幅度,一定時間間隔連續發出的脈沖信號。脈沖信號之間的時間間隔稱為周期;而將在單位時間(如1秒)內所產生的脈沖個數稱為頻率。頻率是描述周期性循環信號(包括脈沖信號)在單位時間內所出現的脈沖數量多少的計量名稱;頻率的標準計量單位是Hz(赫)。電腦中的系統時鐘就是一個典型的頻率相當精確和穩定的脈沖信號發生器。
指令周期:CPU執行一條指令所需要的時間稱為指令周期,它是以機器周期為單位的,指令不同,所需的機器周期也不同。對于一些簡單的的單字節指令,在取指令周期中,指令取出到指令寄存器后,立即譯碼執行,不再需要其它的機器周期。對于一些比較復雜的指令,例如轉移指令、乘法指令,則需要兩個或者兩個以上的機器周期。通常含一個機器周期的指令稱為單周期指令,包含兩個機器周期的指令稱為雙周期指令。
時鐘周期:也稱為振蕩周期,一個時鐘周期 = 晶振的倒數。對于單片機時鐘周期,時鐘周期是單片機的基本時間單位,兩個振蕩周期(時鐘周期)組成一個狀態周期。
機器周期:單片機的基本操作周期,在一個操作周期內,單片機完成一項基本操作,如取指令、存儲器讀/寫等。
機器周期=6個狀態周期=12個時鐘周期。
51單片機的指令有單字節、雙字節和三字節的,它們的指令周期不盡相同,一個單周期指令包含一個機器周期,即12個時鐘周期,所以一條單周期指令被執行所占時間為12*(1/ 晶振頻率)= x μs。常用單片機的晶振為11.0592MHz,12MHz,24MHz。其中11.0592MHz的晶振更容易產生各種標準的波特率,后兩種的一個機器周期分別為1 μs和2 μs,便于精確延時。
接下來列出這三種不同的晶振的延時函數
1、 11.0592MHz
//N ms延時
void delay_ms(uint n)
{
uint i,j;
for(i=n;i>0;i–)
for(y=114;y>0;y–);
}
2、12MHz晶振
//延時n毫秒void delay_ms(unsigned int n)
{
    unsigned int i=0,j=0;
    for(i=0;i<n;i++)
        for(j=0;j<123;j++);
}
//延時n秒void delay_m(unsigned int n)
{
    unsigned int i=0,j=0;
    for(i=0;i<n;i++)
        for(j=0;j<21738;j++);
}
//延時10*n微秒void delay_10um(unsigned int n)
{
    while(n--);
}
3、24MHz晶振
//延時n毫秒
void delay_ms(unsigned int n)
{
unsigned int i=0,j=0;
for(i=0;i
//延時n秒  void delay_s(unsigned int n)  
{  
    unsigned int i=0,j=0;  
    for(i=0;i<n;i++)  
        for(j=0;j<54053;j++);   
}  
//延時10*n微秒  void delay_10us(unsigned int n)  
{  
    unsigned int i=0;  
    char j=0;  
    for(i=0;i<n;i++)  
        for(j=0;j<2;j++);  
}  
建議大家封裝為頭文件,可以方便的調用。
接下來介紹幾個自動適應主時鐘的延時函數
//參數:ms,要延時的ms數,自動適應主時鐘  #define MAIN_Fosc        11059200UL    //定義主時鐘HZ  typedef unsigned int INT16U;  
void delay_ms(INT16U ms)    //INT16U 等價于 unsigned int  
{  
    INT16U i;  
    do{  
        i=MAIN_Fosc/9600;  
        while(--i);     //96T per loop  
    }while(--ms);       //--ms  ms=ms-1  
}  
//5us 延時函數,自動適應主時鐘  #define MAIN_Fosc        11059200UL    //定義主時鐘HZ  
void delay5us()  
{  
    #if MAIN_Fosc == 11059200  
        _nop_();  
    #elif MAIN_Fosc == 12000000  
        _nop_();  
    #elif MAIN_Fosc == 22118400  
        _nop_(); _nop_(); _nop_();  
    #elif  
}  
單片機中還可自動生成
//11.0592MHZ延時100微秒
void Delay100us()       //@11.0592MHz
{
    unsigned char i, j;
    _nop_();
    _nop_();
    i = 2;
    j = 15;
    do
    {
        while (--j);
    } while (--i);
}
//100US
void Delay100us()       //@12.000MHz
{
    unsigned char i, j;
    i = 2;
    j = 39;
    do
    {
        while (--j);
    } while (--i);
}
//100US
void Delay100us()       //@24.000MHz
{
    unsigned char i, j;
    i = 3;
    j = 82;
    do
    {
        while (--j);
    } while (--i);
}

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

使用道具 舉報

沙發
ID:828768 發表于 2020-10-15 08:49 | 只看該作者
謝謝樓主的分享。如果能結合振晶頻率在代碼中再注釋一下時延的計算過程,就更利于小白學習了。
回復

使用道具 舉報

板凳
ID:831065 發表于 2020-10-17 16:56 | 只看該作者
樓主 我還有點不懂的地方可以求解嗎?
回復

使用道具 舉報

地板
ID:135950 發表于 2020-10-19 10:53 | 只看該作者
好東西收藏起來先。。。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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