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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 第4課 點(diǎn)亮發(fā)光管程序分析

          第4課 點(diǎn)亮發(fā)光管程序分析

          作者: 時(shí)間:2016-12-01 來(lái)源:網(wǎng)絡(luò) 收藏
          實(shí)際上就本程序來(lái)說(shuō),我們也可以不包含該頭文件,而加上一句話,“ sfr P1=0x90; ”也是可以的,但如果要用到P0 P1 P2 P3就需要寫(xiě)四名話,這樣就會(huì)顯得很麻煩 ,只要大家能理解這個(gè),相信大家對(duì)為什么要在些加一直頭文件的原因應(yīng)該理解了,總之以后我們寫(xiě)51的程序時(shí)第一句話就直接包含該頭文件就行了。
          2、程序注釋
          在對(duì)頭文件進(jìn)行解釋后,在頭文件后面我們可以看到有“//……”符號(hào)。“//……”表示語(yǔ)句注釋?zhuān)渥饔弥饕菫榱艘院箝喿x程序來(lái)方便。“//……”主要是對(duì)單句或者比較短的程序進(jìn)行注釋?zhuān)绻菍?duì)一整段程序進(jìn)行注釋時(shí),這種方法就顯得非常麻煩,所以程序注釋還有第二種方法,具體的符號(hào)是/*****程序*****/,此時(shí)斜杠星號(hào)與星號(hào)斜杠之間的程序?qū)⒈徽w注釋掉。
          程序被注釋掉后,編譯器在進(jìn)行編譯時(shí)將不會(huì)對(duì)其進(jìn)行編譯,此時(shí)相當(dāng)于此處的程序被刪掉一樣。注釋的目的是為了方便他人閱讀程序,同時(shí)也方便自己一段時(shí)間后再來(lái)閱讀程序時(shí)能夠快速的理解該程序的含義。
          3、位聲明
          程序的第三行出現(xiàn)了”sbit D1=P1^0;”下面進(jìn)行說(shuō)明。
          sbit表示位的意思,它也是非標(biāo)準(zhǔn)C語(yǔ)言的關(guān)鍵字,編寫(xiě)程序時(shí)如需操作寄存器的某一位(可位尋址的寄存器才能用)時(shí),需定義一個(gè)位變量,此時(shí)就要要到sbit,如上面的程序中D1=P1^0,;需要注意的是,位定義時(shí)有些特殊,用法有三種:
          第一種方法:sbit 位變量名=寄存器位地址值
          第二種方法:sbit 位變量名=SFR 名稱(chēng)^寄存器位值(0-7)
          第三種方法:sbit 位變量名=SFR 地址值^寄存器位值
          如:
          sbit IT0=0x88(1)說(shuō)明:0x88是IT0的位地址值
          sbit D1=P1^2(2)說(shuō)明:其中P1必須先用sfr定義好
          sbit EA=0xA8^7(3)說(shuō)明:0xA8就是IE寄存器的地址值
          以上三種定義方法需注意的是 IT0 deng EA可由用戶隨便定義,但必須滿足C語(yǔ)言對(duì)變量名的定義規(guī)則。除些外其它的則必須按照上面的格式寫(xiě),如“名稱(chēng)^變量位地址值”中“^”,它是由keil軟件的規(guī)定的,不能寫(xiě)成其它的,只能這樣能才編譯通過(guò)。
          這里也就是說(shuō)像操作單片機(jī)某個(gè)口(如P1口),需要通過(guò)頭文件sfr P1 = 0x90對(duì)其地址進(jìn)行聲明,同樣的對(duì)寄存器的某一位操作時(shí),也需要對(duì)位地址進(jìn)行聲明,此時(shí)我們就采用的是第二種表達(dá)法sbit D1=P1^0;程序中對(duì)D1的操作就相當(dāng)于對(duì)P1中的位地址0Xaff進(jìn)行操作。
          4、主函數(shù)
          格式:void main()
          特點(diǎn):無(wú)返回值,無(wú)參數(shù)。
          無(wú)返回值,是指函數(shù)執(zhí)行完后不會(huì)返回任何值,上面void表示“空”的意思,即不返回任何值,此處也可以省略不寫(xiě)。當(dāng)然函數(shù)還有帶返回值的,后面具體會(huì)講到。
          無(wú)參數(shù)是指該函數(shù)不還有任何參數(shù),即main后面的()沒(méi)有任何參數(shù),此時(shí)也可以在括號(hào)內(nèi)加上void ,如main(void),但通常省略不寫(xiě)。后面也會(huì)講到還有參數(shù)的函數(shù),等后面講到時(shí)大家就會(huì)理解了。
          函數(shù)是能夠?qū)崿F(xiàn)特定功能的代碼段,需要注意的是,一個(gè)C51源程序必須有,且只能有一個(gè)主函數(shù)main(),它是整個(gè)程序開(kāi)始執(zhí)行的入口。在void main()后面必須加一對(duì)花括號(hào),其內(nèi)部為一條一條的程序語(yǔ)句。如本例程:
          void main()
          {
          D1=0;
          }
          當(dāng)然這個(gè)主函數(shù)相對(duì)來(lái)說(shuō)比較簡(jiǎn)單,里面只有一條語(yǔ)句。
          5、D1=0
          這條語(yǔ)句位于主函數(shù)內(nèi),也是這個(gè)程序中最重要的部分。D1相當(dāng)于單片機(jī)P1口的第1個(gè)引腳。通過(guò)前面的知識(shí)我們也知道,數(shù)字電路中有兩種電平,高電平和低電平,0表示低電平或者說(shuō)低電壓,1表示高電平或者說(shuō)高電壓。由于發(fā)光管陽(yáng)極是通過(guò)限流電阻接的5V高電壓,而陰極接的P1口的第1個(gè)引腳,通過(guò)程序D1=0讓其為低電壓,所以此時(shí)程序一執(zhí)行后,該發(fā)光二極管就會(huì)發(fā)光。
          6、利用總線操作法點(diǎn)亮發(fā)光二極管
          在例1中,要實(shí)現(xiàn)讓一個(gè)管發(fā)光,我們采用了位操作法,位操作法其實(shí)就是對(duì)單片機(jī)的每一個(gè)引腳單獨(dú)操作,如例中就是先作位定義sbit D1=P1^0,然后讓D1=0,最終實(shí)現(xiàn)了功能。一個(gè)燈會(huì)點(diǎn)亮,相信大家也會(huì)同點(diǎn)多個(gè)燈,如要讓1、3、5、7燈亮?xí)r,按前面的方法程序應(yīng)該寫(xiě)為:
          例2 位操作法實(shí)現(xiàn)1、3、5、7燈亮
          #include
          sbit D1=P1^0;
          sbit D3=P1^2;
          sbit D5=P1^4;
          sbit D7=P1^6;
          void main()
          {
          D1=0;
          D3=0;
          D5=0;
          D7=0;
          }
          這種方法當(dāng)然可以實(shí)現(xiàn)1、3、5、7,但這種方法需要定義多個(gè)位變量,程序書(shū)寫(xiě)起來(lái)相對(duì)麻煩。下面給出另一個(gè)寫(xiě)法,如下:
          例3 總線操作法實(shí)現(xiàn)1、3、5、7燈亮
          #include
          void main()
          {
          P1=0xaa;
          }
          這個(gè)程序同樣可能實(shí)現(xiàn)把1、3、5、7燈點(diǎn)亮,也就是說(shuō)程序的功能和上面位操作法寫(xiě)的程序是一樣,但卻要簡(jiǎn)單得多,這種方法就稱(chēng)為總線操作法。所謂的總線操作法也就是同時(shí)操作單片機(jī)P1口的8個(gè)引腳(或者說(shuō)8個(gè)I/O口),具體到程序就是通過(guò)“P1=0xaa;”實(shí)現(xiàn)的, “0x”表示16進(jìn)制的意思,16進(jìn)制aa轉(zhuǎn)化成2進(jìn)制就是10101010,而10101010正好就是讓單片機(jī)P1口的1、3、5、7引腳輸出低電平,2、4、6、8引腳輸出高電平,此時(shí)就實(shí)現(xiàn)讓第1、3、5、7發(fā)光二極管發(fā)光。
          把例3的程序下載到實(shí)驗(yàn)板上的現(xiàn)象如圖13所示:
          圖13 總線操作法實(shí)現(xiàn)1、3、5、7發(fā)光二極管發(fā)光
          在上面三個(gè)例子中,我們用兩種方法(位操作法和總線操作法)實(shí)現(xiàn)點(diǎn)亮發(fā)光二極管的目的,目的是達(dá)到了,但如若仔細(xì)推敲兩個(gè)程序,實(shí)際上是不完善的的。讓我們看例三,程序第一句為頭文件,是對(duì)52單片機(jī)一些特殊功能寄存器相關(guān)的聲明,然后第二句進(jìn)入主程序執(zhí)行“P1=0xaa;”,點(diǎn)亮1、3、5、7發(fā)光二極管,但執(zhí)行完這句后單片機(jī)又試干嘛呢?這之后我們沒(méi)有寫(xiě)相關(guān)程序讓單片機(jī)執(zhí)行什么事情,所以程序執(zhí)行到這里有可能出錯(cuò)(這里只是說(shuō)有可能,因?yàn)槊總€(gè)編譯器不一樣),通過(guò)反復(fù)的實(shí)驗(yàn),我們得出keil軟件一般這里會(huì)回到主程序的第一句開(kāi)始執(zhí)行,也就是說(shuō)又開(kāi)始執(zhí)行“P1=0xaa;”,周而復(fù)始,一直這樣的執(zhí)行下去,1、3、5、7發(fā)光二極管就一直會(huì)亮下去。但從程序開(kāi)發(fā)角度來(lái)說(shuō),我們說(shuō)這里就必須做相應(yīng)的處理,明確告訴下一步程序要做什么事情。比如說(shuō)我們就是要讓主程序周而復(fù)始,反復(fù)的執(zhí)行,此時(shí)我們就可以利用C語(yǔ)言中的while語(yǔ)句來(lái)實(shí)現(xiàn),下面先講下while語(yǔ)句。
          格式:
          While(表達(dá)式)
          {
          語(yǔ)句(內(nèi)部也可為空)
          }
          特點(diǎn):
          先判斷表達(dá)式,后執(zhí)行語(yǔ)句。
          原則:若表達(dá)式為不是0,即為真,則執(zhí)行語(yǔ)句,如為0 ,即為假就跳出while 語(yǔ)句。
          注意:while語(yǔ)句內(nèi)部的語(yǔ)句可以為空,即什么也沒(méi)有,此時(shí)就寫(xiě)成while(1){};此時(shí){}可以不寫(xiě),即寫(xiě)成while(1);意思就是永遠(yuǎn)為真,執(zhí)行空語(yǔ)句,相當(dāng)于程序永遠(yuǎn)停止在這里。
          了解了while語(yǔ)句后,我們就可以把例三的程序進(jìn)完善了,程序如例四。
          例4:完整點(diǎn)亮發(fā)光二極管的程序
          #include
          void main()
          {
          While(1)
          {
          P1=0xaa;
          }
          }
          While語(yǔ)句就介紹到這,下面總結(jié)一下,單片機(jī)軟件的學(xué)習(xí)就是通過(guò)我們寫(xiě)程序,控制單片機(jī)外部引腳輸出“1”(高電平+5V),和“0”(低電平0V),從而達(dá)到對(duì)各種外設(shè)的控制。單片機(jī)學(xué)習(xí)來(lái)并不難,只要大家有信心,肯花功夫,學(xué)起來(lái)也是很容易的。
          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


          技術(shù)專(zhuān)區(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); })();