標題: 關(guān)于單片機延時程序的延時時間是怎么計算的? [打印本頁]

作者: 子u    時間: 2018-12-28 16:35
標題: 關(guān)于單片機延時程序的延時時間是怎么計算的?
………………………………
sbit key1=P3^2;           //布防
sbit key2=P3^3;           //撤防
sbit key3=P3^4;           //緊急報警
sbit BUZZ=P0^4;           //蜂鳴器
sbit rsd=P2^4;           //熱釋電輸入
sbit yanwu=P2^5;
sbit LED_B=P2^3;   //布防指示燈
sbit LED_S=P2^0;   //發(fā)送消息指示燈

uint TIME_50ms=0;           //計時的最小分辨率50ms
uint time_continue;
uchar TIME_ALAM=0;
bit flag=0,flag_BF=0;
bit flag_time_start=0;
bit again=0;
bit flag_alam;
bit SOS;
bit flag_continue;
bit into_BF=0;

void delay(uint z)//延時函數(shù)
{
        uint x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}

………………………………………………………………以上省略了一些無關(guān)定義初始化。以下程序的如何計時,延時多少是我不明白的。
void TIME()
{
        if(flag==0)
        {
                delay(50);
                TIME_50ms++;
                if(TIME_50ms%10==0)
                LED_B=!LED_B;
                if(TIME_50ms>=400)
                {
                        TIME_50ms=0;
                        flag_BF=1;
                        LED_B=0;
                        flag_time_start=0;
                        again=1;
                }        
        }
        else
        {
                delay(50);
                TIME_50ms++;
                if(TIME_50ms%10==0)
                {
                        LED_B=!LED_B;
                        if(flag_alam==1)
                        {
                                if(flag_continue==0)
                                {
                                        flag_continue=1;
                                        time_continue=TIME_50ms;
                                }
                                BUZZ=!BUZZ;
                                if(TIME_50ms>=time_continue+100)
                                {
                                        BUZZ=1;
                                        flag_continue=0;
                                        flag_alam=0;
                                        time_continue=0;
                                }        
                        }
                }
                if(TIME_50ms>=1200)
                {
                        LED_B=0;
                        TIME_50ms=0;
                        flag_time_start=0;
                        again=1;
                }
        }
}

33333.png (41.52 KB, 下載次數(shù): 38)

原理圖

原理圖

作者: bucker    時間: 2018-12-28 20:57
就是根據(jù)時鐘和單片機每條指令消耗的機器周期來計算,軟件延時只能是個大概的值,不會很精準。想要精準的延時值,必須用硬件定時器。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1