MCS 51微控制器實用子程式庫

2022-10-06 06:18:05 字數 8952 閱讀 3748

(23)標號: bhd2 功能:雙位元組bcd碼小數轉換成雙位元組十六進製制小數

入口條件:待轉換的雙位元組bcd碼小數在r4、r5中。

出口資訊:轉換後的雙位元組十六進製制小數在r2、r3中。*

影響資源:psw、a、r2~r6 堆疊需求: 2位元組

bhd2: mov r6,#10h ;準備計算兩個位元組小數

bhd3: mov a,r5 ;按十進位制倍增

add a,r5

da a

mov r5,a

mov a,r4

addc a,r4

da a

mov r4,a

mov a,r3 ;將進製標誌移入結果中

rlc a

mov r3,a

mov a,r2

rlc a

mov r2,a

djnz r6,bhd3 ;共計算16bit小數

mov a,r4

add a,#0b0h ;剩餘部分達到0.50否?

jnc bhd4 ;四捨

inc r3 ;五入

mov a,r3

jnz bhd4

inc r2

bhd4: ret

(24) 標號: mm 功能:求單位元組十六進製制無符號資料塊的極值

入口條件:資料塊的首址在dptr中,資料個數在r7中。

出口資訊:最大值在r6中,位址在r2r3中;最小值在r7中,位址在r4r5中。

影響資源:psw、a、b、r1~r7 堆疊需求: 4位元組

mm: mov b,r7 ;儲存資料個數

movx a,@dptr ;讀取第乙個資料

mov r6,a ;作為最大值的初始值

mov r7,a ;也作為最小值的初始值

mov a,dpl ;取第乙個資料的位址

mov r3,a ;作為最大值存放位址的初始值

mov r5,a ;也作為最小值存放位址的初始值

mov a,dph

mov r2,a

mov r4,a

mov a,b ;取資料個數

dec a ;減一,得到需要比較的次數

jz mme ;只有乙個資料,不需要比較

mov r1,a ;儲存比較次數

push dpl ;保護資料塊的首址

push dph

mm1: inc dptr ;指向乙個新的資料

movx a,@dptr ;讀取這個資料

mov b,a ;儲存

setb c ;與最大值比較

subb a,r6

jc mm2 ;不超過當前最大值,保持當前最大值

mov r6,b ;超過當前最大值,更新最大值存放位址

mov r2,dph ;同時更新最大值存放位址

mov r3,dpl

sjmp mm3

mm2: mov a,b ;與最小值比較

clr c

subb a,r7

jnc mm3 ;大於或等於當前最小值,保持當前最小值

mov r7,b ;更新最小值

mov r4,dph ;更新最小值存放位址

mov r5,dpl

mm3: djnz r1,mm1 ;處理完全部資料

pop dph ;恢復資料首址

pop dpl

mme: ret

(25) 標號: mms 功能:求單位元組十六進製制有符號資料塊的極值

入口條件:資料塊的首址在dptr中,資料個數在r7中。

出口資訊:最大值在r6中, 位址在r2r3中;最小值在r7中,位址在r4r5中。

影響資源:psw、a、b、r1~r7 堆疊需求: 4位元組

mms: mov b,r7 ;儲存資料個數

movx a,@dptr ;讀取第乙個資料

mov r6,a ;作為最大值的初始值

mov r7,a ;也作為最小值的初始值

mov a,dpl ;取第乙個資料的位址

mov r3,a ;作為最大值存放位址的初始值

mov r5,a ;也作為最小值存放位址的初始值

mov a,dph

movr2,a

mov r4,a

mov a,b ;取資料個數

dec a ;減一,得到需要比較的次數

jz mmse ;只有乙個資料,不需要比較

mov r1,a ;儲存比較次數

push dpl ;保護資料塊的首址

push dph

mms1: inc dptr ;調整資料指標

movx a,@dptr ;讀取乙個資料

mov b,a ;儲存

setb c ;與最大值比較

subb a,r6

jz mms4 ;相同,不更新最大值

jnb ov,mms2 ;差未溢位,符號位有效

