微控制器組合語言多分支程式的應用急急急

時間 2022-03-14 01:30:03

1樓:阿鵬溜溜溜

首先你問的問題沒有說清楚,

led是7段數碼管?還是。。。

你覺得你向led輸入01就是顯示1?。。。

關鍵你的led接在哪些引腳?。。。

如果單單要20h中迴圈出現00h,01h,02h,03h的話 這個很簡單程式如下

org 0000h

ajmp start

start:

mov a,#03h

loop1:

mov 20h,#00h

(這裡可根據需要加延時)

loop2:

inc 20h

cjne a,20h,loop2

ajmp loop1

endps:如果真的想在led上出顯示效果,請看我以前的回答

2樓:夜貓叫楓子

不是太明白你的意思

如果只是把那些數送入20h中,用跳轉指令就可以了org 0000h

loop:mov 20h,#00h

acall delay

sjmp loop1

loop1:mov 20h,#01h

acall delay

sjmp loop2

loop2:mov 20h,#02h

acall delay

sjmp loop3

loop3:mov 20h,#03h

acall delay

sjmp loop

delay:mov r7,#250

del:mov r6,#250

del1:djnz r6,del1

djnz r7,del

retend

因為執行的速度太快了,中間要延時一下才行,如果 不要延時的,可能把延時給取消了

急急急!!誰能幫我分析一下這個微控制器組合語言程式,寫出每步的作用。急急急!!

3樓:

雖然沒有樓上動作快,但既然也做了就發上來參考吧,應該比樓上的更具體寫,比如p1.5幹嘛啊。 :)

整體描述:同時在p1.0 和 p1.1輸出反相的佔空可調的方波

佔空比調整通過修改變數m 來設定,變數as用來做內部迴圈量,範圍0-m

p1.5使用閃爍的方式來顯示對於m設定的佔空比值的非法告警

調整佔空比設定m通過int0 和p1.2來 進行加一和減一的設定 ,通過int1 和p1.2來 進行加五和減五的設定

設定的m值通過連線在p0,p2口的兩個led來顯示,方式10進位制單位顯示

count equ 30h //沒用的變數

as equ 30h //timer1內佔空比計數

m equ 35h //佔空比計數上限設定

org 0000h

ljmp start

org 0003h //int0中斷服務入口 佔空比1步進

ljmp int00

org 0013h //int1中斷服務入口 佔空比5步進

ljmp int11

start: setb ex0 //初始化開始

setb px0

setb it0

setb ex1

clr px1

setb it1

setb ea

clr p1.5 //p1.5顯示設定佔空比數字非法時閃爍告警

mov tmod,#21h //使用timer0 模式1和timer1 模式2

mov th1,#38h //timer1做佔空部分控制,即高低電平時間控制

mov th0,#0b1h //timer0做方波週期

mov tl0,#0e0h

setb tr0

setb tr1

mov dptr,#table //led段碼地址

mov m,#50 //佔空比上限初值

mov p0,#3fh //佔空比10進低位 led段碼

mov p2,#6dh //佔空比10進高位 led段碼

mov as,#0 //佔空比計數變數

top:setb tr1 //**新的一個方波週期從這裡開始**

setb p1.0 //p1.0和p1.1分別輸出反相的等週期方波

clr p1.1 //

mov th0,#0b1h //timer0計數值、即方波週期值設定

mov tl0,#0e0h

mov as,#0 //高電平時間計數變數初值每個timer1溢位加一(最大等於m)

mov b,#10 //沒用

mov a,m

mov b,#100

div ab

jz time1 //如果設定的m值在01-99(可以理解為可接受的值,佔空比最少1:99最多99:1)

mov b,#10

clerk:setb p1.5 //設定的佔空比值非法,則閃爍p1.5告警

lcall delay

clr p1.5

lcall delay

setb p1.5

lcall delay

clr p1.5

mov m,#50 //自動重新設定預設佔空比

lcall show //led顯示m,即當前設定佔空比的值

ljmp top //重新 開始新懂得方波週期

time1:jbc tf1,next //等待timer1 溢位標誌

sjmp time1

next:inc as //每次溢位變數as加一,

mov a,m

cjne a,as,time1 //直到as=m ,即佔空計數達到,

clr p1.0 //波形反相

setb p1.1

clr tr1 //關閉timer1,波形在timer0控制的一個週期內不再變化

time0:jbc tf0,top

sjmp time0 //timer0溢位,開始下一個週期波形

int00:jnb p1.2,loop1 //外部中斷0中斷處理

inc m //當int0 為低電平且p1.2為高則m增加1,每次機器響應int0都加一,直到int0消失

lcall show //led顯示m,即當前設定佔空比的值

reti

loop1:dec m //當int0 為低電平且p1.2為低則m減1,每次機器響應int0都減一,直到int0消失

lcall show //led顯示m

reti

int11:jnb p1.2,loop //外部中斷1中斷處理

mov a,m

add a,#5 //當int1 為低電平且p1.2為高則m增加5,每次機器響應int0都加五,直到int0消失

mov m,a

lcall show //led顯示m

reti

loop:mov a,m

subb a,#5 //當int1 為低電平且p1.2為高則m減少5,每次機器響應int0都減五,直到int0消失

mov m,a

lcall show //led顯示m

reti

show:mov a,m //m /10 ab 內分別是商和餘數

