新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 第5課 讓發光二極管閃爍

        第5課 讓發光二極管閃爍

        作者: 時間:2016-12-01 來源:網絡 收藏

        在第4課中我們分別用位操作法和總線操作法點亮了第一個發光二極光,也可以說正式邁出了單片機程序設計的第一步,相信通過前面的學習,大家已經可以很輕松的點亮發光二極管。但光會點亮發光二極管肯定不夠的,大家經常可以看到外面大街小巷各種各樣漂亮的閃爍的流水或者說廣告燈,如圖1,這是怎么實現的呢,這節課我們就來講下如讓發光二極管閃爍和流水燈程序的設計。

        本文引用地址:http://www.104case.com/article/201612/324297.htm
        圖1 漂亮的廣告燈
        1如何實現發光二極管閃爍和簡單延時
        學過匯編的同學都清楚,單片機機在執行指令時,是一條一條指令順序執行的,對于C語言也一樣,也是一條一條語句執行,而每執行一條指令或一條語句,都要占用一定的時間,利用單片機執行程序的這個特點就可能用來實現發光二極管閃爍。
        具體方法就如圖2所示,是先點亮發光二極管,然后寫一條延時語句,在這段延時時間內,單片機什么事也不做,而此時發光二極管還是一直保持亮的狀態,然后延時時間完后,再讓發光二極管熄滅,熄滅后也寫一條延時程序,而在這段時間內,發光二極管一直保持熄滅,直到延時時間結束再復上而的亮的過程,這樣一直不斷的循環下去就實現在發光二極不斷閃爍。
        圖2 發光二極管閃爍 
        延時可以由while語句來實現,也可由for語句實現,由于前面我們已經介紹過while語句,所以這里先介紹如何利用while語句實現延時。
        (1)利用while語句進行延時
        由于while語句在前我們已經講解過,這里直接給出程序如例1。
        例1 利用whiel語句實現發光二極管閃爍程序
        #include
        sbit D1=P1^0;
        unsigned int a;
        void main()
        {
        while(1)
        {
        a=50000;
        D1=0;
        while(a--);
        a=50000;
        D1=1;
        while(a--);
        }
        }
        程序分析:上面程序中出現了新的語句,unsigned int a;由于程序的需要,這里我們先定義了一個變量a,所謂變量其實就是代表單片機內存中具有特定屬性的一個存儲單元,它用來存放數據,也就是變量的值,如下面的a=50000,在程序中這些值是可以改變的。其中a表示變量的名字,unsigned int是無符號整形的意思,它的取值范圍為0-65535,也就是定義成此類型后,在對程序編譯時,編譯系統會給這個變量分配一個存儲空間用來存放數據,且無符號整形的空間存數的范圍為0-65535。 后面的程序對a賦值時,其范圍只能是0-65535,如程序后面的a=50000,如果此時我們對a賦值a=70000,此時編譯時就是報錯。我們也可以把變量a定義為其它類型的,如unsigned char a表示為把變量a定義為無符號字符型,其賦值范圍為0-255
        當然我們也可以定義其它的類型 short int、float等,但作為單片機初學者,一般只用到無符號字符型unsigned char(賦值范圍為0-255)和無符號整形unsigned int(賦值范圍為0-65535)兩種,其它類型可以暫時不管,具體請參考C語言相關書籍。
        unsigned int a明白后,下面就是一個大循環while(1),在大循環里,我們先給a賦值50000,然后燈亮D1=0,再進行延時while(a--)(a--,表示自減1的意思,while(a--),表示a從50000開始自減50000次,此時每自減1有一定的時間,所以自減50000次相當于延時的意思),再后的程序就是延時后再燈滅,再延時,再重復前面的過程,最終就可以實現燈一亮一滅閃爍的現象。下載到實驗室的現象如圖3所示。
        圖3 發光管閃爍
        通過上面程序我們實現 了發光管閃爍的功能,但這里閃爍的間隔時間我們并不清楚具體是多少,我們只能根據具體的多次實驗確定我們所需的時間間隔,如果實在要知道的話,可以通過51單片機的軟件仿真得出,這里我們不作講解,以后等大家單片機學得差不多再去學習。
        下面我們再給出另一種程序延時的for語句的寫法,這種寫法在具體的項目用得更多。
        (2)for語句及其延時
        for語句是C語言中重要的語句,其格式如下:
        格式:

        利用for語句同樣可以寫出延時程序,例如:
        unsigned int i;
        for(i=1;i<=3;i++) ;
        這里首先定義了一個無符號變量i,在for語句中,i=1為表達式1;i<=100為表達式2;i++為表達式3,for語句內程序執行如下
        1、給變量i賦值為1;
        2、判斷i是否小于等于3;此時值為真,即執行for中的語句,此處for后面的語句為空語句,省略不寫,
        相當于什么都不執行,然后跳到語句3;
        3、執行i++,i++為自加1的意思,此時i的值變為2,
        4、跳到第2 步判斷i是否小于等于3,此時仍然小于等于3,又執行空語句;
        5、執行i++,此時i的值變為3;
        6、跳到第2 步判斷i是否小于等于3,此時等于3,直接跳出;
        通過上面6步,for語句執行完畢,注意,單片機在執行每一條語句的時候都需要一定的時間,此時我們只需要改變表達式2的值就
        可以得到我們想要的延時時間了。
        此處需要注意的時,我們把i定義為無符號整形后,i的值最大值只能為65535,也就是利用上面的格式,我們可以寫出最大的延時程序如下:
        unsigned int i;
        for(i=1;i<=65536;i++)
        但我們此時如還需要更長的時間時,如果再讓i值變大的話,編譯時就會出錯,此時我們可以寫成如下的寫法:
        unsigned int i;
        unsigned int j;
        for(i=1;i<=65536;i++)
        {
        for(j=1;j<=100;j++);
        }
        上面的語句稱為c語句的嵌套,是指一個for語句中又包含一個完整的for語句,內嵌的語句還可以嵌套for語句,這稱為多層嵌套,我們這里只有兩層。
        注意第一個for語句后面沒有“;”,這里第一個for語句執行了65535次,第二個for語句執行了100次,相當于總共執行了655535x100次,這樣的寫法就可以寫出較長的延時時間。
        上一頁 1 2 下一頁

        關鍵詞: 發光二極管單片

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 镇康县| 都兰县| 招远市| 琼海市| 临海市| 沂水县| 名山县| 吉木萨尔县| 眉山市| 科尔| 韩城市| 静乐县| 仪征市| 哈尔滨市| 建德市| 五河县| 赤城县| 思茅市| 政和县| 黄山市| 乌兰县| 阳信县| 玉环县| 青海省| 龙岩市| 叶城县| 昌乐县| 延川县| 奉化市| 襄城县| 民乐县| 竹溪县| 天峻县| 彩票| 定襄县| 肇源县| 天长市| 长沙县| 济源市| 西华县| 九江市|