cpl acc.7 ;差溢位,符號位取反

mms2: jb acc.7,mms4;差為負,不更新最大值

mov r6,b ;更新最大值

mov r2,dph ;更新最大值存放位址

mov r3,dpl

sjmp mms7

mms4: mov a,b ;與最小值比較

clr c

subb a,r7

jnb ov,mms6 ;差未溢位,符號位有效

cpl acc.7 ;差溢位,符號位取反

mms6: jnb acc.7,mms7;差為正,不更新最小值

mov r7,b ;更新最小值

mov r4,dph ;更新最小值存放位址

mov r5,dpl

mms7: djnz r1,mms1 ;處理完全部資料

pop dph ;恢復資料首址

pop dpl

mmse: ret標號: fds1 功能:順序查詢(rom)單位元組**入口條件:待查詢的內容在a中,**首址在dptr中,**的位元組數在r7中。

出口資訊:ov=0時,順序號在累加器a中;ov=1時,未找到。

影響資源:psw、a、b、r2、r6 堆疊需求: 2位元組

fds1: mov b,a ;儲存待查詢的內容

mov r2,#0 ;順序號初始化(指向表首)

mov a,r7 ;儲存**的長度

mov r6,a

fd11: mov a,r2 ;按順序號讀取**內容

movc a,@a+dptr

cjne a,b,fd12;與待查詢的內容比較

clr ov ;相同,查詢成功

mov a,r2 ;取對應的順序號

retfd12: inc r2 ;指向**中的下乙個內容

djnz r6,fd11 ;查完全部**內容

setb ov ;未查找到,失敗

ret標號: fds2 功能:順序查詢(rom)雙位元組**入口條件:查詢內容在r4、r5中,**首址在dptr中,資料總個數在r7中。

出口資訊:ov=0時順序號在累加器a中,位址在dptr中;ov=1時未找到。

影響資源:psw、a、r2、r6、dptr 堆疊需求: 2位元組

fds2: mov a,r7 ;儲存**中資料的個數

mov r6,a

mov r2,#0 ;順序號初始化(指向表首)

fd21: clr a ;讀取**內容的高位元組

movc a,@a+dptr

xrl a,r4 ;與待查詢內容的高位元組比較

jnz fd22

mov a,#1 ;讀取**內容的低位元組

movc a,@a+dptr

xrl a,r5 ;與待查詢內容的低位元組比較

jnz fd22

clr ov ;相同,查詢成功

mov a,r2 ;取對應的順序號

retfd22: inc dptr ;指向下乙個資料

inc dptr

inc r2 ;順序號加一

djnz r6,fd21 ;查完全部資料

setb ov ;未查找到,失敗

ret標號:fdd1 功能:對分查詢(rom)單位元組無符號增序資料**入口條件:待查詢的內容在累加器a中,**首址在dptr中,位元組數在r7中。

出口資訊:ov=0 時,順序號在累加器a中

中;ov=1 時,未找到。

影響資源:psw、a、b、r2、r3、r4 堆疊需求: 2位元組

fdd1: mov b,a ;儲存待查詢的內容

mov r2,#0 ;區間低端指標初始化(指向第乙個資料)

mov a,r7

dec a

mov r3,a ;區間高階指標初始化(指向最後乙個資料)

fd61: clr c ;判斷區間大小

mov a,r3

subb a,r2

jc fd69 ;區間消失,查詢失敗

rrc a ;取區間大小的一半

add a,r2 ;加上區間的低端

mov r4,a ;得到區間的中心

movc a,@a+dptr;讀取該點的內容

cjne a,b,fd65;與待查詢的內容比較

clr ov ;相同,查詢成功

mov a,r4 ;取順序號

retfd65: jc fd68 ;該點的內容比待查詢的內容大否?

mov a,r4 ;偏大,取該點位置

dec a ;減一

mov r3,a ;作為新的區間高階

sjmp fd61 ;繼續查詢

fd68: mov a,r4 ;偏小,取該點位置

inc a ;加一

mov r2,a ;作為新的區間低端

sjmp fd61 ;繼續查詢

fd69: setb ov ;查詢失敗

