(玩電(dian)子) 電(dian)子技(ji)術學習與研究
當前位置︰單(dan)片機教程網 >> 基礎教程 >> 瀏覽文章

安徽11选5官网

作者:佚名(ming)   來源:本站(zhan)原創   點擊(ji)數:x  更新(xin)時間︰2020年02月23日   【字體(ti)︰

   我們在學單(dan)片機時我們第一個例(li)程就是燈的(de)閃liao)福 鞘怯醚yan)時程序做的(de),現(xian)在回想(xiang)起來,這樣做不很恰當,為什麼呢?我們的(de)主程序做了(liao)燈的(de)閃liao)福 筒荒茉俑善淥de)事了(liao),難道(dao)單(dan)片機只能這樣工(gong)作嗎?當然不是,我們能用定(ding)時器(qi)來實現(xian)燈的(de)閃liao)傅de)功(gong)能。

例(li)1︰查詢方式

ORG 0000H

AJMP START

ORG 30H

START:

MOV P1,#0FFH ;關(guan)所 燈

MOV TMOD,#00000001B ;定(ding)時/計數器(qi)0工(gong)作于方式1

MOV TH0,#15H

MOV TL0,#0A0H ;即數5536

SETB TR0 ;定(ding)時/計數器(qi)0開始(shi)運行

LOOP:JBC TF0,NEXT ;如果TF0等于1,則(ze)清TF0並轉NEXT處

AJMP LOOP ;不然跳轉到(dao)LOOP處運行

NEXT:CPL P1.0

MOV TH0,#15H

MOV TL0,#9FH;重置定(ding)時/計數器(qi)的(de)初值

AJMP LOOP

END AJMP LOOP

END

   鍵入程序,看到(dao)了(liao)什麼?燈在閃liao)噶liao),這可是用定(ding)時器(qi)做的(de),不再是主程序的(de)循(xun)環(huan)了(liao)。簡單(dan)地分析一下程序,為什麼用JBC呢?TF0是定(ding)時/計數器(qi)0的(de)溢出標記(ji)位,當定(ding)時器(qi)產生溢出後,該位由(you)0變(bian)1,所以查詢該位就可知(zhi)宇(yu)時時間是否已到(dao)。該位為1後,要(yao)用軟件將標記(ji)位清0,以便(bian)下一次定(ding)時是間到(dao)時該位由(you)0變(bian)1,所以用了(liao)JBC指令,該指位在判1轉移的(de)同(tong)時,還將該位清0。

   以上程序是能實現(xian)燈的(de)閃liao)噶liao),可是主程序除了(liao)讓(rang)燈閃liao)竿猓 故遣荒蘢銎淥de)事啊!不,不對,我們能在LOOP︰……和AJMP LOOP指令之(zhi)間插入一些指令來做其他的(de)事情,只要(yao)保證執行這些指令的(de)時間少于定(ding)時時間就行了(liao)。那我們在用軟件延(yan)時程序的(de)時候不是也(ye)能用一些指令來替代DJNZ嗎?是的(de),但(dan)是那就要(yao)求你精確計算所用指令的(de)時間,然後再減去(qu)對應的(de)DJNZ循(xun)環(huan)次數,很不huan)獎bian),而現(xian)在只要(yao)求所用指令的(de)時間少于定(ding)時時間就行,顯(xian)然要(yao)求低了(liao)。當然,這樣的(de)辦法還是不好,所以我們常用以下的(de)辦法來實現(xian)。

程序2︰用中斷實現(xian)

ORG 0000H   ,http://www.51hei.com

AJMP START

ORG 000BH ;定(ding)時器(qi)0的(de)中斷向量地址

AJMP TIME0 ;跳轉到(dao)真(zhen)正(zheng)的(de)定(ding)時器(qi)程序處

ORG 30H

START:

MOV P1,#0FFH ;關(guan)所 燈

MOV TMOD,#00000001B ;定(ding)時/計數器(qi)0工(gong)作于方式1

MOV TH0,#15H

