成人app

首頁  /  單片機教程  /  延時1秒  /  

延時1秒

點擊打開在線編譯器,邊學邊練

1.準確延時

學會了上一講的軟件調試教學,我們現在用軟件調試出延時很接近1毫秒的代碼:

for(j=115;j>0;j--);


如果要延時1秒,那是不是循環1000次這條語句呢?

for(i=0;i<1000;i++)

{

    for(j=115;j>0;j--);

}


成人app可是這段代碼在軟件調試中發現循環1000次這個1毫秒的延時語句時卻跟1秒差距有點大(大于5ms對于單片機來說是一個很大的誤差),在《手把手教你學51單片機》文檔的4.4節也提到C 語言的延時時間是不能通過程序看出來的,所以我們只能在軟件中繼續調試新的延時1秒的代碼。

這里調試出很接近1秒的延時代碼如下

成人appfor(i=0;i<19601;i++)

{

    for(j=5;j>0;j--);

}  

成人app這里需要變量i和j都必須是unsigned int類型才調試得出準確延時1秒。


2.LED間隔1秒閃爍

用本教程的開發板實現LED亮一秒滅一秒閃爍循環的代碼:

#include <reg52.h> 
sbit LED2  = P0^0;
sbit ADDR2 = P1^2;
sbit ADDR1 = P1^1;
sbit ADDR0 = P1^0;
sbit ENLED = P1^4;
sbit ADDR3 = P1^3;

void main()
{  
    unsigned int i,j;//定義兩個16位的變量  
    ADDR3 = 1;//使能三八譯碼器
    ENLED = 0;// 

    ADDR2 = 1;//**************************
    ADDR1 = 1;//讓三八譯碼器的IO6輸出低電平
    ADDR0 = 0;//**************************

    while (1)
    {
        LED2=0;//點亮最右端的燈
        for(i=0;i<19601;i++)//延時1s
        {
            for(j=5;j>0;j--);
        }
        LED2=1;//熄滅最右端的燈
        for(i=0;i<19601;i++)//延時1s
        {
            for(j=5;j>0;j--);
        }
    }
}

成人app如果把j定義為unsigned char類型,那這一段延時代碼就不是1秒了,讀者可以測試一下。所以說真的不能用常識來分析代碼呀。

還有筆者發現這個代碼在實驗現象上有說不出的怪樣,如果大家拿手機的秒表計時與燈的閃爍對比,即使我們給單片機上電的瞬間立馬同步按下手機秒表計時按鍵,發現剛開始燈的閃爍與計時器還同步,后面過了幾秒發現燈的狀態跳變與秒表的數字跳變不同步了,軟件仿真發現的確循環一次之后時間會加多。

可如果我們像下面這樣三種寫法7.png

僅在后面加多一條簡單的語句,上面所說的現象就消失了,也就是燈的跳變和計時的數字跳變是同步的,這個問題筆者還在查找原因,我們姑且先放一下這個糾結,繼續往下學習先。

此時讀者需要自己加入語句后拿手機秒表計時觀察,看看是否燈的跳變與秒表數字的跳變同步,在此之前要保證手機的計時與單片機上電時間同步。


本文固定URL:http://hnsaiyang.com/course/182

第一章 單片機入門
第二章 LED
第三章 蜂鳴器
第四章 數碼管
第五章 獨立按鍵
第六章 多文件編程
第七章 外部中斷
第八章 定時器
第九章 舵機與超聲波模塊
第十章 串口通信
第十一章 1602液晶屏
第十二章 IIC通信
第十三章 紅外遙控與溫度傳感器
第十四章 AD與DA
第十五章 混合例程
第十六章 完結
Dotcpp在線編譯      (登錄可減少運行等待時間)