ret標號:fdd2 功能:對分查詢(rom)雙位元組無符號增序資料**入口條件:查詢內容在r4、r5中,**首址在dptr中,資料個數在r7中。

出口資訊:ov=0 時順序號在累加器a中,址在dptr中;ov=1 時未找到。

影響資源:psw、a、b、r1~r7、dptr 堆疊需求: 2位元組

fdd2: mov r2,#0 ;區間低端指標初始化(指向第乙個資料)

mov a,r7

dec a

mov r3,a ;區間高階指標初始化,指向最後乙個資料

mov r6,dph ;儲存**首址

mov r7,dpl

fd81: clr c ;判斷區間大小

mov a,r3

subb a,r2

jc fd89 ;區間消失,查詢失敗

rrc a ;取區間大小的一半

add a,r2 ;加上區間的低端

mov r1,a ;得到區間的中心

mov dph,r6

clr c ;計算區間中心的位址

rlc a

jnc fd82

inc dph

fd82: add a,r7

mov dpl,a

jnc fd83

inc dph

fd83: clr a ;讀取該點的內容的高位元組

movc a,@a+dptr

mov b,r4 ;與待查詢內容的高位元組比較

cjne a,b,fd84;不相同

mov a,#1 ;讀取該點的內容的低位元組

movc a,@a+dptr

mov b,r5

cjne a,b,fd84;與待查詢內容的低位元組比較

mov a,r1 ;取順序號

clr ov ;查詢成功

retfd84: jc fd86 ;該點的內容比待查詢的內容大否?

mov a,r1 ;偏大,取該點位置

dec a ;減一

mov r3,a ;作為新的區間高階

sjmp fd81 ;繼續查詢

fd86: mov a,r1 ;偏小,取該點位置

inc a ;加一

mov r2,a ;作為新的區間低端

sjmp fd81 ;繼續查詢

fd89: mov dph,r6 ;相同,恢復首址

mov dpl,r7

setb ov ;查詢失敗

ret標號: ddm1 功能:求單位元組十六進製制無符號資料塊的平均值入口條件:資料塊的首址在dptr中,資料個數在r7中。

出口資訊:平均值在累加器a中。

影響資源:psw、a、r2~r6 堆疊需求: 4位元組

ddm1: mov a,r7 ;儲存資料個數

mov r2,a

push dph

push dpl

clr a ;初始化累加和

movr4,a

mov r5,a

dm11: movx a,@dptr ;讀取乙個資料

add a,r5 ;累加到累加和中

mov r5,a

jnc dm12

inc r4

dm12: inc dptr ;調整指標

djnz r2,dm11 ;累加完全部資料

lcall d457 ;求平均值(r4r5/r7-→r3)

mov a,r3 ;取平均值

pop dpl

pop dph

ret標號: ddm2 功能:求雙位元組十六進製制無符號資料塊的平均值入口條件:資料塊的首址在dptr中,雙位元組資料總個數在r7中。

出口資訊:平均值在r4、r5中。

影響資源:psw、a、r2~r6 堆疊需求: 4位元組

ddm2: mov a,r7 ;儲存資料個數

mov r2,a ;初始化資料指標

push dpl ;保持首址

push dph

clr a ;初始化累加和

mov r3,a

mov r4,a

mov r5,a

dm20: movx a,@dptr ;讀取乙個資料的高位元組

mov b,a

inc dptr

movx a,@dptr ;讀取乙個資料的低位元組

inc dptr

add a,r5 ;累加到累加和中

mov r5,a

mov a,b

addc a,r4

mov r4,a

jnc dm21

inc r3

dm21: djnz r2,dm20 ;累加完全部資料

pop dph ;恢復首址

pop dpl

ljmp dv31 ;求r3r4r5/r7-→r4r5,得到平均值標號: xr1 功能:求單位元組資料塊的(異或)校驗和入口條件:

資料塊的首址在dptr中,資料的個數在r6、r7中。

出口資訊:校驗和在累加器a中。

影響資源:psw、a、b、r4~r7 堆疊需求: 2位元組

