<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 第5課 讓發(fā)光二極管閃爍

          第5課 讓發(fā)光二極管閃爍

          作者: 時間:2016-12-01 來源:網(wǎng)絡 收藏

          在第4課中我們分別用位操作法和總線操作法點亮了第一個發(fā)光二極光,也可以說正式邁出了單片機程序設計的第一步,相信通過前面的學習,大家已經(jīng)可以很輕松的點亮發(fā)光二極管。但光會點亮發(fā)光二極管肯定不夠的,大家經(jīng)??梢钥吹酵饷娲蠼中∠锔鞣N各樣漂亮的閃爍的流水或者說廣告燈,如圖1,這是怎么實現(xiàn)的呢,這節(jié)課我們就來講下如讓發(fā)光二極管閃爍和流水燈程序的設計。

          本文引用地址:http://www.ex-cimer.com/article/201612/324297.htm
          圖1 漂亮的廣告燈
          1如何實現(xiàn)發(fā)光二極管閃爍和簡單延時
          學過匯編的同學都清楚,單片機機在執(zhí)行指令時,是一條一條指令順序執(zhí)行的,對于C語言也一樣,也是一條一條語句執(zhí)行,而每執(zhí)行一條指令或一條語句,都要占用一定的時間,利用單片機執(zhí)行程序的這個特點就可能用來實現(xiàn)發(fā)光二極管閃爍。
          具體方法就如圖2所示,是先點亮發(fā)光二極管,然后寫一條延時語句,在這段延時時間內(nèi),單片機什么事也不做,而此時發(fā)光二極管還是一直保持亮的狀態(tài),然后延時時間完后,再讓發(fā)光二極管熄滅,熄滅后也寫一條延時程序,而在這段時間內(nèi),發(fā)光二極管一直保持熄滅,直到延時時間結(jié)束再復上而的亮的過程,這樣一直不斷的循環(huán)下去就實現(xiàn)在發(fā)光二極不斷閃爍。
          圖2 發(fā)光二極管閃爍 
          延時可以由while語句來實現(xiàn),也可由for語句實現(xiàn),由于前面我們已經(jīng)介紹過while語句,所以這里先介紹如何利用while語句實現(xiàn)延時。
          (1)利用while語句進行延時
          由于while語句在前我們已經(jīng)講解過,這里直接給出程序如例1。
          例1 利用whiel語句實現(xiàn)發(fā)光二極管閃爍程序
          #include
          sbit D1=P1^0;
          unsigned int a;
          void main()
          {
          while(1)
          {
          a=50000;
          D1=0;
          while(a--);
          a=50000;
          D1=1;
          while(a--);
          }
          }
          程序分析:上面程序中出現(xiàn)了新的語句,unsigned int a;由于程序的需要,這里我們先定義了一個變量a,所謂變量其實就是代表單片機內(nèi)存中具有特定屬性的一個存儲單元,它用來存放數(shù)據(jù),也就是變量的值,如下面的a=50000,在程序中這些值是可以改變的。其中a表示變量的名字,unsigned int是無符號整形的意思,它的取值范圍為0-65535,也就是定義成此類型后,在對程序編譯時,編譯系統(tǒng)會給這個變量分配一個存儲空間用來存放數(shù)據(jù),且無符號整形的空間存數(shù)的范圍為0-65535。 后面的程序?qū)賦值時,其范圍只能是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明白后,下面就是一個大循環(huán)while(1),在大循環(huán)里,我們先給a賦值50000,然后燈亮D1=0,再進行延時while(a--)(a--,表示自減1的意思,while(a--),表示a從50000開始自減50000次,此時每自減1有一定的時間,所以自減50000次相當于延時的意思),再后的程序就是延時后再燈滅,再延時,再重復前面的過程,最終就可以實現(xiàn)燈一亮一滅閃爍的現(xiàn)象。下載到實驗室的現(xiàn)象如圖3所示。
          圖3 發(fā)光管閃爍
          通過上面程序我們實現(xiàn) 了發(fā)光管閃爍的功能,但這里閃爍的間隔時間我們并不清楚具體是多少,我們只能根據(jù)具體的多次實驗確定我們所需的時間間隔,如果實在要知道的話,可以通過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語句內(nèi)程序執(zhí)行如下
          1、給變量i賦值為1;
          2、判斷i是否小于等于3;此時值為真,即執(zhí)行for中的語句,此處for后面的語句為空語句,省略不寫,
          相當于什么都不執(zhí)行,然后跳到語句3;
          3、執(zhí)行i++,i++為自加1的意思,此時i的值變?yōu)?,
          4、跳到第2 步判斷i是否小于等于3,此時仍然小于等于3,又執(zhí)行空語句;
          5、執(zhí)行i++,此時i的值變?yōu)?;
          6、跳到第2 步判斷i是否小于等于3,此時等于3,直接跳出;
          通過上面6步,for語句執(zhí)行完畢,注意,單片機在執(zhí)行每一條語句的時候都需要一定的時間,此時我們只需要改變表達式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語句,內(nèi)嵌的語句還可以嵌套for語句,這稱為多層嵌套,我們這里只有兩層。
          注意第一個for語句后面沒有“;”,這里第一個for語句執(zhí)行了65535次,第二個for語句執(zhí)行了100次,相當于總共執(zhí)行了655535x100次,這樣的寫法就可以寫出較長的延時時間。
          上一頁 1 2 下一頁

          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();