mov b,#10

div ab

movc a,@a+dptr //查表顯示餘數

mov p2,a

mov a,b

movc a,@a+dptr //查表顯示商

mov p0,a

mov b,#10 //沒用

retdelay:mov r6,#0ffh //延時函式

dey1:mov r7,#0ffh

dey2:mov r5,#3

djnz r5,$

djnz r7,dey2

djnz r6,dey1

ret //延時結束

table:db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh //led段碼錶end

4樓:匿名使用者

count equ 30h

as equ 30h

m equ 35h 地址35h定義為變數m

org 0000h org 後跟地址,表示下面的指令所在地址

ljmp start 即此跳轉指令在 0000h地址出,為系統開機第一條

org 0003h 同理,另外0003h為中斷入口地址,對應的是什麼中斷暫時不記得了

ljmp int00

org 0013h

ljmp int11

start: setb ex0 中斷與定時器的初始化

setb px0

setb it0

setb ex1

clr px1

setb it1

setb ea 開啟中斷總開關

clr p1.5

mov tmod,#21h 設定定時器/計數器的工作模式(參閱51微控制器書)

mov th1,#38h 設定定時器0的初始值

mov th0,#0b1h

mov tl0,#0e0h 設定定時器1的初始值

setb tr0

setb tr1

mov dptr,#table 把顯示字元表的首地址給dptr

mov m,#50

mov p0,#3fh p0所接數碼管顯示0

mov p2,#6dh p2所接數碼管顯示5 應該是顯示50

mov as,#0

top:setb tr1 開啟定時器1

setb p1.0

clr p1.1

mov th0,#0b1h 設定定時器0的初始值

mov tl0,#0e0h

mov as,#0

mov b,#10 b=10

mov a,m a=m=50

mov b,#100

div ab a除上b

jz time1 跳轉到time1函式

mov b,#10

clerk:setb p1.5 p1.5 ---- ----

lcall delay ---- ----

clr p1.5 這段設定p1.5引腳產生方波

lcall delay

setb p1.5

lcall delay

clr p1.5

mov m,#50 m=50

lcall show 顯示50

ljmp top

time1:jbc tf1,next 判斷定時器1 定時時間是否到,沒到迴圈等待,到了跳轉到next

sjmp time1

next:inc as as加一

mov a,m

cjne a,as,time1 判斷a-as是否為零 這個是方波佔空比可調的關鍵,根據不同的m值這裡迴圈延時的時間不一樣

clr p1.0

setb p1.1

clr tr1

time0:jbc tf0,top 判斷定時器0 定時時間是否到,沒到迴圈等待,到了跳轉到top從新開始

sjmp time0

int00:jnb p1.2,loop1 中斷int0產生,判斷p1.2,為0呼叫loop1 m-1後顯示

inc m 否則m+1顯示

lcall show

reti

loop1:dec m

lcall show

reti

int11:jnb p1.2,loop 中斷int1產生,判斷p1.2,為0呼叫loop m-5後顯示

mov a,m 否則m+5顯示

add a,#5

mov m,a

lcall show

reti

loop:mov a,m

subb a,#5

mov m,a 把要顯示的數存於m

lcall show 呼叫顯示子函式

reti

show:mov a,m 這一段是顯示子函式 m為一個兩位數,除10後得到 十位和各位

mov b,#10

div ab

movc a,@a+dptr dptr指向的是下面的table,如果a=0,就把3fh給a,如果a=9,就把6fh給a

mov p2,a 把a給p2,p2接的是數碼管的位選。

mov a,b

movc a,@a+dptr

mov p0,a 看這個 你的硬體應該是p2接一個數碼管,p0接一個數碼管

mov b,#10

retdelay:mov r6,#0ffh 這一段為延時程式,就是通過迴圈執行指令達到延時的效果

dey1:mov r7,#0ffh

dey2:mov r5,#3

djnz r5,$

djnz r7,dey2

djnz r6,dey1

rettable:db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh 用的應該是數碼管,這對應的是0-9

end由於缺少51微控制器書,有些記得不太清楚,如果你手裡有,就算不太會用51微控制器。有上面的註釋應該可以看的懂這段程式了。

祝你好運。 ljmp int11

微控制器組合語言程式設計,全國微控制器組合語言程式設計師

org 0000h main mov dptr,3000h clr r0 clr r1 clr r2 mov r3,100 loop mov a,dptr clr c cjne a,0h,loop1 inc r0 djnz r3,loop loop1 rl a jc fushu inc r1 djn...

組合語言微控制器,組合語言怎麼寫入微控制器

rlc 是帶進位的迴圈左移,rlc a即將a的內容左移一位,將進位位c中的值移到累加器a的最低位,a的最高位移到c裡。譬如說 設a 01000001,c 1 則如果執行rl 則a 10000010,c 1 a所有位左移一位,最低位補零,c不參加移位操作,保持原值不變 如果執行rlc後,則a 1000...

微控制器組合語言的幾個疑問

靈若伊雪 1 r1 20h 不是一條指令,而只是一種說明,表明r1暫存器中的內容是20h。這個20h是地址還是資料,與這個說明無關。2 在指令 mov r1,40h 中,r1 是間接定址方式,表明r1中的內容是地址,指令的功能表明是將立即數40h傳送到r1指定的地址中。3 在指令中容易混淆的是立即數...