xr1: mov r4,dph ;儲存資料塊的首址

mov r5,dpl

mov a,r7 ;雙位元組計數器調整

jz xr10

inc r6

xr10: mov b,#0 ;校驗和初始化

xr11: movx a,@dptr ;讀取乙個資料

xrl b,a ;異或運算

inc dptr ;指向下乙個資料

djnz r7,xr11 ;雙位元組計數器減一

djnz r6,xr11

mov dph,r4 ;恢復資料首址

mov dpl,r5

mov a,b ;取校驗和

ret標號: xr2 功能:求雙位元組資料塊的(異或)校驗和入口條件:資料塊的首址在dptr中,雙位元組資料總個數在r6、r7中。

出口資訊:校驗和在r2、r3中。

影響資源:psw、a、r2~r7 堆疊需求: 2位元組

xr2: mov r4,dph ;儲存資料塊的首址

mov r5,dpl

mov a,r7 ;雙位元組計數器調整

jz xr20

inc r6

xr20: clr a ;校驗和初始化

mov r2,a

mov r3,a

xr21: movx a,@dptr ;讀取乙個資料的高位元組

xrl a,r2 ;異或運算

mov r2,a

inc dptr

movx a,@dptr ;讀取乙個資料的低位元組

xrl a,r3 ;異或運算

mov r3,a

inc dptr ;指向下乙個資料

djnz r7,xr21 ;雙位元組計數器減一

djnz r6,xr21

mov dph,r4 ;恢復資料首址

mov dpl,r5

ret標號: sort 功能:單位元組無符號資料塊排序(增序)

入口條件:資料塊的首址在r0中,位元組數在r7中。

出口資訊:完成排序(增序)

影響資源:psw、a、r2~r6 堆疊需求: 2位元組

sort: mov a,r7

mov r5,a ;比較次數初始化

srt1: clr f0 ;交換標誌初始化

mov a,r5 ;取上遍比較次數

dec a ;本遍比上遍減少一次

mov r5,a

;儲存本遍次數

mov r2,a ;複製到計數器中

jz srt5 ;若為零,排序結束

mov a,r0 ;儲存資料指標

mov r6,a

srt2: mov a,@r0 ;讀取乙個資料

mov r3,a

inc r0 ;指向下乙個資料

mov a,@r0 ;再讀取乙個資料

mov r4,a

clr c

subb a,r3 ;比較兩個資料的大小

jnc srt4 ;順序正確(增序或相同),不必交換

setb f0 ;設立交換標誌

mov a,r3 ;將兩個資料交換位置

mov @r0,a

dec r0

mov a,r4

mov @r0,a

inc r0 ;指向下乙個資料

srt4: djnz r2,srt2 ;完成本遍的比較次數

mov a,r6 ;恢復資料首址

mov r0,a

jb f0,srt1 ;本遍若進行過交換,則需繼續排序

srt5: ret ;排序結束end

MCS51微控制器指令大全

以字母的順序排列 a z a 1 acall addr11 指令名稱 絕對呼叫指令 指令 指令功能 構造目的位址,進行子程式呼叫其方法是以指令提供的11位位址 al0 a0 取代pc的低11位,pc的高5位不變。操作內容 pc pc 2 sp sp 1 sp pc 7 0 sp sp 1 sp pc...

MCS 51微控制器指令全總結

1 運算元中有direct data bit的都是2位元組指令 2 在運算元中沒有以上三個變數卻有 標誌的都是1位元組指令 3 凡是3位元組指令的都是兩週期的指令 4 乘除是單位元組四週期的指令 5 位元組呼叫指令 位元組 位轉移指令 位元組 位邏輯指令 進 出棧指令 返回指令 inc dptr m...

MCS 51系列微控制器模擬SPI匯流排的方法

1.mcu序列輸入子程式spiin 從x25f008的spiso線上接收8位資料並放入暫存器r0中的應用子程式如下 spiin setb p1.1使p1.1 時鐘 輸出為1 clr p1.2選擇從機 mov r1,08h置迴圈次數 spiin1 clr p1.1使p1.1 時鐘 輸出為0 nop延時...