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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)流水燈設(shè)計(jì)方法

          單片機(jī)流水燈設(shè)計(jì)方法

          作者: 時(shí)間:2013-01-15 來(lái)源:網(wǎng)絡(luò) 收藏
          實(shí)現(xiàn)8個(gè)LED源程序 liu01.asm

              ;----- 主程序開始 -----
          START: CLR   P1.0       ;P1.0輸出低電平,使LED1點(diǎn)亮
              ACALL  DELAY      ;調(diào)用延時(shí)子程序
              SETB  P1.0       ;P1.0輸出高電平,使LED1熄滅
              CLR   P1.1       ;P1.1輸出低電平,使LED2點(diǎn)亮
              ACALL  DELAY      ;調(diào)用延時(shí)子程序
              SETB  P1.1       ;P1.1輸出高電平,使LED2熄滅
              CLR   P1.2       ;P1.2輸出低電平,使LED3點(diǎn)亮
              ACALL  DELAY      ;調(diào)用延時(shí)子程序
              SETB  P1.2       ;P1.2輸出高電平,使LED3熄滅
              CLR   P1.3       ;P1.3輸出低電平,使LED4點(diǎn)亮
              ACALL  DELAY      ;調(diào)用延時(shí)子程序
              SETB  P1.3       ;P1.3輸出高電平,使LED4熄滅
              CLR   P1.4       ;P1.4輸出低電平,使LED5點(diǎn)亮
              ACALL  DELAY      ;調(diào)用延時(shí)子程序
              SETB  P1.4       ;P1.4輸出高電平,使LED5熄滅
              CLR   P1.5       ;P1.5輸出低電平,使LED6點(diǎn)亮
              ACALL  DELAY      ;調(diào)用延時(shí)子程序
              SETB  P1.5       ;P1.5輸出高電平,使LED6熄滅
              CLR   P1.6       ;P1.6輸出低電平,使LED7點(diǎn)亮
              ACALL  DELAY      ;調(diào)用延時(shí)子程序
              SETB  P1.6       ;P1.6輸出高電平,使LED7熄滅
              CLR   P1.7       ;P1.7輸出低電平,使LED8點(diǎn)亮
              ACALL  DELAY      ;調(diào)用延時(shí)子程序
              SETB  P1.7       ;P1.7輸出高電平,使LED8熄滅
              ACALL  DELAY      ;調(diào)用延時(shí)子程序
              AJMP  START      ;8個(gè)LED流了一遍后返回到標(biāo)號(hào)START處再循環(huán)

              ;----- 延時(shí)子程序 -----
          DELAY: MOV   R0,#255     ;延時(shí)一段時(shí)間
          D1:   MOV   R1,#255
              DJNZ  R1,$
              DJNZ  R0,D1
              RET            ;子程序返回

              END           ;程序結(jié)束

            在上面主程序中用到了五條指令:CLR、ACALL、SETB、LJMP、END。

            CLR: 是將其后面指定的位清為0,程序中使對(duì)應(yīng)端口輸出低電平
            ACALL:是子程序調(diào)用指令,程序中調(diào)用了DELAY延時(shí)子程序
            SETB:是將其后面指定的位置成1,程序中使對(duì)應(yīng)端口輸出高電平
            AJMP:是無(wú)條件跳轉(zhuǎn)指令,意思是:跳轉(zhuǎn)到指定的標(biāo)號(hào)處繼續(xù)運(yùn)行
            END: 是程序結(jié)束的偽指令,意思是告訴編譯器,程序到此結(jié)束。偽指令只告訴編譯器此程序到此有何要求或條件,它不參與和影響程序的執(zhí)行。

            在上面源程序中"ACALL  DELAY"指令的作用是調(diào)用DELAY延時(shí)子程序。為什么要使用這指令呢?如果不用該指令能夠?qū)崿F(xiàn)"流水"效果嗎?答案是肯定的,一定要用該指令才能看到我們需要的"流水"效果。如果不用該指令,則由于8個(gè)LED發(fā)光與熄滅的時(shí)間都很短,我們?nèi)庋蹮o(wú)法看到LED的熄滅與點(diǎn)亮,憑我們?nèi)庋劭吹降氖荓ED1~LED8都同時(shí)亮(半亮),而看不到“流水”效果的!注:初學(xué)者可以將上面源程序中所有"ACALL  DELAY"指令行刪除后再編譯后燒寫到進(jìn)行驗(yàn)證一下。

            產(chǎn)生這種現(xiàn)象主要是因?yàn)?a class="contentlabel" href="http://www.ex-cimer.com/news/listbylabel/label/單片機(jī)">單片機(jī)執(zhí)行每條指令的時(shí)間很短,我們知道實(shí)驗(yàn)板上的時(shí)鐘高達(dá)11.0592MHz,在這個(gè)時(shí)鐘信號(hào)(即晶體振蕩信號(hào))下,一個(gè)“機(jī)器周期”僅大約1.08uS(微秒)。本程序中我們用到的SETB P.x和CLR P.x均屬于單周期指令,也就是說(shuō),執(zhí)行一句 SETB P.x 用時(shí)僅1.08uS(微秒),CLR P.x 也是1.08uS(微秒);也就是點(diǎn)亮和熄滅時(shí)間都為1.08uS(微秒),在如此高速的流水速度下,8個(gè)LED發(fā)光與熄滅的時(shí)間都很短,當(dāng)然憑我們的肉眼看不到“流水”效果了!

            這里需要說(shuō)明的是,按匯編語(yǔ)法要求,所編制的程序(下稱源程序)之格式和書寫要求必須依下列原則:
            1、源程序必須為純文本格式文件,如用Windows“附件”中的“記事本”編寫的文本文件或用UltraEdit文本編輯器編輯;
            2、源程序的擴(kuò)展名應(yīng)是 *.ASM;
            3、一行只能寫一條語(yǔ)句,以回車作為本句的結(jié)束,每一語(yǔ)句行長(zhǎng)度應(yīng)少于80個(gè)字符(即40個(gè)漢字)。
            4、每行的格式應(yīng)為:標(biāo)號(hào): 命令 參數(shù) ;注釋 。即一行由四部份組成,各部份的順序不能搞錯(cuò),依實(shí)際要求可以缺省其中的一部份或幾部份,甚至全部省去,即空白行。需要使用標(biāo)號(hào)時(shí)標(biāo)號(hào)后面必須有“:”(冒號(hào)),而命令語(yǔ)句和參數(shù)之間必須用空格分開,如果命令有多個(gè)參數(shù),則參數(shù)與參數(shù)之間必須用“,”(逗號(hào))分開,需要注釋時(shí)注釋前必須用“;”(分號(hào)),“;”后面的語(yǔ)句可以寫任何字符,包括漢字用于解釋前面的匯編語(yǔ)句,它將不參與匯編,不生成代碼。由于匯編程序?qū)ξ覀冞€不直觀,所以在編寫源程序時(shí),應(yīng)當(dāng)養(yǎng)成多寫注釋的習(xí)慣,這樣有助于今后源程序的閱讀和維護(hù)。

            標(biāo)號(hào)是標(biāo)志程序中某一行的符號(hào)名,編譯后標(biāo)號(hào)的數(shù)值就是標(biāo)號(hào)所在行代碼的地址。在宏匯編ASM51中標(biāo)號(hào)的長(zhǎng)度不受限制,但標(biāo)號(hào)中不能包含‘:'或其它的一些特殊符號(hào),也不能用漢字,可以用數(shù)字作標(biāo)號(hào),但必須用字母開頭。當(dāng)標(biāo)號(hào)作參數(shù)用(如標(biāo)號(hào)作轉(zhuǎn)移地址),在命令后面出現(xiàn)時(shí),必須舍去‘:'(如上面程序中的 AJMP START中的START是不能再有:)。每行只能有一個(gè)標(biāo)號(hào),一個(gè)標(biāo)號(hào)只能用在一處,如果有兩行用了同一個(gè)標(biāo)號(hào),則匯編時(shí)就會(huì)出錯(cuò)。由于標(biāo)號(hào)的長(zhǎng)度沒(méi)有限制,可以用有意義的英文或漢語(yǔ)拼音來(lái)說(shuō)明行,使源程序讀起來(lái)更方便。在源程序中的字母不區(qū)分大小寫,也就是說(shuō) start 和 START 是一樣的,請(qǐng)不要用大小寫方式去區(qū)分不同的標(biāo)號(hào)。

            好啦!我們知道了程序的規(guī)則,現(xiàn)在就動(dòng)手編輯源程序吧。馬上啟動(dòng)Keil單片機(jī)集成開發(fā)環(huán)境,建立新工程liu01.UV2,將上面的源程序liu01.asm導(dǎo)入到工程中,設(shè)置好Keil工程的編譯參數(shù),編譯得到HEX格式的目標(biāo)文件liu01.hex,用 ISP編程器 將目標(biāo)文件liu01.hex燒寫到AT89S51單片機(jī)中,接下來(lái)就是將燒寫好的AT89S51從編程器上取下,放到“ S51增強(qiáng)型單片機(jī)實(shí)驗(yàn)板 ”上通電,我們就看到了LED1~LED8的"流水"效果了。



          評(píng)論


          相關(guān)推薦

          技術(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); })();