MOV TL0,#0A0H ;即數5536

SETB EA ;開總中斷xian)市/p>

SETB ET0 ;開定(ding)時/計數器(qi)0允許

SETB TR0 ;定(ding)時/計數器(qi)0開始(shi)運行

LOOP: AJMP LOOP ;真(zhen)正(zheng)工(gong)作時,這里可寫任意程序

TIME0: ;定(ding)時器(qi)0的(de)中斷處理程序

PUSH ACC

PUSH PSW ;將PSW和ACC推入堆棧(zhan)保護

CPL P1.0

MOV TH0,#15H

MOV TL0,#0A0H ;重置定(ding)時常數

POP PSW

POP ACC

RETI

END

    上面的(de)例(li)程中,定(ding)時時間一到(dao),TF0由(you)0變(bian)1,就會(hui)引(yin)發中斷,CPU將自動轉至000B處尋找程序並執行,由(you)于留(liu)給定(ding)時器(qi)中斷的(de)空間只有8個字節,顯(xian)然不足以寫下所有有中斷處理程序,所以在000B處安排(pai)一條跳轉指令,轉到(dao)實際處理中斷的(de)程序處,這樣,中斷程序能寫在任意地方,也(ye)能寫任意長度了(liao)。進(jin)入定(ding)時中斷後,首先要(yao)保存當前的(de)一些狀(zhuang)態,程序中只演示了(liao)保存存ACC和PSW,實際工(gong)作中應該根(gen)據需要(yao)將可能會(hui)改變(bian)的(de)單(dan)元的(de)值都(du)推入堆棧(zhan)進(jin)行保護(本程序中實際不需保存護任何(he)值,這里只作個演示)。

   上面的(de)兩(liang)個單(dan)片機程序運行後,我們發現(xian)燈的(de)閃liao)阜淺?歟 gen)本分辨(bian)不出來,只是視覺上感到(dao)燈有些晃動而已,為什麼呢?我們能計算一下,定(ding)時器(qi)中預置的(de)數是5536,所以每(mei)計60000個脈(mai)沖(chong)就是定(ding)時時間到(dao),這60000個脈(mai)沖(chong)的(de)時間是多(duo)少呢?我們的(de)晶體(ti)震蕩器(qi)是12M,所以就是60000微秒,即60毫秒,因此速(su)度是非常快的(de)。如果我想(xiang)實現(xian)一個1S的(de)定(ding)時,該怎(zen)麼辦呢?在該晶體(ti)震蕩器(qi)瀕率下,最長的(de)定(ding)時也(ye)就是65。536個毫秒啊!上面給出一個例(li)程。

ORG 0000H

AJMP START

ORG 000BH ;定(ding)時器(qi)0的(de)中斷向量地址

AJMP TIME0 ;跳轉到(dao)真(zhen)正(zheng)的(de)定(ding)時器(qi)程序處

ORG 30H

START:

MOV P1,#0FFH ;關(guan)所 燈

MOV 30H,#00H ;軟件計數器(qi)預清0

MOV TMOD,#00000001B ;定(ding)時/計數器(qi)0工(gong)作于方式1

MOV TH0,#3CH

MOV TL0,#0B0H ;即數15536

SETB EA ;開總中斷xian)市/p>

SETB ET0 ;開定(ding)時/計數器(qi)0允許

SETB TR0 ;定(ding)時/計數器(qi)0開始(shi)運行

LOOP: AJMP LOOP ;真(zhen)正(zheng)工(gong)作時,這里可寫任意程序

TIME0: ;定(ding)時器(qi)0的(de)中斷處理程序

PUSH ACC

PUSH PSW ;將PSW和ACC推入堆棧(zhan)保護

INC 30H

MOV A,30H

CJNE A,#20,T_RET ;30H單(dan)元中的(de)值到(dao)了(liao)20了(liao)嗎?

T_L1: CPL P1.0 ;到(dao)了(liao),取(qu)反P10

MOV 30H,#0 ;清軟件計數器(qi)

