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

          新聞中心

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

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

          作者: 時(shí)間:2016-12-01 來(lái)源:網(wǎng)絡(luò) 收藏

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

          本文引用地址:http://www.ex-cimer.com/article/201612/324297.htm
          圖1 漂亮的廣告燈
          1如何實(shí)現(xiàn)發(fā)光二極管閃爍和簡(jiǎn)單延時(shí)
          學(xué)過(guò)匯編的同學(xué)都清楚,單片機(jī)機(jī)在執(zhí)行指令時(shí),是一條一條指令順序執(zhí)行的,對(duì)于C語(yǔ)言也一樣,也是一條一條語(yǔ)句執(zhí)行,而每執(zhí)行一條指令或一條語(yǔ)句,都要占用一定的時(shí)間,利用單片機(jī)執(zhí)行程序的這個(gè)特點(diǎn)就可能用來(lái)實(shí)現(xiàn)發(fā)光二極管閃爍。
          具體方法就如圖2所示,是先點(diǎn)亮發(fā)光二極管,然后寫(xiě)一條延時(shí)語(yǔ)句,在這段延時(shí)時(shí)間內(nèi),單片機(jī)什么事也不做,而此時(shí)發(fā)光二極管還是一直保持亮的狀態(tài),然后延時(shí)時(shí)間完后,再讓發(fā)光二極管熄滅,熄滅后也寫(xiě)一條延時(shí)程序,而在這段時(shí)間內(nèi),發(fā)光二極管一直保持熄滅,直到延時(shí)時(shí)間結(jié)束再?gòu)?fù)上而的亮的過(guò)程,這樣一直不斷的循環(huán)下去就實(shí)現(xiàn)在發(fā)光二極不斷閃爍。
          圖2 發(fā)光二極管閃爍 
          延時(shí)可以由while語(yǔ)句來(lái)實(shí)現(xiàn),也可由for語(yǔ)句實(shí)現(xiàn),由于前面我們已經(jīng)介紹過(guò)while語(yǔ)句,所以這里先介紹如何利用while語(yǔ)句實(shí)現(xiàn)延時(shí)。
          (1)利用while語(yǔ)句進(jìn)行延時(shí)
          由于while語(yǔ)句在前我們已經(jīng)講解過(guò),這里直接給出程序如例1。
          例1 利用whiel語(yǔ)句實(shí)現(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)了新的語(yǔ)句,unsigned int a;由于程序的需要,這里我們先定義了一個(gè)變量a,所謂變量其實(shí)就是代表單片機(jī)內(nèi)存中具有特定屬性的一個(gè)存儲(chǔ)單元,它用來(lái)存放數(shù)據(jù),也就是變量的值,如下面的a=50000,在程序中這些值是可以改變的。其中a表示變量的名字,unsigned int是無(wú)符號(hào)整形的意思,它的取值范圍為0-65535,也就是定義成此類型后,在對(duì)程序編譯時(shí),編譯系統(tǒng)會(huì)給這個(gè)變量分配一個(gè)存儲(chǔ)空間用來(lái)存放數(shù)據(jù),且無(wú)符號(hào)整形的空間存數(shù)的范圍為0-65535。 后面的程序?qū)賦值時(shí),其范圍只能是0-65535,如程序后面的a=50000,如果此時(shí)我們對(duì)a賦值a=70000,此時(shí)編譯時(shí)就是報(bào)錯(cuò)。我們也可以把變量a定義為其它類型的,如unsigned char a表示為把變量a定義為無(wú)符號(hào)字符型,其賦值范圍為0-255
          當(dāng)然我們也可以定義其它的類型 short int、float等,但作為單片機(jī)初學(xué)者,一般只用到無(wú)符號(hào)字符型unsigned char(賦值范圍為0-255)和無(wú)符號(hào)整形unsigned int(賦值范圍為0-65535)兩種,其它類型可以暫時(shí)不管,具體請(qǐng)參考C語(yǔ)言相關(guān)書(shū)籍。
          unsigned int a明白后,下面就是一個(gè)大循環(huán)while(1),在大循環(huán)里,我們先給a賦值50000,然后燈亮D1=0,再進(jìn)行延時(shí)while(a--)(a--,表示自減1的意思,while(a--),表示a從50000開(kāi)始自減50000次,此時(shí)每自減1有一定的時(shí)間,所以自減50000次相當(dāng)于延時(shí)的意思),再后的程序就是延時(shí)后再燈滅,再延時(shí),再重復(fù)前面的過(guò)程,最終就可以實(shí)現(xiàn)燈一亮一滅閃爍的現(xiàn)象。下載到實(shí)驗(yàn)室的現(xiàn)象如圖3所示。
          圖3 發(fā)光管閃爍
          通過(guò)上面程序我們實(shí)現(xiàn) 了發(fā)光管閃爍的功能,但這里閃爍的間隔時(shí)間我們并不清楚具體是多少,我們只能根據(jù)具體的多次實(shí)驗(yàn)確定我們所需的時(shí)間間隔,如果實(shí)在要知道的話,可以通過(guò)51單片機(jī)的軟件仿真得出,這里我們不作講解,以后等大家單片機(jī)學(xué)得差不多再去學(xué)習(xí)。
          下面我們?cè)俳o出另一種程序延時(shí)的for語(yǔ)句的寫(xiě)法,這種寫(xiě)法在具體的項(xiàng)目用得更多。
          (2)for語(yǔ)句及其延時(shí)
          for語(yǔ)句是C語(yǔ)言中重要的語(yǔ)句,其格式如下:
          格式:

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

          關(guān)鍵詞: 發(fā)光二極管單片

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁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); })();