T_RET:

MOV TH0,#15H

MOV TL0,#9FH ;重置定(ding)時常數

POP PSW

POP ACC

RETI

END

  先自己分析一下,看看是怎(zen)麼實現(xian)的(de)?這里采用了(liao)軟件計數器(qi)的(de)概(gai)念,思路是這樣的(de),先用定(ding)時/計數器(qi)0做一個50毫秒的(de)定(ding)時器(qi),定(ding)時是間到(dao)了(liao)以後並不是立即取(qu)反P10,而是將軟件計數器(qi)中的(de)值加1,如果軟件計數器(qi)計到(dao)了(liao)20,就取(qu)反P10,並清掉軟件計數器(qi)中的(de)值,不然直接返(fan)回,這樣,就變(bian)成了(liao)20次定(ding)時中斷才取(qu)反一次P10,因此定(ding)時時間就延(yan)長了(liao)成了(liao)20*50即1000毫秒了(liao)。

   這個思路在工(gong)程中是非常有用的(de),有的(de)時候我們需要(yao)若干個定(ding)時器(qi),可51中總共(gong)才有2個,怎(zen)麼辦呢?其實,只要(yao)這幾個定(ding)時的(de)時間有一定(ding)的(de)公約數,我們就能用軟件定(ding)時器(qi)加以實現(xian),如我要(yao)實現(xian)P10口(kou)所接燈按1S每(mei)次,而P11口(kou)所接燈按2S每(mei)次閃liao)福 zen)麼實現(xian)呢?對了(liao)我們用兩(liang)個計數器(qi),一個在它計到(dao)20時,取(qu)反P10,並清零,就如上面所示,另一個計到(dao)40取(qu)反P11,然後清0,不就行了(liao)嗎?這部(bu)份的(de)程序如下

ORG 0000H 

AJMP START

ORG 000BH ;定(ding)時器(qi)0的(de)中斷向量地址

AJMP TIME0 ;跳轉到(dao)真(zhen)正(zheng)的(de)定(ding)時器(qi)程序處

ORG 30H

START:

MOV P1,#0FFH ;關(guan)所 燈

MOV 30H,#00H ;軟件計數器(qi)預清0

MOV TMOD,#00000001B ;定(ding)時/計數器(qi)0工(gong)作于方式1

MOV TH0,#3CH

MOV TL0,#0B0H ;即數15536

SETB EA ;開總中斷xian)市/p>

SETB ET0 ;開定(ding)時/計數器(qi)0允許

SETB TR0 ;定(ding)時/計數器(qi)0開始(shi)運行

LOOP: AJMP LOOP ;真(zhen)正(zheng)工(gong)作時,這里可寫任意程序

TIME0: ;定(ding)時器(qi)0的(de)中斷處理程序

PUSH ACC

PUSH PSW ;將PSW和ACC推入堆棧(zhan)保護

INC 30H

INC 31H ;兩(liang)個計數器(qi)都(du)加1

MOV A,30H

CJNE A,#20,T_NEXT ;30H單(dan)元中的(de)值到(dao)了(liao)20了(liao)嗎?

T_L1: CPL P1.0 ;到(dao)了(liao),取(qu)反P10

MOV 30H,#0 ;清軟件計數器(qi)

T_NEXT:

MOV A,31H

CJNE A,#40,T_RET ;31h單(dan)元中的(de)值到(dao)40了(liao)嗎?

T_L2:

CPL P1.1

MOV 31H,#0 ;到(dao)了(liao),取(qu)反P11,清計數器(qi),返(fan)回

T_RET:

MOV TH0,#15H

MOV TL0,#9FH ;重置定(ding)時常數

POP PSW

POP ACC

RETI

END

您能用定(ding)時器(qi)的(de)辦法實現(xian)前面講的(de)流水燈嗎?試試看。

發表評論】【告訴好友(you)】【收藏此文】【關(guan)閉窗口(kou)

安徽11选5官网

安徽11选5官网 | 下一页